[Mesa-dev] [PATCH 3/7] i965: Always handle GL_DEPTH_TEXTURE_MODE through the shader.

Eric Anholt eric at anholt.net
Wed Nov 23 12:37:17 PST 2011


We were already doing it through the shader (layered underneath
GL_EXT_texture_swizzle) in the shadow compare case.  This avoids
having per-format logic for switching out the surface format dependent
on the depth mode.
---
 src/mesa/drivers/dri/i965/brw_wm.c               |   38 +++++++++++++++-------
 src/mesa/drivers/dri/i965/brw_wm_surface_state.c |   23 ++-----------
 2 files changed, 29 insertions(+), 32 deletions(-)

diff --git a/src/mesa/drivers/dri/i965/brw_wm.c b/src/mesa/drivers/dri/i965/brw_wm.c
index 377b8ba..84b7710 100644
--- a/src/mesa/drivers/dri/i965/brw_wm.c
+++ b/src/mesa/drivers/dri/i965/brw_wm.c
@@ -420,25 +420,39 @@ static void brw_wm_populate_key( struct brw_context *brw,
 	    SWIZZLE_NIL
 	 };
 
-	 /* GL_DEPTH_TEXTURE_MODE is normally handled through
-	  * brw_wm_surface_state, but it applies to shadow compares as
-	  * well and our shadow compares always return the result in
-	  * all 4 channels.
-	  */
-	 if (sampler->CompareMode == GL_COMPARE_R_TO_TEXTURE_ARB) {
-	    key->compare_funcs[i] = sampler->CompareFunc;
-
-	    if (sampler->DepthMode == GL_ALPHA) {
+	 if (img->_BaseFormat == GL_DEPTH_COMPONENT) {
+	    if (sampler->CompareMode == GL_COMPARE_R_TO_TEXTURE_ARB)
+	       key->compare_funcs[i] = sampler->CompareFunc;
+
+	    /* We handle GL_DEPTH_TEXTURE_MODE here instead of as surface format
+	     * overrides because shadow comparison always returns the result of
+	     * the comparison in all channels anyway.
+	     */
+	    switch (sampler->DepthMode) {
+	    case GL_ALPHA:
 	       swizzles[0] = SWIZZLE_ZERO;
 	       swizzles[1] = SWIZZLE_ZERO;
 	       swizzles[2] = SWIZZLE_ZERO;
-	    } else if (sampler->DepthMode == GL_LUMINANCE) {
+	       swizzles[3] = SWIZZLE_X;
+	       break;
+	    case GL_LUMINANCE:
+	       swizzles[0] = SWIZZLE_X;
+	       swizzles[1] = SWIZZLE_X;
+	       swizzles[2] = SWIZZLE_X;
 	       swizzles[3] = SWIZZLE_ONE;
-	    } else if (sampler->DepthMode == GL_RED) {
-	       /* See table 3.23 of the GL 3.0 spec. */
+	       break;
+	    case GL_INTENSITY:
+	       swizzles[0] = SWIZZLE_X;
+	       swizzles[1] = SWIZZLE_X;
+	       swizzles[2] = SWIZZLE_X;
+	       swizzles[3] = SWIZZLE_X;
+	       break;
+	    case GL_RED:
+	       swizzles[0] = SWIZZLE_X;
 	       swizzles[1] = SWIZZLE_ZERO;
 	       swizzles[2] = SWIZZLE_ZERO;
 	       swizzles[3] = SWIZZLE_ONE;
+	       break;
 	    }
 	 }
 
diff --git a/src/mesa/drivers/dri/i965/brw_wm_surface_state.c b/src/mesa/drivers/dri/i965/brw_wm_surface_state.c
index 5a6896e..0f6abe2 100644
--- a/src/mesa/drivers/dri/i965/brw_wm_surface_state.c
+++ b/src/mesa/drivers/dri/i965/brw_wm_surface_state.c
@@ -568,29 +568,12 @@ translate_tex_format(gl_format mesa_format,
    switch( mesa_format ) {
 
    case MESA_FORMAT_Z16:
-      if (depth_mode == GL_INTENSITY) 
-	  return BRW_SURFACEFORMAT_I16_UNORM;
-      else if (depth_mode == GL_ALPHA)
-	  return BRW_SURFACEFORMAT_A16_UNORM;
-      else if (depth_mode == GL_RED)
-	  return BRW_SURFACEFORMAT_R16_UNORM;
-      else
-	  return BRW_SURFACEFORMAT_L16_UNORM;
+      return BRW_SURFACEFORMAT_I16_UNORM;
 
    case MESA_FORMAT_S8_Z24:
    case MESA_FORMAT_X8_Z24:
-      /* XXX: these different surface formats don't seem to
-       * make any difference for shadow sampler/compares.
-       */
-      if (depth_mode == GL_INTENSITY) 
-         return BRW_SURFACEFORMAT_I24X8_UNORM;
-      else if (depth_mode == GL_ALPHA)
-         return BRW_SURFACEFORMAT_A24X8_UNORM;
-      else if (depth_mode == GL_RED)
-         return BRW_SURFACEFORMAT_R24_UNORM_X8_TYPELESS;
-      else
-         return BRW_SURFACEFORMAT_L24X8_UNORM;
-      
+      return BRW_SURFACEFORMAT_I24X8_UNORM;
+
    case MESA_FORMAT_SARGB8:
    case MESA_FORMAT_SLA8:
    case MESA_FORMAT_SL8:
-- 
1.7.7.3



More information about the mesa-dev mailing list