[PATCH vkd3d 2/5] vkd3d-shader: Report descriptor resource types in vkd3d_shader_scan_dxbc().

Henri Verbeet hverbeet at codeweavers.com
Thu Jun 25 01:18:25 CDT 2020


Signed-off-by: Henri Verbeet <hverbeet at codeweavers.com>
---
 include/vkd3d_shader.h                   | 30 +++++++++++++++++++++
 libs/vkd3d-shader/vkd3d_shader_main.c    | 45 ++++++++++++++++++++++++++------
 libs/vkd3d-shader/vkd3d_shader_private.h | 15 -----------
 3 files changed, 67 insertions(+), 23 deletions(-)

diff --git a/include/vkd3d_shader.h b/include/vkd3d_shader.h
index b2fa499..ea1944e 100644
--- a/include/vkd3d_shader.h
+++ b/include/vkd3d_shader.h
@@ -585,11 +585,41 @@ struct vkd3d_versioned_root_signature_desc
 /* FIXME: Add support for 64 UAV bind slots. */
 #define VKD3D_SHADER_MAX_UNORDERED_ACCESS_VIEWS 8
 
+enum vkd3d_shader_resource_type
+{
+    VKD3D_SHADER_RESOURCE_NONE              = 0x0,
+    VKD3D_SHADER_RESOURCE_BUFFER            = 0x1,
+    VKD3D_SHADER_RESOURCE_TEXTURE_1D        = 0x2,
+    VKD3D_SHADER_RESOURCE_TEXTURE_2D        = 0x3,
+    VKD3D_SHADER_RESOURCE_TEXTURE_2DMS      = 0x4,
+    VKD3D_SHADER_RESOURCE_TEXTURE_3D        = 0x5,
+    VKD3D_SHADER_RESOURCE_TEXTURE_CUBE      = 0x6,
+    VKD3D_SHADER_RESOURCE_TEXTURE_1DARRAY   = 0x7,
+    VKD3D_SHADER_RESOURCE_TEXTURE_2DARRAY   = 0x8,
+    VKD3D_SHADER_RESOURCE_TEXTURE_2DMSARRAY = 0x9,
+    VKD3D_SHADER_RESOURCE_TEXTURE_CUBEARRAY = 0xa,
+
+    VKD3D_FORCE_32_BIT_ENUM(VKD3D_SHADER_RESOURCE_TYPE),
+};
+
+enum vkd3d_shader_resource_data_type
+{
+    VKD3D_SHADER_RESOURCE_DATA_UNORM = 0x1,
+    VKD3D_SHADER_RESOURCE_DATA_SNORM = 0x2,
+    VKD3D_SHADER_RESOURCE_DATA_INT   = 0x3,
+    VKD3D_SHADER_RESOURCE_DATA_UINT  = 0x4,
+    VKD3D_SHADER_RESOURCE_DATA_FLOAT = 0x5,
+
+    VKD3D_FORCE_32_BIT_ENUM(VKD3D_SHADER_RESOURCE_DATA_TYPE),
+};
+
 struct vkd3d_shader_descriptor_info
 {
     enum vkd3d_shader_descriptor_type type;
     unsigned int register_space;
     unsigned int register_index;
+    enum vkd3d_shader_resource_type resource_type;
+    enum vkd3d_shader_resource_data_type resource_data_type;
     unsigned int count;
 };
 
diff --git a/libs/vkd3d-shader/vkd3d_shader_main.c b/libs/vkd3d-shader/vkd3d_shader_main.c
index 45a7a80..aa401d0 100644
--- a/libs/vkd3d-shader/vkd3d_shader_main.c
+++ b/libs/vkd3d-shader/vkd3d_shader_main.c
@@ -229,7 +229,8 @@ static void vkd3d_shader_scan_record_uav_counter(struct vkd3d_shader_scan_info *
 }
 
 static bool vkd3d_shader_scan_add_descriptor(struct vkd3d_shader_scan_context *context,
-        enum vkd3d_shader_descriptor_type type, unsigned int register_space, unsigned int register_index)
+        enum vkd3d_shader_descriptor_type type, unsigned int register_space, unsigned int register_index,
+        enum vkd3d_shader_resource_type resource_type, enum vkd3d_shader_resource_data_type resource_data_type)
 {
     struct vkd3d_shader_scan_info *scan_info = context->scan_info;
     struct vkd3d_shader_descriptor_info *d;
@@ -245,6 +246,8 @@ static bool vkd3d_shader_scan_add_descriptor(struct vkd3d_shader_scan_context *c
     d->type = type;
     d->register_space = register_space;
     d->register_index = register_index;
+    d->resource_type = resource_type;
+    d->resource_data_type = resource_data_type;
     d->count = 1;
     ++scan_info->descriptor_count;
 
@@ -256,8 +259,8 @@ static void vkd3d_shader_scan_constant_buffer_declaration(struct vkd3d_shader_sc
 {
     const struct vkd3d_shader_constant_buffer *cb = &instruction->declaration.cb;
 
-    vkd3d_shader_scan_add_descriptor(context, VKD3D_SHADER_DESCRIPTOR_TYPE_CBV,
-            cb->register_space, cb->register_index);
+    vkd3d_shader_scan_add_descriptor(context, VKD3D_SHADER_DESCRIPTOR_TYPE_CBV, cb->register_space,
+            cb->register_index, VKD3D_SHADER_RESOURCE_BUFFER, VKD3D_SHADER_RESOURCE_DATA_UINT);
 }
 
 static void vkd3d_shader_scan_input_declaration(struct vkd3d_shader_scan_info *scan_info,
@@ -282,21 +285,45 @@ static void vkd3d_shader_scan_sampler_declaration(struct vkd3d_shader_scan_conte
         scan_info->sampler_comparison_mode_mask |= 1u << sampler_index;
     }
 
-    vkd3d_shader_scan_add_descriptor(context, VKD3D_SHADER_DESCRIPTOR_TYPE_SAMPLER,
-            sampler->register_space, sampler->register_index);
+    vkd3d_shader_scan_add_descriptor(context, VKD3D_SHADER_DESCRIPTOR_TYPE_SAMPLER, sampler->register_space,
+            sampler->register_index, VKD3D_SHADER_RESOURCE_NONE, VKD3D_SHADER_RESOURCE_DATA_UINT);
 }
 
 static void vkd3d_shader_scan_resource_declaration(struct vkd3d_shader_scan_context *context,
         const struct vkd3d_shader_instruction *instruction)
 {
     const struct vkd3d_shader_semantic *semantic = &instruction->declaration.semantic;
+    enum vkd3d_shader_resource_data_type resource_data_type;
     enum vkd3d_shader_descriptor_type type;
 
     if (semantic->reg.reg.type == VKD3DSPR_UAV)
         type = VKD3D_SHADER_DESCRIPTOR_TYPE_UAV;
     else
         type = VKD3D_SHADER_DESCRIPTOR_TYPE_SRV;
-    vkd3d_shader_scan_add_descriptor(context, type, semantic->register_space, semantic->register_index);
+    switch (semantic->resource_data_type)
+    {
+        case VKD3D_DATA_UNORM:
+            resource_data_type = VKD3D_SHADER_RESOURCE_DATA_UNORM;
+            break;
+        case VKD3D_DATA_SNORM:
+            resource_data_type = VKD3D_SHADER_RESOURCE_DATA_SNORM;
+            break;
+        case VKD3D_DATA_INT:
+            resource_data_type = VKD3D_SHADER_RESOURCE_DATA_INT;
+            break;
+        case VKD3D_DATA_UINT:
+            resource_data_type = VKD3D_SHADER_RESOURCE_DATA_UINT;
+            break;
+        case VKD3D_DATA_FLOAT:
+            resource_data_type = VKD3D_SHADER_RESOURCE_DATA_FLOAT;
+            break;
+        default:
+            ERR("Invalid resource data type %#x.\n", semantic->resource_data_type);
+            resource_data_type = VKD3D_SHADER_RESOURCE_DATA_FLOAT;
+            break;
+    }
+    vkd3d_shader_scan_add_descriptor(context, type, semantic->register_space,
+            semantic->register_index, semantic->resource_type, resource_data_type);
 }
 
 static void vkd3d_shader_scan_resource_declaration_raw(struct vkd3d_shader_scan_context *context,
@@ -309,7 +336,8 @@ static void vkd3d_shader_scan_resource_declaration_raw(struct vkd3d_shader_scan_
         type = VKD3D_SHADER_DESCRIPTOR_TYPE_UAV;
     else
         type = VKD3D_SHADER_DESCRIPTOR_TYPE_SRV;
-    vkd3d_shader_scan_add_descriptor(context, type, resource->register_space, resource->register_index);
+    vkd3d_shader_scan_add_descriptor(context, type, resource->register_space,
+            resource->register_index, VKD3D_SHADER_RESOURCE_BUFFER, VKD3D_SHADER_RESOURCE_DATA_UINT);
 }
 
 static void vkd3d_shader_scan_resource_declaration_structured(struct vkd3d_shader_scan_context *context,
@@ -322,7 +350,8 @@ static void vkd3d_shader_scan_resource_declaration_structured(struct vkd3d_shade
         type = VKD3D_SHADER_DESCRIPTOR_TYPE_UAV;
     else
         type = VKD3D_SHADER_DESCRIPTOR_TYPE_SRV;
-    vkd3d_shader_scan_add_descriptor(context, type, resource->register_space, resource->register_index);
+    vkd3d_shader_scan_add_descriptor(context, type, resource->register_space,
+            resource->register_index, VKD3D_SHADER_RESOURCE_BUFFER, VKD3D_SHADER_RESOURCE_DATA_UINT);
 }
 
 static void vkd3d_shader_scan_instruction(struct vkd3d_shader_scan_context *context,
diff --git a/libs/vkd3d-shader/vkd3d_shader_private.h b/libs/vkd3d-shader/vkd3d_shader_private.h
index dfbbdfd..a9a0c52 100644
--- a/libs/vkd3d-shader/vkd3d_shader_private.h
+++ b/libs/vkd3d-shader/vkd3d_shader_private.h
@@ -361,21 +361,6 @@ enum vkd3d_shader_register_type
     VKD3DSPR_INVALID = ~0u,
 };
 
-enum vkd3d_shader_resource_type
-{
-    VKD3D_SHADER_RESOURCE_NONE,
-    VKD3D_SHADER_RESOURCE_BUFFER,
-    VKD3D_SHADER_RESOURCE_TEXTURE_1D,
-    VKD3D_SHADER_RESOURCE_TEXTURE_2D,
-    VKD3D_SHADER_RESOURCE_TEXTURE_2DMS,
-    VKD3D_SHADER_RESOURCE_TEXTURE_3D,
-    VKD3D_SHADER_RESOURCE_TEXTURE_CUBE,
-    VKD3D_SHADER_RESOURCE_TEXTURE_1DARRAY,
-    VKD3D_SHADER_RESOURCE_TEXTURE_2DARRAY,
-    VKD3D_SHADER_RESOURCE_TEXTURE_2DMSARRAY,
-    VKD3D_SHADER_RESOURCE_TEXTURE_CUBEARRAY,
-};
-
 enum vkd3d_data_type
 {
     VKD3D_DATA_FLOAT,
-- 
2.11.0




More information about the wine-devel mailing list