diff options
| author | Brian Paul <brian.paul@tungstengraphics.com> | 2000-05-23 15:17:12 +0000 | 
|---|---|---|
| committer | Brian Paul <brian.paul@tungstengraphics.com> | 2000-05-23 15:17:12 +0000 | 
| commit | fc4b44399a07a7a7559f20ceab8a791209b4d875 (patch) | |
| tree | 1b3e06659b40d45fc3c516cbb449434552fdb7a7 | |
| parent | df54463363729a25a7c11739d3b09f5a1e3083ef (diff) | |
more work on GL_ARB_texture_cube_map
| -rw-r--r-- | src/mesa/main/enable.c | 60 | ||||
| -rw-r--r-- | src/mesa/main/get.c | 28 | ||||
| -rw-r--r-- | src/mesa/main/teximage.c | 189 | ||||
| -rw-r--r-- | src/mesa/main/teximage.h | 7 | ||||
| -rw-r--r-- | src/mesa/main/texobj.c | 43 | ||||
| -rw-r--r-- | src/mesa/main/texstate.c | 81 | 
6 files changed, 274 insertions, 134 deletions
| diff --git a/src/mesa/main/enable.c b/src/mesa/main/enable.c index b4df44de34..0fa408f764 100644 --- a/src/mesa/main/enable.c +++ b/src/mesa/main/enable.c @@ -1,4 +1,4 @@ -/* $Id: enable.c,v 1.20 2000/05/22 16:33:21 brianp Exp $ */ +/* $Id: enable.c,v 1.21 2000/05/23 15:17:12 brianp Exp $ */  /*   * Mesa 3-D graphics library @@ -508,23 +508,30 @@ void _mesa_set_enable( GLcontext *ctx, GLenum cap, GLboolean state )        /* GL_ARB_texture_cube_map */        case GL_TEXTURE_CUBE_MAP_ARB: -#if 0 -         if (ctx->Visual->RGBAflag) { -	    const GLuint curr = ctx->Texture.CurrentUnit; -	    const GLuint flag = TEXTURE0_CUBE << (curr * 4); -            struct gl_texture_unit *texUnit = &ctx->Texture.Unit[curr]; -	    ctx->NewState |= NEW_TEXTURE_ENABLE; -            if (state) { -	       texUnit->Enabled |= TEXTURE0_2D; -	       ctx->Enabled |= flag; -	    } -            else { -               texUnit->Enabled &= ~TEXTURE0_2D; -               ctx->Enabled &= ~flag; +         if (ctx->Extensions.HaveTextureCubeMap) { +            if (ctx->Visual->RGBAflag) { +               const GLuint curr = ctx->Texture.CurrentUnit; +               const GLuint flag = TEXTURE0_CUBE << (curr * 4); +               struct gl_texture_unit *texUnit = &ctx->Texture.Unit[curr]; +               ctx->NewState |= NEW_TEXTURE_ENABLE; +               if (state) { +                  texUnit->Enabled |= TEXTURE0_CUBE; +                  ctx->Enabled |= flag; +               } +               else { +                  texUnit->Enabled &= ~TEXTURE0_CUBE; +                  ctx->Enabled &= ~flag; +               }              }           } +         else { +            if (state) +               gl_error(ctx, GL_INVALID_ENUM, "glEnable"); +            else +               gl_error(ctx, GL_INVALID_ENUM, "glDisable"); +            return; +         }  	 break; -#endif        default:  	 if (state) { @@ -760,23 +767,14 @@ _mesa_IsEnabled( GLenum cap )        /* GL_ARB_texture_cube_map */        case GL_TEXTURE_CUBE_MAP_ARB: -#if 0 -         if (ctx->Visual->RGBAflag) { -	    const GLuint curr = ctx->Texture.CurrentUnit; -	    const GLuint flag = TEXTURE0_CUBE << (curr * 4); -            struct gl_texture_unit *texUnit = &ctx->Texture.Unit[curr]; -	    ctx->NewState |= NEW_TEXTURE_ENABLE; -            if (state) { -	       texUnit->Enabled |= TEXTURE0_2D; -	       ctx->Enabled |= flag; -	    } -            else { -               texUnit->Enabled &= ~TEXTURE0_2D; -               ctx->Enabled &= ~flag; -            } +         if (ctx->Extensions.HaveTextureCubeMap) { +            const struct gl_texture_unit *texUnit = &ctx->Texture.Unit[ctx->Texture.CurrentUnit]; +            return (texUnit->Enabled & TEXTURE0_CUBE) ? GL_TRUE : GL_FALSE; +         } +         else { +            gl_error(ctx, GL_INVALID_ENUM, "glIsEnabled"); +            return GL_FALSE;           } -	 break; -#endif        default:  	 gl_error( ctx, GL_INVALID_ENUM, "glIsEnabled" ); diff --git a/src/mesa/main/get.c b/src/mesa/main/get.c index e6e4a59717..8302b3459e 100644 --- a/src/mesa/main/get.c +++ b/src/mesa/main/get.c @@ -1,4 +1,4 @@ -/* $Id: get.c,v 1.26 2000/05/22 16:33:21 brianp Exp $ */ +/* $Id: get.c,v 1.27 2000/05/23 15:17:13 brianp Exp $ */  /*   * Mesa 3-D graphics library @@ -963,7 +963,7 @@ _mesa_GetBooleanv( GLenum pname, GLboolean *params )           return;        case GL_TEXTURE_BINDING_CUBE_MAP_ARB:           if (ctx->Extensions.HaveTextureCubeMap) -            *params = INT_TO_BOOL(textureUnit->CurrentPosX->Name); +            *params = INT_TO_BOOL(textureUnit->CurrentCubeMap->Name);           else              gl_error(ctx, GL_INVALID_ENUM, "glGetBooleanv");           return; @@ -2077,19 +2077,19 @@ _mesa_GetDoublev( GLenum pname, GLdouble *params )           if (ctx->Extensions.HaveTextureCubeMap)              *params = (GLdouble) _mesa_IsEnabled(GL_TEXTURE_CUBE_MAP_ARB);           else -            gl_error(ctx, GL_INVALID_ENUM, "glGetBooleanv"); +            gl_error(ctx, GL_INVALID_ENUM, "glGetDoublev");           return;        case GL_TEXTURE_BINDING_CUBE_MAP_ARB:           if (ctx->Extensions.HaveTextureCubeMap) -            *params = (GLdouble) textureUnit->CurrentPosX->Name; +            *params = (GLdouble) textureUnit->CurrentCubeMap->Name;           else -            gl_error(ctx, GL_INVALID_ENUM, "glGetBooleanv"); +            gl_error(ctx, GL_INVALID_ENUM, "glGetDoublev");           return;        case GL_MAX_CUBE_MAP_TEXTURE_SIZE_ARB:           if (ctx->Extensions.HaveTextureCubeMap)              *params = (GLdouble) ctx->Const.MaxCubeTextureSize;           else -            gl_error(ctx, GL_INVALID_ENUM, "glGetBooleanv"); +            gl_error(ctx, GL_INVALID_ENUM, "glGetDoublev");           return;        /* GL_PGI_misc_hints */ @@ -3194,19 +3194,19 @@ _mesa_GetFloatv( GLenum pname, GLfloat *params )           if (ctx->Extensions.HaveTextureCubeMap)              *params = (GLfloat) _mesa_IsEnabled(GL_TEXTURE_CUBE_MAP_ARB);           else -            gl_error(ctx, GL_INVALID_ENUM, "glGetBooleanv"); +            gl_error(ctx, GL_INVALID_ENUM, "glGetFloatv");           return;        case GL_TEXTURE_BINDING_CUBE_MAP_ARB:           if (ctx->Extensions.HaveTextureCubeMap) -            *params = (GLfloat) textureUnit->CurrentPosX->Name; +            *params = (GLfloat) textureUnit->CurrentCubeMap->Name;           else -            gl_error(ctx, GL_INVALID_ENUM, "glGetBooleanv"); +            gl_error(ctx, GL_INVALID_ENUM, "glGetFloatv");           return;        case GL_MAX_CUBE_MAP_TEXTURE_SIZE_ARB:           if (ctx->Extensions.HaveTextureCubeMap)              *params = (GLfloat) ctx->Const.MaxCubeTextureSize;           else -            gl_error(ctx, GL_INVALID_ENUM, "glGetBooleanv"); +            gl_error(ctx, GL_INVALID_ENUM, "glGetFloatv");           return;        /* GL_PGI_misc_hints */ @@ -4285,19 +4285,19 @@ _mesa_GetIntegerv( GLenum pname, GLint *params )           if (ctx->Extensions.HaveTextureCubeMap)              *params = (GLint) _mesa_IsEnabled(GL_TEXTURE_CUBE_MAP_ARB);           else -            gl_error(ctx, GL_INVALID_ENUM, "glGetBooleanv"); +            gl_error(ctx, GL_INVALID_ENUM, "glGetIntegerv");           return;        case GL_TEXTURE_BINDING_CUBE_MAP_ARB:           if (ctx->Extensions.HaveTextureCubeMap) -            *params = textureUnit->CurrentPosX->Name; +            *params = textureUnit->CurrentCubeMap->Name;           else -            gl_error(ctx, GL_INVALID_ENUM, "glGetBooleanv"); +            gl_error(ctx, GL_INVALID_ENUM, "glGetIntegerv");           return;        case GL_MAX_CUBE_MAP_TEXTURE_SIZE_ARB:           if (ctx->Extensions.HaveTextureCubeMap)              *params = ctx->Const.MaxCubeTextureSize;           else -            gl_error(ctx, GL_INVALID_ENUM, "glGetBooleanv"); +            gl_error(ctx, GL_INVALID_ENUM, "glGetIntegerv");           return;        /* GL_PGI_misc_hints */ diff --git a/src/mesa/main/teximage.c b/src/mesa/main/teximage.c index 2f3c0f12c8..74be5546f8 100644 --- a/src/mesa/main/teximage.c +++ b/src/mesa/main/teximage.c @@ -400,17 +400,12 @@ select_tex_object(struct gl_texture_unit *unit, GLenum target)        case GL_TEXTURE_3D:           return unit->CurrentD[3];        case GL_TEXTURE_CUBE_MAP_POSITIVE_X_ARB: -         return unit->CurrentPosX;        case GL_TEXTURE_CUBE_MAP_NEGATIVE_X_ARB: -         return unit->CurrentNegX;        case GL_TEXTURE_CUBE_MAP_POSITIVE_Y_ARB: -         return unit->CurrentPosY;        case GL_TEXTURE_CUBE_MAP_NEGATIVE_Y_ARB: -         return unit->CurrentNegY;        case GL_TEXTURE_CUBE_MAP_POSITIVE_Z_ARB: -         return unit->CurrentPosZ;        case GL_TEXTURE_CUBE_MAP_NEGATIVE_Z_ARB: -         return unit->CurrentNegZ; +         return unit->CurrentCubeMap;        default:           gl_problem(NULL, "bad target in select_tex_object()");           return NULL; @@ -418,6 +413,42 @@ select_tex_object(struct gl_texture_unit *unit, GLenum target)  } +static void +set_tex_image(struct gl_texture_object *tObj, +              GLenum target, GLint level, +              struct gl_texture_image *texImage) +{ +   ASSERT(tObj); +   ASSERT(texImage); +   switch (target) { +      case GL_TEXTURE_2D: +         tObj->Image[level] = texImage; +         return; +      case GL_TEXTURE_CUBE_MAP_POSITIVE_X_ARB: +         tObj->PosX[level] = texImage; +         return; +      case GL_TEXTURE_CUBE_MAP_NEGATIVE_X_ARB: +         tObj->NegX[level] = texImage; +         return; +      case GL_TEXTURE_CUBE_MAP_POSITIVE_Y_ARB: +         tObj->PosY[level] = texImage; +         return; +      case GL_TEXTURE_CUBE_MAP_NEGATIVE_Y_ARB: +         tObj->NegY[level] = texImage; +         return; +      case GL_TEXTURE_CUBE_MAP_POSITIVE_Z_ARB: +         tObj->PosZ[level] = texImage; +         return; +      case GL_TEXTURE_CUBE_MAP_NEGATIVE_Z_ARB: +         tObj->NegZ[level] = texImage; +         return; +      default: +         gl_problem(NULL, "bad target in set_tex_image()"); +         return; +   } +} + +  /*   * Return new gl_texture_image struct with all fields initialized to zero.   */ @@ -475,6 +506,71 @@ _mesa_free_texture_image( struct gl_texture_image *teximage ) +/* + * Return the texture image struct which corresponds to target and level + * for the given texture unit. + */ +struct gl_texture_image * +_mesa_select_tex_image(GLcontext *ctx, const struct gl_texture_unit *texUnit, +                       GLenum target, GLint level) +{ +   ASSERT(texUnit); +   switch (target) { +      case GL_TEXTURE_1D: +         return texUnit->CurrentD[1]->Image[level]; +      case GL_PROXY_TEXTURE_1D: +         return ctx->Texture.Proxy1D->Image[level]; +      case GL_TEXTURE_2D: +         return texUnit->CurrentD[2]->Image[level]; +      case GL_PROXY_TEXTURE_2D: +         return ctx->Texture.Proxy2D->Image[level]; +      case GL_TEXTURE_3D: +         return texUnit->CurrentD[3]->Image[level]; +      case GL_PROXY_TEXTURE_3D: +         return ctx->Texture.Proxy3D->Image[level]; +      case GL_TEXTURE_CUBE_MAP_POSITIVE_X_ARB: +         if (ctx->Extensions.HaveTextureCubeMap) +            return texUnit->CurrentCubeMap->PosX[level]; +         else +            return NULL; +      case GL_TEXTURE_CUBE_MAP_NEGATIVE_X_ARB: +         if (ctx->Extensions.HaveTextureCubeMap) +            return texUnit->CurrentCubeMap->NegX[level]; +         else +            return NULL; +      case GL_TEXTURE_CUBE_MAP_POSITIVE_Y_ARB: +         if (ctx->Extensions.HaveTextureCubeMap) +            return texUnit->CurrentCubeMap->PosY[level]; +         else +            return NULL; +      case GL_TEXTURE_CUBE_MAP_NEGATIVE_Y_ARB: +         if (ctx->Extensions.HaveTextureCubeMap) +            return texUnit->CurrentCubeMap->NegY[level]; +         else +            return NULL; +      case GL_TEXTURE_CUBE_MAP_POSITIVE_Z_ARB: +         if (ctx->Extensions.HaveTextureCubeMap) +            return texUnit->CurrentCubeMap->PosZ[level]; +         else +            return NULL; +      case GL_TEXTURE_CUBE_MAP_NEGATIVE_Z_ARB: +         if (ctx->Extensions.HaveTextureCubeMap) +            return texUnit->CurrentCubeMap->NegZ[level]; +         else +            return NULL; +      case GL_PROXY_TEXTURE_CUBE_MAP_ARB: +         if (ctx->Extensions.HaveTextureCubeMap) +            return ctx->Texture.ProxyCubeMap->PosX[level]; +         else +            return NULL; +      default: +         gl_problem(ctx, "bad target in _mesa_select_tex_image()"); +         return NULL; +   } +} + + +  /* Need this to prevent an out-of-bounds memory access when using   * X86 optimized code.   */ @@ -830,7 +926,15 @@ subtexture_error_check( GLcontext *ctx, GLuint dimensions,        }     }     else if (dimensions == 2) { -      if (target != GL_TEXTURE_2D) { +      if (ctx->Extensions.HaveTextureCubeMap) { +         if ((target < GL_TEXTURE_CUBE_MAP_POSITIVE_X_ARB || +              target > GL_TEXTURE_CUBE_MAP_NEGATIVE_Z_ARB) && +             target != GL_TEXTURE_2D) { +            gl_error( ctx, GL_INVALID_ENUM, "glTexSubImage2D(target)" ); +            return GL_TRUE; +         } +      } +      else if (target != GL_TEXTURE_2D) {           gl_error( ctx, GL_INVALID_ENUM, "glTexSubImage2D(target)" );           return GL_TRUE;        } @@ -928,18 +1032,25 @@ copytexture_error_check( GLcontext *ctx, GLuint dimensions,  {     GLint iformat; -   if (target != GL_TEXTURE_1D && target != GL_TEXTURE_2D) { -      gl_error( ctx, GL_INVALID_ENUM, "glCopyTexImage1/2D(target)" ); -      return GL_TRUE; -   } - -   if (dimensions == 1 && target != GL_TEXTURE_1D) { -      gl_error( ctx, GL_INVALID_ENUM, "glCopyTexImage1D(target)" ); -      return GL_TRUE; +   if (dimensions == 1) { +      if (target != GL_TEXTURE_1D) { +         gl_error( ctx, GL_INVALID_ENUM, "glCopyTexImage1D(target)" ); +         return GL_TRUE; +      }     } -   else if (dimensions == 2 && target != GL_TEXTURE_2D) { -      gl_error( ctx, GL_INVALID_ENUM, "glCopyTexImage2D(target)" ); -      return GL_TRUE; +   else if (dimensions == 2) { +      if (ctx->Extensions.HaveTextureCubeMap) { +         if ((target < GL_TEXTURE_CUBE_MAP_POSITIVE_X_ARB || +              target > GL_TEXTURE_CUBE_MAP_NEGATIVE_Z_ARB) && +             target != GL_TEXTURE_2D) { +            gl_error( ctx, GL_INVALID_ENUM, "glCopyTexImage2D(target)" ); +            return GL_TRUE; +         } +      } +      else if (target != GL_TEXTURE_2D) { +         gl_error( ctx, GL_INVALID_ENUM, "glCopyTexImage2D(target)" ); +         return GL_TRUE; +      }     }     /* Border */ @@ -1000,17 +1111,31 @@ copytexsubimage_error_check( GLcontext *ctx, GLuint dimensions,     struct gl_texture_unit *texUnit = &ctx->Texture.Unit[ctx->Texture.CurrentUnit];     struct gl_texture_image *teximage; -   if (dimensions == 1 && target != GL_TEXTURE_1D) { -      gl_error( ctx, GL_INVALID_ENUM, "glCopyTexSubImage1D(target)" ); -      return GL_TRUE; +   if (dimensions == 1) { +      if (target != GL_TEXTURE_1D) { +         gl_error( ctx, GL_INVALID_ENUM, "glCopyTexSubImage1D(target)" ); +         return GL_TRUE; +      }     } -   else if (dimensions == 2 && target != GL_TEXTURE_2D) { -      gl_error( ctx, GL_INVALID_ENUM, "glCopyTexSubImage2D(target)" ); -      return GL_TRUE; +   else if (dimensions == 2) { +      if (ctx->Extensions.HaveTextureCubeMap) { +         if ((target < GL_TEXTURE_CUBE_MAP_POSITIVE_X_ARB || +              target > GL_TEXTURE_CUBE_MAP_NEGATIVE_Z_ARB) && +             target != GL_TEXTURE_2D) { +            gl_error( ctx, GL_INVALID_ENUM, "glCopyTexSubImage2D(target)" ); +            return GL_TRUE; +         } +      } +      else if (target != GL_TEXTURE_2D) { +         gl_error( ctx, GL_INVALID_ENUM, "glCopyTexSubImage2D(target)" ); +         return GL_TRUE; +      }     } -   else if (dimensions == 3 && target != GL_TEXTURE_3D) { -      gl_error( ctx, GL_INVALID_ENUM, "glCopyTexSubImage3D(target)" ); -      return GL_TRUE; +   else if (dimensions == 3) { +      if (target != GL_TEXTURE_3D) { +         gl_error( ctx, GL_INVALID_ENUM, "glCopyTexSubImage3D(target)" ); +         return GL_TRUE; +      }     }     if (level < 0 || level >= ctx->Const.MaxTextureLevels) { @@ -1210,7 +1335,10 @@ _mesa_TexImage2D( GLenum target, GLint level, GLint internalFormat,     GET_CURRENT_CONTEXT(ctx);     ASSERT_OUTSIDE_BEGIN_END_AND_FLUSH(ctx, "glTexImage2D"); -   if (target==GL_TEXTURE_2D) { +   if (target==GL_TEXTURE_2D || +       (ctx->Extensions.HaveTextureCubeMap && +        target >= GL_TEXTURE_CUBE_MAP_POSITIVE_X_ARB && +        target <= GL_TEXTURE_CUBE_MAP_NEGATIVE_Z_ARB)) {        struct gl_texture_unit *texUnit;        struct gl_texture_object *texObj;        struct gl_texture_image *texImage; @@ -1222,11 +1350,12 @@ _mesa_TexImage2D( GLenum target, GLint level, GLint internalFormat,        texUnit = &ctx->Texture.Unit[ctx->Texture.CurrentUnit];        texObj = select_tex_object(texUnit, target); -      texImage = texObj->Image[level]; +      texImage = _mesa_select_tex_image(ctx, texUnit, target, level);        if (!texImage) {           texImage = _mesa_alloc_texture_image(); -         texObj->Image[level] = texImage; +         set_tex_image(texObj, target, level, texImage); +         /*texObj->Image[level] = texImage;*/           if (!texImage) {              gl_error(ctx, GL_OUT_OF_MEMORY, "glTexImage2D");              return; diff --git a/src/mesa/main/teximage.h b/src/mesa/main/teximage.h index 9aa3a0714b..51e4720210 100644 --- a/src/mesa/main/teximage.h +++ b/src/mesa/main/teximage.h @@ -1,4 +1,4 @@ -/* $Id: teximage.h,v 1.6 2000/03/27 17:54:17 brianp Exp $ */ +/* $Id: teximage.h,v 1.7 2000/05/23 15:17:13 brianp Exp $ */  /*   * Mesa 3-D graphics library @@ -47,6 +47,11 @@ extern void  _mesa_free_texture_image( struct gl_texture_image *teximage ); +extern struct gl_texture_image * +_mesa_select_tex_image(GLcontext *ctx, const struct gl_texture_unit *texUnit, +                       GLenum target, GLint level); + +  extern void  _mesa_get_teximage_from_driver( GLcontext *ctx, GLenum target, GLint level,                                  const struct gl_texture_object *texObj ); diff --git a/src/mesa/main/texobj.c b/src/mesa/main/texobj.c index 330943b579..cdd9aa475b 100644 --- a/src/mesa/main/texobj.c +++ b/src/mesa/main/texobj.c @@ -47,7 +47,7 @@   * table.   * Input:  shared - the shared GL state structure to contain the texture object   *         name - integer name for the texture object - *         dimensions - either 1, 2 or 3 + *         dimensions - either 1, 2, 3 or 6 (cube map)   * Return:  pointer to new texture object   */  struct gl_texture_object * @@ -56,7 +56,7 @@ gl_alloc_texture_object( struct gl_shared_state *shared, GLuint name,  {     struct gl_texture_object *obj; -   ASSERT(dimensions <= 3); +   ASSERT(dimensions <= 3 || dimensions == 6);     obj = CALLOC_STRUCT(gl_texture_object); @@ -173,7 +173,7 @@ void gl_test_texture_object_completeness( const GLcontext *ctx, struct gl_textur     if (t->Dimensions==1) {        t->P = t->Image[0]->WidthLog2;     } -   else if (t->Dimensions==2) { +   else if (t->Dimensions == 2 || t->Dimensions == 6) {        t->P = MAX2(t->Image[0]->WidthLog2, t->Image[0]->HeightLog2);     }     else if (t->Dimensions==3) { @@ -428,25 +428,37 @@ _mesa_BindTexture( GLenum target, GLuint texName )     switch (target) {        case GL_TEXTURE_1D:           dim = 1; +         oldTexObj = texUnit->CurrentD[1];           break;        case GL_TEXTURE_2D:           dim = 2; +         oldTexObj = texUnit->CurrentD[2];           break;        case GL_TEXTURE_3D:           dim = 3; +         oldTexObj = texUnit->CurrentD[3];           break; +      case GL_TEXTURE_CUBE_MAP_ARB: +         if (ctx->Extensions.HaveTextureCubeMap) { +            dim = 6; +            oldTexObj = texUnit->CurrentCubeMap; +            break; +         } +         /* fallthrough */        default:           gl_error( ctx, GL_INVALID_ENUM, "glBindTexture(target)" );           return;     } -   oldTexObj = texUnit->CurrentD[dim]; -     if (oldTexObj->Name == texName)        return; -   if (texName == 0)  -      newTexObj = ctx->Shared->DefaultD[dim]; +   if (texName == 0) { +      if (target == GL_TEXTURE_CUBE_MAP_ARB) +         newTexObj = ctx->Shared->DefaultCubeMap; +      else +         newTexObj = ctx->Shared->DefaultD[dim]; +   }     else {        struct _mesa_HashTable *hash = ctx->Shared->TexObjects;        newTexObj = (struct gl_texture_object *) _mesa_HashLookup(hash, texName); @@ -466,7 +478,22 @@ _mesa_BindTexture( GLenum target, GLuint texName )     newTexObj->RefCount++; -   texUnit->CurrentD[dim] = newTexObj; +   switch (target) { +      case GL_TEXTURE_1D: +         texUnit->CurrentD[1] = newTexObj; +         break; +      case GL_TEXTURE_2D: +         texUnit->CurrentD[2] = newTexObj; +         break; +      case GL_TEXTURE_3D: +         texUnit->CurrentD[3] = newTexObj; +         break; +      case GL_TEXTURE_CUBE_MAP_ARB: +         texUnit->CurrentCubeMap = newTexObj; +         break; +      default: +         gl_problem(ctx, "bad target in BindTexture"); +   }     /* If we've changed the CurrentD[123] texture object then update the      * ctx->Texture.Current pointer to point to the new texture object. diff --git a/src/mesa/main/texstate.c b/src/mesa/main/texstate.c index 7d57f3ec63..4fe440ee15 100644 --- a/src/mesa/main/texstate.c +++ b/src/mesa/main/texstate.c @@ -1,4 +1,4 @@ -/* $Id: texstate.c,v 1.10 2000/05/22 16:33:21 brianp Exp $ */ +/* $Id: texstate.c,v 1.11 2000/05/23 15:17:13 brianp Exp $ */  /*   * Mesa 3-D graphics library @@ -35,6 +35,7 @@  #include "macros.h"  #include "matrix.h"  #include "texobj.h" +#include "teximage.h"  #include "texstate.h"  #include "texture.h"  #include "types.h" @@ -275,7 +276,7 @@ _mesa_TexParameterfv( GLenum target, GLenum pname, const GLfloat *params )           break;        case GL_TEXTURE_CUBE_MAP_ARB:           if (ctx->Extensions.HaveTextureCubeMap) { -            texObj = texUnit->CurrentPosX; +            texObj = texUnit->CurrentCubeMap;              break;           }           /* fallthrough */ @@ -431,6 +432,28 @@ _mesa_GetTexLevelParameterfv( GLenum target, GLint level,  } +static GLuint +tex_image_dimensions(GLcontext *ctx, GLenum target) +{ +   switch (target) { +      case GL_TEXTURE_1D: +      case GL_PROXY_TEXTURE_1D: +         return 1; +      case GL_TEXTURE_2D: +      case GL_PROXY_TEXTURE_2D: +         return 2; +      case GL_TEXTURE_3D: +      case GL_PROXY_TEXTURE_3D: +         return 3; +      case GL_TEXTURE_CUBE_MAP_ARB: +      case GL_PROXY_TEXTURE_CUBE_MAP_ARB: +         return ctx->Extensions.HaveTextureCubeMap ? 2 : 0; +      default: +         gl_problem(ctx, "bad target in _mesa_tex_target_dimensions()"); +         return 0; +   } +} +  void  _mesa_GetTexLevelParameteriv( GLenum target, GLint level, @@ -448,54 +471,12 @@ _mesa_GetTexLevelParameteriv( GLenum target, GLint level,        return;     } -   switch (target) { -      case GL_TEXTURE_1D: -         img = texUnit->CurrentD[1]->Image[level]; -         dimensions = 1; -         break; -      case GL_TEXTURE_2D: -         img = texUnit->CurrentD[2]->Image[level]; -         dimensions = 2; -         break; -      case GL_TEXTURE_3D: -         img = texUnit->CurrentD[3]->Image[level]; -         dimensions = 3;  -         break; -      case GL_TEXTURE_CUBE_MAP_ARB: -         if (ctx->Extensions.HaveTextureCubeMap) { -            img = texUnit->CurrentPosX->Image[level]; -            dimensions = 2; -         } -         else { -            gl_error(ctx, GL_INVALID_ENUM, "glGetTexLevelParameter[if]v(target)"); -            return; -         } -         break; -      case GL_PROXY_TEXTURE_1D: -         img = ctx->Texture.Proxy1D->Image[level]; -         dimensions = 1; -         break; -      case GL_PROXY_TEXTURE_2D: -         img = ctx->Texture.Proxy2D->Image[level]; -         dimensions = 2; -         break; -      case GL_PROXY_TEXTURE_3D: -         img = ctx->Texture.Proxy3D->Image[level]; -         dimensions = 3; -         break; -      case GL_PROXY_TEXTURE_CUBE_MAP_ARB: -         if (ctx->Extensions.HaveTextureCubeMap) { -            img = ctx->Texture.ProxyCubeMap->Image[level]; -            dimensions = 2; -         } -         else { -            gl_error(ctx, GL_INVALID_ENUM, "glGetTexLevelParameter[if]v(target)"); -            return; -         } -         break; -      default: -	 gl_error(ctx, GL_INVALID_ENUM, "glGetTexLevelParameter[if]v(target)"); -         return; +   dimensions = tex_image_dimensions(ctx, target);  /* 1, 2 or 3 */ +   img = _mesa_select_tex_image(ctx, texUnit, target, level); + +   if (dimensions == 0) { +      gl_error(ctx, GL_INVALID_ENUM, "glGetTexLevelParameter[if]v(target)"); +      return;     }     if (!img) { | 
