From 196c4ebe1a1f008c6a450ffc7155c7e793c60f4f Mon Sep 17 00:00:00 2001 From: Pierre-Eric Pelloux-Prayer Date: Tue, 5 Jul 2022 12:26:00 +0200 Subject: [PATCH] ac: add per output is_16bit flag to ac_shader_abi MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Outputs are always f32 except for FS that may use unpacked f16. Store this information here to make it available to later processing. Reviewed-by: Mihai Preda Reviewed-by: Marek Olšák Part-of: --- src/amd/llvm/ac_nir_to_llvm.c | 5 +++-- src/amd/llvm/ac_shader_abi.h | 2 ++ src/gallium/drivers/radeonsi/si_shader_llvm.c | 4 +++- 3 files changed, 8 insertions(+), 3 deletions(-) diff --git a/src/amd/llvm/ac_nir_to_llvm.c b/src/amd/llvm/ac_nir_to_llvm.c index 53f6242ae33..bd974d29816 100644 --- a/src/amd/llvm/ac_nir_to_llvm.c +++ b/src/amd/llvm/ac_nir_to_llvm.c @@ -5377,8 +5377,9 @@ void ac_handle_shader_output_decl(struct ac_llvm_context *ctx, struct ac_shader_ LLVMTypeRef type = is_16bit ? ctx->f16 : ctx->f32; for (unsigned i = 0; i < attrib_count; ++i) { for (unsigned chan = 0; chan < 4; chan++) { - abi->outputs[ac_llvm_reg_index_soa(output_loc + i, chan)] = - ac_build_alloca_undef(ctx, type, ""); + int idx = ac_llvm_reg_index_soa(output_loc + i, chan); + abi->outputs[idx] = ac_build_alloca_undef(ctx, type, ""); + abi->is_16bit[idx] = is_16bit; } } } diff --git a/src/amd/llvm/ac_shader_abi.h b/src/amd/llvm/ac_shader_abi.h index ee9e17a88d0..390d694bf74 100644 --- a/src/amd/llvm/ac_shader_abi.h +++ b/src/amd/llvm/ac_shader_abi.h @@ -38,7 +38,9 @@ * radv to share a compiler backend. */ struct ac_shader_abi { + /* Each entry is a pointer to a f32 or a f16 value (only possible for FS) */ LLVMValueRef outputs[AC_LLVM_MAX_OUTPUTS * 4]; + bool is_16bit[AC_LLVM_MAX_OUTPUTS * 4]; /* These input registers sometimes need to be fixed up. */ LLVMValueRef vertex_id; diff --git a/src/gallium/drivers/radeonsi/si_shader_llvm.c b/src/gallium/drivers/radeonsi/si_shader_llvm.c index a02e1ace0e9..b6023f47241 100644 --- a/src/gallium/drivers/radeonsi/si_shader_llvm.c +++ b/src/gallium/drivers/radeonsi/si_shader_llvm.c @@ -1062,8 +1062,10 @@ bool si_llvm_translate_nir(struct si_shader_context *ctx, struct si_shader *shad nir_alu_type_get_type_size(ctx->shader->selector->info.output_type[i]) == 16) type = ctx->ac.f16; - for (unsigned j = 0; j < 4; j++) + for (unsigned j = 0; j < 4; j++) { ctx->abi.outputs[i * 4 + j] = ac_build_alloca_undef(&ctx->ac, type, ""); + ctx->abi.is_16bit[i * 4 + j] = type == ctx->ac.f16; + } } ac_nir_translate(&ctx->ac, &ctx->abi, &ctx->args, nir);