[PATCH 2/4] d3dcompiler: Allow hlsl_ir_constant to contain only scalar and vector constants.

Zebediah Figura z.figura12 at gmail.com
Sun Jul 5 17:45:34 CDT 2020


We only emit scalar constants at parse time, and while there's certainly an
advantage to vectorizing constant instructions, there's not much point in
having hlsl_ir_constant hold matrices. Matrices should be lowered to vector
operations first.

Signed-off-by: Zebediah Figura <zfigura at codeweavers.com>
---
 dlls/d3dcompiler_43/d3dcompiler_private.h | 10 ++---
 dlls/d3dcompiler_43/utils.c               | 51 ++++++++++-------------
 2 files changed, 27 insertions(+), 34 deletions(-)

diff --git a/dlls/d3dcompiler_43/d3dcompiler_private.h b/dlls/d3dcompiler_43/d3dcompiler_private.h
index 23eff210940..3e91f746459 100644
--- a/dlls/d3dcompiler_43/d3dcompiler_private.h
+++ b/dlls/d3dcompiler_43/d3dcompiler_private.h
@@ -874,11 +874,11 @@ struct hlsl_ir_constant
     struct hlsl_ir_node node;
     union
     {
-        unsigned u[16];
-        int i[16];
-        float f[16];
-        double d[16];
-        BOOL b[16];
+        unsigned u[4];
+        int i[4];
+        float f[4];
+        double d[4];
+        BOOL b[4];
     } value;
 };
 
diff --git a/dlls/d3dcompiler_43/utils.c b/dlls/d3dcompiler_43/utils.c
index 4bc3b9b0a64..7f0c451ce9c 100644
--- a/dlls/d3dcompiler_43/utils.c
+++ b/dlls/d3dcompiler_43/utils.c
@@ -1823,41 +1823,34 @@ static void debug_dump_deref(const struct hlsl_deref *deref)
 static void debug_dump_ir_constant(const struct hlsl_ir_constant *constant)
 {
     struct hlsl_type *type = constant->node.data_type;
-    unsigned int x, y;
+    unsigned int x;
 
-    if (type->dimy != 1)
+    if (type->dimx != 1)
         wine_dbg_printf("{");
-    for (y = 0; y < type->dimy; ++y)
+    for (x = 0; x < type->dimx; ++x)
     {
-        if (type->dimx != 1)
-            wine_dbg_printf("{");
-        for (x = 0; x < type->dimx; ++x)
+        switch (type->base_type)
         {
-            switch (type->base_type)
-            {
-                case HLSL_TYPE_FLOAT:
-                    wine_dbg_printf("%.8e ", constant->value.f[y * type->dimx + x]);
-                    break;
-                case HLSL_TYPE_DOUBLE:
-                    wine_dbg_printf("%.16e ", constant->value.d[y * type->dimx + x]);
-                    break;
-                case HLSL_TYPE_INT:
-                    wine_dbg_printf("%d ", constant->value.i[y * type->dimx + x]);
-                    break;
-                case HLSL_TYPE_UINT:
-                    wine_dbg_printf("%u ", constant->value.u[y * type->dimx + x]);
-                    break;
-                case HLSL_TYPE_BOOL:
-                    wine_dbg_printf("%s ", constant->value.b[y * type->dimx + x] == FALSE ? "false" : "true");
-                    break;
-                default:
-                    wine_dbg_printf("Constants of type %s not supported\n", debug_base_type(type));
-            }
+            case HLSL_TYPE_FLOAT:
+                wine_dbg_printf("%.8e ", constant->value.f[x]);
+                break;
+            case HLSL_TYPE_DOUBLE:
+                wine_dbg_printf("%.16e ", constant->value.d[x]);
+                break;
+            case HLSL_TYPE_INT:
+                wine_dbg_printf("%d ", constant->value.i[x]);
+                break;
+            case HLSL_TYPE_UINT:
+                wine_dbg_printf("%u ", constant->value.u[x]);
+                break;
+            case HLSL_TYPE_BOOL:
+                wine_dbg_printf("%s ", constant->value.b[x] ? "true" : "false");
+                break;
+            default:
+                wine_dbg_printf("Constants of type %s not supported\n", debug_base_type(type));
         }
-        if (type->dimx != 1)
-            wine_dbg_printf("}");
     }
-    if (type->dimy != 1)
+    if (type->dimx != 1)
         wine_dbg_printf("}");
 }
 
-- 
2.27.0




More information about the wine-devel mailing list