From: Brian Paul Date: Thu, 22 Jan 2009 22:13:18 +0000 (-0700) Subject: mesa: added ctx->Driver.ValidateFramebuffer() callback X-Git-Url: https://git.libre-soc.org/?a=commitdiff_plain;h=3528f69ce4ba9098ff4d372d7d411b24cf161d61;p=mesa.git mesa: added ctx->Driver.ValidateFramebuffer() callback Called from the _mesa_test_framebuffer_completeness() function to give the driver the chance to make a framebuffer as incomplete if it doesn't meet some specific hardware restriction. --- diff --git a/src/mesa/main/dd.h b/src/mesa/main/dd.h index ddb38030bf7..989791f39f1 100644 --- a/src/mesa/main/dd.h +++ b/src/mesa/main/dd.h @@ -808,6 +808,8 @@ struct dd_function_table { struct gl_renderbuffer_attachment *att); void (*FinishRenderTexture)(GLcontext *ctx, struct gl_renderbuffer_attachment *att); + void (*ValidateFramebuffer)(GLcontext *ctx, + struct gl_framebuffer *fb); /*@}*/ #endif #if FEATURE_EXT_framebuffer_blit diff --git a/src/mesa/main/fbobject.c b/src/mesa/main/fbobject.c index 5bb9015efe4..ad4965550a4 100644 --- a/src/mesa/main/fbobject.c +++ b/src/mesa/main/fbobject.c @@ -414,6 +414,8 @@ fbo_incomplete(const char *msg, int index) /** * Test if the given framebuffer object is complete and update its * Status field with the results. + * Calls the ctx->Driver.ValidateFramebuffer() function to allow the + * driver to make hardware-specific validation/completeness checks. * Also update the framebuffer's Width and Height fields if the * framebuffer is complete. */ @@ -566,15 +568,23 @@ _mesa_test_framebuffer_completeness(GLcontext *ctx, struct gl_framebuffer *fb) return; } - /* - * If we get here, the framebuffer is complete! - * Note that if ARB_framebuffer_object is supported and the attached - * renderbuffers/textures are different sizes, the framebuffer width/height - * will be set to the smallest width/height. - */ + /* Provisionally set status = COMPLETE ... */ fb->_Status = GL_FRAMEBUFFER_COMPLETE_EXT; - fb->Width = minWidth; - fb->Height = minHeight; + + /* ... but the driver may say the FB is incomplete: */ + if (ctx->Driver.ValidateFramebuffer) { + ctx->Driver.ValidateFramebuffer(ctx, fb); + } + + if (fb->_Status == GL_FRAMEBUFFER_COMPLETE_EXT) { + /* + * Note that if ARB_framebuffer_object is supported and the attached + * renderbuffers/textures are different sizes, the framebuffer + * width/height will be set to the smallest width/height. + */ + fb->Width = minWidth; + fb->Height = minHeight; + } }