From: Eric Anholt Date: Fri, 10 Feb 2017 21:18:06 +0000 (-0800) Subject: vc4: Respect glSampleMask() even when we're not writing color. X-Git-Url: https://git.libre-soc.org/?a=commitdiff_plain;h=5c86f119b946e2557643b78687326322feb1ecea;p=mesa.git vc4: Respect glSampleMask() even when we're not writing color. 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. --- diff --git a/src/gallium/drivers/vc4/vc4_nir_lower_blend.c b/src/gallium/drivers/vc4/vc4_nir_lower_blend.c index 7811f1ce40a..56f6c3bd0e9 100644 --- a/src/gallium/drivers/vc4/vc4_nir_lower_blend.c +++ b/src/gallium/drivers/vc4/vc4_nir_lower_blend.c @@ -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)); + } }