From: Eric Anholt Date: Fri, 29 Apr 2011 22:11:11 +0000 (-0700) Subject: i965/gen6: Fix LogicOp handling for GL_COPY and/or floating-point RTs. X-Git-Tag: android-x86-4.4-r1~11485 X-Git-Url: http://git.osdn.net/view?a=commitdiff_plain;h=6a02679f0120f095d2678eec4532e27e9627b26d;p=android-x86%2Fexternal-mesa.git i965/gen6: Fix LogicOp handling for GL_COPY and/or floating-point RTs. 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. --- diff --git a/src/mesa/drivers/dri/i965/gen6_cc.c b/src/mesa/drivers/dri/i965/gen6_cc.c index 80985db3d68..66357f00fa6 100644 --- a/src/mesa/drivers/dri/i965/gen6_cc.c +++ b/src/mesa/drivers/dri/i965/gen6_cc.c @@ -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, },