Giovanni Mascellani : vkd3d-shader/hlsl: Remove trivial swizzles.

Alexandre Julliard julliard at winehq.org
Fri Nov 19 15:39:45 CST 2021


Module: vkd3d
Branch: master
Commit: 93a40c1c5771546bdfc4eb041aa7b92827d1195d
URL:    https://source.winehq.org/git/vkd3d.git/?a=commit;h=93a40c1c5771546bdfc4eb041aa7b92827d1195d

Author: Giovanni Mascellani <gmascellani at codeweavers.com>
Date:   Wed Nov 17 09:47:24 2021 +0100

vkd3d-shader/hlsl: Remove trivial swizzles.

Signed-off-by: Giovanni Mascellani <gmascellani at codeweavers.com>
Signed-off-by: Zebediah Figura <zfigura at codeweavers.com>
Signed-off-by: Henri Verbeet <hverbeet at codeweavers.com>
Signed-off-by: Matteo Bruni <mbruni at codeweavers.com>
Signed-off-by: Alexandre Julliard <julliard at winehq.org>

---

 libs/vkd3d-shader/hlsl_codegen.c | 22 ++++++++++++++++++++++
 1 file changed, 22 insertions(+)

diff --git a/libs/vkd3d-shader/hlsl_codegen.c b/libs/vkd3d-shader/hlsl_codegen.c
index 24b8205..f8b977b 100644
--- a/libs/vkd3d-shader/hlsl_codegen.c
+++ b/libs/vkd3d-shader/hlsl_codegen.c
@@ -475,6 +475,27 @@ static bool fold_constants(struct hlsl_ctx *ctx, struct hlsl_ir_node *instr, voi
     return true;
 }
 
+static bool remove_trivial_swizzles(struct hlsl_ctx *ctx, struct hlsl_ir_node *instr, void *context)
+{
+    struct hlsl_ir_swizzle *swizzle;
+    unsigned int i;
+
+    if (instr->type != HLSL_IR_SWIZZLE)
+        return false;
+    swizzle = hlsl_ir_swizzle(instr);
+
+    if (instr->data_type->dimx != swizzle->val.node->data_type->dimx)
+        return false;
+
+    for (i = 0; i < instr->data_type->dimx; ++i)
+        if (((swizzle->swizzle >> (2 * i)) & 3) != i)
+            return false;
+
+    replace_node(instr, swizzle->val.node);
+
+    return true;
+}
+
 /* Lower DIV to RCP + MUL. */
 static bool lower_division(struct hlsl_ctx *ctx, struct hlsl_ir_node *instr, void *context)
 {
@@ -1355,6 +1376,7 @@ int hlsl_emit_dxbc(struct hlsl_ctx *ctx, struct hlsl_ir_function_decl *entry_fun
     }
     while (progress);
     while (transform_ir(ctx, fold_constants, body, NULL));
+    transform_ir(ctx, remove_trivial_swizzles, body, NULL);
 
     if (ctx->profile->major_version < 4)
         transform_ir(ctx, lower_division, body, NULL);




More information about the wine-cvs mailing list