[PATCH 5/5] d3dcompiler: Avoid using 1-dimensional vectors as expression types.

Zebediah Figura z.figura12 at gmail.com
Mon Jun 22 17:47:22 CDT 2020


Signed-off-by: Zebediah Figura <zfigura at codeweavers.com>
---
 dlls/d3dcompiler_43/hlsl.y  | 19 +++++++++++++++----
 dlls/d3dcompiler_43/utils.c | 11 ++++++++---
 2 files changed, 23 insertions(+), 7 deletions(-)

diff --git a/dlls/d3dcompiler_43/hlsl.y b/dlls/d3dcompiler_43/hlsl.y
index 21828337939..27aab195b25 100644
--- a/dlls/d3dcompiler_43/hlsl.y
+++ b/dlls/d3dcompiler_43/hlsl.y
@@ -416,11 +416,17 @@ static struct hlsl_ir_swizzle *new_swizzle(DWORD s, unsigned int components,
         struct hlsl_ir_node *val, struct source_location *loc)
 {
     struct hlsl_ir_swizzle *swizzle = d3dcompiler_alloc(sizeof(*swizzle));
+    struct hlsl_type *data_type;
 
     if (!swizzle)
         return NULL;
-    init_node(&swizzle->node, HLSL_IR_SWIZZLE,
-            new_hlsl_type(NULL, HLSL_CLASS_VECTOR, val->data_type->base_type, components, 1), *loc);
+
+    if (components == 1)
+        data_type = hlsl_ctx.builtin_types.scalar[val->data_type->base_type];
+    else
+        data_type = hlsl_ctx.builtin_types.vector[val->data_type->base_type][components - 1];
+
+    init_node(&swizzle->node, HLSL_IR_SWIZZLE, data_type, *loc);
     swizzle->val = val;
     swizzle->swizzle = s;
     return swizzle;
@@ -2488,6 +2494,7 @@ postfix_expr:             primary_expr
             for (i = 0; i < $4.args_count; ++i)
             {
                 struct hlsl_ir_node *arg = $4.args[i];
+                struct hlsl_type *data_type;
                 unsigned int width;
 
                 if (arg->data_type->type == HLSL_CLASS_OBJECT)
@@ -2504,8 +2511,12 @@ postfix_expr:             primary_expr
                     continue;
                 }
 
-                if (!(arg = add_implicit_conversion($4.instrs, arg,
-                        hlsl_ctx.builtin_types.vector[$2->base_type][width - 1], &arg->loc)))
+                if (width == 1)
+                    data_type = hlsl_ctx.builtin_types.scalar[$2->base_type];
+                else
+                    data_type = hlsl_ctx.builtin_types.vector[$2->base_type][width - 1];
+
+                if (!(arg = add_implicit_conversion($4.instrs, arg, data_type, &arg->loc)))
                     continue;
 
                 if (!(assignment = new_assignment(var, NULL, arg,
diff --git a/dlls/d3dcompiler_43/utils.c b/dlls/d3dcompiler_43/utils.c
index 30aa9de1dd4..4f0556103ab 100644
--- a/dlls/d3dcompiler_43/utils.c
+++ b/dlls/d3dcompiler_43/utils.c
@@ -1294,7 +1294,7 @@ static struct hlsl_type *expr_common_type(struct hlsl_type *t1, struct hlsl_type
         }
     }
 
-    if (type == HLSL_CLASS_SCALAR)
+    if (type == HLSL_CLASS_SCALAR || (type == HLSL_CLASS_VECTOR && dimx == 1))
         return hlsl_ctx.builtin_types.scalar[base];
     if (type == HLSL_CLASS_VECTOR)
         return hlsl_ctx.builtin_types.vector[base][dimx - 1];
@@ -1496,9 +1496,14 @@ struct hlsl_ir_node *add_assignment(struct list *instrs, struct hlsl_ir_node *lh
                 d3dcompiler_free(assign);
                 return NULL;
             }
-            assert(swizzle_type->type == HLSL_CLASS_VECTOR);
+            assert(swizzle_type->type == HLSL_CLASS_VECTOR || swizzle_type->type == HLSL_CLASS_SCALAR);
             if (swizzle_type->dimx != width)
-                swizzle->node.data_type = hlsl_ctx.builtin_types.vector[swizzle_type->base_type][width - 1];
+            {
+                if (width == 1)
+                    swizzle->node.data_type = hlsl_ctx.builtin_types.scalar[swizzle_type->base_type];
+                else
+                    swizzle->node.data_type = hlsl_ctx.builtin_types.vector[swizzle_type->base_type][width - 1];
+            }
             rhs = &swizzle->node;
         }
         else
-- 
2.27.0




More information about the wine-devel mailing list