mesa: added ctx->Driver.ValidateFramebuffer() callback
authorBrian Paul <brianp@vmware.com>
Thu, 22 Jan 2009 22:13:18 +0000 (15:13 -0700)
committerBrian Paul <brianp@vmware.com>
Thu, 22 Jan 2009 22:13:18 +0000 (15:13 -0700)
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.

src/mesa/main/dd.h
src/mesa/main/fbobject.c

index ddb38030bf7394937665cdd9713abacc81bc3210..989791f39f19baa59bcf408e95cad3279cc1b09a 100644 (file)
@@ -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
index 5bb9015efe4760545f7fd957c0ca5a762e74b6ab..ad4965550a49a5c0165c90fad064eb96d915c055 100644 (file)
@@ -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;
+   }
 }