[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