prototype implementation of GL_ARB_depth_texture, GL_ARB_shadow, GL_ARB_shadow_ambient
authorBrian Paul <brian.paul@tungstengraphics.com>
Tue, 4 Dec 2001 23:44:55 +0000 (23:44 +0000)
committerBrian Paul <brian.paul@tungstengraphics.com>
Tue, 4 Dec 2001 23:44:55 +0000 (23:44 +0000)
src/mesa/main/extensions.c
src/mesa/main/get.c
src/mesa/main/mtypes.h
src/mesa/main/texobj.c
src/mesa/main/texstate.c
src/mesa/swrast/s_texture.c

index 75b1f3967d1ba381cc93d74018dc605793ed3c87..75bbb05281a3e6593559ef52a23239097bbe6390 100644 (file)
@@ -1,4 +1,4 @@
-/* $Id: extensions.c,v 1.66 2001/11/19 00:41:32 brianp Exp $ */
+/* $Id: extensions.c,v 1.67 2001/12/04 23:44:55 brianp Exp $ */
 
 /*
  * Mesa 3-D graphics library
@@ -56,9 +56,12 @@ static struct {
    const char *name;
    int flag_offset;
 } default_extensions[] = {
+   { OFF, "GL_ARB_depth_texture",              F(SGIX_depth_texture) },
    { OFF, "GL_ARB_imaging",                    F(ARB_imaging) },
    { OFF, "GL_ARB_multisample",                F(ARB_multisample) },
    { OFF, "GL_ARB_multitexture",               F(ARB_multitexture) },
+   { OFF, "GL_ARB_shadow",                     F(ARB_shadow) },
+   { OFF, "GL_ARB_shadow_ambient",             F(SGIX_shadow_ambient) },
    { OFF, "GL_ARB_texture_border_clamp",       F(ARB_texture_border_clamp) },
    { OFF, "GL_ARB_texture_compression",        F(ARB_texture_compression) },
    { OFF, "GL_ARB_texture_cube_map",           F(ARB_texture_cube_map) },
@@ -133,8 +136,11 @@ void
 _mesa_enable_sw_extensions(GLcontext *ctx)
 {
    const char *extensions[] = {
+      "GL_ARB_depth_texture",
       "GL_ARB_imaging",
       "GL_ARB_multitexture",
+      "GL_ARB_shadow",
+      "GL_ARB_shadow_ambient",
       "GL_ARB_texture_border_clamp",
       "GL_ARB_texture_cube_map",
       "GL_ARB_texture_env_add",
index b7f5d09b794ba7ecb2a3238b9b274a9fa6460f5b..2e5130560193bc51d36cda76075b55151ce61e13 100644 (file)
@@ -1,4 +1,4 @@
-/* $Id: get.c,v 1.72 2001/11/06 15:53:00 brianp Exp $ */
+/* $Id: get.c,v 1.73 2001/12/04 23:44:56 brianp Exp $ */
 
 /*
  * Mesa 3-D graphics library
@@ -5366,8 +5366,8 @@ _mesa_GetString( GLenum name )
    GET_CURRENT_CONTEXT(ctx);
    static const char *vendor = "Brian Paul";
    static const char *renderer = "Mesa";
-   static const char *version_1_2 = "1.2 Mesa 4.1";
-   static const char *version_1_3 = "1.3 Mesa 4.1";
+   static const char *version_1_2 = "1.2 Mesa 4.1 beta";
+   static const char *version_1_3 = "1.3 Mesa 4.1 beta";
 
    ASSERT_OUTSIDE_BEGIN_END_WITH_RETVAL(ctx, 0);
 
index f8d330b75ce956f113d4627bdab08eda7afb75d1..865978214d101b030879dc7ab213964c4fbc1bf1 100644 (file)
@@ -1,4 +1,4 @@
-/* $Id: mtypes.h,v 1.53 2001/11/18 23:52:37 brianp Exp $ */
+/* $Id: mtypes.h,v 1.54 2001/12/04 23:44:56 brianp Exp $ */
 
 /*
  * Mesa 3-D graphics library
@@ -269,7 +269,7 @@ struct gl_colorbuffer_attrib {
 
    GLenum DrawBuffer;                  /* Which buffer to draw into */
    GLenum DriverDrawBuffer;            /* Current device driver dest buffer */
-   GLboolean MultiDrawBuffer;          /* Drawing to mutliple buffers? */
+   GLboolean MultiDrawBuffer;          /* Drawing to multiple buffers? */
    GLubyte DrawDestMask;               /* bitwise-OR of bitflags above */
 
    /* alpha testing */
@@ -556,6 +556,7 @@ struct gl_pixel_attrib {
    GLboolean MapColorFlag;
    GLboolean MapStencilFlag;
    GLfloat ZoomX, ZoomY;
+   /* XXX move these out of gl_pixel_attrib */
    GLint MapStoSsize;          /* Size of each pixel map */
    GLint MapItoIsize;
    GLint MapItoRsize;
@@ -827,7 +828,8 @@ struct gl_texture_object {
    GLuint Name;                        /* an unsigned integer */
    GLuint Dimensions;          /* 1 or 2 or 3 or 6 (cube map) */
    GLfloat Priority;           /* in [0,1] */
-   GLchan BorderColor[4];
+   GLfloat BorderValues[4];     /* unclamped */
+   GLchan BorderColor[4];       /* clamped, as GLchan */
    GLenum WrapS;               /* Wrap modes are: GL_CLAMP, REPEAT */
    GLenum WrapT;               /*   GL_CLAMP_TO_EDGE, and          */
    GLenum WrapR;               /*   GL_CLAMP_TO_BORDER_ARB         */
@@ -840,7 +842,10 @@ struct gl_texture_object {
    GLfloat MaxAnisotropy;      /* GL_EXT_texture_filter_anisotropic */
    GLboolean CompareFlag;      /* GL_SGIX_shadow */
    GLenum CompareOperator;     /* GL_SGIX_shadow */
-   GLchan ShadowAmbient;       /* GL_SGIX_shadow_ambient */
+   GLchan ShadowAmbient;       /* GL_SGIX/ARB_shadow_ambient */
+   GLenum CompareMode;         /* GL_ARB_shadow */
+   GLenum CompareFunc;         /* GL_ARB_shadow */
+   GLenum CompareResult;       /* GL_ARB_shadow */
    GLint _MaxLevel;            /* actual max mipmap level (q in the spec) */
    GLfloat _MaxLambda;         /* = _MaxLevel - BaseLevel (q - b in spec) */
    GLboolean GenerateMipmap;    /* GL_SGIS_generate_mipmap */
@@ -1198,6 +1203,7 @@ struct gl_extensions {
    GLboolean ARB_imaging;
    GLboolean ARB_multisample;
    GLboolean ARB_multitexture;
+   GLboolean ARB_shadow;
    GLboolean ARB_texture_border_clamp;
    GLboolean ARB_texture_compression;
    GLboolean ARB_texture_cube_map;
@@ -1245,10 +1251,10 @@ struct gl_extensions {
    GLboolean SGIS_generate_mipmap;
    GLboolean SGIS_pixel_texture;
    GLboolean SGIS_texture_edge_clamp;
-   GLboolean SGIX_depth_texture;
+   GLboolean SGIX_depth_texture;  /* or GL_ARB_depth_texture */
    GLboolean SGIX_pixel_texture;
    GLboolean SGIX_shadow;
-   GLboolean SGIX_shadow_ambient;
+   GLboolean SGIX_shadow_ambient; /* or GL_ARB_shadow_ambient */
    GLboolean _3DFX_texture_compression_FXT1;
 };
 
index a0af0f25abd259abc9290581b3847a83c2293ee7..a8a27ef3ed9e7017ea4c2d7c7a46bfc52a69d6c0 100644 (file)
@@ -1,4 +1,4 @@
-/* $Id: texobj.c,v 1.50 2001/07/27 14:30:50 brianp Exp $ */
+/* $Id: texobj.c,v 1.51 2001/12/04 23:44:56 brianp Exp $ */
 
 /*
  * Mesa 3-D graphics library
@@ -80,9 +80,12 @@ _mesa_alloc_texture_object( struct gl_shared_state *shared,
       obj->BaseLevel = 0;
       obj->MaxLevel = 1000;
       obj->MaxAnisotropy = 1.0;
-      obj->CompareFlag = GL_FALSE;
-      obj->CompareOperator = GL_TEXTURE_LEQUAL_R_SGIX;
-      obj->ShadowAmbient = 0;
+      obj->CompareFlag = GL_FALSE;                      /* SGIX_shadow */
+      obj->CompareOperator = GL_TEXTURE_LEQUAL_R_SGIX;  /* SGIX_shadow */
+      obj->CompareMode = GL_LUMINANCE;    /* ARB_shadow */
+      obj->CompareFunc = GL_LEQUAL;       /* ARB_shadow */
+      obj->CompareResult = GL_LUMINANCE;  /* ARB_shadow */
+      obj->ShadowAmbient = 0;             /* ARB/SGIX_shadow_ambient */
       _mesa_init_colortable(&obj->Palette);
 
       /* insert into linked list */
index 06c3f81871af0facd7f27a1e9c83646efbae28a2..6621ea417bf1f30e41ad60318985a84665765f6f 100644 (file)
@@ -1,4 +1,4 @@
-/* $Id: texstate.c,v 1.59 2001/11/06 15:53:00 brianp Exp $ */
+/* $Id: texstate.c,v 1.60 2001/12/04 23:44:56 brianp Exp $ */
 
 /*
  * Mesa 3-D graphics library
 #include "math/m_matrix.h"
 #endif
 
+/* TEMPORARY! */
+#ifndef GL_TEXTURE_COMPARE_MODE_ARB
+#define GL_TEXTURE_COMPARE_MODE_ARB    0x9990
+#define GL_TEXTURE_COMPARE_FUNC_ARB    0x9991
+#define GL_TEXTURE_COMPARE_RESULT_ARB  0x9992
+#define GL_COMPARE_R_TO_TEXTURE_ARB    0x9993
+#endif
 
 
 #ifdef SPECIALCAST
@@ -967,12 +974,27 @@ _mesa_TexParameterfv( GLenum target, GLenum pname, const GLfloat *params )
             _mesa_error( ctx, GL_INVALID_VALUE, "glTexParameter(param)" );
          }
          break;
-      case GL_TEXTURE_BORDER_COLOR:
+#if 0 /* someday */
+      case GL_TEXTUER_BORDER_VALUES_NV:
+         /* don't clamp */
+         COPY_4V(texObj->BorderValues, params);
          UNCLAMPED_FLOAT_TO_CHAN(texObj->BorderColor[0], params[0]);
          UNCLAMPED_FLOAT_TO_CHAN(texObj->BorderColor[1], params[1]);
          UNCLAMPED_FLOAT_TO_CHAN(texObj->BorderColor[2], params[2]);
          UNCLAMPED_FLOAT_TO_CHAN(texObj->BorderColor[3], params[3]);
          break;
+#endif
+      case GL_TEXTURE_BORDER_COLOR:
+         /* clamp */
+         texObj->BorderValues[0] = CLAMP(params[0], 0.0F, 1.0F);
+         texObj->BorderValues[1] = CLAMP(params[1], 0.0F, 1.0F);
+         texObj->BorderValues[2] = CLAMP(params[2], 0.0F, 1.0F);
+         texObj->BorderValues[3] = CLAMP(params[3], 0.0F, 1.0F);
+         UNCLAMPED_FLOAT_TO_CHAN(texObj->BorderColor[0], texObj->BorderValues[0]);
+         UNCLAMPED_FLOAT_TO_CHAN(texObj->BorderColor[1], texObj->BorderValues[1]);
+         UNCLAMPED_FLOAT_TO_CHAN(texObj->BorderColor[2], texObj->BorderValues[2]);
+         UNCLAMPED_FLOAT_TO_CHAN(texObj->BorderColor[3], texObj->BorderValues[3]);
+         break;
       case GL_TEXTURE_MIN_LOD:
          texObj->MinLod = params[0];
          break;
@@ -1038,7 +1060,7 @@ _mesa_TexParameterfv( GLenum target, GLenum pname, const GLfloat *params )
             return;
          }
          break;
-      case GL_SHADOW_AMBIENT_SGIX:
+      case GL_SHADOW_AMBIENT_SGIX: /* aka GL_TEXTURE_COMPARE_FAIL_VALUE_ARB */
          if (ctx->Extensions.SGIX_shadow_ambient) {
             UNCLAMPED_FLOAT_TO_CHAN(texObj->ShadowAmbient, params[0]);
          }
@@ -1058,6 +1080,62 @@ _mesa_TexParameterfv( GLenum target, GLenum pname, const GLfloat *params )
             return;
          }
          break;
+      case GL_TEXTURE_COMPARE_MODE_ARB:
+         if (ctx->Extensions.ARB_shadow) {
+            const GLenum mode = (GLenum) params[0];
+            if (mode == GL_LUMINANCE || mode == GL_COMPARE_R_TO_TEXTURE_ARB) {
+               texObj->CompareMode = params[0];
+            }
+            else {
+               _mesa_error(ctx, GL_INVALID_ENUM,
+                           "glTexParameter(bad GL_TEXTURE_COMPARE_MODE_ARB)");
+               return;
+            }
+         }
+         else {
+            _mesa_error(ctx, GL_INVALID_ENUM,
+                        "glTexParameter(pname=GL_TEXTURE_COMPARE_MODE_ARB)");
+            return;
+         }
+         break;
+      case GL_TEXTURE_COMPARE_FUNC_ARB:
+         if (ctx->Extensions.ARB_shadow) {
+            const GLenum func = (GLenum) params[0];
+            if (func == GL_LEQUAL || func == GL_GEQUAL) {
+               texObj->CompareFunc = params[0];
+            }
+            else {
+               _mesa_error(ctx, GL_INVALID_ENUM,
+                           "glTexParameter(bad GL_TEXTURE_COMPARE_FUNC_ARB)");
+               return;
+            }
+         }
+         else {
+            _mesa_error(ctx, GL_INVALID_ENUM,
+                        "glTexParameter(pname=GL_TEXTURE_COMPARE_FUNC_ARB)");
+            return;
+         }
+         break;
+      case GL_TEXTURE_COMPARE_RESULT_ARB:
+         if (ctx->Extensions.ARB_shadow) {
+            const GLenum result = (GLenum) params[0];
+            if (result == GL_LUMINANCE || result == GL_INTENSITY
+                || result == GL_ALPHA) {
+               texObj->CompareResult = params[0];
+            }
+            else {
+               _mesa_error(ctx, GL_INVALID_ENUM,
+                          "glTexParameter(bad GL_TEXTURE_COMPARE_RESULT_ARB)");
+               return;
+            }
+         }
+         else {
+            _mesa_error(ctx, GL_INVALID_ENUM,
+                        "glTexParameter(pname=GL_TEXTURE_COMPARE_RESULT_ARB)");
+            return;
+         }
+         break;
+
       default:
          {
             char s[100];
@@ -1321,7 +1399,17 @@ _mesa_GetTexParameterfv( GLenum target, GLenum pname, GLfloat *params )
       case GL_TEXTURE_WRAP_R_EXT:
          *params = ENUM_TO_FLOAT(obj->WrapR);
          return;
+#if 0 /* someday */
+      case GL_TEXTURE_BORDER_VALUES_NV:
+         /* unclamped */
+         params[0] = obj->BorderValues[0];
+         params[1] = obj->BorderValues[1];
+         params[2] = obj->BorderValues[2];
+         params[3] = obj->BorderValues[3];
+         return;
+#endif
       case GL_TEXTURE_BORDER_COLOR:
+         /* clamped */
          params[0] = obj->BorderColor[0] / CHAN_MAXF;
          params[1] = obj->BorderColor[1] / CHAN_MAXF;
          params[2] = obj->BorderColor[2] / CHAN_MAXF;
@@ -1364,7 +1452,7 @@ _mesa_GetTexParameterfv( GLenum target, GLenum pname, GLfloat *params )
             return;
          }
          break;
-      case GL_SHADOW_AMBIENT_SGIX:
+      case GL_SHADOW_AMBIENT_SGIX: /* aka GL_TEXTURE_COMPARE_FAIL_VALUE_ARB */
          if (ctx->Extensions.SGIX_shadow_ambient) {
             *params = CHAN_TO_FLOAT(obj->ShadowAmbient);
             return;
@@ -1376,6 +1464,24 @@ _mesa_GetTexParameterfv( GLenum target, GLenum pname, GLfloat *params )
             return;
          }
          break;
+      case GL_TEXTURE_COMPARE_MODE_ARB:
+         if (ctx->Extensions.ARB_shadow) {
+            *params = (GLfloat) obj->CompareMode;
+            return;
+         }
+         break;
+      case GL_TEXTURE_COMPARE_FUNC_ARB:
+         if (ctx->Extensions.ARB_shadow) {
+            *params = (GLfloat) obj->CompareFunc;
+            return;
+         }
+         break;
+      case GL_TEXTURE_COMPARE_RESULT_ARB:
+         if (ctx->Extensions.ARB_shadow) {
+            *params = (GLfloat) obj->CompareResult;
+            return;
+         }
+         break;
       default:
          ; /* silence warnings */
    }
@@ -1414,17 +1520,27 @@ _mesa_GetTexParameteriv( GLenum target, GLenum pname, GLint *params )
       case GL_TEXTURE_WRAP_R_EXT:
          *params = (GLint) obj->WrapR;
          return;
+#if 0 /* someday */
+      case GL_TEXTURE_BORDER_VALUES_NV:
+         /* unclamped */
+         params[0] = FLOAT_TO_INT(obj->BorderValues[0]);
+         params[1] = FLOAT_TO_INT(obj->BorderValues[1]);
+         params[2] = FLOAT_TO_INT(obj->BorderValues[2]);
+         params[3] = FLOAT_TO_INT(obj->BorderValues[3]);
+         return;
+#endif
       case GL_TEXTURE_BORDER_COLOR:
+         /* clamped */
          {
-            GLfloat color[4];
-            color[0] = obj->BorderColor[0] / CHAN_MAXF;
-            color[1] = obj->BorderColor[1] / CHAN_MAXF;
-            color[2] = obj->BorderColor[2] / CHAN_MAXF;
-            color[3] = obj->BorderColor[3] / CHAN_MAXF;
-            params[0] = FLOAT_TO_INT( color[0] );
-            params[1] = FLOAT_TO_INT( color[1] );
-            params[2] = FLOAT_TO_INT( color[2] );
-            params[3] = FLOAT_TO_INT( color[3] );
+            GLfloat b[4];
+            b[0] = CLAMP(obj->BorderValues[0], 0.0F, 1.0F);
+            b[1] = CLAMP(obj->BorderValues[1], 0.0F, 1.0F);
+            b[2] = CLAMP(obj->BorderValues[2], 0.0F, 1.0F);
+            b[3] = CLAMP(obj->BorderValues[3], 0.0F, 1.0F);
+            params[0] = FLOAT_TO_INT(b[0]);
+            params[1] = FLOAT_TO_INT(b[1]);
+            params[2] = FLOAT_TO_INT(b[2]);
+            params[3] = FLOAT_TO_INT(b[3]);
          }
          return;
       case GL_TEXTURE_RESIDENT:
@@ -1464,10 +1580,10 @@ _mesa_GetTexParameteriv( GLenum target, GLenum pname, GLint *params )
             return;
          }
          break;
-      case GL_SHADOW_AMBIENT_SGIX:
+      case GL_SHADOW_AMBIENT_SGIX: /* aka GL_TEXTURE_COMPARE_FAIL_VALUE_ARB */
          if (ctx->Extensions.SGIX_shadow_ambient) {
-            /* XXX range? */
-            *params = (GLint) CHAN_TO_FLOAT(obj->ShadowAmbient);
+            GLfloat a = CHAN_TO_FLOAT(obj->ShadowAmbient);
+            *params = (GLint) FLOAT_TO_INT(a);
             return;
          }
          break;
@@ -1477,6 +1593,24 @@ _mesa_GetTexParameteriv( GLenum target, GLenum pname, GLint *params )
             return;
          }
          break;
+      case GL_TEXTURE_COMPARE_MODE_ARB:
+         if (ctx->Extensions.ARB_shadow) {
+            *params = (GLint) obj->CompareMode;
+            return;
+         }
+         break;
+      case GL_TEXTURE_COMPARE_FUNC_ARB:
+         if (ctx->Extensions.ARB_shadow) {
+            *params = (GLint) obj->CompareFunc;
+            return;
+         }
+         break;
+      case GL_TEXTURE_COMPARE_RESULT_ARB:
+         if (ctx->Extensions.ARB_shadow) {
+            *params = (GLint) obj->CompareResult;
+            return;
+         }
+         break;
       default:
          ; /* silence warnings */
    }
index e1e1d0f0ceb674f2c72fc6917e183cdf4c0eb958..b849e191773771c96c0d5afaaf51a08ffbf729b5 100644 (file)
@@ -1,4 +1,4 @@
-/* $Id: s_texture.c,v 1.42 2001/11/19 01:18:28 brianp Exp $ */
+/* $Id: s_texture.c,v 1.43 2001/12/04 23:44:56 brianp Exp $ */
 
 /*
  * Mesa 3-D graphics library
@@ -2722,6 +2722,9 @@ sample_depth_texture(const GLcontext *ctx,
    const GLuint height = texImage->Height;
    const GLchan ambient = texObj->ShadowAmbient;
    GLboolean lequal, gequal;
+   GLchan result;
+
+   ASSERT(texObj->Image[texObj->BaseLevel]->Format == GL_DEPTH_COMPONENT);
 
    if (texObj->Dimensions != 2) {
       _mesa_problem(ctx, "only 2-D depth textures supported at this time");
@@ -2733,22 +2736,36 @@ sample_depth_texture(const GLcontext *ctx,
       return;
    }
 
-   /* XXX the GL_SGIX_shadow extension spec doesn't say what to do if
-    * GL_TEXTURE_COMPARE_SGIX == GL_TRUE but the current texture object
-    * isn't a depth texture.
-    */
-   if (texImage->Format != GL_DEPTH_COMPONENT) {
-      _mesa_problem(ctx,"GL_TEXTURE_COMPARE_SGIX enabled with non-depth texture");
-      return;
+   /* XXX this could be precomputed */
+   if (texObj->CompareFlag) {
+      /* GL_SGIX_shadow */
+      if (texObj->CompareOperator == GL_TEXTURE_LEQUAL_R_SGIX) {
+         lequal = GL_TRUE;
+         gequal = GL_FALSE;
+      }
+      else {
+         ASSERT(texObj->CompareOperator == GL_TEXTURE_GEQUAL_R_SGIX);
+         lequal = GL_FALSE;
+         gequal = GL_TRUE;
+      }
    }
-
-   if (texObj->CompareOperator == GL_TEXTURE_LEQUAL_R_SGIX) {
-      lequal = GL_TRUE;
-      gequal = GL_FALSE;
+   else if (texObj->CompareMode == GL_COMPARE_R_TO_TEXTURE_ARB) {
+      /* GL_ARB_shadow */
+      if (texObj->CompareFunc == GL_LEQUAL) {
+         lequal = GL_TRUE;
+         gequal = GL_FALSE;
+      }
+      else {
+         ASSERT(texObj->CompareFunc == GL_GEQUAL);
+         lequal = GL_FALSE;
+         gequal = GL_TRUE;
+      }
    }
    else {
-      lequal = GL_FALSE;
-      gequal = GL_TRUE;
+      /* Treat this depth texture as a luminance texture */
+      _mesa_warning(ctx,
+         "Treating GL_DEPTH_COMPONENT as GL_LUMINANCE not implemented yet");
+      return;
    }
 
    if (texObj->MagFilter == GL_NEAREST) {
@@ -2761,16 +2778,33 @@ sample_depth_texture(const GLcontext *ctx,
          depthSample = *((const GLfloat *) texImage->Data + row * width + col);
          if ((r[i] <= depthSample && lequal) ||
              (r[i] >= depthSample && gequal)) {
-            texel[i][RCOMP] = CHAN_MAX;
-            texel[i][GCOMP] = CHAN_MAX;
-            texel[i][BCOMP] = CHAN_MAX;
-            texel[i][ACOMP] = CHAN_MAX;
+            result = CHAN_MAX;
          }
          else {
-            texel[i][RCOMP] = ambient;
-            texel[i][GCOMP] = ambient;
-            texel[i][BCOMP] = ambient;
+            result = ambient;
+         }
+
+         switch (texObj->CompareResult) {
+         case GL_LUMINANCE:
+            texel[i][RCOMP] = result;
+            texel[i][GCOMP] = result;
+            texel[i][BCOMP] = result;
             texel[i][ACOMP] = CHAN_MAX;
+            break;
+         case GL_INTENSITY:
+            texel[i][RCOMP] = result;
+            texel[i][GCOMP] = result;
+            texel[i][BCOMP] = result;
+            texel[i][ACOMP] = result;
+            break;
+         case GL_ALPHA:
+            texel[i][RCOMP] = 0;
+            texel[i][GCOMP] = 0;
+            texel[i][BCOMP] = 0;
+            texel[i][ACOMP] = result;
+            break;
+         default:
+            _mesa_problem(ctx, "Bad texture compare result value");
          }
       }
    }
@@ -2838,16 +2872,10 @@ sample_depth_texture(const GLcontext *ctx,
                                       + w01 * depth01 + w11 * depth11;
             if ((depthSample <= r[i] && lequal) ||
                 (depthSample >= r[i] && gequal)) {
-               texel[i][RCOMP] = ambient;
-               texel[i][GCOMP] = ambient;
-               texel[i][BCOMP] = ambient;
-               texel[i][ACOMP] = CHAN_MAX;
+               result  = ambient;
             }
             else {
-               texel[i][RCOMP] = CHAN_MAX;
-               texel[i][GCOMP] = CHAN_MAX;
-               texel[i][BCOMP] = CHAN_MAX;
-               texel[i][ACOMP] = CHAN_MAX;
+               result = CHAN_MAX;
             }
          }
          else {
@@ -2857,7 +2885,6 @@ sample_depth_texture(const GLcontext *ctx,
              */
             const GLfloat d = (CHAN_MAXF - (GLfloat) ambient) * 0.25F;
             GLfloat luminance = CHAN_MAXF;
-            GLchan lum;
             if (lequal) {
                if (depth00 <= r[i])   luminance -= d;
                if (depth01 <= r[i])   luminance -= d;
@@ -2870,14 +2897,33 @@ sample_depth_texture(const GLcontext *ctx,
                if (depth10 >= r[i])   luminance -= d;
                if (depth11 >= r[i])   luminance -= d;
             }
-            lum = (GLchan) luminance;
-            texel[i][RCOMP] = lum;
-            texel[i][GCOMP] = lum;
-            texel[i][BCOMP] = lum;
+            result = (GLchan) luminance;
+         }
+
+         switch (texObj->CompareResult) {
+         case GL_LUMINANCE:
+            texel[i][RCOMP] = result;
+            texel[i][GCOMP] = result;
+            texel[i][BCOMP] = result;
             texel[i][ACOMP] = CHAN_MAX;
+            break;
+         case GL_INTENSITY:
+            texel[i][RCOMP] = result;
+            texel[i][GCOMP] = result;
+            texel[i][BCOMP] = result;
+            texel[i][ACOMP] = result;
+            break;
+         case GL_ALPHA:
+            texel[i][RCOMP] = 0;
+            texel[i][GCOMP] = 0;
+            texel[i][BCOMP] = 0;
+            texel[i][ACOMP] = result;
+            break;
+         default:
+            _mesa_problem(ctx, "Bad texture compare result value");
          }
-      }
-   }
+      }  /* for */
+   }  /* if filter */
 }
 
 
@@ -2990,6 +3036,7 @@ _swrast_texture_fragments( GLcontext *ctx, GLuint texUnit, GLuint n,
       const struct gl_texture_unit *textureUnit = &ctx->Texture.Unit[texUnit];
 
       if (textureUnit->_Current) {   /* XXX need this? */
+         const struct gl_texture_object *curObj = textureUnit->_Current;
          GLchan texel[PB_SIZE][4];
 
         if (textureUnit->LodBias != 0.0F) {
@@ -3000,12 +3047,11 @@ _swrast_texture_fragments( GLcontext *ctx, GLuint texUnit, GLuint n,
            }
         }
 
-         if ((textureUnit->_Current->MinLod != -1000.0
-              || textureUnit->_Current->MaxLod != 1000.0)
+         if ((curObj->MinLod != -1000.0 || curObj->MaxLod != 1000.0)
              && lambda) {
             /* apply LOD clamping to lambda */
-            const GLfloat min = textureUnit->_Current->MinLod;
-            const GLfloat max = textureUnit->_Current->MaxLod;
+            const GLfloat min = curObj->MinLod;
+            const GLfloat max = curObj->MaxLod;
             GLuint i;
             for (i=0;i<n;i++) {
                GLfloat l = lambda[i];
@@ -3014,7 +3060,7 @@ _swrast_texture_fragments( GLcontext *ctx, GLuint texUnit, GLuint n,
          }
 
          /* Sample the texture. */
-         if (textureUnit->_Current->CompareFlag) {
+         if (curObj->Image[curObj->BaseLevel]->Format == GL_DEPTH_COMPONENT) {
             /* depth texture */
             sample_depth_texture(ctx, textureUnit, n, s, t, r, texel);
          }