-----BEGIN PGP SIGNED MESSAGE----- Hash: SHA1 On 05/25/2011 02:24 PM, Eric Anholt wrote: > 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)
Why updated instead of update? It looks weird every time I read it. :) > +{ > + FLUSH_VERTICES(ctx, _NEW_BUFFERS); > + > +#if FEATURE_GL > + if (ctx->API == API_OPENGL) { In later patches, checks like this are 'if (ctx->API == API_OPENGL && !ctx->Extensions.ARB_ES2_compatibility)'. Why is this one different? Though, it looks like this is changed in patch 3/4. If 1/4 and 3/4 were squashed, would 2/4 be necessary? > + 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); > } > > -----BEGIN PGP SIGNATURE----- Version: GnuPG v1.4.11 (GNU/Linux) Comment: Using GnuPG with Fedora - http://enigmail.mozdev.org/ iEYEARECAAYFAk3enBUACgkQX1gOwKyEAw9J6wCfdAcE30NKE/ZAB287oH/z8e2K /CIAn2LOLC80iSIOtgSrT6mlMVz6Wblj =3Mon -----END PGP SIGNATURE----- _______________________________________________ mesa-dev mailing list mesa-dev@lists.freedesktop.org http://lists.freedesktop.org/mailman/listinfo/mesa-dev