Henri Verbeet : vkd3d-shader: Handle "mixed" data in vkd3d_shader_scan_typed_resource_declaration().

Alexandre Julliard julliard at winehq.org
Mon Feb 28 15:48:38 CST 2022


Module: vkd3d
Branch: master
Commit: 2a14718fe57b25fa5238ac0264b7f35681248f3f
URL:    https://source.winehq.org/git/vkd3d.git/?a=commit;h=2a14718fe57b25fa5238ac0264b7f35681248f3f

Author: Henri Verbeet <hverbeet at codeweavers.com>
Date:   Mon Feb 28 12:23:46 2022 +0100

vkd3d-shader: Handle "mixed" data in vkd3d_shader_scan_typed_resource_declaration().

Signed-off-by: Henri Verbeet <hverbeet at codeweavers.com>
Signed-off-by: Alexandre Julliard <julliard at winehq.org>

---

 include/vkd3d_shader.h                | 14 ++++++++------
 libs/vkd3d-shader/vkd3d_shader_main.c | 25 +++++++++++++++++++++++++
 2 files changed, 33 insertions(+), 6 deletions(-)

diff --git a/include/vkd3d_shader.h b/include/vkd3d_shader.h
index fece054..1576411 100644
--- a/include/vkd3d_shader.h
+++ b/include/vkd3d_shader.h
@@ -1197,15 +1197,17 @@ enum vkd3d_shader_resource_type
 enum vkd3d_shader_resource_data_type
 {
     /** Unsigned normalized integer. */
-    VKD3D_SHADER_RESOURCE_DATA_UNORM = 0x1,
+    VKD3D_SHADER_RESOURCE_DATA_UNORM     = 0x1,
     /** Signed normalized integer. */
-    VKD3D_SHADER_RESOURCE_DATA_SNORM = 0x2,
+    VKD3D_SHADER_RESOURCE_DATA_SNORM     = 0x2,
     /** Signed integer. */
-    VKD3D_SHADER_RESOURCE_DATA_INT   = 0x3,
+    VKD3D_SHADER_RESOURCE_DATA_INT       = 0x3,
     /** Unsigned integer. */
-    VKD3D_SHADER_RESOURCE_DATA_UINT  = 0x4,
-    /** IEEE floating-point. */
-    VKD3D_SHADER_RESOURCE_DATA_FLOAT = 0x5,
+    VKD3D_SHADER_RESOURCE_DATA_UINT      = 0x4,
+    /** IEEE single-precision floating-point. */
+    VKD3D_SHADER_RESOURCE_DATA_FLOAT     = 0x5,
+    /** Undefined/type-less. \since 1.3 */
+    VKD3D_SHADER_RESOURCE_DATA_MIXED     = 0x6,
 
     VKD3D_FORCE_32_BIT_ENUM(VKD3D_SHADER_RESOURCE_DATA_TYPE),
 };
diff --git a/libs/vkd3d-shader/vkd3d_shader_main.c b/libs/vkd3d-shader/vkd3d_shader_main.c
index a25e28a..298289c 100644
--- a/libs/vkd3d-shader/vkd3d_shader_main.c
+++ b/libs/vkd3d-shader/vkd3d_shader_main.c
@@ -477,6 +477,8 @@ struct vkd3d_shader_scan_context
     } *uav_ranges;
     size_t uav_ranges_size;
     size_t uav_range_count;
+
+    enum vkd3d_shader_api_version api_version;
 };
 
 static void vkd3d_shader_scan_context_init(struct vkd3d_shader_scan_context *context,
@@ -484,11 +486,22 @@ static void vkd3d_shader_scan_context_init(struct vkd3d_shader_scan_context *con
         struct vkd3d_shader_scan_descriptor_info *scan_descriptor_info,
         struct vkd3d_shader_message_context *message_context)
 {
+    unsigned int i;
+
     memset(context, 0, sizeof(*context));
     context->scan_descriptor_info = scan_descriptor_info;
     context->message_context = message_context;
     context->location.source_name = compile_info->source_name;
     context->location.line = 2; /* Line 1 is the version token. */
+    context->api_version = VKD3D_SHADER_API_VERSION_1_2;
+
+    for (i = 0; i < compile_info->option_count; ++i)
+    {
+        const struct vkd3d_shader_compile_option *option = &compile_info->options[i];
+
+        if (option->name == VKD3D_SHADER_COMPILE_OPTION_API_VERSION)
+            context->api_version = option->value;
+    }
 }
 
 static void vkd3d_shader_scan_context_cleanup(struct vkd3d_shader_scan_context *context)
@@ -741,11 +754,23 @@ static void vkd3d_shader_scan_typed_resource_declaration(struct vkd3d_shader_sca
         case VKD3D_DATA_FLOAT:
             resource_data_type = VKD3D_SHADER_RESOURCE_DATA_FLOAT;
             break;
+        case VKD3D_DATA_MIXED:
+            resource_data_type = VKD3D_SHADER_RESOURCE_DATA_MIXED;
+            break;
         default:
             ERR("Invalid resource data type %#x.\n", semantic->resource_data_type[0]);
             resource_data_type = VKD3D_SHADER_RESOURCE_DATA_FLOAT;
             break;
     }
+
+    if (context->api_version < VKD3D_SHADER_API_VERSION_1_3
+            && resource_data_type >= VKD3D_SHADER_RESOURCE_DATA_MIXED)
+    {
+        ERR("Invalid resource data type %#x for API version %#x.\n",
+                semantic->resource_data_type[0], context->api_version);
+        resource_data_type = VKD3D_SHADER_RESOURCE_DATA_FLOAT;
+    }
+
     vkd3d_shader_scan_resource_declaration(context, &semantic->resource,
             semantic->resource_type, resource_data_type);
 }




More information about the wine-cvs mailing list