[PATCH 5/7] d3dcompiler: Separate out an hlsl_deref structure and store it in hlsl_ir_assignment directly.

Zebediah Figura z.figura12 at gmail.com
Fri Mar 6 17:17:34 CST 2020


Signed-off-by: Zebediah Figura <zfigura at codeweavers.com>
---
 dlls/d3dcompiler_43/d3dcompiler_private.h | 25 ++++++++++++++---------
 dlls/d3dcompiler_43/hlsl.y                |  6 +++---
 dlls/d3dcompiler_43/utils.c               | 25 ++++++++++++++---------
 3 files changed, 33 insertions(+), 23 deletions(-)

diff --git a/dlls/d3dcompiler_43/d3dcompiler_private.h b/dlls/d3dcompiler_43/d3dcompiler_private.h
index 04878c70463..830434c9ff1 100644
--- a/dlls/d3dcompiler_43/d3dcompiler_private.h
+++ b/dlls/d3dcompiler_43/d3dcompiler_private.h
@@ -796,14 +796,6 @@ struct hlsl_ir_loop
     struct list *body;
 };
 
-struct hlsl_ir_assignment
-{
-    struct hlsl_ir_node node;
-    struct hlsl_ir_node *lhs;
-    struct hlsl_ir_node *rhs;
-    unsigned char writemask;
-};
-
 enum hlsl_ir_expr_op {
     HLSL_IR_UNOP_BIT_NOT = 0,
     HLSL_IR_UNOP_LOGIC_NOT,
@@ -907,9 +899,8 @@ enum hlsl_ir_deref_type
     HLSL_IR_DEREF_RECORD,
 };
 
-struct hlsl_ir_deref
+struct hlsl_deref
 {
-    struct hlsl_ir_node node;
     enum hlsl_ir_deref_type type;
     union
     {
@@ -927,6 +918,20 @@ struct hlsl_ir_deref
     } v;
 };
 
+struct hlsl_ir_deref
+{
+    struct hlsl_ir_node node;
+    struct hlsl_deref src;
+};
+
+struct hlsl_ir_assignment
+{
+    struct hlsl_ir_node node;
+    struct hlsl_deref lhs;
+    struct hlsl_ir_node *rhs;
+    unsigned char writemask;
+};
+
 struct hlsl_ir_constant
 {
     struct hlsl_ir_node node;
diff --git a/dlls/d3dcompiler_43/hlsl.y b/dlls/d3dcompiler_43/hlsl.y
index 591f755a7b2..a24d29e5df8 100644
--- a/dlls/d3dcompiler_43/hlsl.y
+++ b/dlls/d3dcompiler_43/hlsl.y
@@ -2123,9 +2123,9 @@ postfix_expr:             primary_expr
                                     free_instr_list($3);
                                     YYABORT;
                                 }
-                                deref->type = HLSL_IR_DEREF_ARRAY;
-                                deref->v.array.array = node_from_list($1);
-                                deref->v.array.index = node_from_list($3);
+                                deref->src.type = HLSL_IR_DEREF_ARRAY;
+                                deref->src.v.array.array = node_from_list($1);
+                                deref->src.v.array.index = node_from_list($3);
 
                                 $$ = append_binop($1, $3, &deref->node);
                             }
diff --git a/dlls/d3dcompiler_43/utils.c b/dlls/d3dcompiler_43/utils.c
index 9c388008081..29b35c3d7eb 100644
--- a/dlls/d3dcompiler_43/utils.c
+++ b/dlls/d3dcompiler_43/utils.c
@@ -1380,8 +1380,8 @@ struct hlsl_ir_deref *new_var_deref(struct hlsl_ir_var *var)
     }
     deref->node.type = HLSL_IR_DEREF;
     deref->node.data_type = var->data_type;
-    deref->type = HLSL_IR_DEREF_VAR;
-    deref->v.var = var;
+    deref->src.type = HLSL_IR_DEREF_VAR;
+    deref->src.v.var = var;
     return deref;
 }
 
@@ -1396,9 +1396,9 @@ struct hlsl_ir_deref *new_record_deref(struct hlsl_ir_node *record, struct hlsl_
     }
     deref->node.type = HLSL_IR_DEREF;
     deref->node.data_type = field->type;
-    deref->type = HLSL_IR_DEREF_RECORD;
-    deref->v.record.record = record;
-    deref->v.record.field = field;
+    deref->src.type = HLSL_IR_DEREF_RECORD;
+    deref->src.v.record.record = record;
+    deref->src.v.record.field = field;
     return deref;
 }
 
@@ -1547,13 +1547,13 @@ struct hlsl_ir_node *make_assignment(struct hlsl_ir_node *lhs, enum parse_assign
 
     rhs = implicit_conversion(rhs, type, &rhs->loc);
 
-    assign->lhs = lhs;
+    assign->lhs = deref_from_node(lhs)->src;
     if (assign_op != ASSIGN_OP_ASSIGN)
     {
         enum hlsl_ir_expr_op op = op_from_assignment(assign_op);
         struct hlsl_ir_node *expr;
 
-        if (deref_from_node(lhs)->type != HLSL_IR_DEREF_VAR)
+        if (assign->lhs.type != HLSL_IR_DEREF_VAR)
         {
             FIXME("LHS expression not supported in compound assignments yet.\n");
             assign->rhs = rhs;
@@ -1567,7 +1567,12 @@ struct hlsl_ir_node *make_assignment(struct hlsl_ir_node *lhs, enum parse_assign
         }
     }
     else
+    {
+        list_remove(&lhs->entry);
+        /* Don't recursively free the deref; we just copied its members. */
+        d3dcompiler_free(lhs);
         assign->rhs = rhs;
+    }
 
     return &assign->node;
 }
@@ -1860,7 +1865,7 @@ static void debug_dump_ir_var(const struct hlsl_ir_var *var)
         wine_dbg_printf(" : %s", debugstr_a(var->semantic));
 }
 
-static void debug_dump_ir_deref(const struct hlsl_ir_deref *deref)
+static void debug_dump_deref(const struct hlsl_deref *deref)
 {
     switch (deref->type)
     {
@@ -2048,7 +2053,7 @@ static const char *debug_writemask(DWORD writemask)
 static void debug_dump_ir_assignment(const struct hlsl_ir_assignment *assign)
 {
     wine_dbg_printf("= (");
-    debug_dump_src(assign->lhs);
+    debug_dump_deref(&assign->lhs);
     if (assign->writemask != BWRITERSP_WRITEMASK_ALL)
         wine_dbg_printf("%s", debug_writemask(assign->writemask));
     wine_dbg_printf(" ");
@@ -2129,7 +2134,7 @@ static void debug_dump_instr(const struct hlsl_ir_node *instr)
             debug_dump_ir_expr(expr_from_node(instr));
             break;
         case HLSL_IR_DEREF:
-            debug_dump_ir_deref(deref_from_node(instr));
+            debug_dump_deref(&deref_from_node(instr)->src);
             break;
         case HLSL_IR_CONSTANT:
             debug_dump_ir_constant(constant_from_node(instr));
-- 
2.25.1




More information about the wine-devel mailing list