[PATCH vkd3d v2 09/10] vkd3d-shader/hlsl: Use generic variable initializer for struct fields.

Francisco Casas fcasas at codeweavers.com
Mon Jan 10 13:33:17 CST 2022


This adds support for nested structs and implicit casting of initializer
arguments.

Signed-off-by: Francisco Casas <fcasas at codeweavers.com>
---
 libs/vkd3d-shader/hlsl.y | 42 ++++++++--------------------------------
 1 file changed, 8 insertions(+), 34 deletions(-)

diff --git a/libs/vkd3d-shader/hlsl.y b/libs/vkd3d-shader/hlsl.y
index 69ae48a1..6fb4eb78 100644
--- a/libs/vkd3d-shader/hlsl.y
+++ b/libs/vkd3d-shader/hlsl.y
@@ -1326,39 +1326,6 @@ static void numeric_var_initializer(struct hlsl_ctx *ctx, struct hlsl_ir_var *va
     }
 }
 
-static void struct_var_initializer(struct hlsl_ctx *ctx, struct hlsl_ir_var *var,
-        struct parse_initializer *initializer)
-{
-    struct hlsl_type *type = var->data_type;
-    struct hlsl_struct_field *field;
-    unsigned int i = 0;
-
-    LIST_FOR_EACH_ENTRY(field, type->e.elements, struct hlsl_struct_field, entry)
-    {
-        struct hlsl_ir_node *node = initializer->args[i];
-        struct hlsl_ir_store *store;
-        struct hlsl_ir_constant *c;
-
-        if (i++ >= initializer->args_count)
-            break;
-
-        if (hlsl_type_component_count(field->type) == hlsl_type_component_count(node->data_type))
-        {
-            if (!(c = hlsl_new_uint_constant(ctx, field->reg_offset, node->loc)))
-                break;
-            list_add_tail(initializer->instrs, &c->node.entry);
-
-            if (!(store = hlsl_new_store(ctx, var, &c->node, node, 0, node->loc)))
-                break;
-            list_add_tail(initializer->instrs, &store->node.entry);
-        }
-        else
-        {
-            hlsl_fixme(ctx, &node->loc, "Implicit cast in structure initializer.");
-        }
-    }
-}
-
 static void generic_var_initializer(struct hlsl_ctx *ctx, struct hlsl_ir_var *var,
         struct parse_variable_def *v, unsigned int reg_offset, struct hlsl_type *type,
         unsigned int *initializer_i, struct list *instrs)
@@ -1369,7 +1336,14 @@ static void generic_var_initializer(struct hlsl_ctx *ctx, struct hlsl_ir_var *va
     }
     else if (type->type == HLSL_CLASS_STRUCT)
     {
-        struct_var_initializer(ctx, var, &v->initializer);
+        struct hlsl_struct_field *field;
+
+        LIST_FOR_EACH_ENTRY(field, type->e.elements, struct hlsl_struct_field, entry)
+        {
+            generic_var_initializer(ctx, var, v, reg_offset + field->reg_offset, field->type,
+                    initializer_i, instrs);
+        }
+        return;
     }
     else if (type->type == HLSL_CLASS_ARRAY)
     {
-- 
2.25.1




More information about the wine-devel mailing list