Add support for Z24_S8 to GL state tracker.
authorBen Skeggs <skeggsb@gmail.com>
Tue, 20 Nov 2007 08:09:47 +0000 (19:09 +1100)
committerBen Skeggs <skeggsb@gmail.com>
Tue, 20 Nov 2007 08:09:47 +0000 (19:09 +1100)
src/mesa/pipe/p_format.h
src/mesa/state_tracker/st_cb_clear.c
src/mesa/state_tracker/st_cb_readpixels.c
src/mesa/state_tracker/st_format.c

index d478a6c58df5df71f1cc4df9496b4c8126b11538..f42f987c4e362e833d2e5d34cdefbd0d797763eb 100644 (file)
@@ -171,6 +171,7 @@ static INLINE uint pf_get(pipe_format_rgbazs_t f, uint shift, uint mask)
 #define _PIPE_FORMAT_RRRG _PIPE_FORMAT_SWZ( PIPE_FORMAT_COMP_R, PIPE_FORMAT_COMP_R, PIPE_FORMAT_COMP_R, PIPE_FORMAT_COMP_G )
 #define _PIPE_FORMAT_Z000 _PIPE_FORMAT_SWZ( PIPE_FORMAT_COMP_Z, PIPE_FORMAT_COMP_0, PIPE_FORMAT_COMP_0, PIPE_FORMAT_COMP_0 )
 #define _PIPE_FORMAT_SZ00 _PIPE_FORMAT_SWZ( PIPE_FORMAT_COMP_S, PIPE_FORMAT_COMP_Z, PIPE_FORMAT_COMP_0, PIPE_FORMAT_COMP_0 )
+#define _PIPE_FORMAT_ZS00 _PIPE_FORMAT_SWZ( PIPE_FORMAT_COMP_Z, PIPE_FORMAT_COMP_S, PIPE_FORMAT_COMP_0, PIPE_FORMAT_COMP_0 )
 #define _PIPE_FORMAT_S000 _PIPE_FORMAT_SWZ( PIPE_FORMAT_COMP_S, PIPE_FORMAT_COMP_0, PIPE_FORMAT_COMP_0, PIPE_FORMAT_COMP_0 )
 
 /**
@@ -222,6 +223,7 @@ static INLINE uint pf_rev(pipe_format_ycbcr_t f)
 #define PIPE_FORMAT_U_Z32                 _PIPE_FORMAT_RGBAZS_8N( _PIPE_FORMAT_Z000, 4, 0, 0, 0, PIPE_FORMAT_TYPE_UNORM )  /**< uint Z/depth */
 #define PIPE_FORMAT_F_Z32                 _PIPE_FORMAT_RGBAZS_8N( _PIPE_FORMAT_Z000, 4, 0, 0, 0, PIPE_FORMAT_TYPE_FLOAT )  /**< float Z/depth */
 #define PIPE_FORMAT_S8_Z24                _PIPE_FORMAT_RGBAZS_8N( _PIPE_FORMAT_SZ00, 1, 3, 0, 0, PIPE_FORMAT_TYPE_UNORM )  /**< 8-bit stencil + 24-bit Z */
+#define PIPE_FORMAT_Z24_S8                _PIPE_FORMAT_RGBAZS_8N( _PIPE_FORMAT_ZS00, 3, 1, 0, 0, PIPE_FORMAT_TYPE_UNORM )  /**< 24-bit Z + 8-bit stencil */
 #define PIPE_FORMAT_U_S8                  _PIPE_FORMAT_RGBAZS_8N( _PIPE_FORMAT_S000, 1, 0, 0, 0, PIPE_FORMAT_TYPE_UNORM )  /**< 8-bit stencil */
 #define PIPE_FORMAT_R64_FLOAT             _PIPE_FORMAT_RGBAZS_64( _PIPE_FORMAT_R000, 1, 0, 0, 0, PIPE_FORMAT_TYPE_FLOAT )
 #define PIPE_FORMAT_R64G64_FLOAT          _PIPE_FORMAT_RGBAZS_64( _PIPE_FORMAT_RG00, 1, 1, 0, 0, PIPE_FORMAT_TYPE_FLOAT )
index 3e591170da75a4e56f11ca12235a11df2ec5036d..219a5afcbdd53868b63e465ae22a00d618ca9eb9 100644 (file)
@@ -91,6 +91,8 @@ depth_value(GLuint pipeFormat, GLfloat value)
          return (uint) (value * 0xffffffff);
    case PIPE_FORMAT_S8_Z24:
       return (uint) (value * 0xffffff);
+   case PIPE_FORMAT_Z24_S8:
+      return ((uint) (value * 0xffffff)) << 8;
    default:
       assert(0);
       return 0;
@@ -103,7 +105,7 @@ is_depth_stencil_format(GLuint pipeFormat)
 {
    switch (pipeFormat) {
    case PIPE_FORMAT_S8_Z24:
-   /*case PIPE_FORMAT_Z24_S8:*/
+   case PIPE_FORMAT_Z24_S8:
       return GL_TRUE;
    default:
       return GL_FALSE;
@@ -521,11 +523,9 @@ clear_depth_stencil_buffer(GLcontext *ctx, struct gl_renderbuffer *rb)
       case PIPE_FORMAT_S8_Z24:
          clearValue |= ctx->Stencil.Clear << 24;
          break;
-#if 0
       case PIPE_FORMAT_Z24_S8:
-         clearValue = (clearValue << 8) | clearVal;
+         clearValue |= clearValue | ctx->Stencil.Clear;
          break;
-#endif
       default:
          assert(0);
       }  
index c347a0b6888e3ad38d1240430599011503646a93..2e7c01672a180561507792480f93938aec247896 100644 (file)
@@ -100,6 +100,15 @@ st_read_stencil_pixels(GLcontext *ctx, GLint x, GLint y,
             }
          }
          break;
+      case PIPE_FORMAT_Z24_S8:
+         {
+            const uint *src = (uint *) stmap + srcY * ps->region->pitch + x;
+            GLint k;
+            for (k = 0; k < width; k++) {
+               values[k] = src[k] & 0xff;
+            }
+         }
+         break;
       default:
          assert(0);
       }
index ddba65094158ee8c6984b326736c862126f6cfd6..c6b5bc968f07ab32fa0d2079c026708d7eb13891 100644 (file)
@@ -320,6 +320,9 @@ default_depth_format(
    if (pipe->is_format_supported( pipe, PIPE_FORMAT_S8_Z24 )) {
       return PIPE_FORMAT_S8_Z24;
    }
+   if (pipe->is_format_supported( pipe, PIPE_FORMAT_Z24_S8 )) {
+      return PIPE_FORMAT_Z24_S8;
+   }
    return PIPE_FORMAT_NONE;
 }
 
@@ -486,6 +489,8 @@ st_choose_pipe_format(struct pipe_context *pipe, GLint internalFormat,
    case GL_DEPTH_COMPONENT24:
       if (pipe->is_format_supported( pipe, PIPE_FORMAT_S8_Z24 ))
          return PIPE_FORMAT_S8_Z24;
+      if (pipe->is_format_supported( pipe, PIPE_FORMAT_Z24_S8 ))
+         return PIPE_FORMAT_Z24_S8;
       /* fall-through */
    case GL_DEPTH_COMPONENT32:
       if (pipe->is_format_supported( pipe, PIPE_FORMAT_U_Z32 ))
@@ -503,12 +508,16 @@ st_choose_pipe_format(struct pipe_context *pipe, GLint internalFormat,
          return PIPE_FORMAT_U_S8;
       if (pipe->is_format_supported( pipe, PIPE_FORMAT_S8_Z24 ))
          return PIPE_FORMAT_S8_Z24;
+      if (pipe->is_format_supported( pipe, PIPE_FORMAT_Z24_S8 ))
+         return PIPE_FORMAT_Z24_S8;
       return PIPE_FORMAT_NONE;
 
    case GL_DEPTH_STENCIL_EXT:
    case GL_DEPTH24_STENCIL8_EXT:
       if (pipe->is_format_supported( pipe, PIPE_FORMAT_S8_Z24 ))
          return PIPE_FORMAT_S8_Z24;
+      if (pipe->is_format_supported( pipe, PIPE_FORMAT_Z24_S8 ))
+         return PIPE_FORMAT_Z24_S8;
       return PIPE_FORMAT_NONE;
 
    default: