From 5f81a43535e8512cef26ea3dcd1e3a489bd5a1bb Mon Sep 17 00:00:00 2001 From: Samuel Pitoiset Date: Tue, 5 Dec 2017 18:02:08 +0100 Subject: [PATCH] radv: use a faster version for nir_op_pack_half_2x16 This patch is ported from RadeonSI and it has two effects. It fixes a rendering issue which affects F1 2017 and Dawn of War 3 (Vega only) because LLVM was ending up by generating the new v_mad_mix_{hi,lo} instructions which appear to be buggy in some way. Not sure if Mesa is generating something wrong or if the issue is in LLVM only. Anyway, that explains why the DOW3 issue can't be reproduced with GL on Vega. It also improves performance because v_cvt_pkrtz_f16 is faster, and because I guess the rounding mode behaviour is similar between GL and VK, we can use it. About performance, it improves Talos by +3/4% but I don't see any other impacts. No CTS regressions on Polaris. Signed-off-by: Samuel Pitoiset Reviewed-by: Dave Airlie --- src/amd/common/ac_nir_to_llvm.c | 12 +----------- 1 file changed, 1 insertion(+), 11 deletions(-) diff --git a/src/amd/common/ac_nir_to_llvm.c b/src/amd/common/ac_nir_to_llvm.c index 96ba289..663b27d 100644 --- a/src/amd/common/ac_nir_to_llvm.c +++ b/src/amd/common/ac_nir_to_llvm.c @@ -1426,23 +1426,13 @@ static LLVMValueRef emit_bitfield_insert(struct ac_llvm_context *ctx, static LLVMValueRef emit_pack_half_2x16(struct ac_llvm_context *ctx, LLVMValueRef src0) { - LLVMValueRef const16 = LLVMConstInt(ctx->i32, 16, false); - int i; LLVMValueRef comp[2]; src0 = ac_to_float(ctx, src0); comp[0] = LLVMBuildExtractElement(ctx->builder, src0, ctx->i32_0, ""); comp[1] = LLVMBuildExtractElement(ctx->builder, src0, ctx->i32_1, ""); - for (i = 0; i < 2; i++) { - comp[i] = LLVMBuildFPTrunc(ctx->builder, comp[i], ctx->f16, ""); - comp[i] = LLVMBuildBitCast(ctx->builder, comp[i], ctx->i16, ""); - comp[i] = LLVMBuildZExt(ctx->builder, comp[i], ctx->i32, ""); - } - - comp[1] = LLVMBuildShl(ctx->builder, comp[1], const16, ""); - comp[0] = LLVMBuildOr(ctx->builder, comp[0], comp[1], ""); - return comp[0]; + return ac_build_cvt_pkrtz_f16(ctx, comp); } static LLVMValueRef emit_unpack_half_2x16(struct ac_llvm_context *ctx, -- 2.7.4