diff options
author | Carl Worth <cworth@cworth.org> | 2013-01-11 07:15:18 -0800 |
---|---|---|
committer | Carl Worth <cworth@cworth.org> | 2013-01-14 15:35:37 -0800 |
commit | 258453716f001eab1288d99765213221d0599ca4 (patch) | |
tree | 87d586d066e1a84d2b5b739b7a897a3e09c2be74 /src/mesa/drivers/dri/i965/gen6_cc.c | |
parent | 6d4d4b00ddfbd3257ecd129fec5b813be7e36fe9 (diff) | |
download | external_mesa3d-258453716f001eab1288d99765213221d0599ca4.zip external_mesa3d-258453716f001eab1288d99765213221d0599ca4.tar.gz external_mesa3d-258453716f001eab1288d99765213221d0599ca4.tar.bz2 |
i965: Avoid blending with destination alpha when RB format has no alpha bits
The hardware does not support a render target without an alpha channel.
So when the user creates a render buffer with no alpha channel, there actually
is storage available for alpha internally. It requires special care to
avoid these unwanted alpha bits from causing any problems.
Specifically, when blending, and when the blend factors would read the
destination alpha values, this commit coerces the blend factors to instead be
either 0 or 1 as appropriate.
A similar fix was made for pre-gen6 hardware in commit eadd9b8e and this
commit shares the fixup function written by Ian then.
This commit the following es3conform test:
rgb8_rgba8_rgb
As well as the following piglit (sub) tests:
EXT_framebuffer_object/fbo-blending-formats/3
EXT_framebuffer_object/fbo-blending-formats/GL_RGB
EXT_framebuffer_object/fbo-blending-formats/GL_RGB8
Reviewed-by: Ian Romanick <ian.d.romanick@intel.com>
Diffstat (limited to 'src/mesa/drivers/dri/i965/gen6_cc.c')
-rw-r--r-- | src/mesa/drivers/dri/i965/gen6_cc.c | 15 |
1 files changed, 15 insertions, 0 deletions
diff --git a/src/mesa/drivers/dri/i965/gen6_cc.c b/src/mesa/drivers/dri/i965/gen6_cc.c index b61a816c..fcd1794 100644 --- a/src/mesa/drivers/dri/i965/gen6_cc.c +++ b/src/mesa/drivers/dri/i965/gen6_cc.c @@ -118,6 +118,21 @@ gen6_upload_blend_state(struct brw_context *brw) srcA = dstA = GL_ONE; } + /* Due to hardware limitations, the destination may have information + * in an alpha channel even when the format specifies no alpha + * channel. In order to avoid getting any incorrect blending due to + * that alpha channel, coerce the blend factors to values that will + * not read the alpha channel, but will instead use the correct + * implicit value for alpha. + */ + if (_mesa_get_format_bits(rb->Format, GL_ALPHA_BITS) == 0) + { + srcRGB = brw_fix_xRGB_alpha(srcRGB); + srcA = brw_fix_xRGB_alpha(srcA); + dstRGB = brw_fix_xRGB_alpha(dstRGB); + dstA = brw_fix_xRGB_alpha(dstA); + } + blend[b].blend0.dest_blend_factor = brw_translate_blend_factor(dstRGB); blend[b].blend0.source_blend_factor = brw_translate_blend_factor(srcRGB); blend[b].blend0.blend_func = brw_translate_blend_equation(eqRGB); |