[PATCH vkd3d 5/5] vkd3d: Store root signature Vulkan descriptor set layouts in an array.

Conor McCarthy cmccarthy at codeweavers.com
Fri Apr 16 10:01:42 CDT 2021


They need to be in an array for pipeline layout creation anyway, and
this is useful when more layouts are needed for unbounded arrays.

signed-off-by: Conor McCarthy <cmccarthy at codeweavers.com>
---
 libs/vkd3d/command.c       |  4 +--
 libs/vkd3d/state.c         | 59 +++++++++++++++++---------------------
 libs/vkd3d/vkd3d_private.h |  5 ++--
 3 files changed, 31 insertions(+), 37 deletions(-)

diff --git a/libs/vkd3d/command.c b/libs/vkd3d/command.c
index 8b84451..116a8a6 100644
--- a/libs/vkd3d/command.c
+++ b/libs/vkd3d/command.c
@@ -2582,7 +2582,7 @@ static void d3d12_command_list_prepare_descriptors(struct d3d12_command_list *li
      *   and when the command completes executing on the queue."
      */
     bindings->descriptor_set = d3d12_command_allocator_allocate_descriptor_set(list->allocator,
-            root_signature->vk_set_layout);
+            root_signature->vk_set_layouts[root_signature->main_set]);
     bindings->in_use = false;
 
     bindings->descriptor_table_dirty_mask |= bindings->descriptor_table_active_mask & root_signature->descriptor_table_mask;
@@ -2895,7 +2895,7 @@ static void d3d12_command_list_update_descriptors(struct d3d12_command_list *lis
     struct d3d12_desc *base_descriptor;
     unsigned int i;
 
-    if (!rs || !rs->vk_set_layout)
+    if (!rs || !rs->vk_set_count)
         return;
 
     if (bindings->descriptor_table_dirty_mask || bindings->push_descriptor_dirty_mask)
diff --git a/libs/vkd3d/state.c b/libs/vkd3d/state.c
index c4fcde9..e459c99 100644
--- a/libs/vkd3d/state.c
+++ b/libs/vkd3d/state.c
@@ -65,10 +65,8 @@ static void d3d12_root_signature_cleanup(struct d3d12_root_signature *root_signa
 
     if (root_signature->vk_pipeline_layout)
         VK_CALL(vkDestroyPipelineLayout(device->vk_device, root_signature->vk_pipeline_layout, NULL));
-    if (root_signature->vk_set_layout)
-        VK_CALL(vkDestroyDescriptorSetLayout(device->vk_device, root_signature->vk_set_layout, NULL));
-    if (root_signature->vk_push_set_layout)
-        VK_CALL(vkDestroyDescriptorSetLayout(device->vk_device, root_signature->vk_push_set_layout, NULL));
+    for (i = 0; i < root_signature->vk_set_count; ++i)
+        VK_CALL(vkDestroyDescriptorSetLayout(device->vk_device, root_signature->vk_set_layouts[i], NULL));
 
     if (root_signature->parameters)
     {
@@ -514,7 +512,6 @@ struct vkd3d_descriptor_set_context
 {
     VkDescriptorSetLayoutBinding *current_binding;
     unsigned int descriptor_index;
-    uint32_t set_index;
     uint32_t descriptor_binding;
 };
 
@@ -531,7 +528,7 @@ static void d3d12_root_signature_append_vk_binding(struct d3d12_root_signature *
     mapping->register_index = register_idx;
     mapping->shader_visibility = shader_visibility;
     mapping->flags = buffer_descriptor ? VKD3D_SHADER_BINDING_FLAG_BUFFER : VKD3D_SHADER_BINDING_FLAG_IMAGE;
-    mapping->binding.set = context->set_index;
+    mapping->binding.set = root_signature->vk_set_count;
     mapping->binding.binding = context->descriptor_binding++;
     mapping->binding.count = 1;
 }
@@ -777,7 +774,6 @@ static HRESULT d3d12_root_signature_init(struct d3d12_root_signature *root_signa
     struct vkd3d_descriptor_set_context context;
     VkDescriptorSetLayoutBinding *binding_desc;
     struct d3d12_root_signature_info info;
-    VkDescriptorSetLayout set_layouts[2];
     HRESULT hr;
 
     memset(&context, 0, sizeof(context));
@@ -787,8 +783,7 @@ static HRESULT d3d12_root_signature_init(struct d3d12_root_signature *root_signa
     root_signature->refcount = 1;
 
     root_signature->vk_pipeline_layout = VK_NULL_HANDLE;
-    root_signature->vk_push_set_layout = VK_NULL_HANDLE;
-    root_signature->vk_set_layout = VK_NULL_HANDLE;
+    root_signature->vk_set_count = 0;
     root_signature->parameters = NULL;
     root_signature->flags = desc->Flags;
     root_signature->descriptor_mapping = NULL;
@@ -839,10 +834,10 @@ static HRESULT d3d12_root_signature_init(struct d3d12_root_signature *root_signa
     {
         if (FAILED(hr = vkd3d_create_descriptor_set_layout(device,
                 VK_DESCRIPTOR_SET_LAYOUT_CREATE_PUSH_DESCRIPTOR_BIT_KHR,
-                context.descriptor_binding, binding_desc, &root_signature->vk_push_set_layout)))
+                context.descriptor_binding, binding_desc, &root_signature->vk_set_layouts[0])))
             goto fail;
+        ++root_signature->vk_set_count;
 
-        set_layouts[context.set_index++] = root_signature->vk_push_set_layout;
         context.current_binding = binding_desc;
         context.descriptor_binding = 0;
     }
@@ -855,21 +850,21 @@ static HRESULT d3d12_root_signature_init(struct d3d12_root_signature *root_signa
     if (FAILED(hr = d3d12_root_signature_init_static_samplers(root_signature, device, desc, &context)))
         goto fail;
 
-    root_signature->main_set = context.set_index;
+    root_signature->main_set = root_signature->vk_set_count;
     if (context.descriptor_binding)
     {
         if (FAILED(hr = vkd3d_create_descriptor_set_layout(device,
-                0, context.descriptor_binding, binding_desc, &root_signature->vk_set_layout)))
+                0, context.descriptor_binding, binding_desc,
+                &root_signature->vk_set_layouts[root_signature->vk_set_count])))
             goto fail;
-
-        set_layouts[context.set_index++] = root_signature->vk_set_layout;
+        ++root_signature->vk_set_count;
     }
     vkd3d_free(binding_desc);
     binding_desc = NULL;
 
-    if (FAILED(hr = vkd3d_create_pipeline_layout(device, context.set_index, set_layouts,
-            root_signature->push_constant_range_count, root_signature->push_constant_ranges,
-            &root_signature->vk_pipeline_layout)))
+    if (FAILED(hr = vkd3d_create_pipeline_layout(device, root_signature->vk_set_count,
+            root_signature->vk_set_layouts, root_signature->push_constant_range_count,
+            root_signature->push_constant_ranges, &root_signature->vk_pipeline_layout)))
         goto fail;
 
     if (FAILED(hr = vkd3d_private_store_init(&root_signature->private_store)))
@@ -1424,9 +1419,9 @@ static HRESULT d3d12_pipeline_state_init_compute_uav_counters(struct d3d12_pipel
         const struct vkd3d_shader_scan_descriptor_info *shader_info)
 {
     const struct vkd3d_vk_device_procs *vk_procs = &device->vk_procs;
-    struct vkd3d_descriptor_set_context context;
+    VkDescriptorSetLayout set_layouts[VKD3D_MAX_DESCRIPTOR_SETS + 1];
     VkDescriptorSetLayoutBinding *binding_desc;
-    VkDescriptorSetLayout set_layouts[3];
+    uint32_t set_index, descriptor_binding;
     unsigned int uav_counter_count = 0;
     unsigned int i, j;
     HRESULT hr;
@@ -1452,11 +1447,9 @@ static HRESULT d3d12_pipeline_state_init_compute_uav_counters(struct d3d12_pipel
     }
     state->uav_counter_count = uav_counter_count;
 
-    memset(&context, 0, sizeof(context));
-    if (root_signature->vk_push_set_layout)
-        set_layouts[context.set_index++] = root_signature->vk_push_set_layout;
-    if (root_signature->vk_set_layout)
-        set_layouts[context.set_index++] = root_signature->vk_set_layout;
+    descriptor_binding = 0;
+    for (set_index = 0; set_index < root_signature->vk_set_count; ++set_index)
+        set_layouts[set_index] = root_signature->vk_set_layouts[set_index];
 
     for (i = 0, j = 0; i < shader_info->descriptor_count; ++i)
     {
@@ -1469,25 +1462,25 @@ static HRESULT d3d12_pipeline_state_init_compute_uav_counters(struct d3d12_pipel
         state->uav_counters[j].register_space = d->register_space;
         state->uav_counters[j].register_index = d->register_index;
         state->uav_counters[j].shader_visibility = VKD3D_SHADER_VISIBILITY_COMPUTE;
-        state->uav_counters[j].binding.set = context.set_index;
-        state->uav_counters[j].binding.binding = context.descriptor_binding;
+        state->uav_counters[j].binding.set = set_index;
+        state->uav_counters[j].binding.binding = descriptor_binding;
         state->uav_counters[j].binding.count = 1;
 
         /* FIXME: For the graphics pipeline we have to take the shader
          * visibility into account. */
-        binding_desc[j].binding = context.descriptor_binding;
+        binding_desc[j].binding = descriptor_binding;
         binding_desc[j].descriptorType = VK_DESCRIPTOR_TYPE_STORAGE_TEXEL_BUFFER;
         binding_desc[j].descriptorCount = 1;
         binding_desc[j].stageFlags = VK_SHADER_STAGE_ALL;
         binding_desc[j].pImmutableSamplers = NULL;
 
-        ++context.descriptor_binding;
+        ++descriptor_binding;
         ++j;
     }
 
     /* Create a descriptor set layout for UAV counters. */
     hr = vkd3d_create_descriptor_set_layout(device,
-            0, context.descriptor_binding, binding_desc, &state->vk_set_layout);
+            0, descriptor_binding, binding_desc, &state->vk_set_layout);
     vkd3d_free(binding_desc);
     if (FAILED(hr))
     {
@@ -1498,9 +1491,9 @@ static HRESULT d3d12_pipeline_state_init_compute_uav_counters(struct d3d12_pipel
     /* Create a pipeline layout which is compatible for all other descriptor
      * sets with the root signature's pipeline layout.
      */
-    state->set_index = context.set_index;
-    set_layouts[context.set_index++] = state->vk_set_layout;
-    if (FAILED(hr = vkd3d_create_pipeline_layout(device, context.set_index, set_layouts,
+    state->set_index = set_index;
+    set_layouts[set_index++] = state->vk_set_layout;
+    if (FAILED(hr = vkd3d_create_pipeline_layout(device, set_index, set_layouts,
             root_signature->push_constant_range_count, root_signature->push_constant_ranges,
             &state->vk_pipeline_layout)))
     {
diff --git a/libs/vkd3d/vkd3d_private.h b/libs/vkd3d/vkd3d_private.h
index b096a8c..b30e38e 100644
--- a/libs/vkd3d/vkd3d_private.h
+++ b/libs/vkd3d/vkd3d_private.h
@@ -54,6 +54,7 @@
 #define VKD3D_MAX_SHADER_EXTENSIONS       1u
 #define VKD3D_MAX_SHADER_STAGES           5u
 #define VKD3D_MAX_VK_SYNC_OBJECTS         4u
+#define VKD3D_MAX_DESCRIPTOR_SETS         2u
 
 struct d3d12_command_list;
 struct d3d12_device;
@@ -699,8 +700,8 @@ struct d3d12_root_signature
     LONG refcount;
 
     VkPipelineLayout vk_pipeline_layout;
-    VkDescriptorSetLayout vk_push_set_layout;
-    VkDescriptorSetLayout vk_set_layout;
+    uint32_t vk_set_count;
+    VkDescriptorSetLayout vk_set_layouts[VKD3D_MAX_DESCRIPTOR_SETS];
 
     struct d3d12_root_parameter *parameters;
     unsigned int parameter_count;
-- 
2.31.0




More information about the wine-devel mailing list