glDrawBuffers pointing at an unattached buffer is supposed to be incomplete without ARB_ES2_compatibility. The testcase to catch the bug of not implementing that bit of the spec was tricked by this missing piece of state update. --- src/mesa/main/buffers.c | 36 ++++++++++++++++++++++++++---------- 1 files changed, 26 insertions(+), 10 deletions(-)
diff --git a/src/mesa/main/buffers.c b/src/mesa/main/buffers.c index 96ee1ac..895cde0 100644 --- a/src/mesa/main/buffers.c +++ b/src/mesa/main/buffers.c @@ -340,6 +340,26 @@ _mesa_DrawBuffersARB(GLsizei n, const GLenum *buffers) ctx->Driver.DrawBuffer(ctx, n > 0 ? buffers[0] : GL_NONE); } +/** + * Performs necessary state updates when _mesa_drawbuffers makes an + * actual change. + */ +static void +_mesa_updated_drawbuffers(struct gl_context *ctx) +{ + FLUSH_VERTICES(ctx, _NEW_BUFFERS); + +#if FEATURE_GL + if (ctx->API == API_OPENGL) { + struct gl_framebuffer *fb = ctx->DrawBuffer; + + /* Flag the FBO as requring validation. */ + if (fb->Name != 0) { + fb->_Status = 0; + } + } +#endif +} /** * Helper function to set the GL_DRAW_BUFFER state in the context and @@ -361,7 +381,6 @@ _mesa_drawbuffers(struct gl_context *ctx, GLuint n, const GLenum *buffers, { struct gl_framebuffer *fb = ctx->DrawBuffer; GLbitfield mask[MAX_DRAW_BUFFERS]; - GLboolean newState = GL_FALSE; if (!destMask) { /* compute destMask values now */ @@ -385,7 +404,7 @@ _mesa_drawbuffers(struct gl_context *ctx, GLuint n, const GLenum *buffers, GLint bufIndex = _mesa_ffs(destMask0) - 1; if (fb->_ColorDrawBufferIndexes[count] != bufIndex) { fb->_ColorDrawBufferIndexes[count] = bufIndex; - newState = GL_TRUE; + _mesa_updated_drawbuffers(ctx); } count++; destMask0 &= ~(1 << bufIndex); @@ -393,7 +412,7 @@ _mesa_drawbuffers(struct gl_context *ctx, GLuint n, const GLenum *buffers, fb->ColorDrawBuffer[0] = buffers[0]; if (fb->_NumColorDrawBuffers != count) { fb->_NumColorDrawBuffers = count; - newState = GL_TRUE; + _mesa_updated_drawbuffers(ctx); } } else { @@ -405,14 +424,14 @@ _mesa_drawbuffers(struct gl_context *ctx, GLuint n, const GLenum *buffers, ASSERT(_mesa_bitcount(destMask[buf]) == 1); if (fb->_ColorDrawBufferIndexes[buf] != bufIndex) { fb->_ColorDrawBufferIndexes[buf] = bufIndex; - newState = GL_TRUE; + _mesa_updated_drawbuffers(ctx); } count = buf + 1; } else { if (fb->_ColorDrawBufferIndexes[buf] != -1) { fb->_ColorDrawBufferIndexes[buf] = -1; - newState = GL_TRUE; + _mesa_updated_drawbuffers(ctx); } } fb->ColorDrawBuffer[buf] = buffers[buf]; @@ -421,7 +440,7 @@ _mesa_drawbuffers(struct gl_context *ctx, GLuint n, const GLenum *buffers, while (buf < ctx->Const.MaxDrawBuffers) { if (fb->_ColorDrawBufferIndexes[buf] != -1) { fb->_ColorDrawBufferIndexes[buf] = -1; - newState = GL_TRUE; + _mesa_updated_drawbuffers(ctx); } fb->ColorDrawBuffer[buf] = GL_NONE; buf++; @@ -435,13 +454,10 @@ _mesa_drawbuffers(struct gl_context *ctx, GLuint n, const GLenum *buffers, for (buf = 0; buf < ctx->Const.MaxDrawBuffers; buf++) { if (ctx->Color.DrawBuffer[buf] != fb->ColorDrawBuffer[buf]) { ctx->Color.DrawBuffer[buf] = fb->ColorDrawBuffer[buf]; - newState = GL_TRUE; + _mesa_updated_drawbuffers(ctx); } } } - - if (newState) - FLUSH_VERTICES(ctx, _NEW_BUFFERS); } -- 1.7.5.1 _______________________________________________ mesa-dev mailing list mesa-dev@lists.freedesktop.org http://lists.freedesktop.org/mailman/listinfo/mesa-dev