Allow different max texture sizes for 1/2D, 3D and cube maps.

This commit is contained in:
Brian Paul
2001-06-13 14:56:14 +00:00
parent cc22179cd8
commit cd1cefae91
9 changed files with 186 additions and 66 deletions

View File

@@ -754,7 +754,6 @@ fxDDInitFxMesaContext(fxMesaContext fxMesa)
fxMesa->textureAlign = FX_grGetInteger(FX_TEXTURE_ALIGN); fxMesa->textureAlign = FX_grGetInteger(FX_TEXTURE_ALIGN);
fxMesa->glCtx->Const.MaxTextureLevels = 9; fxMesa->glCtx->Const.MaxTextureLevels = 9;
fxMesa->glCtx->Const.MaxTextureSize = 256;
fxMesa->glCtx->Const.MaxTextureUnits = fxMesa->emulateTwoTMUs ? 2 : 1; fxMesa->glCtx->Const.MaxTextureUnits = fxMesa->emulateTwoTMUs ? 2 : 1;
fxMesa->new_state = _NEW_ALL; fxMesa->new_state = _NEW_ALL;

View File

@@ -1,4 +1,4 @@
/* $Id: config.h,v 1.31 2001/05/14 23:11:12 brianp Exp $ */ /* $Id: config.h,v 1.32 2001/06/13 14:56:14 brianp Exp $ */
/* /*
* Mesa 3-D graphics library * Mesa 3-D graphics library
@@ -99,9 +99,15 @@
/* Max texture palette / color table size */ /* Max texture palette / color table size */
#define MAX_COLOR_TABLE_SIZE 256 #define MAX_COLOR_TABLE_SIZE 256
/* Number of texture levels */ /* Number of 1D/2D texture mipmap levels */
#define MAX_TEXTURE_LEVELS 12 #define MAX_TEXTURE_LEVELS 12
/* Number of 3D texture mipmap levels */
#define MAX_3D_TEXTURE_LEVELS 8
/* Number of cube texture mipmap levels */
#define MAX_CUBE_TEXTURE_LEVELS 12
/* Number of texture units - GL_ARB_multitexture */ /* Number of texture units - GL_ARB_multitexture */
#define MAX_TEXTURE_UNITS 8 #define MAX_TEXTURE_UNITS 8

View File

@@ -1,4 +1,4 @@
/* $Id: context.c,v 1.142 2001/06/12 22:08:41 brianp Exp $ */ /* $Id: context.c,v 1.143 2001/06/13 14:56:14 brianp Exp $ */
/* /*
* Mesa 3-D graphics library * Mesa 3-D graphics library
@@ -728,10 +728,13 @@ init_attrib_groups( GLcontext *ctx )
assert(ctx); assert(ctx);
assert(MAX_TEXTURE_LEVELS >= MAX_3D_TEXTURE_LEVELS);
assert(MAX_TEXTURE_LEVELS >= MAX_CUBE_TEXTURE_LEVELS);
/* Constants, may be overriden by device drivers */ /* Constants, may be overriden by device drivers */
ctx->Const.MaxTextureLevels = MAX_TEXTURE_LEVELS; ctx->Const.MaxTextureLevels = MAX_TEXTURE_LEVELS;
ctx->Const.MaxTextureSize = 1 << (MAX_TEXTURE_LEVELS - 1); ctx->Const.Max3DTextureLevels = MAX_3D_TEXTURE_LEVELS;
ctx->Const.MaxCubeTextureSize = ctx->Const.MaxTextureSize; ctx->Const.MaxCubeTextureLevels = MAX_CUBE_TEXTURE_LEVELS;
ctx->Const.MaxTextureUnits = MAX_TEXTURE_UNITS; ctx->Const.MaxTextureUnits = MAX_TEXTURE_UNITS;
ctx->Const.MaxTextureMaxAnisotropy = MAX_TEXTURE_MAX_ANISOTROPY; ctx->Const.MaxTextureMaxAnisotropy = MAX_TEXTURE_MAX_ANISOTROPY;
ctx->Const.MaxArrayLockSize = MAX_ARRAY_LOCK_SIZE; ctx->Const.MaxArrayLockSize = MAX_ARRAY_LOCK_SIZE;

View File

@@ -1,4 +1,4 @@
/* $Id: get.c,v 1.62 2001/06/12 22:08:41 brianp Exp $ */ /* $Id: get.c,v 1.63 2001/06/13 14:56:14 brianp Exp $ */
/* /*
* Mesa 3-D graphics library * Mesa 3-D graphics library
@@ -583,8 +583,10 @@ _mesa_GetBooleanv( GLenum pname, GLboolean *params )
*params = INT_TO_BOOL(MAX_PROJECTION_STACK_DEPTH); *params = INT_TO_BOOL(MAX_PROJECTION_STACK_DEPTH);
break; break;
case GL_MAX_TEXTURE_SIZE: case GL_MAX_TEXTURE_SIZE:
*params = INT_TO_BOOL(1 << (ctx->Const.MaxTextureLevels - 1));
break;
case GL_MAX_3D_TEXTURE_SIZE: case GL_MAX_3D_TEXTURE_SIZE:
*params = INT_TO_BOOL(ctx->Const.MaxTextureSize); *params = INT_TO_BOOL(1 << (ctx->Const.Max3DTextureLevels - 1));
break; break;
case GL_MAX_TEXTURE_STACK_DEPTH: case GL_MAX_TEXTURE_STACK_DEPTH:
*params = INT_TO_BOOL(MAX_TEXTURE_STACK_DEPTH); *params = INT_TO_BOOL(MAX_TEXTURE_STACK_DEPTH);
@@ -994,7 +996,7 @@ _mesa_GetBooleanv( GLenum pname, GLboolean *params )
return; return;
case GL_MAX_CUBE_MAP_TEXTURE_SIZE_ARB: case GL_MAX_CUBE_MAP_TEXTURE_SIZE_ARB:
if (ctx->Extensions.ARB_texture_cube_map) if (ctx->Extensions.ARB_texture_cube_map)
*params = INT_TO_BOOL(ctx->Const.MaxCubeTextureSize); *params = INT_TO_BOOL(1 << (ctx->Const.MaxCubeTextureLevels - 1));
else else
_mesa_error(ctx, GL_INVALID_ENUM, "glGetBooleanv"); _mesa_error(ctx, GL_INVALID_ENUM, "glGetBooleanv");
break; break;
@@ -1861,8 +1863,10 @@ _mesa_GetDoublev( GLenum pname, GLdouble *params )
*params = (GLdouble) MAX_PROJECTION_STACK_DEPTH; *params = (GLdouble) MAX_PROJECTION_STACK_DEPTH;
break; break;
case GL_MAX_TEXTURE_SIZE: case GL_MAX_TEXTURE_SIZE:
*params = (GLdouble) (1 << (ctx->Const.MaxTextureLevels - 1));
break;
case GL_MAX_3D_TEXTURE_SIZE: case GL_MAX_3D_TEXTURE_SIZE:
*params = (GLdouble) ctx->Const.MaxTextureSize; *params = (GLdouble) (1 << (ctx->Const.Max3DTextureLevels - 1));
break; break;
case GL_MAX_TEXTURE_STACK_DEPTH: case GL_MAX_TEXTURE_STACK_DEPTH:
*params = (GLdouble) MAX_TEXTURE_STACK_DEPTH; *params = (GLdouble) MAX_TEXTURE_STACK_DEPTH;
@@ -2272,7 +2276,7 @@ _mesa_GetDoublev( GLenum pname, GLdouble *params )
return; return;
case GL_MAX_CUBE_MAP_TEXTURE_SIZE_ARB: case GL_MAX_CUBE_MAP_TEXTURE_SIZE_ARB:
if (ctx->Extensions.ARB_texture_cube_map) if (ctx->Extensions.ARB_texture_cube_map)
*params = (GLdouble) ctx->Const.MaxCubeTextureSize; *params = (GLdouble) (1 << (ctx->Const.MaxCubeTextureLevels - 1));
else else
_mesa_error(ctx, GL_INVALID_ENUM, "glGetDoublev"); _mesa_error(ctx, GL_INVALID_ENUM, "glGetDoublev");
return; return;
@@ -3139,8 +3143,10 @@ _mesa_GetFloatv( GLenum pname, GLfloat *params )
*params = (GLfloat) MAX_PROJECTION_STACK_DEPTH; *params = (GLfloat) MAX_PROJECTION_STACK_DEPTH;
break; break;
case GL_MAX_TEXTURE_SIZE: case GL_MAX_TEXTURE_SIZE:
*params = (GLfloat) (1 << (ctx->Const.MaxTextureLevels - 1));
break;
case GL_MAX_3D_TEXTURE_SIZE: case GL_MAX_3D_TEXTURE_SIZE:
*params = (GLfloat) ctx->Const.MaxTextureSize; *params = (GLfloat) (1 << (ctx->Const.Max3DTextureLevels - 1));
break; break;
case GL_MAX_TEXTURE_STACK_DEPTH: case GL_MAX_TEXTURE_STACK_DEPTH:
*params = (GLfloat) MAX_TEXTURE_STACK_DEPTH; *params = (GLfloat) MAX_TEXTURE_STACK_DEPTH;
@@ -3552,7 +3558,7 @@ _mesa_GetFloatv( GLenum pname, GLfloat *params )
return; return;
case GL_MAX_CUBE_MAP_TEXTURE_SIZE_ARB: case GL_MAX_CUBE_MAP_TEXTURE_SIZE_ARB:
if (ctx->Extensions.ARB_texture_cube_map) if (ctx->Extensions.ARB_texture_cube_map)
*params = (GLfloat) ctx->Const.MaxCubeTextureSize; *params = (GLfloat) (1 << (ctx->Const.MaxCubeTextureLevels - 1));
else else
_mesa_error(ctx, GL_INVALID_ENUM, "glGetFloatv"); _mesa_error(ctx, GL_INVALID_ENUM, "glGetFloatv");
return; return;
@@ -4393,8 +4399,10 @@ _mesa_GetIntegerv( GLenum pname, GLint *params )
*params = (GLint) MAX_PROJECTION_STACK_DEPTH; *params = (GLint) MAX_PROJECTION_STACK_DEPTH;
break; break;
case GL_MAX_TEXTURE_SIZE: case GL_MAX_TEXTURE_SIZE:
*params = (1 << (ctx->Const.MaxTextureLevels - 1));
break;
case GL_MAX_3D_TEXTURE_SIZE: case GL_MAX_3D_TEXTURE_SIZE:
*params = ctx->Const.MaxTextureSize; *params = (1 << (ctx->Const.Max3DTextureLevels - 1));
break; break;
case GL_MAX_TEXTURE_STACK_DEPTH: case GL_MAX_TEXTURE_STACK_DEPTH:
*params = (GLint) MAX_TEXTURE_STACK_DEPTH; *params = (GLint) MAX_TEXTURE_STACK_DEPTH;
@@ -4804,7 +4812,7 @@ _mesa_GetIntegerv( GLenum pname, GLint *params )
return; return;
case GL_MAX_CUBE_MAP_TEXTURE_SIZE_ARB: case GL_MAX_CUBE_MAP_TEXTURE_SIZE_ARB:
if (ctx->Extensions.ARB_texture_cube_map) if (ctx->Extensions.ARB_texture_cube_map)
*params = ctx->Const.MaxCubeTextureSize; *params = (1 << (ctx->Const.MaxCubeTextureLevels - 1));
else else
_mesa_error(ctx, GL_INVALID_ENUM, "glGetIntegerv"); _mesa_error(ctx, GL_INVALID_ENUM, "glGetIntegerv");
return; return;

View File

@@ -1,4 +1,4 @@
/* $Id: mtypes.h,v 1.45 2001/06/12 22:08:41 brianp Exp $ */ /* $Id: mtypes.h,v 1.46 2001/06/13 14:56:14 brianp Exp $ */
/* /*
* Mesa 3-D graphics library * Mesa 3-D graphics library
@@ -1156,9 +1156,9 @@ struct gl_frame_buffer {
* but are never changed after that. * but are never changed after that.
*/ */
struct gl_constants { struct gl_constants {
GLint MaxTextureSize;
GLint MaxCubeTextureSize;
GLint MaxTextureLevels; GLint MaxTextureLevels;
GLint Max3DTextureLevels;
GLint MaxCubeTextureLevels;
GLuint MaxTextureUnits; GLuint MaxTextureUnits;
GLfloat MaxTextureMaxAnisotropy; /* GL_EXT_texture_filter_anisotropic */ GLfloat MaxTextureMaxAnisotropy; /* GL_EXT_texture_filter_anisotropic */
GLuint MaxArrayLockSize; GLuint MaxArrayLockSize;

View File

@@ -1,4 +1,4 @@
/* $Id: teximage.c,v 1.96 2001/06/12 22:05:34 brianp Exp $ */ /* $Id: teximage.c,v 1.97 2001/06/13 14:56:14 brianp Exp $ */
/* /*
* Mesa 3-D graphics library * Mesa 3-D graphics library
@@ -443,6 +443,7 @@ _mesa_select_tex_image(GLcontext *ctx, const struct gl_texture_unit *texUnit,
GLenum target, GLint level) GLenum target, GLint level)
{ {
ASSERT(texUnit); ASSERT(texUnit);
ASSERT(level < MAX_TEXTURE_LEVELS);
switch (target) { switch (target) {
case GL_TEXTURE_1D: case GL_TEXTURE_1D:
return texUnit->Current1D->Image[level]; return texUnit->Current1D->Image[level];
@@ -631,6 +632,7 @@ texture_error_check( GLcontext *ctx, GLenum target,
{ {
GLboolean isProxy; GLboolean isProxy;
GLint iformat; GLint iformat;
GLint maxLevels = 0, maxTextureSize;
if (dimensions == 1) { if (dimensions == 1) {
isProxy = (GLboolean) (target == GL_PROXY_TEXTURE_1D); isProxy = (GLboolean) (target == GL_PROXY_TEXTURE_1D);
@@ -638,6 +640,7 @@ texture_error_check( GLcontext *ctx, GLenum target,
_mesa_error( ctx, GL_INVALID_ENUM, "glTexImage1D(target)" ); _mesa_error( ctx, GL_INVALID_ENUM, "glTexImage1D(target)" );
return GL_TRUE; return GL_TRUE;
} }
maxLevels = ctx->Const.MaxTextureLevels;
} }
else if (dimensions == 2) { else if (dimensions == 2) {
isProxy = (GLboolean) (target == GL_PROXY_TEXTURE_2D || isProxy = (GLboolean) (target == GL_PROXY_TEXTURE_2D ||
@@ -649,6 +652,10 @@ texture_error_check( GLcontext *ctx, GLenum target,
_mesa_error( ctx, GL_INVALID_ENUM, "glTexImage2D(target)" ); _mesa_error( ctx, GL_INVALID_ENUM, "glTexImage2D(target)" );
return GL_TRUE; return GL_TRUE;
} }
if (target == GL_PROXY_TEXTURE_2D && target == GL_TEXTURE_2D)
maxLevels = ctx->Const.MaxTextureLevels;
else
maxLevels = ctx->Const.MaxCubeTextureLevels;
} }
else if (dimensions == 3) { else if (dimensions == 3) {
isProxy = (GLboolean) (target == GL_PROXY_TEXTURE_3D); isProxy = (GLboolean) (target == GL_PROXY_TEXTURE_3D);
@@ -656,12 +663,16 @@ texture_error_check( GLcontext *ctx, GLenum target,
_mesa_error( ctx, GL_INVALID_ENUM, "glTexImage3D(target)" ); _mesa_error( ctx, GL_INVALID_ENUM, "glTexImage3D(target)" );
return GL_TRUE; return GL_TRUE;
} }
maxLevels = ctx->Const.Max3DTextureLevels;
} }
else { else {
_mesa_problem( ctx, "bad dims in texture_error_check" ); _mesa_problem( ctx, "bad dims in texture_error_check" );
return GL_TRUE; return GL_TRUE;
} }
ASSERT(maxLevels > 0);
maxTextureSize = 1 << (maxLevels - 1);
/* Border */ /* Border */
if (border != 0 && border != 1) { if (border != 0 && border != 1) {
if (!isProxy) { if (!isProxy) {
@@ -673,7 +684,7 @@ texture_error_check( GLcontext *ctx, GLenum target,
} }
/* Width */ /* Width */
if (width < 2 * border || width > 2 + ctx->Const.MaxTextureSize if (width < 2 * border || width > 2 + maxTextureSize
|| logbase2( width - 2 * border ) < 0) { || logbase2( width - 2 * border ) < 0) {
if (!isProxy) { if (!isProxy) {
char message[100]; char message[100];
@@ -685,7 +696,7 @@ texture_error_check( GLcontext *ctx, GLenum target,
/* Height */ /* Height */
if (dimensions >= 2) { if (dimensions >= 2) {
if (height < 2 * border || height > 2 + ctx->Const.MaxTextureSize if (height < 2 * border || height > 2 + maxTextureSize
|| logbase2( height - 2 * border ) < 0) { || logbase2( height - 2 * border ) < 0) {
if (!isProxy) { if (!isProxy) {
char message[100]; char message[100];
@@ -709,7 +720,7 @@ texture_error_check( GLcontext *ctx, GLenum target,
/* Depth */ /* Depth */
if (dimensions >= 3) { if (dimensions >= 3) {
if (depth < 2 * border || depth > 2 + ctx->Const.MaxTextureSize if (depth < 2 * border || depth > 2 + maxTextureSize
|| logbase2( depth - 2 * border ) < 0) { || logbase2( depth - 2 * border ) < 0) {
if (!isProxy) { if (!isProxy) {
char message[100]; char message[100];
@@ -721,7 +732,7 @@ texture_error_check( GLcontext *ctx, GLenum target,
} }
/* Level */ /* Level */
if (level < 0 || level >= ctx->Const.MaxTextureLevels) { if (level < 0 || level >= maxLevels) {
if (!isProxy) { if (!isProxy) {
char message[100]; char message[100];
sprintf(message, "glTexImage%dD(level=%d)", dimensions, level); sprintf(message, "glTexImage%dD(level=%d)", dimensions, level);
@@ -784,12 +795,14 @@ subtexture_error_check( GLcontext *ctx, GLuint dimensions,
{ {
struct gl_texture_unit *texUnit = &ctx->Texture.Unit[ctx->Texture.CurrentUnit]; struct gl_texture_unit *texUnit = &ctx->Texture.Unit[ctx->Texture.CurrentUnit];
struct gl_texture_image *destTex; struct gl_texture_image *destTex;
GLint maxLevels = 0;
if (dimensions == 1) { if (dimensions == 1) {
if (target != GL_TEXTURE_1D) { if (target != GL_TEXTURE_1D) {
_mesa_error( ctx, GL_INVALID_ENUM, "glTexSubImage1D(target)" ); _mesa_error( ctx, GL_INVALID_ENUM, "glTexSubImage1D(target)" );
return GL_TRUE; return GL_TRUE;
} }
maxLevels = ctx->Const.MaxTextureLevels;
} }
else if (dimensions == 2) { else if (dimensions == 2) {
if (ctx->Extensions.ARB_texture_cube_map) { if (ctx->Extensions.ARB_texture_cube_map) {
@@ -804,19 +817,26 @@ subtexture_error_check( GLcontext *ctx, GLuint dimensions,
_mesa_error( ctx, GL_INVALID_ENUM, "glTexSubImage2D(target)" ); _mesa_error( ctx, GL_INVALID_ENUM, "glTexSubImage2D(target)" );
return GL_TRUE; return GL_TRUE;
} }
if (target == GL_PROXY_TEXTURE_2D && target == GL_TEXTURE_2D)
maxLevels = ctx->Const.MaxTextureLevels;
else
maxLevels = ctx->Const.MaxCubeTextureLevels;
} }
else if (dimensions == 3) { else if (dimensions == 3) {
if (target != GL_TEXTURE_3D) { if (target != GL_TEXTURE_3D) {
_mesa_error( ctx, GL_INVALID_ENUM, "glTexSubImage3D(target)" ); _mesa_error( ctx, GL_INVALID_ENUM, "glTexSubImage3D(target)" );
return GL_TRUE; return GL_TRUE;
} }
maxLevels = ctx->Const.Max3DTextureLevels;
} }
else { else {
_mesa_problem( ctx, "bad dims in texture_error_check" ); _mesa_problem( ctx, "bad dims in texture_error_check" );
return GL_TRUE; return GL_TRUE;
} }
if (level < 0 || level >= ctx->Const.MaxTextureLevels) { ASSERT(maxLevels > 0);
if (level < 0 || level >= maxLevels) {
char message[100]; char message[100];
sprintf(message, "glTexSubImage2D(level=%d)", level); sprintf(message, "glTexSubImage2D(level=%d)", level);
_mesa_error(ctx, GL_INVALID_ENUM, message); _mesa_error(ctx, GL_INVALID_ENUM, message);
@@ -901,12 +921,14 @@ copytexture_error_check( GLcontext *ctx, GLuint dimensions,
GLint width, GLint height, GLint border ) GLint width, GLint height, GLint border )
{ {
GLint iformat; GLint iformat;
GLint maxLevels = 0, maxTextureSize;
if (dimensions == 1) { if (dimensions == 1) {
if (target != GL_TEXTURE_1D) { if (target != GL_TEXTURE_1D) {
_mesa_error( ctx, GL_INVALID_ENUM, "glCopyTexImage1D(target)" ); _mesa_error( ctx, GL_INVALID_ENUM, "glCopyTexImage1D(target)" );
return GL_TRUE; return GL_TRUE;
} }
maxLevels = ctx->Const.MaxTextureLevels;
} }
else if (dimensions == 2) { else if (dimensions == 2) {
if (ctx->Extensions.ARB_texture_cube_map) { if (ctx->Extensions.ARB_texture_cube_map) {
@@ -921,8 +943,15 @@ copytexture_error_check( GLcontext *ctx, GLuint dimensions,
_mesa_error( ctx, GL_INVALID_ENUM, "glCopyTexImage2D(target)" ); _mesa_error( ctx, GL_INVALID_ENUM, "glCopyTexImage2D(target)" );
return GL_TRUE; return GL_TRUE;
} }
if (target == GL_PROXY_TEXTURE_2D && target == GL_TEXTURE_2D)
maxLevels = ctx->Const.MaxTextureLevels;
else
maxLevels = ctx->Const.MaxCubeTextureLevels;
} }
ASSERT(maxLevels > 0);
maxTextureSize = 1 << (maxLevels - 1);
/* Border */ /* Border */
if (border != 0 && border != 1) { if (border != 0 && border != 1) {
char message[100]; char message[100];
@@ -932,7 +961,7 @@ copytexture_error_check( GLcontext *ctx, GLuint dimensions,
} }
/* Width */ /* Width */
if (width < 2 * border || width > 2 + ctx->Const.MaxTextureSize if (width < 2 * border || width > 2 + maxTextureSize
|| logbase2( width - 2 * border ) < 0) { || logbase2( width - 2 * border ) < 0) {
char message[100]; char message[100];
sprintf(message, "glCopyTexImage%dD(width=%d)", dimensions, width); sprintf(message, "glCopyTexImage%dD(width=%d)", dimensions, width);
@@ -942,7 +971,7 @@ copytexture_error_check( GLcontext *ctx, GLuint dimensions,
/* Height */ /* Height */
if (dimensions >= 2) { if (dimensions >= 2) {
if (height < 2 * border || height > 2 + ctx->Const.MaxTextureSize if (height < 2 * border || height > 2 + maxTextureSize
|| logbase2( height - 2 * border ) < 0) { || logbase2( height - 2 * border ) < 0) {
char message[100]; char message[100];
sprintf(message, "glCopyTexImage%dD(height=%d)", dimensions, height); sprintf(message, "glCopyTexImage%dD(height=%d)", dimensions, height);
@@ -961,14 +990,14 @@ copytexture_error_check( GLcontext *ctx, GLuint dimensions,
} }
/* Level */ /* Level */
if (level < 0 || level>=ctx->Const.MaxTextureLevels) { if (level < 0 || level >= maxLevels) {
char message[100]; char message[100];
sprintf(message, "glCopyTexImage%dD(level=%d)", dimensions, level); sprintf(message, "glCopyTexImage%dD(level=%d)", dimensions, level);
_mesa_error(ctx, GL_INVALID_VALUE, message); _mesa_error(ctx, GL_INVALID_VALUE, message);
return GL_TRUE; return GL_TRUE;
} }
iformat = _mesa_base_tex_format( ctx, internalFormat ); iformat = _mesa_base_tex_format(ctx, internalFormat);
if (iformat < 0) { if (iformat < 0) {
char message[100]; char message[100];
sprintf(message, "glCopyTexImage%dD(internalFormat)", dimensions); sprintf(message, "glCopyTexImage%dD(internalFormat)", dimensions);
@@ -989,12 +1018,14 @@ copytexsubimage_error_check( GLcontext *ctx, GLuint dimensions,
{ {
struct gl_texture_unit *texUnit = &ctx->Texture.Unit[ctx->Texture.CurrentUnit]; struct gl_texture_unit *texUnit = &ctx->Texture.Unit[ctx->Texture.CurrentUnit];
struct gl_texture_image *teximage; struct gl_texture_image *teximage;
GLint maxLevels = 0;
if (dimensions == 1) { if (dimensions == 1) {
if (target != GL_TEXTURE_1D) { if (target != GL_TEXTURE_1D) {
_mesa_error( ctx, GL_INVALID_ENUM, "glCopyTexSubImage1D(target)" ); _mesa_error( ctx, GL_INVALID_ENUM, "glCopyTexSubImage1D(target)" );
return GL_TRUE; return GL_TRUE;
} }
maxLevels = ctx->Const.MaxTextureLevels;
} }
else if (dimensions == 2) { else if (dimensions == 2) {
if (ctx->Extensions.ARB_texture_cube_map) { if (ctx->Extensions.ARB_texture_cube_map) {
@@ -1009,15 +1040,22 @@ copytexsubimage_error_check( GLcontext *ctx, GLuint dimensions,
_mesa_error( ctx, GL_INVALID_ENUM, "glCopyTexSubImage2D(target)" ); _mesa_error( ctx, GL_INVALID_ENUM, "glCopyTexSubImage2D(target)" );
return GL_TRUE; return GL_TRUE;
} }
if (target == GL_PROXY_TEXTURE_2D && target == GL_TEXTURE_2D)
maxLevels = ctx->Const.MaxTextureLevels;
else
maxLevels = ctx->Const.MaxCubeTextureLevels;
} }
else if (dimensions == 3) { else if (dimensions == 3) {
if (target != GL_TEXTURE_3D) { if (target != GL_TEXTURE_3D) {
_mesa_error( ctx, GL_INVALID_ENUM, "glCopyTexSubImage3D(target)" ); _mesa_error( ctx, GL_INVALID_ENUM, "glCopyTexSubImage3D(target)" );
return GL_TRUE; return GL_TRUE;
} }
maxLevels = ctx->Const.Max3DTextureLevels;
} }
if (level < 0 || level >= ctx->Const.MaxTextureLevels) { ASSERT(maxLevels > 0);
if (level < 0 || level >= maxLevels) {
char message[100]; char message[100];
sprintf(message, "glCopyTexSubImage%dD(level=%d)", dimensions, level); sprintf(message, "glCopyTexSubImage%dD(level=%d)", dimensions, level);
_mesa_error(ctx, GL_INVALID_VALUE, message); _mesa_error(ctx, GL_INVALID_VALUE, message);
@@ -1101,10 +1139,30 @@ _mesa_GetTexImage( GLenum target, GLint level, GLenum format,
const struct gl_texture_unit *texUnit; const struct gl_texture_unit *texUnit;
const struct gl_texture_object *texObj; const struct gl_texture_object *texObj;
struct gl_texture_image *texImage; struct gl_texture_image *texImage;
GLint maxLevels = 0;
GET_CURRENT_CONTEXT(ctx); GET_CURRENT_CONTEXT(ctx);
ASSERT_OUTSIDE_BEGIN_END_AND_FLUSH(ctx); ASSERT_OUTSIDE_BEGIN_END_AND_FLUSH(ctx);
if (level < 0 || level >= ctx->Const.MaxTextureLevels) { texUnit = &(ctx->Texture.Unit[ctx->Texture.CurrentUnit]);
texObj = _mesa_select_tex_object(ctx, texUnit, target);
if (!texObj || is_proxy_target(target)) {
_mesa_error(ctx, GL_INVALID_ENUM, "glGetTexImage(target)");
return;
}
if (target == GL_TEXTURE_1D || target == GL_TEXTURE_2D) {
maxLevels = ctx->Const.MaxTextureLevels;
}
else if (target == GL_TEXTURE_3D) {
maxLevels = ctx->Const.Max3DTextureLevels;
}
else {
maxLevels = ctx->Const.MaxCubeTextureLevels;
}
ASSERT(maxLevels > 0);
if (level < 0 || level >= maxLevels) {
_mesa_error( ctx, GL_INVALID_VALUE, "glGetTexImage(level)" ); _mesa_error( ctx, GL_INVALID_VALUE, "glGetTexImage(level)" );
return; return;
} }
@@ -1133,13 +1191,6 @@ _mesa_GetTexImage( GLenum target, GLint level, GLenum format,
if (!pixels) if (!pixels)
return; return;
texUnit = &(ctx->Texture.Unit[ctx->Texture.CurrentUnit]);
texObj = _mesa_select_tex_object(ctx, texUnit, target);
if (!texObj || is_proxy_target(target)) {
_mesa_error(ctx, GL_INVALID_ENUM, "glGetTexImage(target)");
return;
}
texImage = _mesa_select_tex_image(ctx, texUnit, target, level); texImage = _mesa_select_tex_image(ctx, texUnit, target, level);
if (!texImage) { if (!texImage) {
/* invalid mipmap level, not an error */ /* invalid mipmap level, not an error */
@@ -1173,7 +1224,7 @@ _mesa_GetTexImage( GLenum target, GLint level, GLenum format,
} }
_mesa_pack_index_span(ctx, width, type, dest, _mesa_pack_index_span(ctx, width, type, dest,
indexRow, &ctx->Pack, indexRow, &ctx->Pack,
ctx->_ImageTransferState); 0 /* no image transfer */);
} }
else if (format == GL_DEPTH_COMPONENT) { else if (format == GL_DEPTH_COMPONENT) {
GLfloat depthRow[MAX_WIDTH]; GLfloat depthRow[MAX_WIDTH];
@@ -1195,7 +1246,7 @@ _mesa_GetTexImage( GLenum target, GLint level, GLenum format,
} }
_mesa_pack_rgba_span(ctx, width, (const GLchan (*)[4])rgba, _mesa_pack_rgba_span(ctx, width, (const GLchan (*)[4])rgba,
format, type, dest, &ctx->Pack, format, type, dest, &ctx->Pack,
ctx->_ImageTransferState); 0 /* no image transfer */);
} /* format */ } /* format */
} /* row */ } /* row */
} /* img */ } /* img */
@@ -1414,7 +1465,9 @@ _mesa_TexImage2D( GLenum target, GLint level, GLint internalFormat,
} }
if (error) { if (error) {
/* if error, clear all proxy texture image parameters */ /* if error, clear all proxy texture image parameters */
if (level >= 0 && level < ctx->Const.MaxTextureLevels) { const GLint maxLevels = (target == GL_PROXY_TEXTURE_2D) ?
ctx->Const.MaxTextureLevels : ctx->Const.MaxCubeTextureLevels;
if (level >= 0 && level < maxLevels) {
clear_teximage_fields(ctx->Texture.Proxy2D->Image[level]); clear_teximage_fields(ctx->Texture.Proxy2D->Image[level]);
} }
} }
@@ -1520,7 +1573,7 @@ _mesa_TexImage3D( GLenum target, GLint level, GLenum internalFormat,
} }
if (error) { if (error) {
/* if error, clear all proxy texture image parameters */ /* if error, clear all proxy texture image parameters */
if (level >= 0 && level < ctx->Const.MaxTextureLevels) { if (level >= 0 && level < ctx->Const.Max3DTextureLevels) {
clear_teximage_fields(ctx->Texture.Proxy3D->Image[level]); clear_teximage_fields(ctx->Texture.Proxy3D->Image[level]);
} }
} }
@@ -2013,7 +2066,7 @@ _mesa_CompressedTexImage1DARB(GLenum target, GLint level,
} }
} }
else { else {
_mesa_error( ctx, GL_INVALID_ENUM, "glCompressedTexImage1DARB(target)" ); _mesa_error(ctx, GL_INVALID_ENUM, "glCompressedTexImage1DARB(target)");
return; return;
} }
} }
@@ -2106,13 +2159,15 @@ _mesa_CompressedTexImage2DARB(GLenum target, GLint level,
} }
if (error) { if (error) {
/* if error, clear all proxy texture image parameters */ /* if error, clear all proxy texture image parameters */
if (level >= 0 && level < ctx->Const.MaxTextureLevels) { const GLint maxLevels = (target == GL_PROXY_TEXTURE_2D) ?
ctx->Const.MaxTextureLevels : ctx->Const.MaxCubeTextureLevels;
if (level >= 0 && level < maxLevels) {
clear_teximage_fields(ctx->Texture.Proxy2D->Image[level]); clear_teximage_fields(ctx->Texture.Proxy2D->Image[level]);
} }
} }
} }
else { else {
_mesa_error( ctx, GL_INVALID_ENUM, "glCompressedTexImage2DARB(target)" ); _mesa_error(ctx, GL_INVALID_ENUM, "glCompressedTexImage2DARB(target)");
return; return;
} }
} }
@@ -2203,13 +2258,13 @@ _mesa_CompressedTexImage3DARB(GLenum target, GLint level,
} }
if (error) { if (error) {
/* if error, clear all proxy texture image parameters */ /* if error, clear all proxy texture image parameters */
if (level >= 0 && level < ctx->Const.MaxTextureLevels) { if (level >= 0 && level < ctx->Const.Max3DTextureLevels) {
clear_teximage_fields(ctx->Texture.Proxy3D->Image[level]); clear_teximage_fields(ctx->Texture.Proxy3D->Image[level]);
} }
} }
} }
else { else {
_mesa_error( ctx, GL_INVALID_ENUM, "glCompressedTexImage3DARB(target)" ); _mesa_error(ctx, GL_INVALID_ENUM, "glCompressedTexImage3DARB(target)");
return; return;
} }
} }
@@ -2326,11 +2381,31 @@ _mesa_GetCompressedTexImageARB(GLenum target, GLint level, GLvoid *img)
const struct gl_texture_unit *texUnit; const struct gl_texture_unit *texUnit;
const struct gl_texture_object *texObj; const struct gl_texture_object *texObj;
struct gl_texture_image *texImage; struct gl_texture_image *texImage;
GLint maxLevels;
GET_CURRENT_CONTEXT(ctx); GET_CURRENT_CONTEXT(ctx);
ASSERT_OUTSIDE_BEGIN_END_AND_FLUSH(ctx); ASSERT_OUTSIDE_BEGIN_END_AND_FLUSH(ctx);
if (level < 0 || level >= ctx->Const.MaxTextureLevels) { texUnit = &ctx->Texture.Unit[ctx->Texture.CurrentUnit];
_mesa_error( ctx, GL_INVALID_VALUE, "glGetCompressedTexImageARB(level)" ); texObj = _mesa_select_tex_object(ctx, texUnit, target);
if (!texObj) {
_mesa_error(ctx, GL_INVALID_ENUM, "glGetCompressedTexImageARB");
return;
}
if (target == GL_TEXTURE_1D || target == GL_TEXTURE_2D) {
maxLevels = ctx->Const.MaxTextureLevels;
}
else if (target == GL_TEXTURE_3D) {
maxLevels = ctx->Const.Max3DTextureLevels;
}
else {
maxLevels = ctx->Const.MaxCubeTextureLevels;
}
ASSERT(maxLevels > 0);
if (level < 0 || level >= maxLevels) {
_mesa_error(ctx, GL_INVALID_VALUE, "glGetCompressedTexImageARB(level)");
return; return;
} }
@@ -2339,10 +2414,7 @@ _mesa_GetCompressedTexImageARB(GLenum target, GLint level, GLvoid *img)
return; return;
} }
texUnit = &ctx->Texture.Unit[ctx->Texture.CurrentUnit];
texObj = _mesa_select_tex_object(ctx, texUnit, target);
texImage = _mesa_select_tex_image(ctx, texUnit, target, level); texImage = _mesa_select_tex_image(ctx, texUnit, target, level);
if (!texImage) { if (!texImage) {
/* invalid mipmap level */ /* invalid mipmap level */
_mesa_error(ctx, GL_INVALID_VALUE, "glGetCompressedTexImageARB(level)"); _mesa_error(ctx, GL_INVALID_VALUE, "glGetCompressedTexImageARB(level)");

View File

@@ -1,4 +1,4 @@
/* $Id: texobj.c,v 1.48 2001/04/25 18:21:05 brianp Exp $ */ /* $Id: texobj.c,v 1.49 2001/06/13 14:56:14 brianp Exp $ */
/* /*
* Mesa 3-D graphics library * Mesa 3-D graphics library
@@ -181,7 +181,7 @@ _mesa_test_texobj_completeness( const GLcontext *ctx,
struct gl_texture_object *t ) struct gl_texture_object *t )
{ {
const GLint baseLevel = t->BaseLevel; const GLint baseLevel = t->BaseLevel;
GLint maxLog2 = 0; GLint maxLog2 = 0, maxLevels = 0;
t->Complete = GL_TRUE; /* be optimistic */ t->Complete = GL_TRUE; /* be optimistic */
@@ -195,20 +195,30 @@ _mesa_test_texobj_completeness( const GLcontext *ctx,
/* Compute _MaxLevel */ /* Compute _MaxLevel */
if (t->Dimensions == 1) { if (t->Dimensions == 1) {
maxLog2 = t->Image[baseLevel]->WidthLog2; maxLog2 = t->Image[baseLevel]->WidthLog2;
maxLevels = ctx->Const.MaxTextureLevels;
} }
else if (t->Dimensions == 2 || t->Dimensions == 6) { else if (t->Dimensions == 2 || t->Dimensions == 6) {
maxLog2 = MAX2(t->Image[baseLevel]->WidthLog2, maxLog2 = MAX2(t->Image[baseLevel]->WidthLog2,
t->Image[baseLevel]->HeightLog2); t->Image[baseLevel]->HeightLog2);
maxLevels = (t->Dimensions == 2) ?
ctx->Const.MaxTextureLevels : ctx->Const.MaxCubeTextureLevels;
} }
else if (t->Dimensions == 3) { else if (t->Dimensions == 3) {
GLint max = MAX2(t->Image[baseLevel]->WidthLog2, GLint max = MAX2(t->Image[baseLevel]->WidthLog2,
t->Image[baseLevel]->HeightLog2); t->Image[baseLevel]->HeightLog2);
maxLog2 = MAX2(max, (GLint)(t->Image[baseLevel]->DepthLog2)); maxLog2 = MAX2(max, (GLint)(t->Image[baseLevel]->DepthLog2));
maxLevels = ctx->Const.Max3DTextureLevels;
} }
else {
_mesa_problem(ctx, "Bad t->Dimension in _mesa_test_texobj_completeness");
return;
}
ASSERT(maxLevels > 0);
t->_MaxLevel = baseLevel + maxLog2; t->_MaxLevel = baseLevel + maxLog2;
t->_MaxLevel = MIN2(t->_MaxLevel, t->MaxLevel); t->_MaxLevel = MIN2(t->_MaxLevel, t->MaxLevel);
t->_MaxLevel = MIN2(t->_MaxLevel, ctx->Const.MaxTextureLevels - 1); t->_MaxLevel = MIN2(t->_MaxLevel, maxLevels - 1);
/* Compute _MaxLambda = q - b (see the 1.2 spec) used during mipmapping */ /* Compute _MaxLambda = q - b (see the 1.2 spec) used during mipmapping */
t->_MaxLambda = (GLfloat) (t->_MaxLevel - t->BaseLevel); t->_MaxLambda = (GLfloat) (t->_MaxLevel - t->BaseLevel);
@@ -272,7 +282,7 @@ _mesa_test_texobj_completeness( const GLcontext *ctx,
if (t->Dimensions == 1) { if (t->Dimensions == 1) {
/* Test 1-D mipmaps */ /* Test 1-D mipmaps */
GLuint width = t->Image[baseLevel]->Width2; GLuint width = t->Image[baseLevel]->Width2;
for (i = baseLevel + 1; i < ctx->Const.MaxTextureLevels; i++) { for (i = baseLevel + 1; i < maxLevels; i++) {
if (width > 1) { if (width > 1) {
width /= 2; width /= 2;
} }
@@ -297,7 +307,7 @@ _mesa_test_texobj_completeness( const GLcontext *ctx,
/* Test 2-D mipmaps */ /* Test 2-D mipmaps */
GLuint width = t->Image[baseLevel]->Width2; GLuint width = t->Image[baseLevel]->Width2;
GLuint height = t->Image[baseLevel]->Height2; GLuint height = t->Image[baseLevel]->Height2;
for (i = baseLevel + 1; i < ctx->Const.MaxTextureLevels; i++) { for (i = baseLevel + 1; i < maxLevels; i++) {
if (width > 1) { if (width > 1) {
width /= 2; width /= 2;
} }
@@ -331,7 +341,7 @@ _mesa_test_texobj_completeness( const GLcontext *ctx,
GLuint width = t->Image[baseLevel]->Width2; GLuint width = t->Image[baseLevel]->Width2;
GLuint height = t->Image[baseLevel]->Height2; GLuint height = t->Image[baseLevel]->Height2;
GLuint depth = t->Image[baseLevel]->Depth2; GLuint depth = t->Image[baseLevel]->Depth2;
for (i = baseLevel + 1; i < ctx->Const.MaxTextureLevels; i++) { for (i = baseLevel + 1; i < maxLevels; i++) {
if (width > 1) { if (width > 1) {
width /= 2; width /= 2;
} }
@@ -372,7 +382,7 @@ _mesa_test_texobj_completeness( const GLcontext *ctx,
/* make sure 6 cube faces are consistant */ /* make sure 6 cube faces are consistant */
GLuint width = t->Image[baseLevel]->Width2; GLuint width = t->Image[baseLevel]->Width2;
GLuint height = t->Image[baseLevel]->Height2; GLuint height = t->Image[baseLevel]->Height2;
for (i = baseLevel + 1; i < ctx->Const.MaxTextureLevels; i++) { for (i = baseLevel + 1; i < maxLevels; i++) {
if (width > 1) { if (width > 1) {
width /= 2; width /= 2;
} }

View File

@@ -1,4 +1,4 @@
/* $Id: texstate.c,v 1.52 2001/06/12 22:08:41 brianp Exp $ */ /* $Id: texstate.c,v 1.53 2001/06/13 14:56:14 brianp Exp $ */
/* /*
* Mesa 3-D graphics library * Mesa 3-D graphics library
@@ -1133,19 +1133,36 @@ _mesa_GetTexLevelParameteriv( GLenum target, GLint level,
const struct gl_texture_image *img = NULL; const struct gl_texture_image *img = NULL;
GLuint dimensions; GLuint dimensions;
GLboolean isProxy; GLboolean isProxy;
GLint maxLevels;
ASSERT_OUTSIDE_BEGIN_END(ctx); ASSERT_OUTSIDE_BEGIN_END(ctx);
if (level < 0 || level >= ctx->Const.MaxTextureLevels) {
_mesa_error( ctx, GL_INVALID_VALUE, "glGetTexLevelParameter[if]v" );
return;
}
dimensions = tex_image_dimensions(ctx, target); /* 1, 2 or 3 */ dimensions = tex_image_dimensions(ctx, target); /* 1, 2 or 3 */
if (dimensions == 0) { if (dimensions == 0) {
_mesa_error(ctx, GL_INVALID_ENUM, "glGetTexLevelParameter[if]v(target)"); _mesa_error(ctx, GL_INVALID_ENUM, "glGetTexLevelParameter[if]v(target)");
return; return;
} }
switch (target) {
case GL_TEXTURE_1D:
case GL_PROXY_TEXTURE_1D:
case GL_TEXTURE_2D:
case GL_PROXY_TEXTURE_2D:
maxLevels = ctx->Const.MaxTextureLevels;
break;
case GL_TEXTURE_3D:
case GL_PROXY_TEXTURE_3D:
maxLevels = ctx->Const.Max3DTextureLevels;
break;
default:
maxLevels = ctx->Const.MaxCubeTextureLevels;
break;
}
if (level < 0 || level >= maxLevels) {
_mesa_error( ctx, GL_INVALID_VALUE, "glGetTexLevelParameter[if]v" );
return;
}
img = _mesa_select_tex_image(ctx, texUnit, target, level); img = _mesa_select_tex_image(ctx, texUnit, target, level);
if (!img || !img->TexFormat) { if (!img || !img->TexFormat) {
/* undefined texture image */ /* undefined texture image */

View File

@@ -1,4 +1,4 @@
/* $Id: texstore.c,v 1.27 2001/05/24 14:47:56 brianp Exp $ */ /* $Id: texstore.c,v 1.28 2001/06/13 14:56:14 brianp Exp $ */
/* /*
* Mesa 3-D graphics library * Mesa 3-D graphics library
@@ -1544,6 +1544,7 @@ _mesa_generate_mipmap(GLcontext *ctx,
0 }; 0 };
const GLenum *targets; const GLenum *targets;
GLuint level; GLuint level;
GLint maxLevels = 0;
ASSERT(texObj); ASSERT(texObj);
ASSERT(texObj->Image[texObj->BaseLevel]); ASSERT(texObj->Image[texObj->BaseLevel]);
@@ -1551,15 +1552,19 @@ _mesa_generate_mipmap(GLcontext *ctx,
switch (texObj->Dimensions) { switch (texObj->Dimensions) {
case 1: case 1:
targets = targets1D; targets = targets1D;
maxLevels = ctx->Const.MaxTextureLevels;
break; break;
case 2: case 2:
targets = targets2D; targets = targets2D;
maxLevels = ctx->Const.MaxTextureLevels;
break; break;
case 3: case 3:
targets = targets3D; targets = targets3D;
maxLevels = ctx->Const.Max3DTextureLevels;
break; break;
case 6: case 6:
targets = targetsCube; targets = targetsCube;
maxLevels = ctx->Const.MaxCubeTextureLevels;
break; break;
default: default:
_mesa_problem(ctx, _mesa_problem(ctx,
@@ -1568,7 +1573,7 @@ _mesa_generate_mipmap(GLcontext *ctx,
} }
for (level = texObj->BaseLevel; level < texObj->MaxLevel for (level = texObj->BaseLevel; level < texObj->MaxLevel
&& level < ctx->Const.MaxTextureLevels - 1; level++) { && level < maxLevels - 1; level++) {
/* generate image[level+1] from image[level] */ /* generate image[level+1] from image[level] */
const struct gl_texture_image *srcImage; const struct gl_texture_image *srcImage;
struct gl_texture_image *dstImage; struct gl_texture_image *dstImage;