i965: Properly demote the depth mt format for fake packed depth/stencil.
authorEric Anholt <eric@anholt.net>
Thu, 15 Dec 2011 01:16:07 +0000 (17:16 -0800)
committerEric Anholt <eric@anholt.net>
Mon, 19 Dec 2011 21:20:11 +0000 (13:20 -0800)
gen7 only supports the non-packed formats, even if you associate a
real separate stencil buffer -- otherwise it's as if the depth test
always fails.

This requires a little bit of care in the match_texture_image case,
since the miptree format no longer matches the texture image format.

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

index 3946cb3d1d55e0632f00b1da579c24d4ec0d2cfb..89a4e719ae00e0c911d666f35d5fcc8dd7fc7728 100644 (file)
@@ -53,6 +53,7 @@ static void emit_depthbuffer(struct brw_context *brw)
 
    /* Gen7 doesn't support packed depth/stencil */
    assert(stencil_mt == NULL || depth_mt != stencil_mt);
+   assert(!depth_mt || !_mesa_is_format_packed_depth_stencil(depth_mt->format));
 
    intel_emit_depth_stall_flushes(intel);
 
index 6f518ee23b92ef656930e01be6c2c59c6573d7f8..17118036128cbb0156301634350a7f8da40db289 100644 (file)
@@ -279,7 +279,8 @@ intel_alloc_renderbuffer_storage(struct gl_context * ctx, struct gl_renderbuffer
         return false;
       }
 
-      assert(irb->mt->format == MESA_FORMAT_S8_Z24);
+      assert(irb->mt->format == MESA_FORMAT_S8_Z24 ||
+            irb->mt->format == MESA_FORMAT_X8_Z24);
       ok = intel_renderbuffer_update_wrapper(intel, depth_irb, irb->mt,
                                             0, 0, /* level, layer */
                                             MESA_FORMAT_X8_Z24,
index 989038e1610a31343f21427b146bad598bc2228b..ee2d1e03ad286cc5da0d3055ce0a7162ea67cb29 100644 (file)
@@ -136,6 +136,16 @@ intel_miptree_create_internal(struct intel_context *intel,
         intel_miptree_release(&mt);
         return NULL;
       }
+
+      /* Fix up the Z miptree format for how we're splitting out separate
+       * stencil.  Gen7 expects there to be no stencil bits in its depth buffer.
+       */
+      if (mt->format == MESA_FORMAT_S8_Z24) {
+        mt->format = MESA_FORMAT_X8_Z24;
+      } else {
+        _mesa_problem("Unknown format %s in separate stencil\n",
+                      _mesa_get_format_name(mt->format));
+      }
    }
 
    return mt;
@@ -320,8 +330,12 @@ intel_miptree_match_image(struct intel_mipmap_tree *mt,
    GLuint level = intelImage->base.Base.Level;
    int width, height, depth;
 
-   if (image->TexFormat != mt->format)
+   if (image->TexFormat != mt->format &&
+       !(image->TexFormat == MESA_FORMAT_S8_Z24 &&
+        mt->format == MESA_FORMAT_X8_Z24 &&
+        mt->stencil_mt)) {
       return false;
+   }
 
    intel_miptree_get_dimensions_for_image(image, &width, &height, &depth);
 
index fef1dcf8ce6cd95eb5b295dd23091909e3f1af55..9082864201941416e55d4e99f67452b2a7380ba7 100644 (file)
@@ -149,7 +149,7 @@ struct intel_mipmap_tree
     * two miptrees for storing the data.  If the depthstencil texture or rb is
     * MESA_FORMAT_Z32_FLOAT_X24S8, then mt->format will be
     * MESA_FORMAT_Z32_FLOAT, otherwise for MESA_FORMAT_S8_Z24 objects it will be
-    * MESA_FORMAT_S8_Z24.
+    * MESA_FORMAT_X8_Z24.
     */
    gl_format format;