From: Zebediah Figura Subject: [PATCH 5/5] d3dcompiler: Avoid using 1-dimensional vectors as expression types. Message-Id: <20200622224722.135396-5-zfigura@codeweavers.com> Date: Mon, 22 Jun 2020 17:47:22 -0500 In-Reply-To: <20200622224722.135396-1-zfigura@codeweavers.com> References: <20200622224722.135396-1-zfigura@codeweavers.com> Signed-off-by: Zebediah Figura --- 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