vc4: Respect glSampleMask() even when we're not writing color.
authorEric Anholt <eric@anholt.net>
Fri, 10 Feb 2017 21:18:06 +0000 (13:18 -0800)
committerEric Anholt <eric@anholt.net>
Fri, 10 Feb 2017 22:17:04 +0000 (14:17 -0800)
gallium's quad-based blitter for copying MSAA depth textures expects to be
able to do 4 passes updating a sample at a time using glSampleMask, and
there's no color buffer bound when it's doing that.

src/gallium/drivers/vc4/vc4_nir_lower_blend.c

index 7811f1ce40a9c8e43e2d2c0e3f644869950d8aaa..56f6c3bd0e9533a56bc9ffc570b2fe5050886133 100644 (file)
@@ -630,9 +630,7 @@ vc4_nir_lower_blend_instr(struct vc4_compile *c, nir_builder *b,
 {
         nir_ssa_def *frag_color = intr->src[0].ssa;
 
-        if (c->fs_key->sample_coverage) {
-                vc4_nir_store_sample_mask(c, b, nir_load_sample_mask_in(b));
-        } else if (c->fs_key->sample_alpha_to_coverage) {
+        if (c->fs_key->sample_alpha_to_coverage) {
                 nir_ssa_def *a = nir_channel(b, frag_color, 3);
 
                 /* XXX: We should do a nice dither based on the fragment
@@ -721,4 +719,16 @@ vc4_nir_lower_blend(nir_shader *s, struct vc4_compile *c)
                                               nir_metadata_dominance);
                 }
         }
+
+        /* If we didn't do alpha-to-coverage on the output color, we still
+         * need to pass glSampleMask() through.
+         */
+        if (c->fs_key->sample_coverage && !c->fs_key->sample_alpha_to_coverage) {
+                nir_function_impl *impl = nir_shader_get_entrypoint(s);
+                nir_builder b;
+                nir_builder_init(&b, impl);
+                b.cursor = nir_after_block(nir_impl_last_block(impl));
+
+                vc4_nir_store_sample_mask(c, &b, nir_load_sample_mask_in(&b));
+        }
 }