[Mesa-dev] [PATCH 1/3] mesa: fix glPushAttrib(0) / glPopAttrib() error

Brian Paul brianp at vmware.com
Tue May 26 14:13:10 PDT 2015


On 05/26/2015 02:03 PM, Jose Fonseca wrote:
> On 25/05/15 15:41, Brian Paul wrote:
>> 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.
>> ---
>>   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;
>>
>
> If I'm not mistaken, you could use 0 for DUMMY_BIT (instead of
> 0x10000000), and therefore completely avoid the possibility of a clash.

Yes, I just thought it was more obvious this way what's going on.


> Either way
>
> Reviewed-by: Jose Fonseca <jfonseca at vmware.com>

Thanks.

-Brian




More information about the mesa-dev mailing list