more work on GL_ARB_texture_cube_map

This commit is contained in:
Brian Paul 2000-05-23 15:17:12 +00:00
parent df54463363
commit fc4b44399a
6 changed files with 274 additions and 134 deletions

View File

@ -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" );

View File

@ -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 */

View File

@ -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) {
if (target != GL_TEXTURE_1D) {
gl_error( ctx, GL_INVALID_ENUM, "glCopyTexImage1D(target)" );
return GL_TRUE;
}
}
if (dimensions == 1 && 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;

View File

@ -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 );

View File

@ -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.

View File

@ -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) {