i965: Avoid blending with destination alpha when RB format has no alpha bits
authorCarl Worth <cworth@cworth.org>
Fri, 11 Jan 2013 15:15:18 +0000 (07:15 -0800)
committerCarl Worth <cworth@cworth.org>
Mon, 14 Jan 2013 23:35:37 +0000 (15:35 -0800)
commit258453716f001eab1288d99765213221d0599ca4
tree87d586d066e1a84d2b5b739b7a897a3e09c2be74
parent6d4d4b00ddfbd3257ecd129fec5b813be7e36fe9
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>
src/mesa/drivers/dri/i965/brw_cc.c
src/mesa/drivers/dri/i965/brw_util.h
src/mesa/drivers/dri/i965/gen6_cc.c