From: Brian Paul Date: Tue, 23 May 2000 15:17:12 +0000 (+0000) Subject: more work on GL_ARB_texture_cube_map X-Git-Url: https://git.libre-soc.org/?a=commitdiff_plain;h=fc4b44399a07a7a7559f20ceab8a791209b4d875;p=mesa.git more work on GL_ARB_texture_cube_map --- diff --git a/src/mesa/main/enable.c b/src/mesa/main/enable.c index b4df44de34f..0fa408f7644 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 e6e4a59717c..8302b3459ee 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 2f3c0f12c80..74be5546f88 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 9aa3a0714be..51e47202103 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 330943b5794..cdd9aa475b9 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 7d57f3ec636..4fe440ee15d 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) {