Giovanni Mascellani : vkd3d-shader/hlsl: Do not generate useless swizzles.
Alexandre Julliard
julliard at winehq.org
Wed Apr 27 16:12:02 CDT 2022
Module: vkd3d
Branch: master
Commit: c5c50a8b9bc7e3bcbb5caabb24b44ced59d0eb70
URL: https://source.winehq.org/git/vkd3d.git/?a=commit;h=c5c50a8b9bc7e3bcbb5caabb24b44ced59d0eb70
Author: Giovanni Mascellani <gmascellani at codeweavers.com>
Date: Wed Apr 27 10:56:22 2022 +0200
vkd3d-shader/hlsl: Do not generate useless 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: Alexandre Julliard <julliard at winehq.org>
---
libs/vkd3d-shader/hlsl_codegen.c | 15 +++++++++++----
1 file changed, 11 insertions(+), 4 deletions(-)
diff --git a/libs/vkd3d-shader/hlsl_codegen.c b/libs/vkd3d-shader/hlsl_codegen.c
index f31bfe9f..5f1d5997 100644
--- a/libs/vkd3d-shader/hlsl_codegen.c
+++ b/libs/vkd3d-shader/hlsl_codegen.c
@@ -246,6 +246,7 @@ static bool lower_broadcasts(struct hlsl_ctx *ctx, struct hlsl_ir_node *instr, v
&& src_type->type <= HLSL_CLASS_VECTOR && dst_type->type <= HLSL_CLASS_VECTOR
&& src_type->dimx == 1)
{
+ struct hlsl_ir_node *replacement;
struct hlsl_ir_swizzle *swizzle;
struct hlsl_ir_expr *new_cast;
@@ -255,11 +256,17 @@ static bool lower_broadcasts(struct hlsl_ctx *ctx, struct hlsl_ir_node *instr, v
if (!(new_cast = hlsl_new_cast(ctx, cast->operands[0].node, dst_scalar_type, &cast->node.loc)))
return false;
list_add_after(&cast->node.entry, &new_cast->node.entry);
- if (!(swizzle = hlsl_new_swizzle(ctx, HLSL_SWIZZLE(X, X, X, X), dst_type->dimx, &new_cast->node, &cast->node.loc)))
- return false;
- list_add_after(&new_cast->node.entry, &swizzle->node.entry);
+ replacement = &new_cast->node;
- hlsl_replace_node(&cast->node, &swizzle->node);
+ if (dst_type->dimx != 1)
+ {
+ if (!(swizzle = hlsl_new_swizzle(ctx, HLSL_SWIZZLE(X, X, X, X), dst_type->dimx, replacement, &cast->node.loc)))
+ return false;
+ list_add_after(&new_cast->node.entry, &swizzle->node.entry);
+ replacement = &swizzle->node;
+ }
+
+ hlsl_replace_node(&cast->node, replacement);
return true;
}
More information about the wine-cvs
mailing list