From c7a219ec6f6047b691a9bb32e55ec4a889ba2814 Mon Sep 17 00:00:00 2001 From: Brian Paul Date: Mon, 21 Oct 2002 15:52:34 +0000 Subject: [PATCH] GL_ATI_texture_mirror_once extension (Ian Romanick) --- src/mesa/main/extensions.c | 4 ++- src/mesa/main/mtypes.h | 3 ++- src/mesa/main/texstate.c | 20 +++++++++++--- src/mesa/swrast/s_texture.c | 52 +++++++++++++++++++++++++++++++++++-- 4 files changed, 71 insertions(+), 8 deletions(-) diff --git a/src/mesa/main/extensions.c b/src/mesa/main/extensions.c index ec4422daa21..f37c07d33dc 100644 --- a/src/mesa/main/extensions.c +++ b/src/mesa/main/extensions.c @@ -1,4 +1,4 @@ -/* $Id: extensions.c,v 1.82 2002/10/16 17:57:52 brianp Exp $ */ +/* $Id: extensions.c,v 1.83 2002/10/21 15:52:34 brianp Exp $ */ /* * Mesa 3-D graphics library @@ -73,6 +73,7 @@ static struct { { OFF, "GL_ARB_texture_mirrored_repeat", F(ARB_texture_mirrored_repeat)}, { ON, "GL_ARB_transpose_matrix", 0 }, { ON, "GL_ARB_window_pos", F(ARB_window_pos) }, + { OFF, "GL_ATI_texture_mirror_once", F(ATI_texture_mirror_once)}, { ON, "GL_EXT_abgr", 0 }, { ON, "GL_EXT_bgra", 0 }, { OFF, "GL_EXT_blend_color", F(EXT_blend_color) }, @@ -160,6 +161,7 @@ _mesa_enable_sw_extensions(GLcontext *ctx) "GL_ARB_texture_env_crossbar", "GL_ARB_texture_env_dot3", "GL_ARB_texture_mirrored_repeat", + "GL_ATI_texture_mirror_once", "GL_EXT_blend_color", "GL_EXT_blend_func_separate", "GL_EXT_blend_logic_op", diff --git a/src/mesa/main/mtypes.h b/src/mesa/main/mtypes.h index 10f8e2bf57d..fde7e3fab2c 100644 --- a/src/mesa/main/mtypes.h +++ b/src/mesa/main/mtypes.h @@ -1,4 +1,4 @@ -/* $Id: mtypes.h,v 1.96 2002/10/11 17:41:04 brianp Exp $ */ +/* $Id: mtypes.h,v 1.97 2002/10/21 15:52:34 brianp Exp $ */ /* * Mesa 3-D graphics library @@ -1367,6 +1367,7 @@ struct gl_extensions { GLboolean ARB_texture_env_dot3; GLboolean ARB_texture_mirrored_repeat; GLboolean ARB_window_pos; + GLboolean ATI_texture_mirror_once; GLboolean EXT_blend_color; GLboolean EXT_blend_func_separate; GLboolean EXT_blend_logic_op; diff --git a/src/mesa/main/texstate.c b/src/mesa/main/texstate.c index 0da213404b9..ce40c56f13f 100644 --- a/src/mesa/main/texstate.c +++ b/src/mesa/main/texstate.c @@ -1,4 +1,4 @@ -/* $Id: texstate.c,v 1.81 2002/10/17 22:26:06 kschultz Exp $ */ +/* $Id: texstate.c,v 1.82 2002/10/21 15:52:34 brianp Exp $ */ /* * Mesa 3-D graphics library @@ -1093,7 +1093,11 @@ _mesa_TexParameterfv( GLenum target, GLenum pname, const GLfloat *params ) else if (texObj->Target != GL_TEXTURE_RECTANGLE_NV && (eparam == GL_REPEAT || (eparam == GL_MIRRORED_REPEAT_ARB && - ctx->Extensions.ARB_texture_mirrored_repeat))) { + ctx->Extensions.ARB_texture_mirrored_repeat) || + (eparam == GL_MIRROR_CLAMP_ATI && + ctx->Extensions.ATI_texture_mirror_once) || + (eparam == GL_MIRROR_CLAMP_TO_EDGE_ATI && + ctx->Extensions.ATI_texture_mirror_once))) { /* non-rectangle texture */ FLUSH_VERTICES(ctx, _NEW_TEXTURE); texObj->WrapS = eparam; @@ -1116,7 +1120,11 @@ _mesa_TexParameterfv( GLenum target, GLenum pname, const GLfloat *params ) else if (texObj->Target != GL_TEXTURE_RECTANGLE_NV && (eparam == GL_REPEAT || (eparam == GL_MIRRORED_REPEAT_ARB && - ctx->Extensions.ARB_texture_mirrored_repeat))) { + ctx->Extensions.ARB_texture_mirrored_repeat) || + (eparam == GL_MIRROR_CLAMP_ATI && + ctx->Extensions.ATI_texture_mirror_once) || + (eparam == GL_MIRROR_CLAMP_TO_EDGE_ATI && + ctx->Extensions.ATI_texture_mirror_once))) { /* non-rectangle texture */ FLUSH_VERTICES(ctx, _NEW_TEXTURE); texObj->WrapT = eparam; @@ -1139,7 +1147,11 @@ _mesa_TexParameterfv( GLenum target, GLenum pname, const GLfloat *params ) else if (texObj->Target != GL_TEXTURE_RECTANGLE_NV && (eparam == GL_REPEAT || (eparam == GL_MIRRORED_REPEAT_ARB && - ctx->Extensions.ARB_texture_mirrored_repeat))) { + ctx->Extensions.ARB_texture_mirrored_repeat) || + (eparam == GL_MIRROR_CLAMP_ATI && + ctx->Extensions.ATI_texture_mirror_once) || + (eparam == GL_MIRROR_CLAMP_TO_EDGE_ATI && + ctx->Extensions.ATI_texture_mirror_once))) { /* non-rectangle texture */ FLUSH_VERTICES(ctx, _NEW_TEXTURE); texObj->WrapR = eparam; diff --git a/src/mesa/swrast/s_texture.c b/src/mesa/swrast/s_texture.c index db2e9e0df92..6929a3cf3ab 100644 --- a/src/mesa/swrast/s_texture.c +++ b/src/mesa/swrast/s_texture.c @@ -1,4 +1,4 @@ -/* $Id: s_texture.c,v 1.71 2002/10/18 17:02:01 kschultz Exp $ */ +/* $Id: s_texture.c,v 1.72 2002/10/21 15:52:35 brianp Exp $ */ /* * Mesa 3-D graphics library @@ -97,7 +97,31 @@ U = 1.0F - (S - (GLfloat) flr); /* flr is odd */ \ else \ U = S - (GLfloat) flr; /* flr is even */ \ - U = (U * SIZE) - 0.5F; \ + U = (U * SIZE) - 0.5; \ + I0 = IFLOOR(U); \ + I1 = I0 + 1; \ + if (I0 < 0) \ + I0 = 0; \ + if (I1 >= (GLint) SIZE) \ + I1 = SIZE - 1; \ + } \ + else if (wrapMode == GL_MIRROR_CLAMP_ATI) { \ + U = fabs(S); \ + if (U >= 1.0F) \ + U = (GLfloat) SIZE; \ + else \ + U *= SIZE; \ + U -= 0.5F; \ + I0 = IFLOOR(U); \ + I1 = I0 + 1; \ + } \ + else if (wrapMode == GL_MIRROR_CLAMP_TO_EDGE_ATI) { \ + U = fabs(S); \ + if (U >= 1.0F) \ + U = (GLfloat) SIZE; \ + else \ + U *= SIZE; \ + U -= 0.5F; \ I0 = IFLOOR(U); \ I1 = I0 + 1; \ if (I0 < 0) \ @@ -171,6 +195,30 @@ else \ I = IFLOOR(u * SIZE); \ } \ + else if (wrapMode == GL_MIRROR_CLAMP_ATI) { \ + /* s limited to [0,1] */ \ + /* i limited to [0,size-1] */ \ + const GLfloat u = fabs(S); \ + if (u <= 0.0F) \ + I = 0; \ + else if (u >= 1.0F) \ + I = SIZE - 1; \ + else \ + I = IFLOOR(u * SIZE); \ + } \ + else if (wrapMode == GL_MIRROR_CLAMP_TO_EDGE_ATI) { \ + /* s limited to [min,max] */ \ + /* i limited to [0, size-1] */ \ + const GLfloat min = 1.0F / (2.0F * SIZE); \ + const GLfloat max = 1.0F - min; \ + const GLfloat u = fabs(S); \ + if (u < min) \ + I = 0; \ + else if (u > max) \ + I = SIZE - 1; \ + else \ + I = IFLOOR(u * SIZE); \ + } \ else { \ ASSERT(wrapMode == GL_CLAMP); \ /* s limited to [0,1] */ \ -- 2.30.2