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

_______________________________________________
mesa-dev mailing list
mesa-dev@lists.freedesktop.org
http://lists.freedesktop.org/mailman/listinfo/mesa-dev

Reply via email to