[Mesa-dev] [PATCH 5/8] i965: Add support for mapping Z32_FLOAT_X24S8 fake packed depth/stencil.

Eric Anholt eric at anholt.net
Thu Dec 15 20:43:41 PST 2011


The format handling here is tricky, because we're not actually
generating a Z32_FLOAT_X24S8 miptree, so we're guessing the format
that GL wants based on seeing Z32_FLOAT with a separate stencil.

Reviewed-by: Kenneth Graunke <kenneth at whitecape.org>
---
 src/mesa/drivers/dri/intel/intel_mipmap_tree.c |   22 +++++++++++++++++-----
 1 files changed, 17 insertions(+), 5 deletions(-)

diff --git a/src/mesa/drivers/dri/intel/intel_mipmap_tree.c b/src/mesa/drivers/dri/intel/intel_mipmap_tree.c
index ee2d1e0..0d49fec 100644
--- a/src/mesa/drivers/dri/intel/intel_mipmap_tree.c
+++ b/src/mesa/drivers/dri/intel/intel_mipmap_tree.c
@@ -876,7 +876,8 @@ intel_miptree_map_depthstencil(struct intel_context *intel,
 {
    struct intel_mipmap_tree *z_mt = mt;
    struct intel_mipmap_tree *s_mt = mt->stencil_mt;
-   int packed_bpp = 4;
+   bool map_z32f_x24s8 = mt->format == MESA_FORMAT_Z32_FLOAT;
+   int packed_bpp = map_z32f_x24s8 ? 8 : 4;
 
    map->stride = map->w * packed_bpp;
    map->buffer = map->ptr = malloc(map->stride * map->h);
@@ -911,7 +912,12 @@ intel_miptree_map_depthstencil(struct intel_context *intel,
 	    uint8_t s = s_map[s_offset];
 	    uint32_t z = z_map[z_offset];
 
-	    packed_map[y * map->w + x] = (s << 24) | (z & 0x00ffffff);
+	    if (map_z32f_x24s8) {
+	       packed_map[(y * map->w + x) * 2 + 0] = z;
+	       packed_map[(y * map->w + x) * 2 + 1] = s;
+	    } else {
+	       packed_map[y * map->w + x] = (s << 24) | (z & 0x00ffffff);
+	    }
 	 }
       }
 
@@ -940,6 +946,7 @@ intel_miptree_unmap_depthstencil(struct intel_context *intel,
 {
    struct intel_mipmap_tree *z_mt = mt;
    struct intel_mipmap_tree *s_mt = mt->stencil_mt;
+   bool map_z32f_x24s8 = mt->format == MESA_FORMAT_Z32_FLOAT;
 
    if (map->mode & GL_MAP_WRITE_BIT) {
       uint32_t *packed_map = map->ptr;
@@ -960,10 +967,15 @@ intel_miptree_unmap_depthstencil(struct intel_context *intel,
 						 y + s_image_y + map->y);
 	    ptrdiff_t z_offset = ((y + z_image_y) * z_mt->region->pitch +
 				  (x + z_image_x));
-	    uint32_t packed = packed_map[y * map->w + x];
 
-	    s_map[s_offset] = packed >> 24;
-	    z_map[z_offset] = packed;
+	    if (map_z32f_x24s8) {
+	       z_map[z_offset] = packed_map[(y * map->w + x) * 2 + 0];
+	       s_map[s_offset] = packed_map[(y * map->w + x) * 2 + 1];
+	    } else {
+	       uint32_t packed = packed_map[y * map->w + x];
+	       s_map[s_offset] = packed >> 24;
+	       z_map[z_offset] = packed;
+	    }
 	 }
       }
 
-- 
1.7.7.3



More information about the mesa-dev mailing list