[Mesa-dev] [PATCH 3/3 v3] mesa: Fix GL error generation in glBlitFramebuffer()

Kenneth Graunke kenneth at whitecape.org
Tue Jan 8 12:04:26 PST 2013


On 01/08/2013 02:03 AM, Anuj Phogat wrote:
> On Tue, Jan 8, 2013 at 5:25 AM, Kenneth Graunke <kenneth at whitecape.org> wrote:
>> From: Anuj Phogat <anuj.phogat at gmail.com>
>>
>> V2:
>> If mask has GL_STENCIL_BUFFER_BIT set, the depth formats for readRenderBuffer
>> and drawRenderBuffer must match unless one of the two buffers doesn't have
>> depth, in which case it's not blitted, so the format check should be ignored.
>> Same comment goes for stencil formats in depth renderbuffers if mask has
>> GL_DEPTH_BUFFER_BIT set.
>>
>> v3 (Kayden): Refactor code to be a bit more readable.
>>
>> Signed-off-by: Anuj Phogat <anuj.phogat at gmail.com>
>> Signed-off-by: Kenneth Graunke <kenneth at whitecape.org>
>> ---
>>   src/mesa/main/fbobject.c | 59 ++++++++++++++++++++++++++++++++++++------------
>>   1 file changed, 44 insertions(+), 15 deletions(-)
>>
>> Anuj,
>>
>> This looks correct, but the run-on conditionals are pretty hard to read...
>> just too much going on in a single if-statement.
>>
>> How about splitting them up a bit?  Here's my proposed version.  It also
>> gives slightly more descriptive messages.
>>
> I'm happy with the refactored code except a small mistake I explained below.
>> Untested.
>>
>> diff --git a/src/mesa/main/fbobject.c b/src/mesa/main/fbobject.c
>> index 281cdd0..bf613ff 100644
>> --- a/src/mesa/main/fbobject.c
>> +++ b/src/mesa/main/fbobject.c
>> @@ -2833,14 +2833,28 @@ _mesa_BlitFramebuffer(GLint srcX0, GLint srcY0, GLint srcX1, GLint srcY1,
>>         if ((readRb == NULL) || (drawRb == NULL)) {
>>           mask &= ~GL_STENCIL_BUFFER_BIT;
>>         }
>> -      else if (_mesa_get_format_bits(readRb->Format, GL_STENCIL_BITS) !=
>> -              _mesa_get_format_bits(drawRb->Format, GL_STENCIL_BITS)) {
>> -        /* There is no need to check the stencil datatype here, because
>> -         * there is only one: GL_UNSIGNED_INT.
>> -         */
>> -         _mesa_error(ctx, GL_INVALID_OPERATION,
>> -                     "glBlitFramebufferEXT(stencil buffer size mismatch)");
>> -         return;
>> +      else {
>> +         if ((_mesa_get_format_bits(readRb->Format, GL_STENCIL_BITS) !=
>> +              _mesa_get_format_bits(drawRb->Format, GL_STENCIL_BITS)) ||
>> +             (_mesa_get_format_datatype(readRb->Format) !=
>> +              _mesa_get_format_datatype(drawRb->Format))) {
> Matching the data type is not required here as data type for stencil buffer is
> always GL_UNSIGNED_INT. But, data type of GL_DEPTH24_STENCIL8 is
> GL_UNSIGNED_NORMALIZED. So, matching the data types here will disallow
> blitting between GL_STENCIL_INDEX8 and GL_DEPTH24_STENCIL8 which is a
> valid blitting case. This caused 7 gles3 conformance blitframebuffer test cases
> fail.

Oops.  I thought that would be harmless, since it'd always be the same 
in the stencil-only case, and needed to match in the depth-only case. 
But you're right.  Sorry for the trouble.

I'm fine with you pushing your series now (other than my comments on 7.1/7).


More information about the mesa-dev mailing list