[PATCH vkd3d v2 1/4] vkd3d: Resolve D3D12_DESCRIPTOR_RANGE_OFFSET_APPEND during table parsing.

Conor McCarthy cmccarthy at codeweavers.com
Thu Jun 3 00:04:04 CDT 2021


Simplifies the code path for handling array bindings and unbounded
ranges.

Signed-off-by: Conor McCarthy <cmccarthy at codeweavers.com>
---
 libs/vkd3d/command.c |  6 +-----
 libs/vkd3d/state.c   | 25 ++++++++++++++++++++-----
 2 files changed, 21 insertions(+), 10 deletions(-)

diff --git a/libs/vkd3d/command.c b/libs/vkd3d/command.c
index 116a8a62..06d7746d 100644
--- a/libs/vkd3d/command.c
+++ b/libs/vkd3d/command.c
@@ -2674,7 +2674,6 @@ static void d3d12_command_list_update_descriptor_table(struct d3d12_command_list
 
     descriptor_table = root_signature_get_descriptor_table(root_signature, index);
 
-    descriptor = base_descriptor;
     descriptor_count = 0;
     current_descriptor_write = descriptor_writes;
     current_image_info = image_infos;
@@ -2682,10 +2681,7 @@ static void d3d12_command_list_update_descriptor_table(struct d3d12_command_list
     {
         range = &descriptor_table->ranges[i];
 
-        if (range->offset != D3D12_DESCRIPTOR_RANGE_OFFSET_APPEND)
-        {
-            descriptor = base_descriptor + range->offset;
-        }
+        descriptor = base_descriptor + range->offset;
 
         for (j = 0; j < range->descriptor_count; ++j, ++descriptor)
         {
diff --git a/libs/vkd3d/state.c b/libs/vkd3d/state.c
index e459c998..d07212f6 100644
--- a/libs/vkd3d/state.c
+++ b/libs/vkd3d/state.c
@@ -591,6 +591,8 @@ static HRESULT d3d12_root_signature_init_root_descriptor_tables(struct d3d12_roo
     for (i = 0; i < desc->NumParameters; ++i)
     {
         const D3D12_ROOT_PARAMETER *p = &desc->pParameters[i];
+        unsigned int offset = 0;
+
         if (p->ParameterType != D3D12_ROOT_PARAMETER_TYPE_DESCRIPTOR_TABLE)
             continue;
 
@@ -608,6 +610,24 @@ static HRESULT d3d12_root_signature_init_root_descriptor_tables(struct d3d12_roo
         {
             range = &p->u.DescriptorTable.pDescriptorRanges[j];
 
+            if (range->OffsetInDescriptorsFromTableStart != D3D12_DESCRIPTOR_RANGE_OFFSET_APPEND)
+                offset = range->OffsetInDescriptorsFromTableStart;
+
+            table->ranges[j].offset = offset;
+            table->ranges[j].descriptor_count = range->NumDescriptors;
+            table->ranges[j].descriptor_magic = vkd3d_descriptor_magic_from_d3d12(range->RangeType);
+            table->ranges[j].register_space = range->RegisterSpace;
+            table->ranges[j].base_register_idx = range->BaseShaderRegister;
+
+            TRACE("Descriptor table range %u.%u, offset %u, type %u, count %d.\n", i, j,
+                    offset, range->RangeType, range->NumDescriptors);
+
+            /* Validation during counting ensures this value is never used if range->NumDescriptors == UINT_MAX. */
+            offset += range->NumDescriptors;
+        }
+
+        for (j = 0; j < range_count; ++j)
+        {
             vk_binding = d3d12_root_signature_assign_vk_bindings(root_signature,
                     vkd3d_descriptor_type_from_d3d12_range_type(range->RangeType),
                     range->RegisterSpace, range->BaseShaderRegister, range->NumDescriptors, false, true,
@@ -638,12 +658,7 @@ static HRESULT d3d12_root_signature_init_root_descriptor_tables(struct d3d12_roo
                 ++cur_binding;
             }
 
-            table->ranges[j].offset = range->OffsetInDescriptorsFromTableStart;
-            table->ranges[j].descriptor_count = range->NumDescriptors;
             table->ranges[j].binding = vk_binding;
-            table->ranges[j].descriptor_magic = vkd3d_descriptor_magic_from_d3d12(range->RangeType);
-            table->ranges[j].register_space = range->RegisterSpace;
-            table->ranges[j].base_register_idx = range->BaseShaderRegister;
         }
     }
 
-- 
2.31.1




More information about the wine-devel mailing list