i965/gen6: Fix LogicOp handling for GL_COPY and/or floating-point RTs.
authorEric Anholt <eric@anholt.net>
Fri, 29 Apr 2011 22:11:11 +0000 (15:11 -0700)
committerEric Anholt <eric@anholt.net>
Fri, 29 Apr 2011 22:27:02 +0000 (15:27 -0700)
We were accidentally leaving blending enabled for LogicOp GL_COPY,
which ARB_color_buffer_float/GL_RGBA32F-render (and friends) caught.
Additionally, the GL spec says that no LogicOp should be done to
floating-point targets, and the GPU gets really angry even if you say
to LogicOp GL_COPY to float.

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

index 80985db3d686f63eddc2d70afecf8ee62dc57c1e..66357f00fa65e54a8878c7338b3478191d6f2227 100644 (file)
@@ -47,10 +47,17 @@ prepare_blend_state(struct brw_context *brw)
 
    for (b = 0; b < nr_draw_buffers; b++) {
       /* _NEW_COLOR */
-      if (ctx->Color._LogicOpEnabled && ctx->Color.LogicOp != GL_COPY) {
-        blend[b].blend1.logic_op_enable = 1;
-        blend[b].blend1.logic_op_func =
-           intel_translate_logic_op(ctx->Color.LogicOp);
+      if (ctx->Color._LogicOpEnabled) {
+        struct gl_renderbuffer *rb = ctx->DrawBuffer->_ColorDrawBuffers[b];
+        /* _NEW_BUFFERS */
+        /* Floating point RTs should have no effect from LogicOp,
+         * except for disabling of blending
+         */
+        if (_mesa_get_format_datatype(rb->Format) != GL_FLOAT) {
+           blend[b].blend1.logic_op_enable = 1;
+           blend[b].blend1.logic_op_func =
+              intel_translate_logic_op(ctx->Color.LogicOp);
+        }
       } else if (ctx->Color.BlendEnabled & (1 << b)) {
         GLenum eqRGB = ctx->Color.Blend[0].EquationRGB;
         GLenum eqA = ctx->Color.Blend[0].EquationA;
@@ -108,7 +115,8 @@ prepare_blend_state(struct brw_context *brw)
 
 const struct brw_tracked_state gen6_blend_state = {
    .dirty = {
-      .mesa = _NEW_COLOR,
+      .mesa = (_NEW_COLOR |
+              _NEW_BUFFERS),
       .brw = BRW_NEW_BATCH,
       .cache = 0,
    },