From 07e6687f6ac9fb27a0fde1420da26d35f8f2713e Mon Sep 17 00:00:00 2001 From: Philip Rebohle Date: Sat, 3 Oct 2020 21:49:09 +0200 Subject: [PATCH] vkd3d: Rework descriptor set lookup. This is no longer performance-critical, so in order to simplify changing the binding model, remove hard-coded descriptor set numbers and instead look them up based on the requested descriptor properties. Signed-off-by: Philip Rebohle --- libs/vkd3d/command.c | 6 ++--- libs/vkd3d/resource.c | 55 +++++++++++++------------------------- libs/vkd3d/state.c | 27 +++++++++++++++++++ libs/vkd3d/vkd3d_private.h | 30 ++------------------- 4 files changed, 50 insertions(+), 68 deletions(-) diff --git a/libs/vkd3d/command.c b/libs/vkd3d/command.c index c30dd984..ed7291e0 100644 --- a/libs/vkd3d/command.c +++ b/libs/vkd3d/command.c @@ -5113,14 +5113,15 @@ static void STDMETHODCALLTYPE d3d12_command_list_SetDescriptorHeaps(d3d12_comman struct d3d12_command_list *list = impl_from_ID3D12GraphicsCommandList(iface); struct vkd3d_bindless_state *bindless_state = &list->device->bindless_state; bool dirty_uav_counters = false; - unsigned int i, j, set_index; uint64_t dirty_mask = 0; + unsigned int i, j; TRACE("iface %p, heap_count %u, heaps %p.\n", iface, heap_count, heaps); for (i = 0; i < heap_count; i++) { struct d3d12_descriptor_heap *heap = unsafe_impl_from_ID3D12DescriptorHeap(heaps[i]); + unsigned int set_index = 0; if (!heap) continue; @@ -5130,8 +5131,7 @@ static void STDMETHODCALLTYPE d3d12_command_list_SetDescriptorHeaps(d3d12_comman if (bindless_state->set_info[j].heap_type != heap->desc.Type) continue; - set_index = d3d12_descriptor_heap_set_index_from_binding(&bindless_state->set_info[j]); - list->descriptor_heaps[j] = heap->vk_descriptor_sets[set_index]; + list->descriptor_heaps[j] = heap->vk_descriptor_sets[set_index++]; dirty_mask |= 1ull << j; } diff --git a/libs/vkd3d/resource.c b/libs/vkd3d/resource.c index e013656d..218b9f0b 100644 --- a/libs/vkd3d/resource.c +++ b/libs/vkd3d/resource.c @@ -3499,7 +3499,8 @@ void d3d12_desc_copy(struct d3d12_desc *dst, struct d3d12_desc *src, } else { - uint32_t set_index = d3d12_descriptor_heap_uav_counter_set_index(); + uint32_t set_index = vkd3d_bindless_state_find_set(&device->bindless_state, + D3D12_DESCRIPTOR_RANGE_TYPE_UAV, VKD3D_SHADER_BINDING_FLAG_COUNTER); vk_copy = &vk_copies[copy_count++]; vk_copy->sType = VK_STRUCTURE_TYPE_COPY_DESCRIPTOR_SET; @@ -3935,7 +3936,8 @@ void d3d12_desc_create_cbv(struct d3d12_desc *descriptor, vk_descriptor_type = vkd3d_bindless_state_get_cbv_descriptor_type(&device->bindless_state); descriptor->metadata.cookie = resource ? resource->cookie : 0; - descriptor->metadata.set_index = d3d12_descriptor_heap_cbv_set_index(); + descriptor->metadata.set_index = vkd3d_bindless_state_find_set(&device->bindless_state, + D3D12_DESCRIPTOR_RANGE_TYPE_CBV, VKD3D_SHADER_BINDING_FLAG_BUFFER); descriptor->metadata.flags = VKD3D_DESCRIPTOR_FLAG_DEFINED; descriptor->info.buffer = descriptor_info.buffer; @@ -4000,7 +4002,8 @@ static void vkd3d_create_buffer_srv(struct d3d12_desc *descriptor, descriptor->info.view = view; descriptor->metadata.cookie = view ? view->cookie : 0; - descriptor->metadata.set_index = d3d12_descriptor_heap_srv_set_index(true); + descriptor->metadata.set_index = vkd3d_bindless_state_find_set(&device->bindless_state, + D3D12_DESCRIPTOR_RANGE_TYPE_SRV, VKD3D_SHADER_BINDING_FLAG_BUFFER); descriptor->metadata.flags = VKD3D_DESCRIPTOR_FLAG_DEFINED | VKD3D_DESCRIPTOR_FLAG_VIEW; vkd3d_init_write_descriptor_set(&vk_write, descriptor, VK_DESCRIPTOR_TYPE_UNIFORM_TEXEL_BUFFER, &descriptor_info); @@ -4157,7 +4160,8 @@ static void vkd3d_create_texture_srv(struct d3d12_desc *descriptor, descriptor->info.view = view; descriptor->metadata.cookie = view ? view->cookie : 0; - descriptor->metadata.set_index = d3d12_descriptor_heap_srv_set_index(false); + descriptor->metadata.set_index = vkd3d_bindless_state_find_set(&device->bindless_state, + D3D12_DESCRIPTOR_RANGE_TYPE_SRV, VKD3D_SHADER_BINDING_FLAG_IMAGE); descriptor->metadata.flags = VKD3D_DESCRIPTOR_FLAG_DEFINED | VKD3D_DESCRIPTOR_FLAG_VIEW; vkd3d_init_write_descriptor_set(&vk_write, descriptor, VK_DESCRIPTOR_TYPE_SAMPLED_IMAGE, &descriptor_info); @@ -4259,7 +4263,8 @@ static void vkd3d_create_buffer_uav(struct d3d12_desc *descriptor, struct d3d12_ descriptor->info.view = view; descriptor->metadata.cookie = view ? view->cookie : 0; - descriptor->metadata.set_index = d3d12_descriptor_heap_uav_set_index(true); + descriptor->metadata.set_index = vkd3d_bindless_state_find_set(&device->bindless_state, + D3D12_DESCRIPTOR_RANGE_TYPE_UAV, VKD3D_SHADER_BINDING_FLAG_BUFFER); descriptor->metadata.flags = VKD3D_DESCRIPTOR_FLAG_DEFINED | VKD3D_DESCRIPTOR_FLAG_VIEW | VKD3D_DESCRIPTOR_FLAG_UAV_COUNTER; descriptor_info[vk_write_count].buffer_view = view ? view->vk_buffer_view : VK_NULL_HANDLE; @@ -4302,7 +4307,8 @@ static void vkd3d_create_buffer_uav(struct d3d12_desc *descriptor, struct d3d12_ } else { - uint32_t set_index = d3d12_descriptor_heap_uav_counter_set_index(); + uint32_t set_index = vkd3d_bindless_state_find_set(&device->bindless_state, + D3D12_DESCRIPTOR_RANGE_TYPE_UAV, VKD3D_SHADER_BINDING_FLAG_COUNTER); descriptor_info[vk_write_count].buffer_view = view ? view->vk_counter_view : VK_NULL_HANDLE; vkd3d_init_write_descriptor_set(&vk_write[vk_write_count], descriptor, @@ -4427,7 +4433,8 @@ static void vkd3d_create_texture_uav(struct d3d12_desc *descriptor, descriptor->info.view = view; descriptor->metadata.cookie = view ? view->cookie : 0; - descriptor->metadata.set_index = d3d12_descriptor_heap_uav_set_index(false); + descriptor->metadata.set_index = vkd3d_bindless_state_find_set(&device->bindless_state, + D3D12_DESCRIPTOR_RANGE_TYPE_UAV, VKD3D_SHADER_BINDING_FLAG_IMAGE); descriptor->metadata.flags = VKD3D_DESCRIPTOR_FLAG_DEFINED | VKD3D_DESCRIPTOR_FLAG_VIEW; vkd3d_init_write_descriptor_set(&vk_write, descriptor, VK_DESCRIPTOR_TYPE_STORAGE_IMAGE, &descriptor_info); @@ -4721,7 +4728,8 @@ void d3d12_desc_create_sampler(struct d3d12_desc *sampler, sampler->info.view = view; sampler->metadata.cookie = view->cookie; - sampler->metadata.set_index = d3d12_descriptor_heap_sampler_set_index(); + sampler->metadata.set_index = vkd3d_bindless_state_find_set(&device->bindless_state, + D3D12_DESCRIPTOR_RANGE_TYPE_SAMPLER, VKD3D_SHADER_BINDING_FLAG_IMAGE); sampler->metadata.flags = VKD3D_DESCRIPTOR_FLAG_DEFINED | VKD3D_DESCRIPTOR_FLAG_VIEW; descriptor_info.image.sampler = view->vk_sampler; @@ -5341,7 +5349,7 @@ static HRESULT d3d12_descriptor_heap_create_uav_counter_buffer(struct d3d12_desc static HRESULT d3d12_descriptor_heap_init(struct d3d12_descriptor_heap *descriptor_heap, struct d3d12_device *device, const D3D12_DESCRIPTOR_HEAP_DESC *desc) { - unsigned int i; + unsigned int i, set_index = 0; HRESULT hr; memset(descriptor_heap, 0, sizeof(*descriptor_heap)); @@ -5363,10 +5371,8 @@ static HRESULT d3d12_descriptor_heap_init(struct d3d12_descriptor_heap *descript if (set_info->heap_type == desc->Type) { - unsigned int set_index = d3d12_descriptor_heap_set_index_from_binding(set_info); - if (FAILED(hr = d3d12_descriptor_heap_create_descriptor_set(descriptor_heap, - set_info, &descriptor_heap->vk_descriptor_sets[set_index]))) + set_info, &descriptor_heap->vk_descriptor_sets[set_index++]))) goto fail; } } @@ -5489,31 +5495,6 @@ void d3d12_descriptor_heap_cleanup(struct d3d12_descriptor_heap *descriptor_heap VK_CALL(vkDestroyDescriptorPool(device->vk_device, descriptor_heap->vk_descriptor_pool, NULL)); } -unsigned int d3d12_descriptor_heap_set_index_from_binding(const struct vkd3d_bindless_set_info *set) -{ - switch (set->range_type) - { - case D3D12_DESCRIPTOR_RANGE_TYPE_SAMPLER: - return d3d12_descriptor_heap_sampler_set_index(); - - case D3D12_DESCRIPTOR_RANGE_TYPE_CBV: - return d3d12_descriptor_heap_cbv_set_index(); - - case D3D12_DESCRIPTOR_RANGE_TYPE_SRV: - return d3d12_descriptor_heap_srv_set_index( - set->binding_flag & VKD3D_SHADER_BINDING_FLAG_BUFFER); - - case D3D12_DESCRIPTOR_RANGE_TYPE_UAV: - return set->binding_flag & VKD3D_SHADER_BINDING_FLAG_COUNTER - ? d3d12_descriptor_heap_uav_counter_set_index() - : d3d12_descriptor_heap_uav_set_index(set->binding_flag & VKD3D_SHADER_BINDING_FLAG_BUFFER); - - default: - WARN("Unhandled descriptor range type %d.\n", set->range_type); - return 0; - } -} - /* ID3D12QueryHeap */ static inline struct d3d12_query_heap *impl_from_ID3D12QueryHeap(ID3D12QueryHeap *iface) { diff --git a/libs/vkd3d/state.c b/libs/vkd3d/state.c index 28907538..409c82b1 100644 --- a/libs/vkd3d/state.c +++ b/libs/vkd3d/state.c @@ -3518,3 +3518,30 @@ bool vkd3d_bindless_state_find_binding(const struct vkd3d_bindless_state *bindle return false; } + +unsigned int vkd3d_bindless_state_find_set(const struct vkd3d_bindless_state *bindless_state, + D3D12_DESCRIPTOR_RANGE_TYPE range_type, enum vkd3d_shader_binding_flag binding_flag) +{ + D3D12_DESCRIPTOR_HEAP_TYPE heap_type; + unsigned int i, set_index = 0; + + heap_type = range_type == D3D12_DESCRIPTOR_RANGE_TYPE_SAMPLER + ? D3D12_DESCRIPTOR_HEAP_TYPE_SAMPLER + : D3D12_DESCRIPTOR_HEAP_TYPE_CBV_SRV_UAV; + + for (i = 0; i < bindless_state->set_count; i++) + { + const struct vkd3d_bindless_set_info *set_info = &bindless_state->set_info[i]; + + if (set_info->heap_type == heap_type) + { + if (set_info->range_type == range_type && set_info->binding_flag == binding_flag) + return set_index; + + set_index++; + } + } + + ERR("No set found for range type %u, flag %#x.", range_type, binding_flag); + return 0; +} diff --git a/libs/vkd3d/vkd3d_private.h b/libs/vkd3d/vkd3d_private.h index df5d984a..afa3263c 100644 --- a/libs/vkd3d/vkd3d_private.h +++ b/libs/vkd3d/vkd3d_private.h @@ -756,39 +756,11 @@ HRESULT d3d12_descriptor_heap_create(struct d3d12_device *device, void d3d12_descriptor_heap_cleanup(struct d3d12_descriptor_heap *descriptor_heap); struct d3d12_descriptor_heap *unsafe_impl_from_ID3D12DescriptorHeap(ID3D12DescriptorHeap *iface); -static inline unsigned int d3d12_descriptor_heap_sampler_set_index() -{ - return 0; -} - -static inline unsigned int d3d12_descriptor_heap_cbv_set_index() -{ - return 0; -} - -static inline unsigned int d3d12_descriptor_heap_srv_set_index(bool is_buffer) -{ - return 1 + (is_buffer ? 0 : 1); -} - -static inline unsigned int d3d12_descriptor_heap_uav_set_index(bool is_buffer) -{ - return 3 + (is_buffer ? 0 : 1); -} - -static inline unsigned int d3d12_descriptor_heap_uav_counter_set_index() -{ - return 5; -} - static inline uint32_t d3d12_desc_heap_offset(const struct d3d12_desc *dst) { return dst->heap_offset; } -unsigned int d3d12_descriptor_heap_set_index_from_binding(const struct vkd3d_bindless_set_info *set); -unsigned int d3d12_descriptor_heap_set_index_from_magic(uint32_t magic, bool is_buffer); - /* ID3D12QueryHeap */ struct d3d12_query_heap { @@ -1626,6 +1598,8 @@ void vkd3d_bindless_state_cleanup(struct vkd3d_bindless_state *bindless_state, bool vkd3d_bindless_state_find_binding(const struct vkd3d_bindless_state *bindless_state, D3D12_DESCRIPTOR_RANGE_TYPE range_type, enum vkd3d_shader_binding_flag binding_flag, struct vkd3d_shader_descriptor_binding *binding); +unsigned int vkd3d_bindless_state_find_set(const struct vkd3d_bindless_state *bindless_state, + D3D12_DESCRIPTOR_RANGE_TYPE range_type, enum vkd3d_shader_binding_flag binding_flag); static inline VkDescriptorType vkd3d_bindless_state_get_cbv_descriptor_type(const struct vkd3d_bindless_state *bindless_state) {