pan/mdg: Don't read base for combined stores

`base` is meaningless for combined stores, so don't read it. This allows
us to remove the base index from the intrinsic and simplify the lowering
code generating the combined store intrinsic.

Signed-off-by: Alyssa Rosenzweig <alyssa@collabora.com>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/13714>
This commit is contained in:
Alyssa Rosenzweig 2022-01-01 10:41:58 -05:00 committed by Marge Bot
parent 996645e479
commit b3d7272753

View file

@ -1867,18 +1867,36 @@ emit_intrinsic(compiler_context *ctx, nir_intrinsic_instr *instr)
case nir_intrinsic_store_combined_output_pan: case nir_intrinsic_store_combined_output_pan:
assert(nir_src_is_const(instr->src[1]) && "no indirect outputs"); assert(nir_src_is_const(instr->src[1]) && "no indirect outputs");
offset = nir_intrinsic_base(instr) + nir_src_as_uint(instr->src[1]);
reg = nir_src_index(ctx, &instr->src[0]); reg = nir_src_index(ctx, &instr->src[0]);
if (ctx->stage == MESA_SHADER_FRAGMENT) { if (ctx->stage == MESA_SHADER_FRAGMENT) {
bool combined = instr->intrinsic == bool combined = instr->intrinsic ==
nir_intrinsic_store_combined_output_pan; nir_intrinsic_store_combined_output_pan;
const nir_variable *var; enum midgard_rt_id rt;
var = nir_find_variable_with_driver_location(ctx->nir, nir_var_shader_out,
unsigned reg_z = ~0, reg_s = ~0;
if (combined) {
unsigned writeout = nir_intrinsic_component(instr);
if (writeout & PAN_WRITEOUT_Z)
reg_z = nir_src_index(ctx, &instr->src[2]);
if (writeout & PAN_WRITEOUT_S)
reg_s = nir_src_index(ctx, &instr->src[3]);
if (writeout & PAN_WRITEOUT_C)
rt = MIDGARD_COLOR_RT0;
else
rt = MIDGARD_ZS_RT;
} else {
const nir_variable *var =
nir_find_variable_with_driver_location(ctx->nir, nir_var_shader_out,
nir_intrinsic_base(instr)); nir_intrinsic_base(instr));
assert(var);
assert(var != NULL);
assert(var->data.location >= FRAG_RESULT_DATA0);
rt = MIDGARD_COLOR_RT0 + var->data.location -
FRAG_RESULT_DATA0;
/* Dual-source blend writeout is done by leaving the /* Dual-source blend writeout is done by leaving the
* value in r2 for the blend shader to use. */ * value in r2 for the blend shader to use. */
@ -1898,23 +1916,6 @@ emit_intrinsic(compiler_context *ctx, nir_intrinsic_instr *instr)
break; break;
} }
enum midgard_rt_id rt;
if (var->data.location >= FRAG_RESULT_DATA0)
rt = MIDGARD_COLOR_RT0 + var->data.location -
FRAG_RESULT_DATA0;
else if (combined)
rt = MIDGARD_ZS_RT;
else
unreachable("bad rt");
unsigned reg_z = ~0, reg_s = ~0;
if (combined) {
unsigned writeout = nir_intrinsic_component(instr);
if (writeout & PAN_WRITEOUT_Z)
reg_z = nir_src_index(ctx, &instr->src[2]);
if (writeout & PAN_WRITEOUT_S)
reg_s = nir_src_index(ctx, &instr->src[3]);
} }
emit_fragment_store(ctx, reg, reg_z, reg_s, rt, 0); emit_fragment_store(ctx, reg, reg_z, reg_s, rt, 0);
@ -1931,6 +1932,8 @@ emit_intrinsic(compiler_context *ctx, nir_intrinsic_instr *instr)
emit_explicit_constant(ctx, reg, reg); emit_explicit_constant(ctx, reg, reg);
offset = nir_intrinsic_base(instr) + nir_src_as_uint(instr->src[1]);
unsigned dst_component = nir_intrinsic_component(instr); unsigned dst_component = nir_intrinsic_component(instr);
unsigned nr_comp = nir_src_num_components(instr->src[0]); unsigned nr_comp = nir_src_num_components(instr->src[0]);