Module: Mesa
Branch: main
Commit: 44bdcb7214b6caf491ddc80b24b97914fb94c235
URL:    
http://cgit.freedesktop.org/mesa/mesa/commit/?id=44bdcb7214b6caf491ddc80b24b97914fb94c235

Author: Alyssa Rosenzweig <[email protected]>
Date:   Mon Feb  6 10:49:41 2023 -0500

panfrost: Use proper locations in blend shaders

Rather than always blending to FRAG_RESULT_DATA0. This removes silly special
cases in the compiler.

Signed-off-by: Alyssa Rosenzweig <[email protected]>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/21426>

---

 src/panfrost/compiler/bifrost_compile.c | 11 ++++------
 src/panfrost/lib/pan_blend.c            | 39 ++++++++++++++++++---------------
 src/panfrost/midgard/midgard_compile.c  |  3 ---
 3 files changed, 25 insertions(+), 28 deletions(-)

diff --git a/src/panfrost/compiler/bifrost_compile.c 
b/src/panfrost/compiler/bifrost_compile.c
index cd2eb54a58e..ba144dd277c 100644
--- a/src/panfrost/compiler/bifrost_compile.c
+++ b/src/panfrost/compiler/bifrost_compile.c
@@ -1544,17 +1544,14 @@ bi_emit_ld_tile(bi_builder *b, nir_intrinsic_instr 
*instr)
    bi_index dest = bi_dest_index(&instr->dest);
    nir_alu_type T = nir_intrinsic_dest_type(instr);
    enum bi_register_format regfmt = bi_reg_fmt_for_nir(T);
-   unsigned rt = b->shader->inputs->blend.rt;
    unsigned size = nir_dest_bit_size(instr->dest);
    unsigned nr = instr->num_components;
 
    /* Get the render target */
-   if (!b->shader->inputs->is_blend) {
-      nir_io_semantics sem = nir_intrinsic_io_semantics(instr);
-      unsigned loc = sem.location;
-      assert(loc >= FRAG_RESULT_DATA0);
-      rt = (loc - FRAG_RESULT_DATA0);
-   }
+   nir_io_semantics sem = nir_intrinsic_io_semantics(instr);
+   unsigned loc = sem.location;
+   assert(loc >= FRAG_RESULT_DATA0);
+   unsigned rt = (loc - FRAG_RESULT_DATA0);
 
    bi_index desc =
       b->shader->inputs->is_blend
diff --git a/src/panfrost/lib/pan_blend.c b/src/panfrost/lib/pan_blend.c
index df9a60470e6..865919fda13 100644
--- a/src/panfrost/lib/pan_blend.c
+++ b/src/panfrost/lib/pan_blend.c
@@ -630,10 +630,11 @@ GENX(pan_blend_create_shader)(const struct 
panfrost_device *dev,
    nir_lower_blend_options options = {
       .logicop_enable = state->logicop_enable,
       .logicop_func = state->logicop_func,
-      .rt[0].colormask = rt_state->equation.color_mask,
-      .format[0] = rt_state->format,
    };
 
+   options.rt[rt].colormask = rt_state->equation.color_mask;
+   options.format[rt] = rt_state->format;
+
    if (!rt_state->equation.blend_enable) {
       static const nir_lower_blend_channel replace = {
          .func = BLEND_FUNC_ADD,
@@ -643,22 +644,22 @@ GENX(pan_blend_create_shader)(const struct 
panfrost_device *dev,
          .invert_dst_factor = false,
       };
 
-      options.rt[0].rgb = replace;
-      options.rt[0].alpha = replace;
+      options.rt[rt].rgb = replace;
+      options.rt[rt].alpha = replace;
    } else {
-      options.rt[0].rgb.func = rt_state->equation.rgb_func;
-      options.rt[0].rgb.src_factor = rt_state->equation.rgb_src_factor;
-      options.rt[0].rgb.invert_src_factor =
+      options.rt[rt].rgb.func = rt_state->equation.rgb_func;
+      options.rt[rt].rgb.src_factor = rt_state->equation.rgb_src_factor;
+      options.rt[rt].rgb.invert_src_factor =
          rt_state->equation.rgb_invert_src_factor;
-      options.rt[0].rgb.dst_factor = rt_state->equation.rgb_dst_factor;
-      options.rt[0].rgb.invert_dst_factor =
+      options.rt[rt].rgb.dst_factor = rt_state->equation.rgb_dst_factor;
+      options.rt[rt].rgb.invert_dst_factor =
          rt_state->equation.rgb_invert_dst_factor;
-      options.rt[0].alpha.func = rt_state->equation.alpha_func;
-      options.rt[0].alpha.src_factor = rt_state->equation.alpha_src_factor;
-      options.rt[0].alpha.invert_src_factor =
+      options.rt[rt].alpha.func = rt_state->equation.alpha_func;
+      options.rt[rt].alpha.src_factor = rt_state->equation.alpha_src_factor;
+      options.rt[rt].alpha.invert_src_factor =
          rt_state->equation.alpha_invert_src_factor;
-      options.rt[0].alpha.dst_factor = rt_state->equation.alpha_dst_factor;
-      options.rt[0].alpha.invert_dst_factor =
+      options.rt[rt].alpha.dst_factor = rt_state->equation.alpha_dst_factor;
+      options.rt[rt].alpha.invert_dst_factor =
          rt_state->equation.alpha_invert_dst_factor;
    }
 
@@ -696,9 +697,10 @@ GENX(pan_blend_create_shader)(const struct panfrost_device 
*dev,
    }
 
    /* Build a trivial blend shader */
-   nir_store_output(
-      &b, s_src[0], zero, .write_mask = BITFIELD_MASK(4), .src_type = nir_type,
-      .io_semantics.location = FRAG_RESULT_DATA0, .io_semantics.num_slots = 1);
+   nir_store_output(&b, s_src[0], zero, .write_mask = BITFIELD_MASK(4),
+                    .src_type = nir_type,
+                    .io_semantics.location = FRAG_RESULT_DATA0 + rt,
+                    .io_semantics.num_slots = 1);
 
    b.shader->info.io_lowered = true;
 
@@ -840,9 +842,10 @@ GENX(pan_blend_get_shader_locked)(const struct 
panfrost_device *dev,
       .blend.rt = shader->key.rt,
       .blend.nr_samples = key.nr_samples,
       .fixed_sysval_ubo = -1,
-      .rt_formats = {key.format},
    };
 
+   inputs.rt_formats[rt] = key.format;
+
 #if PAN_ARCH >= 6
    inputs.blend.bifrost_blend_desc =
       GENX(pan_blend_get_internal_desc)(dev, key.format, key.rt, 0, false);
diff --git a/src/panfrost/midgard/midgard_compile.c 
b/src/panfrost/midgard/midgard_compile.c
index a56ade24124..94a59adabd2 100644
--- a/src/panfrost/midgard/midgard_compile.c
+++ b/src/panfrost/midgard/midgard_compile.c
@@ -1706,9 +1706,6 @@ mir_get_branch_cond(nir_src *src, bool *invert)
 static uint8_t
 output_load_rt_addr(compiler_context *ctx, nir_intrinsic_instr *instr)
 {
-   if (ctx->inputs->is_blend)
-      return MIDGARD_COLOR_RT0 + ctx->inputs->blend.rt;
-
    unsigned loc = nir_intrinsic_io_semantics(instr).location;
 
    if (loc >= FRAG_RESULT_DATA0)

Reply via email to