Module: vkd3d Branch: master Commit: 42d46d25134df28170d9a145520f372fa7e4dcfe URL: https://gitlab.winehq.org/wine/vkd3d/-/commit/42d46d25134df28170d9a145520f37...
Author: Conor McCarthy cmccarthy@codeweavers.com Date: Sat Jul 8 18:22:20 2023 +1000
vkd3d: Do not create Vulkan descriptor sets for non-shader-visible heaps.
---
libs/vkd3d/command.c | 10 ++++++++++ libs/vkd3d/resource.c | 4 ++-- 2 files changed, 12 insertions(+), 2 deletions(-)
diff --git a/libs/vkd3d/command.c b/libs/vkd3d/command.c index 53cb5d95..1aeae451 100644 --- a/libs/vkd3d/command.c +++ b/libs/vkd3d/command.c @@ -4425,6 +4425,7 @@ static void d3d12_command_list_set_descriptor_table(struct d3d12_command_list *l { struct vkd3d_pipeline_bindings *bindings = &list->pipeline_bindings[bind_point]; const struct d3d12_root_signature *root_signature = bindings->root_signature; + struct d3d12_descriptor_heap *descriptor_heap; struct d3d12_desc *desc;
assert(root_signature_get_descriptor_table(root_signature, index)); @@ -4435,6 +4436,15 @@ static void d3d12_command_list_set_descriptor_table(struct d3d12_command_list *l if (bindings->descriptor_tables[index] == desc) return;
+ descriptor_heap = d3d12_desc_get_descriptor_heap(desc); + if (!(descriptor_heap->desc.Flags & D3D12_DESCRIPTOR_HEAP_FLAG_SHADER_VISIBLE)) + { + /* GetGPUDescriptorHandleForHeapStart() returns a null handle in this case, + * but a CPU handle could be passed. */ + WARN("Descriptor heap %p is not shader visible.\n", descriptor_heap); + return; + } + bindings->descriptor_tables[index] = desc; bindings->descriptor_table_dirty_mask |= (uint64_t)1 << index; bindings->descriptor_table_active_mask |= (uint64_t)1 << index; diff --git a/libs/vkd3d/resource.c b/libs/vkd3d/resource.c index 00614ddd..f2fe1250 100644 --- a/libs/vkd3d/resource.c +++ b/libs/vkd3d/resource.c @@ -3970,7 +3970,7 @@ static HRESULT d3d12_descriptor_heap_vk_descriptor_sets_init(struct d3d12_descri descriptor_heap->vk_descriptor_pool = VK_NULL_HANDLE; memset(descriptor_heap->vk_descriptor_sets, 0, sizeof(descriptor_heap->vk_descriptor_sets));
- if (!device->use_vk_heaps || (desc->Type != D3D12_DESCRIPTOR_HEAP_TYPE_CBV_SRV_UAV + if (!descriptor_heap->use_vk_heaps || (desc->Type != D3D12_DESCRIPTOR_HEAP_TYPE_CBV_SRV_UAV && desc->Type != D3D12_DESCRIPTOR_HEAP_TYPE_SAMPLER)) return S_OK;
@@ -4001,7 +4001,7 @@ static HRESULT d3d12_descriptor_heap_init(struct d3d12_descriptor_heap *descript if (FAILED(hr = vkd3d_private_store_init(&descriptor_heap->private_store))) return hr;
- descriptor_heap->use_vk_heaps = device->use_vk_heaps; + descriptor_heap->use_vk_heaps = device->use_vk_heaps && (desc->Flags & D3D12_DESCRIPTOR_HEAP_FLAG_SHADER_VISIBLE); d3d12_descriptor_heap_vk_descriptor_sets_init(descriptor_heap, device, desc); vkd3d_mutex_init(&descriptor_heap->vk_sets_mutex);