[PATCH vkd3d 1/5] vkd3d-shader: Find bindings for descriptor arrays.

Conor McCarthy cmccarthy at codeweavers.com
Fri Jul 9 00:46:49 CDT 2021


Signed-off-by: Conor McCarthy <cmccarthy at codeweavers.com>
---
 libs/vkd3d-shader/spirv.c | 51 +++++++++++++++++++++++++++------------
 tests/d3d12.c             |  1 +
 2 files changed, 36 insertions(+), 16 deletions(-)

diff --git a/libs/vkd3d-shader/spirv.c b/libs/vkd3d-shader/spirv.c
index bd231124..61f0d903 100644
--- a/libs/vkd3d-shader/spirv.c
+++ b/libs/vkd3d-shader/spirv.c
@@ -2460,15 +2460,28 @@ static void VKD3D_PRINTF_FUNC(3, 4) vkd3d_dxbc_compiler_error(struct vkd3d_dxbc_
     compiler->failed = true;
 }
 
+#define RANGE_STRING_SIZE 24
+
+static void register_range_format_string(char range_str[RANGE_STRING_SIZE],
+        const struct vkd3d_shader_register_range *range)
+{
+    if (range->last != ~0u)
+        sprintf(range_str, "[%u:%u]", range->first, range->last);
+    else
+        sprintf(range_str, "[%u:*]", range->first);
+}
+
 static struct vkd3d_shader_descriptor_binding vkd3d_dxbc_compiler_get_descriptor_binding(
         struct vkd3d_dxbc_compiler *compiler, const struct vkd3d_shader_register *reg,
         const struct vkd3d_shader_register_range *range, enum vkd3d_shader_resource_type resource_type,
-        bool is_uav_counter)
+        bool is_uav_counter, unsigned int *binding_base_idx)
 {
     const struct vkd3d_shader_interface_info *shader_interface = &compiler->shader_interface;
+    unsigned int register_last = (range->last == ~0u) ? range->first : range->last;
     enum vkd3d_shader_descriptor_type descriptor_type;
     enum vkd3d_shader_binding_flag resource_type_flag;
     struct vkd3d_shader_descriptor_binding binding;
+    char range_str[RANGE_STRING_SIZE];
     unsigned int i;
 
     if (reg->type == VKD3DSPR_CONSTBUFFER)
@@ -2519,6 +2532,7 @@ static struct vkd3d_shader_descriptor_binding vkd3d_dxbc_compiler_get_descriptor
                         range->first, range->space, current->binding.count);
             }
 
+            *binding_base_idx = current->register_index;
             return current->binding;
         }
         if (shader_interface->uav_counter_count)
@@ -2541,31 +2555,26 @@ static struct vkd3d_shader_descriptor_binding vkd3d_dxbc_compiler_get_descriptor
                 continue;
 
             if (current->type != descriptor_type || current->register_space != range->space
-                    || current->register_index != range->first)
+                    || current->register_index > range->first
+                    || current->binding.count <= register_last - current->register_index)
                 continue;
 
-            if (current->binding.count != 1)
-            {
-                FIXME("Descriptor arrays are not supported.\n");
-                vkd3d_dxbc_compiler_error(compiler, VKD3D_SHADER_ERROR_SPV_INVALID_DESCRIPTOR_BINDING,
-                        "Descriptor binding for type %#x, space %u, register %u, "
-                        "shader type %#x has unsupported ‘count’ %u.",
-                        descriptor_type, range->space, range->first, compiler->shader_type, current->binding.count);
-            }
-
+            *binding_base_idx = current->register_index;
             return current->binding;
         }
         if (shader_interface->binding_count)
         {
-            FIXME("Could not find binding for type %#x, space %u, register %u, shader type %#x.\n",
-                    descriptor_type, range->space, range->first, compiler->shader_type);
+            register_range_format_string(range_str, range);
+            FIXME("Could not find descriptor binding for type %#x, space %u, registers %s, shader type %#x.\n",
+                    descriptor_type, range->space, range_str, compiler->shader_type);
             vkd3d_dxbc_compiler_error(compiler, VKD3D_SHADER_ERROR_SPV_DESCRIPTOR_BINDING_NOT_FOUND,
-                    "Could not find descriptor binding for type %#x, space %u, register %u, shader type %#x.",
-                    descriptor_type, range->space, range->first, compiler->shader_type);
+                    "Could not find descriptor binding for type %#x, space %u, registers %s, shader type %#x.",
+                    descriptor_type, range->space, range_str, compiler->shader_type);
         }
     }
 
 done:
+    *binding_base_idx = range->first;
     binding.set = 0;
     binding.count = 1;
     binding.binding = compiler->binding_idx++;
@@ -2586,8 +2595,18 @@ static void vkd3d_dxbc_compiler_emit_descriptor_binding_for_reg(struct vkd3d_dxb
         enum vkd3d_shader_resource_type resource_type, bool is_uav_counter)
 {
     struct vkd3d_shader_descriptor_binding binding;
+    unsigned int binding_base_idx;
 
-    binding = vkd3d_dxbc_compiler_get_descriptor_binding(compiler, reg, range, resource_type, is_uav_counter);
+    binding = vkd3d_dxbc_compiler_get_descriptor_binding(compiler, reg, range,
+            resource_type, is_uav_counter, &binding_base_idx);
+    if (binding_base_idx != range->first)
+    {
+        FIXME("Descriptor arrays are not supported.\n");
+        vkd3d_dxbc_compiler_error(compiler, VKD3D_SHADER_ERROR_SPV_INVALID_DESCRIPTOR_BINDING,
+                "Descriptor binding for type %#x, space %u, register %u, "
+                "shader type %#x has unsupported base index %u.",
+                reg->type, range->space, range->first, compiler->shader_type, binding_base_idx);
+    }
     vkd3d_dxbc_compiler_emit_descriptor_binding(compiler, variable_id, &binding);
 }
 
diff --git a/tests/d3d12.c b/tests/d3d12.c
index 4397c063..424a57cf 100644
--- a/tests/d3d12.c
+++ b/tests/d3d12.c
@@ -33996,6 +33996,7 @@ static void test_resource_arrays(void)
                 get_cpu_descriptor_handle(&context, heap, ARRAY_SIZE(input_buffers) + i));
     }
 
+    todo
     context.pipeline_state = create_compute_pipeline_state(device, context.root_signature,
             shader_bytecode(cs_code, sizeof(cs_code)));
     if (!context.pipeline_state)
-- 
2.31.1




More information about the wine-devel mailing list