On 05/12/2011 09:05 PM, Eric Anholt wrote:
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 |   12 +++++++++++-
  1 files changed, 11 insertions(+), 1 deletions(-)

diff --git a/src/mesa/drivers/dri/i965/gen6_cc.c 
b/src/mesa/drivers/dri/i965/gen6_cc.c
index 66357f0..2b16d6c 100644
--- a/src/mesa/drivers/dri/i965/gen6_cc.c
+++ b/src/mesa/drivers/dri/i965/gen6_cc.c
@@ -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

The above comment mentions depth or alpha...

+    * 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;

...but this doesn't do anything with depth?  Does it need to?

+   size = sizeof(*blend) * nr_draw_buffers;
     blend = brw_state_batch(brw, size, 64,&brw->cc.blend_state_offset);

     memset(blend, 0, size);

I'm not familiar enough with this code to offer a Reviewed-by, sorry.

--Kenneth
_______________________________________________
mesa-dev mailing list
mesa-dev@lists.freedesktop.org
http://lists.freedesktop.org/mailman/listinfo/mesa-dev

Reply via email to