OpenGL specification 3.3 (page 196), section 4.1.3 says: If drawbuffer zero is not NONE and the buffer it references has an integer format, the SAMPLE_ALPHA_TO_COVERAGE and SAMPLE_ALPHA_TO_ONE operations are skipped." This should work properly even if there are other draw buffers that are not in integer format.
This patch makes following piglit tests pass on mesa: int-draw-buffers-alpha-to-coverage int-draw-buffers-alpha-to-one Note: Patches for these piglit tests are under review on piglit mailing list. Signed-off-by: Anuj Phogat <anuj.pho...@gmail.com> --- src/mesa/drivers/dri/i965/gen6_cc.c | 29 ++++++++++++++++++++++------- 1 files changed, 22 insertions(+), 7 deletions(-) diff --git a/src/mesa/drivers/dri/i965/gen6_cc.c b/src/mesa/drivers/dri/i965/gen6_cc.c index e0523ef..427cca9 100644 --- a/src/mesa/drivers/dri/i965/gen6_cc.c +++ b/src/mesa/drivers/dri/i965/gen6_cc.c @@ -35,6 +35,7 @@ static void gen6_upload_blend_state(struct brw_context *brw) { + bool is_buffer_zero_integer_format = false; struct gl_context *ctx = &brw->intel.ctx; struct gen6_blend_state *blend; int b; @@ -76,6 +77,9 @@ gen6_upload_blend_state(struct brw_context *brw) */ integer = (rb_type == GL_INT || rb_type == GL_UNSIGNED_INT); + if(b == 0 && integer) + is_buffer_zero_integer_format = true; + /* _NEW_COLOR */ if (ctx->Color.ColorLogicOpEnabled) { /* Floating point RTs should have no effect from LogicOp, @@ -161,13 +165,24 @@ gen6_upload_blend_state(struct brw_context *brw) blend[b].blend1.write_disable_g = !ctx->Color.ColorMask[b][1]; blend[b].blend1.write_disable_b = !ctx->Color.ColorMask[b][2]; blend[b].blend1.write_disable_a = !ctx->Color.ColorMask[b][3]; - - /* _NEW_MULTISAMPLE */ - blend[b].blend1.alpha_to_coverage = - ctx->Multisample._Enabled && ctx->Multisample.SampleAlphaToCoverage; - blend[b].blend1.alpha_to_one = - ctx->Multisample._Enabled && ctx->Multisample.SampleAlphaToOne; - blend[b].blend1.alpha_to_coverage_dither = (brw->intel.gen >= 7); + + /* OpenGL specification 3.3 (page 196), section 4.1.3 says: + * "If drawbuffer zero is not NONE and the buffer it references has an + * integer format, the SAMPLE_ALPHA_TO_COVERAGE and SAMPLE_ALPHA_TO_ONE + * operations are skipped." + */ + if(!is_buffer_zero_integer_format) { + /* _NEW_MULTISAMPLE */ + blend[b].blend1.alpha_to_coverage = + ctx->Multisample._Enabled && ctx->Multisample.SampleAlphaToCoverage; + blend[b].blend1.alpha_to_one = + ctx->Multisample._Enabled && ctx->Multisample.SampleAlphaToOne; + blend[b].blend1.alpha_to_coverage_dither = (brw->intel.gen >= 7); + } + else { + blend[b].blend1.alpha_to_coverage = false; + blend[b].blend1.alpha_to_one = false; + } } brw->state.dirty.cache |= CACHE_NEW_BLEND_STATE; -- 1.7.7.6 _______________________________________________ mesa-dev mailing list mesa-dev@lists.freedesktop.org http://lists.freedesktop.org/mailman/listinfo/mesa-dev