[PATCH vkd3d 2/2] vkd3d-shader: Store a validity flag in struct vkd3d_sm4_data.

Conor McCarthy cmccarthy at codeweavers.com
Tue Jun 29 22:10:53 CDT 2021


Signed-off-by: Conor McCarthy <cmccarthy at codeweavers.com>
---
 libs/vkd3d-shader/dxbc.c                 | 17 +++++++++++------
 libs/vkd3d-shader/trace.c                | 15 +++++++++++----
 libs/vkd3d-shader/vkd3d_shader_main.c    | 10 ++++------
 libs/vkd3d-shader/vkd3d_shader_private.h |  2 +-
 4 files changed, 27 insertions(+), 17 deletions(-)

diff --git a/libs/vkd3d-shader/dxbc.c b/libs/vkd3d-shader/dxbc.c
index e3a8351e..8aea7525 100644
--- a/libs/vkd3d-shader/dxbc.c
+++ b/libs/vkd3d-shader/dxbc.c
@@ -491,6 +491,7 @@ struct vkd3d_sm4_data
     struct vkd3d_shader_immediate_constant_buffer icb;
 
     struct vkd3d_shader_message_context *message_context;
+    bool valid;
 };
 
 struct vkd3d_sm4_opcode_info
@@ -571,6 +572,8 @@ static void VKD3D_PRINTF_FUNC(3, 4) shader_read_error(struct vkd3d_sm4_data *pri
     va_start(args, format);
     vkd3d_shader_verror(priv->message_context, NULL, error, format, args);
     va_end(args);
+
+    priv->valid = false;
 }
 
 static bool shader_sm4_read_src_param(struct vkd3d_sm4_data *priv, const DWORD **ptr, const DWORD *end,
@@ -1441,6 +1444,7 @@ void *shader_sm4_init(const DWORD *byte_code, size_t byte_code_size,
     list_init(&priv->src);
 
     priv->message_context = message_context;
+    priv->valid = true;
 
     return priv;
 }
@@ -1878,7 +1882,7 @@ static void shader_sm4_read_instruction_modifier(DWORD modifier, struct vkd3d_sh
     }
 }
 
-void shader_sm4_read_instruction(void *data, const DWORD **ptr, struct vkd3d_shader_instruction *ins)
+bool shader_sm4_read_instruction(void *data, const DWORD **ptr, struct vkd3d_shader_instruction *ins)
 {
     const struct vkd3d_sm4_opcode_info *opcode_info;
     DWORD opcode_token, opcode, previous_token;
@@ -1922,7 +1926,7 @@ void shader_sm4_read_instruction(void *data, const DWORD **ptr, struct vkd3d_sha
         FIXME("Unrecognized opcode %#x, opcode_token 0x%08x.\n", opcode, opcode_token);
         ins->handler_idx = VKD3DSIH_INVALID;
         *ptr += len;
-        return;
+        return false;
     }
 
     ins->handler_idx = opcode_info->handler_idx;
@@ -1949,6 +1953,7 @@ void shader_sm4_read_instruction(void *data, const DWORD **ptr, struct vkd3d_sha
     if (opcode_info->read_opcode_func)
     {
         opcode_info->read_opcode_func(ins, opcode, opcode_token, p, len, priv);
+        return priv->valid;
     }
     else
     {
@@ -1973,7 +1978,7 @@ void shader_sm4_read_instruction(void *data, const DWORD **ptr, struct vkd3d_sha
                     &priv->dst_param[i])))
             {
                 ins->handler_idx = VKD3DSIH_INVALID;
-                return;
+                return false;
             }
             priv->dst_param[i].modifiers |= instruction_dst_modifier;
         }
@@ -1984,17 +1989,17 @@ void shader_sm4_read_instruction(void *data, const DWORD **ptr, struct vkd3d_sha
                     &priv->src_param[i])))
             {
                 ins->handler_idx = VKD3DSIH_INVALID;
-                return;
+                return false;
             }
         }
     }
 
-    return;
+    return true;
 
 fail:
     *ptr = priv->end;
     ins->handler_idx = VKD3DSIH_INVALID;
-    return;
+    return false;
 }
 
 bool shader_sm4_is_end(void *data, const DWORD **ptr)
diff --git a/libs/vkd3d-shader/trace.c b/libs/vkd3d-shader/trace.c
index 2d16714b..5a766f65 100644
--- a/libs/vkd3d-shader/trace.c
+++ b/libs/vkd3d-shader/trace.c
@@ -1751,11 +1751,18 @@ enum vkd3d_result vkd3d_dxbc_binary_to_text(void *data,
     {
         struct vkd3d_shader_instruction ins;
 
-        shader_sm4_read_instruction(data, &ptr, &ins);
-        if (ins.handler_idx == VKD3DSIH_INVALID)
+        if (!shader_sm4_read_instruction(data, &ptr, &ins))
         {
-            WARN("Skipping unrecognized instruction.\n");
-            vkd3d_string_buffer_printf(buffer, "<unrecognized instruction>\n");
+            if (ins.handler_idx == VKD3DSIH_INVALID)
+            {
+                WARN("Skipping unrecognized instruction.\n");
+                vkd3d_string_buffer_printf(buffer, "<unrecognized instruction>\n");
+            }
+            else
+            {
+                WARN("Skipping invalid instruction.\n");
+                vkd3d_string_buffer_printf(buffer, "<invalid instruction>\n");
+            }
             result = VKD3D_ERROR;
             continue;
         }
diff --git a/libs/vkd3d-shader/vkd3d_shader_main.c b/libs/vkd3d-shader/vkd3d_shader_main.c
index 54654f3f..3e5bab35 100644
--- a/libs/vkd3d-shader/vkd3d_shader_main.c
+++ b/libs/vkd3d-shader/vkd3d_shader_main.c
@@ -919,9 +919,8 @@ static int scan_dxbc(const struct vkd3d_shader_compile_info *compile_info,
 
     while (!shader_sm4_is_end(parser.data, &parser.ptr))
     {
-        shader_sm4_read_instruction(parser.data, &parser.ptr, &instruction);
-
-        if (instruction.handler_idx == VKD3DSIH_INVALID)
+        if (!shader_sm4_read_instruction(parser.data, &parser.ptr, &instruction)
+                || instruction.handler_idx == VKD3DSIH_INVALID)
         {
             WARN("Encountered unrecognized or invalid instruction.\n");
             if (scan_descriptor_info)
@@ -1015,9 +1014,8 @@ static int compile_dxbc_tpf(const struct vkd3d_shader_compile_info *compile_info
 
     while (!shader_sm4_is_end(parser.data, &parser.ptr))
     {
-        shader_sm4_read_instruction(parser.data, &parser.ptr, &instruction);
-
-        if (instruction.handler_idx == VKD3DSIH_INVALID)
+        if (!shader_sm4_read_instruction(parser.data, &parser.ptr, &instruction)
+                || instruction.handler_idx == VKD3DSIH_INVALID)
         {
             WARN("Encountered unrecognized or invalid instruction.\n");
             ret = VKD3D_ERROR_INVALID_SHADER;
diff --git a/libs/vkd3d-shader/vkd3d_shader_private.h b/libs/vkd3d-shader/vkd3d_shader_private.h
index 5e107a6b..dec2d656 100644
--- a/libs/vkd3d-shader/vkd3d_shader_private.h
+++ b/libs/vkd3d-shader/vkd3d_shader_private.h
@@ -870,7 +870,7 @@ void *shader_sm4_init(const DWORD *byte_code, size_t byte_code_size,
 void shader_sm4_free(void *data) DECLSPEC_HIDDEN;
 void shader_sm4_read_header(void *data, const DWORD **ptr,
         struct vkd3d_shader_version *shader_version) DECLSPEC_HIDDEN;
-void shader_sm4_read_instruction(void *data, const DWORD **ptr,
+bool shader_sm4_read_instruction(void *data, const DWORD **ptr,
         struct vkd3d_shader_instruction *ins) DECLSPEC_HIDDEN;
 bool shader_sm4_is_end(void *data, const DWORD **ptr) DECLSPEC_HIDDEN;
 
-- 
2.31.1




More information about the wine-devel mailing list