radeonsi/nir: implement FBFETCH for KHR_blend_equation_advanced

This commit is contained in:
Marek Olšák 2019-07-23 19:32:50 -04:00
parent 925161c84c
commit 9234275320
5 changed files with 28 additions and 7 deletions

View File

@ -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(

View File

@ -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;

View File

@ -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:

View File

@ -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,

View File

@ -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;