diff --git a/include/vkd3d.h b/include/vkd3d.h index 4ea9f3ca..01b415f1 100644 --- a/include/vkd3d.h +++ b/include/vkd3d.h @@ -66,7 +66,9 @@ enum vkd3d_config_flags VKD3D_CONFIG_FLAG_FORCE_STATIC_CBV = 0x00000008, VKD3D_CONFIG_FLAG_DXR = 0x00000010, VKD3D_CONFIG_FLAG_SINGLE_QUEUE = 0x00000020, - VKD3D_CONFIG_FLAG_DESCRIPTOR_QA_CHECKS = 0x00000040 + VKD3D_CONFIG_FLAG_DESCRIPTOR_QA_CHECKS = 0x00000040, + VKD3D_CONFIG_FLAG_FORCE_RTV_EXCLUSIVE_QUEUE = 0x00000080, + VKD3D_CONFIG_FLAG_FORCE_DSV_EXCLUSIVE_QUEUE = 0x00000100, }; typedef HRESULT (*PFN_vkd3d_signal_event)(HANDLE event); diff --git a/libs/vkd3d/device.c b/libs/vkd3d/device.c index 2b01fe6b..9fef87bc 100644 --- a/libs/vkd3d/device.c +++ b/libs/vkd3d/device.c @@ -485,6 +485,9 @@ static const struct vkd3d_debug_option vkd3d_config_options[] = {"dxr", VKD3D_CONFIG_FLAG_DXR}, {"single_queue", VKD3D_CONFIG_FLAG_SINGLE_QUEUE}, {"descriptor_qa_checks", VKD3D_CONFIG_FLAG_DESCRIPTOR_QA_CHECKS}, + {"force_rtv_exclusive_queue", VKD3D_CONFIG_FLAG_FORCE_RTV_EXCLUSIVE_QUEUE}, + {"force_dsv_exclusive_queue", VKD3D_CONFIG_FLAG_FORCE_DSV_EXCLUSIVE_QUEUE}, + {"force_exclusive_queue", VKD3D_CONFIG_FLAG_FORCE_RTV_EXCLUSIVE_QUEUE | VKD3D_CONFIG_FLAG_FORCE_DSV_EXCLUSIVE_QUEUE}, }; static void vkd3d_config_flags_init_once(void) diff --git a/libs/vkd3d/resource.c b/libs/vkd3d/resource.c index a8d1e990..7e5ba363 100644 --- a/libs/vkd3d/resource.c +++ b/libs/vkd3d/resource.c @@ -356,6 +356,7 @@ static HRESULT vkd3d_create_image(struct d3d12_device *device, const struct vkd3d_format *format; VkImageCreateInfo image_info; DXGI_FORMAT typeless_format; + bool use_concurrent; unsigned int i; VkResult vr; @@ -496,7 +497,21 @@ static HRESULT vkd3d_create_image(struct d3d12_device *device, if (vkd3d_resource_can_be_vrs(device, heap_properties, desc)) image_info.usage |= VK_IMAGE_USAGE_FRAGMENT_SHADING_RATE_ATTACHMENT_BIT_KHR; - if (device->unique_queue_mask & (device->unique_queue_mask - 1)) + use_concurrent = !!(device->unique_queue_mask & (device->unique_queue_mask - 1)); + + if (!(desc->Flags & D3D12_RESOURCE_FLAG_ALLOW_SIMULTANEOUS_ACCESS)) + { + /* Ignore config flags for actual simultaneous access cases. */ + if (((desc->Flags & D3D12_RESOURCE_FLAG_ALLOW_RENDER_TARGET) && + (vkd3d_config_flags & VKD3D_CONFIG_FLAG_FORCE_RTV_EXCLUSIVE_QUEUE)) || + ((desc->Flags & D3D12_RESOURCE_FLAG_ALLOW_DEPTH_STENCIL) && + (vkd3d_config_flags & VKD3D_CONFIG_FLAG_FORCE_DSV_EXCLUSIVE_QUEUE))) + { + use_concurrent = false; + } + } + + if (use_concurrent) { /* For multi-queue, we have to use CONCURRENT since D3D does * not give us enough information to do ownership transfers. */