From 23150f60502a2dfb806849777cee2c875a0b5094 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?J=C3=B3zef=20Kucia?= Date: Tue, 5 Sep 2017 11:53:55 +0200 Subject: [PATCH] libs/vkd3d: Update Vulkan descriptor sets just before draw call. --- libs/vkd3d/command.c | 23 ++++++++++++++++++++++- libs/vkd3d/vkd3d_private.h | 3 +++ 2 files changed, 25 insertions(+), 1 deletion(-) diff --git a/libs/vkd3d/command.c b/libs/vkd3d/command.c index 24008f2b..2af3367b 100644 --- a/libs/vkd3d/command.c +++ b/libs/vkd3d/command.c @@ -1812,7 +1812,7 @@ static bool vk_write_descriptor_set_from_d3d12_desc(VkWriteDescriptorSet *vk_des return true; } -static void d3d12_command_list_set_descriptor_table(struct d3d12_command_list *list, +static void d3d12_command_list_update_descriptor_table(struct d3d12_command_list *list, VkPipelineBindPoint bind_point, unsigned int index, D3D12_GPU_DESCRIPTOR_HANDLE base_descriptor) { struct vkd3d_pipeline_bindings *bindings = &list->pipeline_bindings[bind_point]; @@ -1882,10 +1882,18 @@ static void d3d12_command_list_update_descriptors(struct d3d12_command_list *lis struct vkd3d_pipeline_bindings *bindings = &list->pipeline_bindings[bind_point]; const struct vkd3d_vk_device_procs *vk_procs = &list->device->vk_procs; struct d3d12_root_signature *rs = bindings->root_signature; + unsigned int i; if (!rs || !rs->pool_size_count || !rs->vk_set_layout) return; + for (i = 0; i < ARRAY_SIZE(bindings->descriptor_tables); ++i) + { + if (bindings->descriptor_table_dirty_mask & ((uint64_t)1 << i)) + d3d12_command_list_update_descriptor_table(list, bind_point, i, bindings->descriptor_tables[i]); + } + bindings->descriptor_table_dirty_mask = 0; + bindings->in_use = true; VK_CALL(vkCmdBindDescriptorSets(list->vk_command_buffer, bind_point, rs->vk_pipeline_layout, rs->main_set, 1, &bindings->descriptor_set, 0, NULL)); @@ -2571,6 +2579,19 @@ static void STDMETHODCALLTYPE d3d12_command_list_SetGraphicsRootSignature(ID3D12 unsafe_impl_from_ID3D12RootSignature(root_signature)); } +static void d3d12_command_list_set_descriptor_table(struct d3d12_command_list *list, + VkPipelineBindPoint bind_point, unsigned int index, D3D12_GPU_DESCRIPTOR_HANDLE base_descriptor) +{ + struct vkd3d_pipeline_bindings *bindings = &list->pipeline_bindings[bind_point]; + struct d3d12_root_signature *root_signature = bindings->root_signature; + + assert(root_signature->parameters[index].parameter_type == D3D12_ROOT_PARAMETER_TYPE_DESCRIPTOR_TABLE); + + assert(index < ARRAY_SIZE(bindings->descriptor_tables)); + bindings->descriptor_tables[index] = base_descriptor; + bindings->descriptor_table_dirty_mask |= (uint64_t)1 << index; +} + static void STDMETHODCALLTYPE d3d12_command_list_SetComputeRootDescriptorTable(ID3D12GraphicsCommandList *iface, UINT root_parameter_index, D3D12_GPU_DESCRIPTOR_HANDLE base_descriptor) { diff --git a/libs/vkd3d/vkd3d_private.h b/libs/vkd3d/vkd3d_private.h index e44ea8cb..81ba983e 100644 --- a/libs/vkd3d/vkd3d_private.h +++ b/libs/vkd3d/vkd3d_private.h @@ -451,6 +451,9 @@ struct vkd3d_pipeline_bindings VkDescriptorSet descriptor_set; bool in_use; + + D3D12_GPU_DESCRIPTOR_HANDLE descriptor_tables[D3D12_MAX_ROOT_COST]; + uint64_t descriptor_table_dirty_mask; }; /* ID3D12CommandList */