This allows us to more easily manipulate individual elements in a type-agnostic way. For example, it allows easier implementation of constant swizzle folding.
Signed-off-by: Zebediah Figura zfigura@codeweavers.com --- libs/vkd3d-shader/hlsl.c | 14 ++++++++------ libs/vkd3d-shader/hlsl.h | 14 +++++++------- libs/vkd3d-shader/hlsl.y | 17 +++++++++-------- libs/vkd3d-shader/hlsl_codegen.c | 22 ++++++++++++---------- libs/vkd3d-shader/hlsl_sm4.c | 2 +- 5 files changed, 37 insertions(+), 32 deletions(-)
diff --git a/libs/vkd3d-shader/hlsl.c b/libs/vkd3d-shader/hlsl.c index 96473d057..8a2286c45 100644 --- a/libs/vkd3d-shader/hlsl.c +++ b/libs/vkd3d-shader/hlsl.c @@ -535,7 +535,7 @@ struct hlsl_ir_constant *hlsl_new_uint_constant(struct hlsl_ctx *ctx, unsigned i if (!(c = hlsl_alloc(ctx, sizeof(*c)))) return NULL; init_node(&c->node, HLSL_IR_CONSTANT, ctx->builtin_types.scalar[HLSL_TYPE_UINT], loc); - c->value.u[0] = n; + c->value[0].u = n; return c; }
@@ -1018,26 +1018,28 @@ static void dump_ir_constant(struct vkd3d_string_buffer *buffer, const struct hl vkd3d_string_buffer_printf(buffer, "{"); for (x = 0; x < type->dimx; ++x) { + const union hlsl_constant_value *value = &constant->value[x]; + switch (type->base_type) { case HLSL_TYPE_BOOL: - vkd3d_string_buffer_printf(buffer, "%s ", constant->value.b[x] ? "true" : "false"); + vkd3d_string_buffer_printf(buffer, "%s ", value->b ? "true" : "false"); break;
case HLSL_TYPE_DOUBLE: - vkd3d_string_buffer_printf(buffer, "%.16e ", constant->value.d[x]); + vkd3d_string_buffer_printf(buffer, "%.16e ", value->d); break;
case HLSL_TYPE_FLOAT: - vkd3d_string_buffer_printf(buffer, "%.8e ", constant->value.f[x]); + vkd3d_string_buffer_printf(buffer, "%.8e ", value->f); break;
case HLSL_TYPE_INT: - vkd3d_string_buffer_printf(buffer, "%d ", constant->value.i[x]); + vkd3d_string_buffer_printf(buffer, "%d ", value->i); break;
case HLSL_TYPE_UINT: - vkd3d_string_buffer_printf(buffer, "%u ", constant->value.u[x]); + vkd3d_string_buffer_printf(buffer, "%u ", value->u); break;
default: diff --git a/libs/vkd3d-shader/hlsl.h b/libs/vkd3d-shader/hlsl.h index ce1f1b756..7079171b8 100644 --- a/libs/vkd3d-shader/hlsl.h +++ b/libs/vkd3d-shader/hlsl.h @@ -374,14 +374,14 @@ struct hlsl_ir_store struct hlsl_ir_constant { struct hlsl_ir_node node; - union + union hlsl_constant_value { - unsigned u[4]; - int i[4]; - float f[4]; - double d[4]; - bool b[4]; - } value; + uint32_t u; + int32_t i; + float f; + double d; + bool b; + } value[4]; struct hlsl_reg reg; };
diff --git a/libs/vkd3d-shader/hlsl.y b/libs/vkd3d-shader/hlsl.y index 2b381dc8a..2206d641d 100644 --- a/libs/vkd3d-shader/hlsl.y +++ b/libs/vkd3d-shader/hlsl.y @@ -828,20 +828,21 @@ static unsigned int evaluate_array_dimension(struct hlsl_ir_node *node) case HLSL_IR_CONSTANT: { struct hlsl_ir_constant *constant = hlsl_ir_constant(node); + const union hlsl_constant_value *value = &constant->value[0];
switch (constant->node.data_type->base_type) { case HLSL_TYPE_UINT: - return constant->value.u[0]; + return value->u; case HLSL_TYPE_INT: - return constant->value.i[0]; + return value->i; case HLSL_TYPE_FLOAT: case HLSL_TYPE_HALF: - return constant->value.f[0]; + return value->f; case HLSL_TYPE_DOUBLE: - return constant->value.d[0]; + return value->d; case HLSL_TYPE_BOOL: - return constant->value.b[0]; + return value->b; default: assert(0); return 0; @@ -2770,7 +2771,7 @@ primary_expr: if (!(c = hlsl_alloc(ctx, sizeof(*c)))) YYABORT; init_node(&c->node, HLSL_IR_CONSTANT, ctx->builtin_types.scalar[HLSL_TYPE_FLOAT], @1); - c->value.f[0] = $1; + c->value[0].f = $1; if (!($$ = make_list(ctx, &c->node))) YYABORT; } @@ -2781,7 +2782,7 @@ primary_expr: if (!(c = hlsl_alloc(ctx, sizeof(*c)))) YYABORT; init_node(&c->node, HLSL_IR_CONSTANT, ctx->builtin_types.scalar[HLSL_TYPE_INT], @1); - c->value.i[0] = $1; + c->value[0].i = $1; if (!($$ = make_list(ctx, &c->node))) YYABORT; } @@ -2792,7 +2793,7 @@ primary_expr: if (!(c = hlsl_alloc(ctx, sizeof(*c)))) YYABORT; init_node(&c->node, HLSL_IR_CONSTANT, ctx->builtin_types.scalar[HLSL_TYPE_BOOL], @1); - c->value.b[0] = $1; + c->value[0].b = $1; if (!($$ = make_list(ctx, &c->node))) YYABORT; } diff --git a/libs/vkd3d-shader/hlsl_codegen.c b/libs/vkd3d-shader/hlsl_codegen.c index 275920159..8bd9d1385 100644 --- a/libs/vkd3d-shader/hlsl_codegen.c +++ b/libs/vkd3d-shader/hlsl_codegen.c @@ -413,12 +413,12 @@ static bool fold_constants(struct hlsl_ctx *ctx, struct hlsl_ir_node *instr, voi { case HLSL_TYPE_INT: for (i = 0; i < dimx; ++i) - res->value.f[i] = arg1->value.i[i]; + res->value[i].f = arg1->value[i].i; break;
case HLSL_TYPE_UINT: for (i = 0; i < dimx; ++i) - res->value.f[i] = arg1->value.u[i]; + res->value[i].f = arg1->value[i].u; break;
default: @@ -443,17 +443,17 @@ static bool fold_constants(struct hlsl_ctx *ctx, struct hlsl_ir_node *instr, voi { case HLSL_OP1_NEG: for (i = 0; i < instr->data_type->dimx; ++i) - res->value.u[i] = -arg1->value.u[i]; + res->value[i].u = -arg1->value[i].u; break;
case HLSL_OP2_ADD: for (i = 0; i < instr->data_type->dimx; ++i) - res->value.u[i] = arg1->value.u[i] + arg2->value.u[i]; + res->value[i].u = arg1->value[i].u + arg2->value[i].u; break;
case HLSL_OP2_MUL: for (i = 0; i < instr->data_type->dimx; ++i) - res->value.u[i] = arg1->value.u[i] * arg2->value.u[i]; + res->value[i].u = arg1->value[i].u * arg2->value[i].u; break;
default: @@ -920,28 +920,30 @@ static void allocate_const_registers_recurse(struct hlsl_ctx *ctx, struct list * { for (x = 0, i = 0; x < 4; ++x) { + const union hlsl_constant_value *value; float f;
if (!(writemask & (1u << x))) continue; + value = &constant->value[i++];
switch (type->base_type) { case HLSL_TYPE_BOOL: - f = constant->value.b[i++]; + f = value->b; break;
case HLSL_TYPE_FLOAT: case HLSL_TYPE_HALF: - f = constant->value.f[i++]; + f = value->f; break;
case HLSL_TYPE_INT: - f = constant->value.i[i++]; + f = value->i; break;
case HLSL_TYPE_UINT: - f = constant->value.u[i++]; + f = value->u; break;
case HLSL_TYPE_DOUBLE: @@ -1208,7 +1210,7 @@ struct hlsl_reg hlsl_reg_from_deref(const struct hlsl_deref *deref, const struct ret.allocated = var->reg.allocated; ret.id = var->reg.id; if (offset_node) - offset = hlsl_ir_constant(offset_node)->value.u[0]; + offset = hlsl_ir_constant(offset_node)->value[0].u; ret.id += offset / 4;
if (type_is_single_reg(var->data_type)) diff --git a/libs/vkd3d-shader/hlsl_sm4.c b/libs/vkd3d-shader/hlsl_sm4.c index b347e3526..5558a1ff2 100644 --- a/libs/vkd3d-shader/hlsl_sm4.c +++ b/libs/vkd3d-shader/hlsl_sm4.c @@ -962,7 +962,7 @@ static void write_sm4_constant(struct hlsl_ctx *ctx, instr.srcs[0].reg.idx[0] = constant->reg.id; instr.srcs[0].reg.idx_count = 1; for (i = 0; i < dimx; ++i) - instr.srcs[0].reg.immconst_uint[i] = constant->value.u[i]; + instr.srcs[0].reg.immconst_uint[i] = constant->value[i].u; instr.src_count = 1,
write_sm4_instruction(buffer, &instr);