gallium: add util_format_stencil_only helper function
authorMarek Olšák <maraeo@gmail.com>
Sat, 7 Jul 2012 21:23:49 +0000 (23:23 +0200)
committerMarek Olšák <maraeo@gmail.com>
Thu, 12 Jul 2012 00:08:30 +0000 (02:08 +0200)
used for stencil sampler views.

Reviewed-by: Alex Deucher <alexander.deucher@amd.com>
src/gallium/auxiliary/util/u_format.h
src/mesa/state_tracker/st_cb_drawpixels.c

index e35e164..a718389 100644 (file)
@@ -882,6 +882,35 @@ util_format_linear(enum pipe_format format)
 }
 
 /**
+ * Given a depth-stencil format, return the corresponding stencil-only format.
+ * For stencil-only formats, return the format unchanged.
+ */
+static INLINE enum pipe_format
+util_format_stencil_only(enum pipe_format format)
+{
+   switch (format) {
+   /* mask out the depth component */
+   case PIPE_FORMAT_Z24_UNORM_S8_UINT:
+      return PIPE_FORMAT_X24S8_UINT;
+   case PIPE_FORMAT_S8_UINT_Z24_UNORM:
+      return PIPE_FORMAT_S8X24_UINT;
+   case PIPE_FORMAT_Z32_FLOAT_S8X24_UINT:
+      return PIPE_FORMAT_X32_S8X24_UINT;
+
+   /* stencil only formats */
+   case PIPE_FORMAT_X24S8_UINT:
+   case PIPE_FORMAT_S8X24_UINT:
+   case PIPE_FORMAT_X32_S8X24_UINT:
+   case PIPE_FORMAT_S8_UINT:
+      return format;
+
+   default:
+      assert(0);
+      return PIPE_FORMAT_NONE;
+   }
+}
+
+/**
  * Return the number of components stored.
  * Formats with block size != 1x1 will always have 1 component (the block).
  */
index 2bcbada..10eaa84 100644 (file)
@@ -1165,27 +1165,8 @@ st_DrawPixels(struct gl_context *ctx, GLint x, GLint y,
              * The stencil is written using the shader stencil export
              * functionality. */
             if (write_stencil) {
-               enum pipe_format stencil_format = PIPE_FORMAT_NONE;
-
-               switch (pt->format) {
-               case PIPE_FORMAT_Z24_UNORM_S8_UINT:
-               case PIPE_FORMAT_X24S8_UINT:
-                  stencil_format = PIPE_FORMAT_X24S8_UINT;
-                  break;
-               case PIPE_FORMAT_S8_UINT_Z24_UNORM:
-               case PIPE_FORMAT_S8X24_UINT:
-                  stencil_format = PIPE_FORMAT_S8X24_UINT;
-                  break;
-               case PIPE_FORMAT_Z32_FLOAT_S8X24_UINT:
-               case PIPE_FORMAT_X32_S8X24_UINT:
-                  stencil_format = PIPE_FORMAT_X32_S8X24_UINT;
-                  break;
-               case PIPE_FORMAT_S8_UINT:
-                  stencil_format = PIPE_FORMAT_S8_UINT;
-                  break;
-               default:
-                  assert(0);
-               }
+               enum pipe_format stencil_format =
+                     util_format_stencil_only(pt->format);
 
                sv[1] = st_create_texture_sampler_view_format(st->pipe, pt,
                                                              stencil_format);