util/u_surface: Fix util_clear_depth_stencil for Z32_FLOAT_S8X24_UINT.
authorJosé Fonseca <jfonseca@vmware.com>
Wed, 7 Nov 2012 12:57:15 +0000 (12:57 +0000)
committerJosé Fonseca <jfonseca@vmware.com>
Fri, 9 Nov 2012 13:43:19 +0000 (13:43 +0000)
util_pack_z_stencil was being unconditionally invoked for all formats,
causing an assertion failure for Z32_FLOAT_S8X24_UINT.

NOTE: Candidate for the stable branches.

Reviewed-by: Brian Paul <brianp@vmware.com>
Reviewed-by: Roland Scheidegger <sroland@vmware.com>
src/gallium/auxiliary/util/u_surface.c

index 304da90..055e538 100644 (file)
@@ -271,7 +271,8 @@ util_clear_depth_stencil(struct pipe_context *pipe,
 
    if (dst_map) {
       unsigned dst_stride = dst_trans->stride;
-      unsigned zstencil = util_pack_z_stencil(dst->texture->format, depth, stencil);
+      uint64_t zstencil = util_pack64_z_stencil(dst->texture->format,
+                                                depth, stencil);
       unsigned i, j;
       assert(dst_trans->stride > 0);
 
@@ -279,10 +280,10 @@ util_clear_depth_stencil(struct pipe_context *pipe,
       case 1:
          assert(dst->format == PIPE_FORMAT_S8_UINT);
          if(dst_stride == width)
-            memset(dst_map, (ubyte) zstencil, height * width);
+            memset(dst_map, (uint8_t) zstencil, height * width);
          else {
             for (i = 0; i < height; i++) {
-               memset(dst_map, (ubyte) zstencil, width);
+               memset(dst_map, (uint8_t) zstencil, width);
                dst_map += dst_stride;
             }
          }
@@ -301,7 +302,7 @@ util_clear_depth_stencil(struct pipe_context *pipe,
             for (i = 0; i < height; i++) {
                uint32_t *row = (uint32_t *)dst_map;
                for (j = 0; j < width; j++)
-                  *row++ = zstencil;
+                  *row++ = (uint32_t) zstencil;
                dst_map += dst_stride;
             }
          }
@@ -319,19 +320,13 @@ util_clear_depth_stencil(struct pipe_context *pipe,
                uint32_t *row = (uint32_t *)dst_map;
                for (j = 0; j < width; j++) {
                   uint32_t tmp = *row & dst_mask;
-                  *row++ = tmp | (zstencil & ~dst_mask);
+                  *row++ = tmp | ((uint32_t) zstencil & ~dst_mask);
                }
                dst_map += dst_stride;
             }
          }
          break;
       case 8:
-      {
-         uint64_t zstencil = util_pack64_z_stencil(dst->texture->format,
-                                                   depth, stencil);
-
-         assert(dst->format == PIPE_FORMAT_Z32_FLOAT_S8X24_UINT);
-
          if (!need_rmw) {
             for (i = 0; i < height; i++) {
                uint64_t *row = (uint64_t *)dst_map;
@@ -358,7 +353,6 @@ util_clear_depth_stencil(struct pipe_context *pipe,
             }
          }
          break;
-      }
       default:
          assert(0);
          break;