intel: Simplify and touch up the FBO completeness test.
authorEric Anholt <eric@anholt.net>
Thu, 8 Dec 2011 01:51:14 +0000 (17:51 -0800)
committerEric Anholt <eric@anholt.net>
Wed, 14 Dec 2011 21:18:48 +0000 (13:18 -0800)
Now that we have miptrees for everything, we can more easily test for
!has_separate_stencil completeness.  Also, test for whether the
stencil rb is the wrong kind of format for separate stencil, or if we
are trying to do packed to different images of a single miptree.

Reviewed-by: Kenneth Graunke <kenneth@whitecape.org>
src/mesa/drivers/dri/intel/intel_fbo.c

index b694129f4867d23af634ec77f496afe1830b678c..671de81c8dc4038fc77b3ac7c38f3eb531a94e55 100644 (file)
@@ -852,26 +852,29 @@ intel_validate_framebuffer(struct gl_context *ctx, struct gl_framebuffer *fb)
       intel_get_renderbuffer(fb, BUFFER_DEPTH);
    const struct intel_renderbuffer *stencilRb =
       intel_get_renderbuffer(fb, BUFFER_STENCIL);
+   struct intel_mipmap_tree *depth_mt = NULL, *stencil_mt = NULL;
    int i;
 
-   /*
-    * The depth and stencil renderbuffers are the same renderbuffer or wrap
-    * the same texture.
-    */
-   if (depthRb && stencilRb) {
-      bool depth_stencil_are_same;
-      if (depthRb == stencilRb)
-        depth_stencil_are_same = true;
-      else if ((fb->Attachment[BUFFER_DEPTH].Type == GL_TEXTURE) &&
-              (fb->Attachment[BUFFER_STENCIL].Type == GL_TEXTURE) &&
-              (fb->Attachment[BUFFER_DEPTH].Texture->Name ==
-               fb->Attachment[BUFFER_STENCIL].Texture->Name))
-        depth_stencil_are_same = true;
-      else
-        depth_stencil_are_same = false;
-
-      if (!intel->has_separate_stencil && !depth_stencil_are_same) {
-        fb->_Status = GL_FRAMEBUFFER_UNSUPPORTED_EXT;
+   if (depthRb)
+      depth_mt = depthRb->mt;
+   if (stencilRb)
+      stencil_mt = stencilRb->mt;
+
+   if (depth_mt && stencil_mt) {
+      if (depth_mt == stencil_mt) {
+        /* For true packed depth/stencil (not faked on prefers-separate-stencil
+         * hardware) we need to be sure they're the same level/layer, since
+         * we'll be emitting a single packet describing the packed setup.
+         */
+        if (depthRb->mt_level != stencilRb->mt_level ||
+            depthRb->mt_layer != stencilRb->mt_layer) {
+           fb->_Status = GL_FRAMEBUFFER_UNSUPPORTED_EXT;
+        }
+      } else {
+        if (!intel->has_separate_stencil)
+           fb->_Status = GL_FRAMEBUFFER_UNSUPPORTED_EXT;
+        if (stencil_mt->format != MESA_FORMAT_S8)
+           fb->_Status = GL_FRAMEBUFFER_UNSUPPORTED_EXT;
       }
    }