i965/gen6: Fix blending state when no color buffer is bound.
authorEric Anholt <eric@anholt.net>
Wed, 11 May 2011 21:07:44 +0000 (14:07 -0700)
committerEric Anholt <eric@anholt.net>
Wed, 18 May 2011 20:57:16 +0000 (13:57 -0700)
This is part of fixing fbo-alphatest-nocolor -- a regression in
35e8fe5c99b285f348cb8a1bba2931f120f7c0a1 after the initial regression,
that had us using a garbage BLEND_STATE[0] (in particular, the alpha
test enable) if no color buffer was bound.

src/mesa/drivers/dri/i965/gen6_cc.c

index 66357f00fa65e54a8878c7338b3478191d6f2227..2b16d6cdc019b2a9f509c3dd975b6f753ded13c1 100644 (file)
@@ -39,8 +39,18 @@ prepare_blend_state(struct brw_context *brw)
    struct gen6_blend_state *blend;
    int b;
    int nr_draw_buffers = ctx->DrawBuffer->_NumColorDrawBuffers;
-   int size = sizeof(*blend) * nr_draw_buffers;
-
+   int size;
+
+   /* We need at least one BLEND_STATE written, because we might do
+    * thread dispatch even if _NumColorDrawBuffers is 0 (for example
+    * for computed depth or alpha test), which will do an FB write
+    * with render target 0, which will reference BLEND_STATE[0] for
+    * alpha test enable.
+    */
+   if (nr_draw_buffers == 0 && ctx->Color.AlphaEnabled)
+      nr_draw_buffers = 1;
+
+   size = sizeof(*blend) * nr_draw_buffers;
    blend = brw_state_batch(brw, size, 64, &brw->cc.blend_state_offset);
 
    memset(blend, 0, size);