i965: Examine _BaseFormat when deciding to perform xRGB_alpha fixups
authorCarl Worth <cworth@cworth.org>
Mon, 21 Jan 2013 20:18:02 +0000 (12:18 -0800)
committerCarl Worth <cworth@cworth.org>
Thu, 24 Jan 2013 01:40:24 +0000 (17:40 -0800)
The renderbuffer's Format field may have an alpha channel even when the
underlying _BaseFormat does not. This can happen when mesa chooses to use
RGBA16 for an RGB16 format, for example.

So look at _BaseFormat when deciding whether to fixup the blend factors.

This test improves the results of at least the following piglit tests:

EXT_frambebuffer_object/fbo-blending-formats
         {GL_RGB10, GL_RGB12, GL_RGB16}
EXT_texture_snorm/fbo-blending-formats
{GL_RGB16_SNORM, GLRGB8_SNORM, GL_RGB_SNORM}

But none of these actually change from FAIL to PASS yet. The R, G, and B probe
values are fixed with this commit, but the tests still fail because the alpha
values are still wrong.

Reviewed-by: Eric Anholt <eric@anholt.net>
src/mesa/drivers/dri/i965/gen6_cc.c

index fcd1794b8f57ae6ba0c6c520dbd2244d25aa723d..d32f6366b7c86f15cc5f895462b75ac0131204a1 100644 (file)
@@ -32,6 +32,7 @@
 #include "intel_batchbuffer.h"
 #include "main/macros.h"
 #include "main/enums.h"
+#include "main/glformats.h"
 
 static void
 gen6_upload_blend_state(struct brw_context *brw)
@@ -125,7 +126,7 @@ gen6_upload_blend_state(struct brw_context *brw)
           * 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)
+         if (!_mesa_base_format_has_channel(rb->_BaseFormat, GL_TEXTURE_ALPHA_TYPE))
          {
             srcRGB = brw_fix_xRGB_alpha(srcRGB);
             srcA = brw_fix_xRGB_alpha(srcA);