From a37933b7214ad7aa6608b0822886bb9b0503501d Mon Sep 17 00:00:00 2001 From: Qiang Yu Date: Fri, 9 Aug 2024 17:07:57 +0800 Subject: [PATCH] ac/llvm: build wqm for quad intrinsics only when fragment shader Otherwise we get wrong result when non-fragment shader. Signed-off-by: Qiang Yu Part-of: --- src/amd/llvm/ac_nir_to_llvm.c | 15 ++++++++++----- 1 file changed, 10 insertions(+), 5 deletions(-) diff --git a/src/amd/llvm/ac_nir_to_llvm.c b/src/amd/llvm/ac_nir_to_llvm.c index 50788b98175..fed3bd80054 100644 --- a/src/amd/llvm/ac_nir_to_llvm.c +++ b/src/amd/llvm/ac_nir_to_llvm.c @@ -3276,26 +3276,31 @@ static bool visit_intrinsic(struct ac_nir_context *ctx, nir_intrinsic_instr *ins case nir_intrinsic_quad_broadcast: { unsigned lane = nir_src_as_uint(instr->src[1]); result = ac_build_quad_swizzle(&ctx->ac, get_src(ctx, instr->src[0]), lane, lane, lane, lane); - result = ac_build_wqm(&ctx->ac, result); + if (ctx->info->stage == MESA_SHADER_FRAGMENT) + result = ac_build_wqm(&ctx->ac, result); break; } case nir_intrinsic_quad_swap_horizontal: result = ac_build_quad_swizzle(&ctx->ac, get_src(ctx, instr->src[0]), 1, 0, 3, 2); - result = ac_build_wqm(&ctx->ac, result); + if (ctx->info->stage == MESA_SHADER_FRAGMENT) + result = ac_build_wqm(&ctx->ac, result); break; case nir_intrinsic_quad_swap_vertical: result = ac_build_quad_swizzle(&ctx->ac, get_src(ctx, instr->src[0]), 2, 3, 0, 1); - result = ac_build_wqm(&ctx->ac, result); + if (ctx->info->stage == MESA_SHADER_FRAGMENT) + result = ac_build_wqm(&ctx->ac, result); break; case nir_intrinsic_quad_swap_diagonal: result = ac_build_quad_swizzle(&ctx->ac, get_src(ctx, instr->src[0]), 3, 2, 1, 0); - result = ac_build_wqm(&ctx->ac, result); + if (ctx->info->stage == MESA_SHADER_FRAGMENT) + result = ac_build_wqm(&ctx->ac, result); break; case nir_intrinsic_quad_swizzle_amd: { uint32_t mask = nir_intrinsic_swizzle_mask(instr); result = ac_build_quad_swizzle(&ctx->ac, get_src(ctx, instr->src[0]), mask & 0x3, (mask >> 2) & 0x3, (mask >> 4) & 0x3, (mask >> 6) & 0x3); - result = ac_build_wqm(&ctx->ac, result); + if (ctx->info->stage == MESA_SHADER_FRAGMENT) + result = ac_build_wqm(&ctx->ac, result); break; } case nir_intrinsic_masked_swizzle_amd: {