Test implementation of proposed GL_EXT_shadow_funcs extension. This just
generalizes the R/texture comparision operators to include all eight of the depth test comparisons.
This commit is contained in:
@@ -1,4 +1,4 @@
|
||||
/* $Id: extensions.c,v 1.70 2002/03/13 04:33:16 brianp Exp $ */
|
||||
/* $Id: extensions.c,v 1.71 2002/03/23 16:33:53 brianp Exp $ */
|
||||
|
||||
/*
|
||||
* Mesa 3-D graphics library
|
||||
@@ -90,6 +90,7 @@ static struct {
|
||||
{ ON, "GL_EXT_polygon_offset", F(EXT_polygon_offset) },
|
||||
{ ON, "GL_EXT_rescale_normal", F(EXT_rescale_normal) },
|
||||
{ OFF, "GL_EXT_secondary_color", F(EXT_secondary_color) },
|
||||
{ OFF, "GL_EXT_shadow_funcs", F(EXT_shadow_funcs) },
|
||||
{ OFF, "GL_EXT_shared_texture_palette", F(EXT_shared_texture_palette) },
|
||||
{ OFF, "GL_EXT_stencil_wrap", F(EXT_stencil_wrap) },
|
||||
{ ON, "GL_EXT_texture3D", F(EXT_texture3D) },
|
||||
@@ -159,6 +160,7 @@ _mesa_enable_sw_extensions(GLcontext *ctx)
|
||||
"GL_EXT_histogram",
|
||||
"GL_EXT_paletted_texture",
|
||||
"GL_EXT_point_parameters",
|
||||
"GL_EXT_shadow_funcs",
|
||||
"GL_EXT_secondary_color",
|
||||
"GL_EXT_shared_texture_palette",
|
||||
"GL_EXT_stencil_wrap",
|
||||
|
@@ -1,4 +1,4 @@
|
||||
/* $Id: mtypes.h,v 1.67 2002/03/16 00:53:15 brianp Exp $ */
|
||||
/* $Id: mtypes.h,v 1.68 2002/03/23 16:33:53 brianp Exp $ */
|
||||
|
||||
/*
|
||||
* Mesa 3-D graphics library
|
||||
@@ -1408,6 +1408,7 @@ struct gl_extensions {
|
||||
GLboolean EXT_point_parameters;
|
||||
GLboolean EXT_polygon_offset;
|
||||
GLboolean EXT_rescale_normal;
|
||||
GLboolean EXT_shadow_funcs;
|
||||
GLboolean EXT_secondary_color;
|
||||
GLboolean EXT_shared_texture_palette;
|
||||
GLboolean EXT_stencil_wrap;
|
||||
|
@@ -1,4 +1,4 @@
|
||||
/* $Id: texstate.c,v 1.65 2002/03/23 01:48:18 brianp Exp $ */
|
||||
/* $Id: texstate.c,v 1.66 2002/03/23 16:33:53 brianp Exp $ */
|
||||
|
||||
/*
|
||||
* Mesa 3-D graphics library
|
||||
@@ -1125,6 +1125,16 @@ _mesa_TexParameterfv( GLenum target, GLenum pname, const GLfloat *params )
|
||||
FLUSH_VERTICES(ctx, _NEW_TEXTURE);
|
||||
texObj->CompareFunc = params[0];
|
||||
}
|
||||
else if (ctx->Extensions.EXT_shadow_funcs &&
|
||||
(func == GL_EQUAL ||
|
||||
func == GL_NOTEQUAL ||
|
||||
func == GL_LESS ||
|
||||
func == GL_GREATER ||
|
||||
func == GL_ALWAYS ||
|
||||
func == GL_NEVER)) {
|
||||
FLUSH_VERTICES(ctx, _NEW_TEXTURE);
|
||||
texObj->CompareFunc = params[0];
|
||||
}
|
||||
else {
|
||||
_mesa_error(ctx, GL_INVALID_ENUM,
|
||||
"glTexParameter(bad GL_TEXTURE_COMPARE_FUNC_ARB)");
|
||||
|
@@ -1,4 +1,4 @@
|
||||
/* $Id: s_texture.c,v 1.56 2002/03/16 18:02:08 brianp Exp $ */
|
||||
/* $Id: s_texture.c,v 1.57 2002/03/23 16:33:53 brianp Exp $ */
|
||||
|
||||
/*
|
||||
* Mesa 3-D graphics library
|
||||
@@ -2030,7 +2030,7 @@ sample_depth_texture( GLcontext *ctx, GLuint unit,
|
||||
const GLuint width = texImage->Width;
|
||||
const GLuint height = texImage->Height;
|
||||
const GLchan ambient = tObj->ShadowAmbient;
|
||||
GLboolean lequal, gequal;
|
||||
GLenum function;
|
||||
GLchan result;
|
||||
|
||||
(void) unit;
|
||||
@@ -2044,29 +2044,19 @@ sample_depth_texture( GLcontext *ctx, GLuint unit,
|
||||
if (tObj->CompareFlag) {
|
||||
/* GL_SGIX_shadow */
|
||||
if (tObj->CompareOperator == GL_TEXTURE_LEQUAL_R_SGIX) {
|
||||
lequal = GL_TRUE;
|
||||
gequal = GL_FALSE;
|
||||
function = GL_LEQUAL;
|
||||
}
|
||||
else {
|
||||
ASSERT(tObj->CompareOperator == GL_TEXTURE_GEQUAL_R_SGIX);
|
||||
lequal = GL_FALSE;
|
||||
gequal = GL_TRUE;
|
||||
function = GL_GEQUAL;
|
||||
}
|
||||
}
|
||||
else if (tObj->CompareMode == GL_COMPARE_R_TO_TEXTURE_ARB) {
|
||||
/* GL_ARB_shadow */
|
||||
if (tObj->CompareFunc == GL_LEQUAL) {
|
||||
lequal = GL_TRUE;
|
||||
gequal = GL_FALSE;
|
||||
function = tObj->CompareFunc;
|
||||
}
|
||||
else {
|
||||
ASSERT(tObj->CompareFunc == GL_GEQUAL);
|
||||
lequal = GL_FALSE;
|
||||
gequal = GL_TRUE;
|
||||
}
|
||||
}
|
||||
else {
|
||||
lequal = gequal = GL_FALSE;
|
||||
function = GL_NONE; /* pass depth through as grayscale */
|
||||
}
|
||||
|
||||
if (tObj->MagFilter == GL_NEAREST) {
|
||||
@@ -2078,21 +2068,37 @@ sample_depth_texture( GLcontext *ctx, GLuint unit,
|
||||
COMPUTE_NEAREST_TEXEL_LOCATION(tObj->WrapT, texcoords[i][1], height, row);
|
||||
depthSample = *((const GLfloat *) texImage->Data + row * width + col);
|
||||
|
||||
if (lequal) {
|
||||
if (texcoords[i][2] <= depthSample)
|
||||
switch (function) {
|
||||
case GL_LEQUAL:
|
||||
result = (texcoords[i][2] <= depthSample) ? CHAN_MAX : ambient;
|
||||
break;
|
||||
case GL_GEQUAL:
|
||||
result = (texcoords[i][2] >= depthSample) ? CHAN_MAX : ambient;
|
||||
break;
|
||||
case GL_LESS:
|
||||
result = (texcoords[i][2] < depthSample) ? CHAN_MAX : ambient;
|
||||
break;
|
||||
case GL_GREATER:
|
||||
result = (texcoords[i][2] > depthSample) ? CHAN_MAX : ambient;
|
||||
break;
|
||||
case GL_EQUAL:
|
||||
result = (texcoords[i][2] == depthSample) ? CHAN_MAX : ambient;
|
||||
break;
|
||||
case GL_NOTEQUAL:
|
||||
result = (texcoords[i][2] != depthSample) ? CHAN_MAX : ambient;
|
||||
break;
|
||||
case GL_ALWAYS:
|
||||
result = CHAN_MAX;
|
||||
else
|
||||
break;
|
||||
case GL_NEVER:
|
||||
result = ambient;
|
||||
}
|
||||
else if (gequal) {
|
||||
if (texcoords[i][2] >= depthSample)
|
||||
result = CHAN_MAX;
|
||||
else
|
||||
result = ambient;
|
||||
}
|
||||
else {
|
||||
/* no comparison */
|
||||
break;
|
||||
case GL_NONE:
|
||||
CLAMPED_FLOAT_TO_CHAN(result, depthSample);
|
||||
break;
|
||||
default:
|
||||
_mesa_problem(ctx, "Bad compare func in sample_depth_texture");
|
||||
return;
|
||||
}
|
||||
|
||||
switch (tObj->DepthMode) {
|
||||
@@ -2181,8 +2187,8 @@ sample_depth_texture( GLcontext *ctx, GLuint unit,
|
||||
const GLfloat w11 = ( a) * ( b);
|
||||
const GLfloat depthSample = w00 * depth00 + w10 * depth10
|
||||
+ w01 * depth01 + w11 * depth11;
|
||||
if ((depthSample <= texcoords[i][2] && lequal) ||
|
||||
(depthSample >= texcoords[i][2] && gequal)) {
|
||||
if ((depthSample <= texcoords[i][2] && function == GL_LEQUAL) ||
|
||||
(depthSample >= texcoords[i][2] && function == GL_GEQUAL)) {
|
||||
result = ambient;
|
||||
}
|
||||
else {
|
||||
@@ -2196,22 +2202,59 @@ sample_depth_texture( GLcontext *ctx, GLuint unit,
|
||||
*/
|
||||
const GLfloat d = (CHAN_MAXF - (GLfloat) ambient) * 0.25F;
|
||||
GLfloat luminance = CHAN_MAXF;
|
||||
if (lequal) {
|
||||
|
||||
switch (function) {
|
||||
case GL_LEQUAL:
|
||||
if (depth00 <= texcoords[i][2]) luminance -= d;
|
||||
if (depth01 <= texcoords[i][2]) luminance -= d;
|
||||
if (depth10 <= texcoords[i][2]) luminance -= d;
|
||||
if (depth11 <= texcoords[i][2]) luminance -= d;
|
||||
result = (GLchan) luminance;
|
||||
}
|
||||
else if (gequal) {
|
||||
break;
|
||||
case GL_GEQUAL:
|
||||
if (depth00 >= texcoords[i][2]) luminance -= d;
|
||||
if (depth01 >= texcoords[i][2]) luminance -= d;
|
||||
if (depth10 >= texcoords[i][2]) luminance -= d;
|
||||
if (depth11 >= texcoords[i][2]) luminance -= d;
|
||||
result = (GLchan) luminance;
|
||||
}
|
||||
else {
|
||||
/* no comparison, just bilinear sampling */
|
||||
break;
|
||||
case GL_LESS:
|
||||
if (depth00 < texcoords[i][2]) luminance -= d;
|
||||
if (depth01 < texcoords[i][2]) luminance -= d;
|
||||
if (depth10 < texcoords[i][2]) luminance -= d;
|
||||
if (depth11 < texcoords[i][2]) luminance -= d;
|
||||
result = (GLchan) luminance;
|
||||
break;
|
||||
case GL_GREATER:
|
||||
if (depth00 > texcoords[i][2]) luminance -= d;
|
||||
if (depth01 > texcoords[i][2]) luminance -= d;
|
||||
if (depth10 > texcoords[i][2]) luminance -= d;
|
||||
if (depth11 > texcoords[i][2]) luminance -= d;
|
||||
result = (GLchan) luminance;
|
||||
break;
|
||||
case GL_EQUAL:
|
||||
if (depth00 == texcoords[i][2]) luminance -= d;
|
||||
if (depth01 == texcoords[i][2]) luminance -= d;
|
||||
if (depth10 == texcoords[i][2]) luminance -= d;
|
||||
if (depth11 == texcoords[i][2]) luminance -= d;
|
||||
result = (GLchan) luminance;
|
||||
break;
|
||||
case GL_NOTEQUAL:
|
||||
if (depth00 != texcoords[i][2]) luminance -= d;
|
||||
if (depth01 != texcoords[i][2]) luminance -= d;
|
||||
if (depth10 != texcoords[i][2]) luminance -= d;
|
||||
if (depth11 != texcoords[i][2]) luminance -= d;
|
||||
result = (GLchan) luminance;
|
||||
break;
|
||||
case GL_ALWAYS:
|
||||
result = 0;
|
||||
break;
|
||||
case GL_NEVER:
|
||||
result = CHAN_MAXF;
|
||||
break;
|
||||
case GL_NONE:
|
||||
/* ordinary bilinear filtering */
|
||||
{
|
||||
const GLfloat a = FRAC(u + 1.0F);
|
||||
const GLfloat b = FRAC(v + 1.0F);
|
||||
const GLfloat w00 = (1.0F - a) * (1.0F - b);
|
||||
@@ -2222,6 +2265,11 @@ sample_depth_texture( GLcontext *ctx, GLuint unit,
|
||||
+ w01 * depth01 + w11 * depth11;
|
||||
CLAMPED_FLOAT_TO_CHAN(result, depthSample);
|
||||
}
|
||||
break;
|
||||
default:
|
||||
_mesa_problem(ctx, "Bad compare func in sample_depth_texture");
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
||||
switch (tObj->DepthMode) {
|
||||
|
Reference in New Issue
Block a user