[PATCH 3/6] d3dcompiler: Create assignment instructions more directly in struct_var_initializer().
Zebediah Figura
z.figura12 at gmail.com
Mon Jun 1 17:58:43 CDT 2020
In particular so that we can remove the need for creating a load instruction,
which besides being unnecessary was also never added to any instruction lists.
Signed-off-by: Zebediah Figura <zfigura at codeweavers.com>
---
dlls/d3dcompiler_43/hlsl.y | 43 +++++++++++++++++++++-----------------
1 file changed, 24 insertions(+), 19 deletions(-)
diff --git a/dlls/d3dcompiler_43/hlsl.y b/dlls/d3dcompiler_43/hlsl.y
index f94e9a6462b..19e7dd7aeb5 100644
--- a/dlls/d3dcompiler_43/hlsl.y
+++ b/dlls/d3dcompiler_43/hlsl.y
@@ -549,22 +549,30 @@ static struct hlsl_ir_var *new_synthetic_var(const char *name, struct hlsl_type
return var;
}
-static struct hlsl_ir_assignment *make_simple_assignment(struct hlsl_ir_var *lhs, struct hlsl_ir_node *rhs)
+static struct hlsl_ir_assignment *new_assignment(struct hlsl_ir_var *var, struct hlsl_ir_node *offset,
+ struct hlsl_ir_node *rhs, unsigned int writemask, struct source_location loc)
{
struct hlsl_ir_assignment *assign;
+ if (!writemask && type_is_single_reg(rhs->data_type))
+ writemask = (1 << rhs->data_type->dimx) - 1;
+
if (!(assign = d3dcompiler_alloc(sizeof(*assign))))
return NULL;
- init_node(&assign->node, HLSL_IR_ASSIGNMENT, rhs->data_type, rhs->loc);
- assign->lhs.var = lhs;
+ init_node(&assign->node, HLSL_IR_ASSIGNMENT, NULL, loc);
+ assign->lhs.var = var;
+ assign->lhs.offset = offset;
assign->rhs = rhs;
- if (type_is_single_reg(lhs->data_type))
- assign->writemask = (1 << lhs->data_type->dimx) - 1;
-
+ assign->writemask = writemask;
return assign;
}
+static struct hlsl_ir_assignment *make_simple_assignment(struct hlsl_ir_var *lhs, struct hlsl_ir_node *rhs)
+{
+ return new_assignment(lhs, NULL, rhs, 0, rhs->loc);
+}
+
static struct hlsl_ir_constant *new_uint_constant(unsigned int n, const struct source_location loc)
{
struct hlsl_ir_constant *c;
@@ -693,8 +701,6 @@ static void struct_var_initializer(struct list *list, struct hlsl_ir_var *var,
{
struct hlsl_type *type = var->data_type;
struct hlsl_struct_field *field;
- struct hlsl_ir_node *assignment;
- struct hlsl_ir_load *load;
unsigned int i = 0;
if (initializer_size(initializer) != components_count_type(type))
@@ -710,22 +716,21 @@ static void struct_var_initializer(struct list *list, struct hlsl_ir_var *var,
LIST_FOR_EACH_ENTRY(field, type->e.elements, struct hlsl_struct_field, entry)
{
struct hlsl_ir_node *node = initializer->args[i];
+ struct hlsl_ir_assignment *assign;
+ struct hlsl_ir_constant *c;
if (i++ >= initializer->args_count)
- {
- d3dcompiler_free(initializer->args);
- return;
- }
+ break;
+
if (components_count_type(field->type) == components_count_type(node->data_type))
{
- if (!(load = new_record_load(&new_var_load(var, var->loc)->node, field, node->loc)))
- {
- ERR("Out of memory.\n");
+ if (!(c = new_uint_constant(field->reg_offset * 4, node->loc)))
break;
- }
- list_add_tail(list, &load->node.entry);
- assignment = make_assignment(&load->node, ASSIGN_OP_ASSIGN, node);
- list_add_tail(list, &assignment->entry);
+ list_add_tail(list, &c->node.entry);
+
+ if (!(assign = new_assignment(var, &c->node, node, 0, node->loc)))
+ break;
+ list_add_tail(list, &assign->node.entry);
}
else
FIXME("Initializing with \"mismatched\" fields is not supported yet.\n");
--
2.26.2
More information about the wine-devel
mailing list