[Mesa-dev] [PATCH] mesa: Report core FBO incompleteness cases through GL_ARB_debug_output.

Eric Anholt eric at anholt.net
Thu Jun 6 15:00:37 PDT 2013


Brian Paul <brianp at vmware.com> writes:

> On 06/06/2013 11:16 AM, Eric Anholt wrote:
>> Just like we produce from inside the Intel driver, this can help provide
>> information quickly about FBO incompatibility problems (particularly when
>> using apitrace replay).
>>
>> Currently, in driver-marked incompleteness cases, you'll get both the
>> driver message and the core message on Intel.  Until the other drivers are
>> fixed to produce output, I think this is better than not putting in a
>> message for driver-marked incomplete.
>> ---
>>   src/mesa/main/fbobject.c | 43 +++++++++++++++++++++++++------------------
>>   1 file changed, 25 insertions(+), 18 deletions(-)
>>
>> diff --git a/src/mesa/main/fbobject.c b/src/mesa/main/fbobject.c
>> index aa0f125..ba462e9 100644
>> --- a/src/mesa/main/fbobject.c
>> +++ b/src/mesa/main/fbobject.c
>> @@ -568,8 +568,15 @@ att_incomplete(const char *msg)
>>    * For debug only.
>>    */
>>   static void
>> -fbo_incomplete(const char *msg, int index)
>> +fbo_incomplete(struct gl_context *ctx, const char *msg, int index)
>>   {
>> +   static GLuint msg_id;
>> +
>> +   _mesa_gl_debug(ctx, &msg_id,
>> +                  MESA_DEBUG_TYPE_OTHER,
>> +                  MESA_DEBUG_SEVERITY_MEDIUM,
>> +                  "FBO incomplete: %s [%d]\n", msg, index);
>> +
>>      if (MESA_DEBUG_FLAGS & DEBUG_INCOMPLETE_FBO) {
>>         _mesa_debug(NULL, "FBO Incomplete: %s [%d]\n", msg, index);
>>      }
>> @@ -863,7 +870,7 @@ _mesa_test_framebuffer_completeness(struct gl_context *ctx,
>>            test_attachment_completeness(ctx, GL_DEPTH, att);
>>            if (!att->Complete) {
>>               fb->_Status = GL_FRAMEBUFFER_INCOMPLETE_ATTACHMENT_EXT;
>> -            fbo_incomplete("depth attachment incomplete", -1);
>> +            fbo_incomplete(ctx, "depth attachment incomplete", -1);
>>               return;
>>            }
>>         }
>> @@ -872,7 +879,7 @@ _mesa_test_framebuffer_completeness(struct gl_context *ctx,
>>            test_attachment_completeness(ctx, GL_STENCIL, att);
>>            if (!att->Complete) {
>>               fb->_Status = GL_FRAMEBUFFER_INCOMPLETE_ATTACHMENT_EXT;
>> -            fbo_incomplete("stencil attachment incomplete", -1);
>> +            fbo_incomplete(ctx, "stencil attachment incomplete", -1);
>>               return;
>>            }
>>         }
>> @@ -881,7 +888,7 @@ _mesa_test_framebuffer_completeness(struct gl_context *ctx,
>>            test_attachment_completeness(ctx, GL_COLOR, att);
>>            if (!att->Complete) {
>>               fb->_Status = GL_FRAMEBUFFER_INCOMPLETE_ATTACHMENT_EXT;
>> -            fbo_incomplete("color attachment incomplete", i);
>> +            fbo_incomplete(ctx, "color attachment incomplete", i);
>>               return;
>>            }
>>         }
>> @@ -901,7 +908,7 @@ _mesa_test_framebuffer_completeness(struct gl_context *ctx,
>>            if (!is_format_color_renderable(ctx, attFormat, texImg->InternalFormat) &&
>>                !is_legal_depth_format(ctx, f)) {
>>               fb->_Status = GL_FRAMEBUFFER_INCOMPLETE_FORMATS_EXT;
>> -            fbo_incomplete("texture attachment incomplete", -1);
>> +            fbo_incomplete(ctx, "texture attachment incomplete", -1);
>>               return;
>>            }
>>
>> @@ -909,7 +916,7 @@ _mesa_test_framebuffer_completeness(struct gl_context *ctx,
>>               numSamples = texImg->NumSamples;
>>            else if (numSamples != texImg->NumSamples) {
>>               fb->_Status = GL_FRAMEBUFFER_INCOMPLETE_MULTISAMPLE;
>> -            fbo_incomplete("inconsistent sample count", -1);
>> +            fbo_incomplete(ctx, "inconsistent sample count", -1);
>>               return;
>>            }
>>
>> @@ -917,7 +924,7 @@ _mesa_test_framebuffer_completeness(struct gl_context *ctx,
>>               fixedSampleLocations = texImg->FixedSampleLocations;
>>            else if (fixedSampleLocations != texImg->FixedSampleLocations) {
>>               fb->_Status = GL_FRAMEBUFFER_INCOMPLETE_MULTISAMPLE;
>> -            fbo_incomplete("inconsistent fixed sample locations", -1);
>> +            fbo_incomplete(ctx, "inconsistent fixed sample locations", -1);
>>               return;
>>            }
>>         }
>> @@ -934,7 +941,7 @@ _mesa_test_framebuffer_completeness(struct gl_context *ctx,
>>               numSamples = att->Renderbuffer->NumSamples;
>>            else if (numSamples != att->Renderbuffer->NumSamples) {
>>               fb->_Status = GL_FRAMEBUFFER_INCOMPLETE_MULTISAMPLE;
>> -            fbo_incomplete("inconsistent sample count", -1);
>> +            fbo_incomplete(ctx, "inconsistent sample count", -1);
>>               return;
>>            }
>>
>> @@ -943,7 +950,7 @@ _mesa_test_framebuffer_completeness(struct gl_context *ctx,
>>               fixedSampleLocations = GL_TRUE;
>>            else if (fixedSampleLocations != GL_TRUE) {
>>               fb->_Status = GL_FRAMEBUFFER_INCOMPLETE_MULTISAMPLE;
>> -            fbo_incomplete("inconsistent fixed sample locations", -1);
>> +            fbo_incomplete(ctx, "inconsistent fixed sample locations", -1);
>>               return;
>>            }
>>         }
>> @@ -980,13 +987,13 @@ _mesa_test_framebuffer_completeness(struct gl_context *ctx,
>>               /* check that width, height, format are same */
>>               if (minWidth != maxWidth || minHeight != maxHeight) {
>>                  fb->_Status = GL_FRAMEBUFFER_INCOMPLETE_DIMENSIONS_EXT;
>> -               fbo_incomplete("width or height mismatch", -1);
>> +               fbo_incomplete(ctx, "width or height mismatch", -1);
>>                  return;
>>               }
>>               /* check that all color buffers are the same format */
>>               if (intFormat != GL_NONE && f != intFormat) {
>>                  fb->_Status = GL_FRAMEBUFFER_INCOMPLETE_FORMATS_EXT;
>> -               fbo_incomplete("format mismatch", -1);
>> +               fbo_incomplete(ctx, "format mismatch", -1);
>>                  return;
>>               }
>>            }
>> @@ -997,7 +1004,7 @@ _mesa_test_framebuffer_completeness(struct gl_context *ctx,
>>         if (att->Type == GL_RENDERBUFFER &&
>>             att->Renderbuffer->Format == MESA_FORMAT_NONE) {
>>            fb->_Status = GL_FRAMEBUFFER_UNSUPPORTED;
>> -         fbo_incomplete("unsupported renderbuffer format", i);
>> +         fbo_incomplete(ctx, "unsupported renderbuffer format", i);
>>            return;
>>         }
>>
>> @@ -1009,10 +1016,10 @@ _mesa_test_framebuffer_completeness(struct gl_context *ctx,
>>         } else if (layer_count != att_layer_count) {
>>            if (layer_count == 0 || att_layer_count == 0) {
>>               fb->_Status = GL_FRAMEBUFFER_INCOMPLETE_LAYER_TARGETS;
>> -            fbo_incomplete("framebuffer attachment layer mode is inconsistent", i);
>> +            fbo_incomplete(ctx, "framebuffer attachment layer mode is inconsistent", i);
>>            } else {
>>               fb->_Status = GL_FRAMEBUFFER_INCOMPLETE_LAYER_COUNT_ARB;
>> -            fbo_incomplete("framebuffer attachment layer count is inconsistent", i);
>> +            fbo_incomplete(ctx, "framebuffer attachment layer count is inconsistent", i);
>>            }
>>            return;
>>         }
>> @@ -1029,7 +1036,7 @@ _mesa_test_framebuffer_completeness(struct gl_context *ctx,
>>   	    assert(att);
>>   	    if (att->Type == GL_NONE) {
>>   	       fb->_Status = GL_FRAMEBUFFER_INCOMPLETE_DRAW_BUFFER_EXT;
>> -	       fbo_incomplete("missing drawbuffer", j);
>> +	       fbo_incomplete(ctx, "missing drawbuffer", j);
>>   	       return;
>>   	    }
>>   	 }
>> @@ -1042,7 +1049,7 @@ _mesa_test_framebuffer_completeness(struct gl_context *ctx,
>>   	 assert(att);
>>   	 if (att->Type == GL_NONE) {
>>   	    fb->_Status = GL_FRAMEBUFFER_INCOMPLETE_READ_BUFFER_EXT;
>> -            fbo_incomplete("missing readbuffer", -1);
>> +            fbo_incomplete(ctx, "missing readbuffer", -1);
>>   	    return;
>>   	 }
>>         }
>> @@ -1050,7 +1057,7 @@ _mesa_test_framebuffer_completeness(struct gl_context *ctx,
>>
>>      if (numImages == 0) {
>>         fb->_Status = GL_FRAMEBUFFER_INCOMPLETE_MISSING_ATTACHMENT_EXT;
>> -      fbo_incomplete("no attachments", -1);
>> +      fbo_incomplete(ctx, "no attachments", -1);
>>         return;
>>      }
>>
>> @@ -1064,7 +1071,7 @@ _mesa_test_framebuffer_completeness(struct gl_context *ctx,
>>      if (ctx->Driver.ValidateFramebuffer) {
>>         ctx->Driver.ValidateFramebuffer(ctx, fb);
>>         if (fb->_Status != GL_FRAMEBUFFER_COMPLETE_EXT) {
>> -         fbo_incomplete("driver marked FBO as incomplete", -1);
>> +         fbo_incomplete(ctx, "driver marked FBO as incomplete", -1);
>>         }
>>      }
>
> Looks good.  But as long as you're there, maybe we should make better 
> use of the 'index' parameter.  It looks like some of the -1 args might 
> be replaced by 'i'.  And fbo_incomplete() could check for -1, -2 
> (stencil buf, depth buf) and emit more informative messages.
>
> Mesa also has some debug/info code for incomplete textures.  But knowing 
> when to call _mesa_gl_debug() isn't as clear because it depends on 
> sampler state, etc.  It might be too messy to do anything.

Yeah, it would be incredibly useful for incomplete textures, but we'd
need to save the message and only emit it at draw time.
-------------- next part --------------
A non-text attachment was scrubbed...
Name: not available
Type: application/pgp-signature
Size: 197 bytes
Desc: not available
URL: <http://lists.freedesktop.org/archives/mesa-dev/attachments/20130606/6bff41b7/attachment.pgp>


More information about the mesa-dev mailing list