[PATCH vkd3d 07/11] vkd3d-shader/hlsl: Support complex numeric initializers.

Giovanni Mascellani gmascellani at codeweavers.com
Thu Apr 14 05:52:38 CDT 2022


From: Francisco Casas <fcasas at codeweavers.com>

Signed-off-by: Francisco Casas <fcasas at codeweavers.com>
Signed-off-by: Giovanni Mascellani <gmascellani at codeweavers.com>
---
 libs/vkd3d-shader/hlsl.y                   | 47 ++++++++++++++++++++--
 tests/hlsl-initializer-flatten.shader_test |  4 +-
 tests/hlsl-initializer-nested.shader_test  |  2 +-
 tests/hlsl-initializer-numeric.shader_test |  8 ++--
 4 files changed, 50 insertions(+), 11 deletions(-)

diff --git a/libs/vkd3d-shader/hlsl.y b/libs/vkd3d-shader/hlsl.y
index f0a74826..58d71ff6 100644
--- a/libs/vkd3d-shader/hlsl.y
+++ b/libs/vkd3d-shader/hlsl.y
@@ -1447,6 +1447,39 @@ static bool add_increment(struct hlsl_ctx *ctx, struct list *instrs, bool decrem
     return true;
 }
 
+static void initialize_numeric_var(struct hlsl_ctx *ctx, struct hlsl_ir_var *var,
+        struct parse_initializer *initializer, unsigned int reg_offset, struct hlsl_type *type,
+        unsigned int *initializer_offset)
+{
+    unsigned int i;
+
+    if (type->type == HLSL_CLASS_MATRIX)
+        hlsl_fixme(ctx, &var->loc, "Matrix initializer.");
+
+    for (i = 0; i < type->dimx; i++)
+    {
+        struct hlsl_ir_store *store;
+        struct hlsl_ir_constant *c;
+        struct hlsl_ir_node *node;
+
+        node = initializer->args[*initializer_offset];
+        *initializer_offset += 1;
+
+        if (!(node = add_implicit_conversion(ctx, initializer->instrs, node,
+                hlsl_get_scalar_type(ctx, type->base_type), &node->loc)))
+            return;
+
+        if (!(c = hlsl_new_uint_constant(ctx, reg_offset + i, &node->loc)))
+            return;
+        list_add_tail(initializer->instrs, &c->node.entry);
+
+        if (!(store = hlsl_new_store(ctx, var, &c->node, node, 0, node->loc)))
+            return;
+
+        list_add_tail(initializer->instrs, &store->node.entry);
+    }
+}
+
 static void struct_var_initializer(struct hlsl_ctx *ctx, struct hlsl_ir_var *var,
         struct parse_initializer *initializer)
 {
@@ -1612,6 +1645,7 @@ static struct list *declare_vars(struct hlsl_ctx *ctx, struct hlsl_type *basic_t
             if (v->initializer.braces)
             {
                 unsigned int size = initializer_size(&v->initializer);
+                unsigned int initializer_offset = 0;
 
                 if (type->type <= HLSL_CLASS_LAST_NUMERIC && type->dimx * type->dimy != size)
                 {
@@ -1647,10 +1681,15 @@ static struct list *declare_vars(struct hlsl_ctx *ctx, struct hlsl_type *basic_t
                 }
                 else
                 {
-                    hlsl_fixme(ctx, &v->loc, "Complex initializer.");
-                    free_parse_initializer(&v->initializer);
-                    vkd3d_free(v);
-                    continue;
+                    if (v->initializer.args_count != size)
+                    {
+                        hlsl_fixme(ctx, &v->loc, "Flatten initializer.");
+                        free_parse_initializer(&v->initializer);
+                        vkd3d_free(v);
+                        continue;
+                    }
+
+                    initialize_numeric_var(ctx, var, &v->initializer, 0, type, &initializer_offset);
                 }
             }
             else
diff --git a/tests/hlsl-initializer-flatten.shader_test b/tests/hlsl-initializer-flatten.shader_test
index 439ead5e..3a430e0d 100644
--- a/tests/hlsl-initializer-flatten.shader_test
+++ b/tests/hlsl-initializer-flatten.shader_test
@@ -37,8 +37,8 @@ float4 main() : sv_target
 }
 
 [test]
-todo draw quad
-probe all rgba (40, 10, 20, 30)
+draw quad
+todo probe all rgba (40, 10, 20, 30)
 
 
 [pixel shader]
diff --git a/tests/hlsl-initializer-nested.shader_test b/tests/hlsl-initializer-nested.shader_test
index 0204afc9..bcb37cf4 100644
--- a/tests/hlsl-initializer-nested.shader_test
+++ b/tests/hlsl-initializer-nested.shader_test
@@ -6,7 +6,7 @@ float4 main() : sv_target
 }
 
 [test]
-todo draw quad
+draw quad
 probe all rgba (1, 2, 3, 4)
 
 
diff --git a/tests/hlsl-initializer-numeric.shader_test b/tests/hlsl-initializer-numeric.shader_test
index 92117591..40576887 100644
--- a/tests/hlsl-initializer-numeric.shader_test
+++ b/tests/hlsl-initializer-numeric.shader_test
@@ -6,7 +6,7 @@ float4 main() : sv_target
 }
 
 [test]
-todo draw quad
+draw quad
 probe all rgba (1.0, 2.0, 3.0, 4.0) 4
 
 
@@ -18,7 +18,7 @@ float4 main() : sv_target
 }
 
 [test]
-todo draw quad
+draw quad
 probe all rgba (1.0, 2.0, 3.0, 4.0) 4
 
 
@@ -31,7 +31,7 @@ float4 main() : sv_target
 }
 
 [test]
-todo draw quad
+draw quad
 probe all rgba (1.0, 2.0, 3.0, 4.0) 4
 
 
@@ -44,5 +44,5 @@ float4 main() : sv_target
 }
 
 [test]
-todo draw quad
+draw quad
 probe all rgba (10.1, 1.1, 1.2, 2.1) 4
-- 
2.35.2




More information about the wine-devel mailing list