asahi: Handle non-written RTs correctly
authorAsahi Lina <lina@asahilina.net>
Fri, 11 Aug 2023 04:41:02 +0000 (13:41 +0900)
committerMarge Bot <emma+marge@anholt.net>
Fri, 11 Aug 2023 20:31:28 +0000 (20:31 +0000)
When a bound RT is not written to, we need to force the pass type to
translucent to ensure that this draw does not cull draws that do write
to that RT.

Fixes Inochi2D regression after c24b753378.

Signed-off-by: Asahi Lina <lina@asahilina.net>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/24635>

src/gallium/drivers/asahi/agx_state.c

index 8f5197b..aa8cec2 100644 (file)
@@ -1572,6 +1572,16 @@ agx_compile_variant(struct agx_device *dev, struct agx_uncompiled_shader *so,
          } else {
             colormasks[i] = BITFIELD_MASK(4);
          }
+
+         /* If not all bound RTs are fully written to, we need to force
+          * translucent pass type. agx_nir_lower_tilebuffer will take
+          * care of this for its own colormasks input.
+          */
+         unsigned comps = util_format_get_nr_components(key->rt_formats[i]);
+         if (i < key->nr_cbufs &&
+             (opts.rt[i].colormask & BITFIELD_MASK(comps)) !=
+                BITFIELD_MASK(comps))
+            force_translucent = true;
       }
 
       /* Clip plane lowering creates discard instructions, so run that before