From 9234275320d11aa1b22c311f333dd67423aee6e2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Marek=20Ol=C5=A1=C3=A1k?= Date: Tue, 23 Jul 2019 19:32:50 -0400 Subject: [PATCH] radeonsi/nir: implement FBFETCH for KHR_blend_equation_advanced --- src/amd/common/ac_nir_to_llvm.c | 5 ++++ src/amd/common/ac_shader_abi.h | 2 ++ src/gallium/drivers/radeonsi/si_shader.c | 1 + .../drivers/radeonsi/si_shader_internal.h | 1 + .../drivers/radeonsi/si_shader_tgsi_mem.c | 26 ++++++++++++++----- 5 files changed, 28 insertions(+), 7 deletions(-) diff --git a/src/amd/common/ac_nir_to_llvm.c b/src/amd/common/ac_nir_to_llvm.c index 78071297971..826a6377323 100644 --- a/src/amd/common/ac_nir_to_llvm.c +++ b/src/amd/common/ac_nir_to_llvm.c @@ -2053,6 +2053,11 @@ static LLVMValueRef visit_load_var(struct ac_nir_context *ctx, return load_tess_varyings(ctx, instr, false); } + if (ctx->stage == MESA_SHADER_FRAGMENT && + var->data.fb_fetch_output && + ctx->abi->emit_fbfetch) + return ctx->abi->emit_fbfetch(ctx->abi); + for (unsigned chan = comp; chan < ve + comp; chan++) { if (indir_index) { unsigned count = glsl_count_attribute_slots( diff --git a/src/amd/common/ac_shader_abi.h b/src/amd/common/ac_shader_abi.h index 083ab6c2298..d8572d124e9 100644 --- a/src/amd/common/ac_shader_abi.h +++ b/src/amd/common/ac_shader_abi.h @@ -198,6 +198,8 @@ struct ac_shader_abi { LLVMValueRef (*load_base_vertex)(struct ac_shader_abi *abi); + LLVMValueRef (*emit_fbfetch)(struct ac_shader_abi *abi); + /* Whether to clamp the shadow reference value to [0,1]on GFX8. Radeonsi currently * uses it due to promoting D16 to D32, but radv needs it off. */ bool clamp_shadow_reference; diff --git a/src/gallium/drivers/radeonsi/si_shader.c b/src/gallium/drivers/radeonsi/si_shader.c index 679fa4edabd..650195b01bf 100644 --- a/src/gallium/drivers/radeonsi/si_shader.c +++ b/src/gallium/drivers/radeonsi/si_shader.c @@ -6118,6 +6118,7 @@ static bool si_compile_tgsi_main(struct si_shader_context *ctx) ctx->abi.lookup_interp_param = si_nir_lookup_interp_param; ctx->abi.load_sample_position = load_sample_position; ctx->abi.load_sample_mask_in = load_sample_mask_in; + ctx->abi.emit_fbfetch = si_nir_emit_fbfetch; ctx->abi.emit_kill = si_llvm_emit_kill; break; case PIPE_SHADER_COMPUTE: diff --git a/src/gallium/drivers/radeonsi/si_shader_internal.h b/src/gallium/drivers/radeonsi/si_shader_internal.h index aa4e083ec1a..b4bee5e22e2 100644 --- a/src/gallium/drivers/radeonsi/si_shader_internal.h +++ b/src/gallium/drivers/radeonsi/si_shader_internal.h @@ -350,6 +350,7 @@ LLVMValueRef si_load_image_desc(struct si_shader_context *ctx, LLVMValueRef list, LLVMValueRef index, enum ac_descriptor_type desc_type, bool uses_store, bool bindless); +LLVMValueRef si_nir_emit_fbfetch(struct ac_shader_abi *abi); void si_load_system_value(struct si_shader_context *ctx, unsigned index, diff --git a/src/gallium/drivers/radeonsi/si_shader_tgsi_mem.c b/src/gallium/drivers/radeonsi/si_shader_tgsi_mem.c index 6181332ec01..6fca1d86847 100644 --- a/src/gallium/drivers/radeonsi/si_shader_tgsi_mem.c +++ b/src/gallium/drivers/radeonsi/si_shader_tgsi_mem.c @@ -1698,11 +1698,8 @@ static void si_llvm_emit_txqs( emit_data->output[emit_data->chan] = samples; } -static void si_llvm_emit_fbfetch(const struct lp_build_tgsi_action *action, - struct lp_build_tgsi_context *bld_base, - struct lp_build_emit_data *emit_data) +static LLVMValueRef si_llvm_emit_fbfetch(struct si_shader_context *ctx) { - struct si_shader_context *ctx = si_shader_context(bld_base); struct ac_image_args args = {}; LLVMValueRef ptr, image, fmask; @@ -1756,8 +1753,23 @@ static void si_llvm_emit_fbfetch(const struct lp_build_tgsi_action *action, args.dim = ctx->shader->key.mono.u.ps.fbfetch_layered ? ac_image_2darray : ac_image_2d; - emit_data->output[emit_data->chan] = - ac_build_image_opcode(&ctx->ac, &args); + return ac_build_image_opcode(&ctx->ac, &args); +} + +static void si_tgsi_emit_fbfetch(const struct lp_build_tgsi_action *action, + struct lp_build_tgsi_context *bld_base, + struct lp_build_emit_data *emit_data) +{ + struct si_shader_context *ctx = si_shader_context(bld_base); + + emit_data->output[emit_data->chan] = si_llvm_emit_fbfetch(ctx); +} + +LLVMValueRef si_nir_emit_fbfetch(struct ac_shader_abi *abi) +{ + struct si_shader_context *ctx = si_shader_context_from_abi(abi); + + return si_llvm_emit_fbfetch(ctx); } /** @@ -1783,7 +1795,7 @@ void si_shader_context_init_mem(struct si_shader_context *ctx) bld_base->op_actions[TGSI_OPCODE_LODQ].emit = build_tex_intrinsic; bld_base->op_actions[TGSI_OPCODE_TXQS].emit = si_llvm_emit_txqs; - bld_base->op_actions[TGSI_OPCODE_FBFETCH].emit = si_llvm_emit_fbfetch; + bld_base->op_actions[TGSI_OPCODE_FBFETCH].emit = si_tgsi_emit_fbfetch; bld_base->op_actions[TGSI_OPCODE_LOAD].emit = load_emit; bld_base->op_actions[TGSI_OPCODE_STORE].emit = store_emit;