From 2f92adb9e03c84dc6a6e0f90ba1a5c1ada4d6964 Mon Sep 17 00:00:00 2001 From: Brian Paul Date: Sat, 22 Apr 2006 01:20:20 +0000 Subject: [PATCH] Fix yet another issue with popping GL_DRAW_BUFFER state with respect to single vs. multiple outputs and what kind of FBO is currently bound. --- src/mesa/main/attrib.c | 41 +++++++++++++++++++++++++++++------------ 1 file changed, 29 insertions(+), 12 deletions(-) diff --git a/src/mesa/main/attrib.c b/src/mesa/main/attrib.c index d15f9f714de..eaf20a5b73e 100644 --- a/src/mesa/main/attrib.c +++ b/src/mesa/main/attrib.c @@ -848,18 +848,35 @@ _mesa_PopAttrib(void) (GLboolean) (color->ColorMask[1] != 0), (GLboolean) (color->ColorMask[2] != 0), (GLboolean) (color->ColorMask[3] != 0)); - /* Call the API_level functions, not _mesa_drawbuffers() since - * we need to do error checking on the pop'd GL_DRAW_BUFFER. - * Ex: if GL_FRONT were pushed, but we're popping with a user - * FBO bound, GL_FRONT will be illegal and we'll need to - * record that error. Per OpenGL ARB decision. - */ - if (ctx->Extensions.ARB_draw_buffers) { - _mesa_DrawBuffersARB(ctx->Const.MaxDrawBuffers, - color->DrawBuffer); - } - else { - _mesa_DrawBuffer(color->DrawBuffer[0]); + { + /* Need to determine if more than one color output is + * specified. If so, call glDrawBuffersARB, else call + * glDrawBuffer(). This is a subtle, but essential point + * since GL_FRONT (for example) is illegal for the former + * function, but legal for the later. + */ + GLboolean multipleBuffers = GL_FALSE; + if (ctx->Extensions.ARB_draw_buffers) { + GLuint i; + for (i = 1; i < ctx->Const.MaxDrawBuffers; i++) { + if (color->DrawBuffer[i] != GL_NONE) { + multipleBuffers = GL_TRUE; + break; + } + } + } + /* Call the API_level functions, not _mesa_drawbuffers() + * since we need to do error checking on the pop'd + * GL_DRAW_BUFFER. + * Ex: if GL_FRONT were pushed, but we're popping with a + * user FBO bound, GL_FRONT will be illegal and we'll need + * to record that error. Per OpenGL ARB decision. + */ + if (multipleBuffers) + _mesa_DrawBuffersARB(ctx->Const.MaxDrawBuffers, + color->DrawBuffer); + else + _mesa_DrawBuffer(color->DrawBuffer[0]); } _mesa_set_enable(ctx, GL_ALPHA_TEST, color->AlphaEnabled); _mesa_AlphaFunc(color->AlphaFunc, color->AlphaRef); -- 2.30.2