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:
parent
86a74e9b6b
commit
6139195606
|
@ -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;
|
||||
|
|
Loading…
Reference in New Issue