Mesa (master): mesa: fix glPushAttrib(0) / glPopAttrib() error
Brian Paul
brianp at kemper.freedesktop.org
Wed Jun 3 17:38:47 UTC 2015
Module: Mesa
Branch: master
Commit: 6139195606d97b43a739500627c906baf804fab0
URL: http://cgit.freedesktop.org/mesa/mesa/commit/?id=6139195606d97b43a739500627c906baf804fab0
Author: Brian Paul <brianp at vmware.com>
Date: Fri May 15 11:22:25 2015 -0600
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 at vmware.com>
---
src/mesa/main/attrib.c | 17 +++++++++++++++++
1 file changed, 17 insertions(+)
diff --git a/src/mesa/main/attrib.c b/src/mesa/main/attrib.c
index b163c0a..365a79d 100644
--- a/src/mesa/main/attrib.c
+++ b/src/mesa/main/attrib.c
@@ -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;
More information about the mesa-commit
mailing list