mesa: fix glPushAttrib(0) / glPopAttrib() error

If the glPushAttrib() mask value was zero we didn't actually push
anything onto the attribute stack.  A subsequent glPopAttrib() call
would generate a GL_STACK_UNDERFLOW error.  Now push a dummy attribute
in that case to prevent the error.

Mesa now matches nvidia's behavior.

Reviewed-by: Jose Fonseca <jfonseca@vmware.com>
This commit is contained in:
Brian Paul 2015-05-15 11:22:25 -06:00
parent 86a74e9b6b
commit 6139195606
1 changed files with 17 additions and 0 deletions

View File

@ -177,6 +177,10 @@ struct texture_state
};
/** An unused GL_*_BIT value */
#define DUMMY_BIT 0x10000000
/**
* Allocate new attribute node of given type/kind. Attach payload data.
* Insert it into the linked list named by 'head'.
@ -253,6 +257,15 @@ _mesa_PushAttrib(GLbitfield mask)
/* groups specified by the mask. */
head = NULL;
if (mask == 0) {
/* if mask is zero we still need to push something so that we
* don't get a GL_STACK_UNDERFLOW error in glPopAttrib().
*/
GLuint dummy = 0;
if (!push_attrib(ctx, &head, DUMMY_BIT, sizeof(dummy), &dummy))
goto end;
}
if (mask & GL_ACCUM_BUFFER_BIT) {
if (!push_attrib(ctx, &head, GL_ACCUM_BUFFER_BIT,
sizeof(struct gl_accum_attrib),
@ -928,6 +941,10 @@ _mesa_PopAttrib(void)
}
switch (attr->kind) {
case DUMMY_BIT:
/* do nothing */
break;
case GL_ACCUM_BUFFER_BIT:
{
const struct gl_accum_attrib *accum;