From 1c2397666068f509941762d5363f331128824ab3 Mon Sep 17 00:00:00 2001 From: Conor McCarthy Date: Thu, 9 Oct 2025 17:41:26 +1000 Subject: [PATCH] vkd3d-shader/ir: Fix the addition swizzle in vsir_program_lower_precise_mad(). The swizzle from vsir_swizzle_from_writemask() is for use with a contiguous write mask starting at bit zero, but we need the final write mask to match that of the original MAD instruction. Wine-Bug: https://bugs.winehq.org/show_bug.cgi?id=58746 --- libs/vkd3d-shader/ir.c | 5 ++++- tests/hlsl/arithmetic-float-uniform.shader_test | 2 +- 2 files changed, 5 insertions(+), 2 deletions(-) diff --git a/libs/vkd3d-shader/ir.c b/libs/vkd3d-shader/ir.c index c013c9e61..e158367c6 100644 --- a/libs/vkd3d-shader/ir.c +++ b/libs/vkd3d-shader/ir.c @@ -1426,9 +1426,12 @@ static enum vkd3d_result vsir_program_lower_precise_mad(struct vsir_program *pro vsir_register_init(&mul_dst->reg, VKD3DSPR_TEMP, mul_ins->src[0].reg.data_type, 1); mul_dst->reg.dimension = add_ins->dst->reg.dimension; mul_dst->reg.idx[0].offset = *tmp_idx; + mul_dst->write_mask = mul_dst->reg.dimension == VSIR_DIMENSION_VEC4 + ? VKD3DSP_WRITEMASK_ALL : VKD3DSP_WRITEMASK_0; add_ins->src[0].reg = mul_dst->reg; - add_ins->src[0].swizzle = vsir_swizzle_from_writemask(mul_dst->write_mask); + add_ins->src[0].swizzle = mul_dst->reg.dimension == VSIR_DIMENSION_VEC4 + ? VKD3D_SHADER_NO_SWIZZLE : VKD3D_SHADER_SWIZZLE(X, X, X, X); add_ins->src[0].modifiers = 0; add_ins->src[1] = mul_ins->src[2]; diff --git a/tests/hlsl/arithmetic-float-uniform.shader_test b/tests/hlsl/arithmetic-float-uniform.shader_test index ccc30602d..4169513f1 100644 --- a/tests/hlsl/arithmetic-float-uniform.shader_test +++ b/tests/hlsl/arithmetic-float-uniform.shader_test @@ -201,7 +201,7 @@ uniform 0 float4 1.5 1.5 1.5 1.5 uniform 4 float4 1.00000007 -42.1 1.625 -5.0 uniform 8 float4 1.00000007 -1.0 2.0 2.0 todo(glsl | msl) draw quad -todo probe (0, 0) f32(6.0, 6.0, 3.93750072, 314.25) 1 +probe (0, 0) f32(6.0, 6.0, 3.93750072, 314.25) 1 [require] shader model >= 5.0