Mesa (main): pan/mdg: Don't read base for combined stores
GitLab Mirror
gitlab-mirror at kemper.freedesktop.org
Sun Jan 2 01:41:20 UTC 2022
Module: Mesa
Branch: main
Commit: b3d72727537ff1b40323148ac040f84cdbb575c1
URL: http://cgit.freedesktop.org/mesa/mesa/commit/?id=b3d72727537ff1b40323148ac040f84cdbb575c1
Author: Alyssa Rosenzweig <alyssa at collabora.com>
Date: Sat Jan 1 10:41:58 2022 -0500
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 at collabora.com>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/13714>
---
src/panfrost/midgard/midgard_compile.c | 69 ++++++++++++++++++----------------
1 file changed, 36 insertions(+), 33 deletions(-)
diff --git a/src/panfrost/midgard/midgard_compile.c b/src/panfrost/midgard/midgard_compile.c
index c7b94f1215a..ca2915ddf10 100644
--- a/src/panfrost/midgard/midgard_compile.c
+++ b/src/panfrost/midgard/midgard_compile.c
@@ -1867,46 +1867,13 @@ emit_intrinsic(compiler_context *ctx, nir_intrinsic_instr *instr)
case nir_intrinsic_store_combined_output_pan:
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]);
if (ctx->stage == MESA_SHADER_FRAGMENT) {
bool combined = instr->intrinsic ==
nir_intrinsic_store_combined_output_pan;
- const nir_variable *var;
- var = nir_find_variable_with_driver_location(ctx->nir, nir_var_shader_out,
- nir_intrinsic_base(instr));
- assert(var);
-
- /* Dual-source blend writeout is done by leaving the
- * value in r2 for the blend shader to use. */
- if (var->data.index) {
- if (instr->src[0].is_ssa) {
- emit_explicit_constant(ctx, reg, reg);
-
- unsigned out = make_compiler_temp(ctx);
-
- midgard_instruction ins = v_mov(reg, out);
- emit_mir_instruction(ctx, ins);
-
- ctx->blend_src1 = out;
- } else {
- ctx->blend_src1 = reg;
- }
-
- 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) {
@@ -1915,6 +1882,40 @@ emit_intrinsic(compiler_context *ctx, nir_intrinsic_instr *instr)
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));
+
+ 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
+ * value in r2 for the blend shader to use. */
+ if (var->data.index) {
+ if (instr->src[0].is_ssa) {
+ emit_explicit_constant(ctx, reg, reg);
+
+ unsigned out = make_compiler_temp(ctx);
+
+ midgard_instruction ins = v_mov(reg, out);
+ emit_mir_instruction(ctx, ins);
+
+ ctx->blend_src1 = out;
+ } else {
+ ctx->blend_src1 = reg;
+ }
+
+ break;
+ }
}
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);
+ offset = nir_intrinsic_base(instr) + nir_src_as_uint(instr->src[1]);
+
unsigned dst_component = nir_intrinsic_component(instr);
unsigned nr_comp = nir_src_num_components(instr->src[0]);
More information about the mesa-commit
mailing list