Mesa (master): swrast: add coord clamping, fix comparisons for shadow testing

Brian Paul brianp at kemper.freedesktop.org
Tue Mar 8 15:32:23 UTC 2011


Module: Mesa
Branch: master
Commit: d9f584e663c7447e638acca2c164b16626a5271a
URL:    http://cgit.freedesktop.org/mesa/mesa/commit/?id=d9f584e663c7447e638acca2c164b16626a5271a

Author: Philip Taylor <excors at gmail.com>
Date:   Tue Mar  8 08:21:10 2011 -0700

swrast: add coord clamping, fix comparisons for shadow testing

This fixes https://bugs.freedesktop.org/show_bug.cgi?id=31159 for swrast
and piglit depth-tex-compare.

NOTE: This is a candidate for the 7.10 branch.

Signed-off-by: Brian Paul <brianp at vmware.com>

---

 src/mesa/swrast/s_texfilter.c |   57 +++++++++++++++++++++-------------------
 1 files changed, 30 insertions(+), 27 deletions(-)

diff --git a/src/mesa/swrast/s_texfilter.c b/src/mesa/swrast/s_texfilter.c
index ecc09e0..4b0a4bc 100644
--- a/src/mesa/swrast/s_texfilter.c
+++ b/src/mesa/swrast/s_texfilter.c
@@ -2918,51 +2918,51 @@ shadow_compare4(GLenum function, GLfloat coord,
 
    switch (function) {
    case GL_LEQUAL:
-      if (depth00 <= coord)  luminance -= d;
-      if (depth01 <= coord)  luminance -= d;
-      if (depth10 <= coord)  luminance -= d;
-      if (depth11 <= coord)  luminance -= d;
-      return luminance;
-   case GL_GEQUAL:
-      if (depth00 >= coord)  luminance -= d;
-      if (depth01 >= coord)  luminance -= d;
-      if (depth10 >= coord)  luminance -= d;
-      if (depth11 >= coord)  luminance -= d;
-      return luminance;
-   case GL_LESS:
       if (depth00 < coord)  luminance -= d;
       if (depth01 < coord)  luminance -= d;
       if (depth10 < coord)  luminance -= d;
       if (depth11 < coord)  luminance -= d;
       return luminance;
-   case GL_GREATER:
+   case GL_GEQUAL:
       if (depth00 > coord)  luminance -= d;
       if (depth01 > coord)  luminance -= d;
       if (depth10 > coord)  luminance -= d;
       if (depth11 > coord)  luminance -= d;
       return luminance;
-   case GL_EQUAL:
-      if (depth00 == coord)  luminance -= d;
-      if (depth01 == coord)  luminance -= d;
-      if (depth10 == coord)  luminance -= d;
-      if (depth11 == coord)  luminance -= d;
+   case GL_LESS:
+      if (depth00 <= coord)  luminance -= d;
+      if (depth01 <= coord)  luminance -= d;
+      if (depth10 <= coord)  luminance -= d;
+      if (depth11 <= coord)  luminance -= d;
       return luminance;
-   case GL_NOTEQUAL:
+   case GL_GREATER:
+      if (depth00 >= coord)  luminance -= d;
+      if (depth01 >= coord)  luminance -= d;
+      if (depth10 >= coord)  luminance -= d;
+      if (depth11 >= coord)  luminance -= d;
+      return luminance;
+   case GL_EQUAL:
       if (depth00 != coord)  luminance -= d;
       if (depth01 != coord)  luminance -= d;
       if (depth10 != coord)  luminance -= d;
       if (depth11 != coord)  luminance -= d;
       return luminance;
+   case GL_NOTEQUAL:
+      if (depth00 == coord)  luminance -= d;
+      if (depth01 == coord)  luminance -= d;
+      if (depth10 == coord)  luminance -= d;
+      if (depth11 == coord)  luminance -= d;
+      return luminance;
    case GL_ALWAYS:
-      return 0.0;
+      return 1.0F;
    case GL_NEVER:
       return ambient;
    case GL_NONE:
       /* ordinary bilinear filtering */
       return lerp_2d(wi, wj, depth00, depth10, depth01, depth11);
    default:
-      _mesa_problem(NULL, "Bad compare func in sample_depth_texture");
-      return 0.0F;
+      _mesa_problem(NULL, "Bad compare func in sample_compare4");
+      return ambient;
    }
 }
 
@@ -3030,7 +3030,7 @@ sample_depth_texture( struct gl_context *ctx,
    if (tObj->MagFilter == GL_NEAREST) {
       GLuint i;
       for (i = 0; i < n; i++) {
-         GLfloat depthSample;
+         GLfloat depthSample, depthRef;
          GLint col, row, slice;
 
          nearest_texcoord(tObj, level, texcoords[i], &col, &row, &slice);
@@ -3043,8 +3043,9 @@ sample_depth_texture( struct gl_context *ctx,
             depthSample = tObj->BorderColor.f[0];
          }
 
-         result = shadow_compare(function, texcoords[i][compare_coord],
-                                 depthSample, ambient);
+         depthRef = CLAMP(texcoords[i][compare_coord], 0.0F, 1.0F);
+
+         result = shadow_compare(function, depthRef, depthSample, ambient);
 
          switch (tObj->DepthMode) {
          case GL_LUMINANCE:
@@ -3068,7 +3069,7 @@ sample_depth_texture( struct gl_context *ctx,
       GLuint i;
       ASSERT(tObj->MagFilter == GL_LINEAR);
       for (i = 0; i < n; i++) {
-         GLfloat depth00, depth01, depth10, depth11;
+         GLfloat depth00, depth01, depth10, depth11, depthRef;
          GLint i0, i1, j0, j1;
          GLint slice;
          GLfloat wi, wj;
@@ -3134,7 +3135,9 @@ sample_depth_texture( struct gl_context *ctx,
             }
          }
 
-         result = shadow_compare4(function, texcoords[i][compare_coord],
+         depthRef = CLAMP(texcoords[i][compare_coord], 0.0F, 1.0F);
+
+         result = shadow_compare4(function, depthRef,
                                   depth00, depth01, depth10, depth11,
                                   ambient, wi, wj);
 




More information about the mesa-commit mailing list