-/* $Id: texstate.c,v 1.14 2000/06/27 21:42:13 brianp Exp $ */
+/* $Id: texstate.c,v 1.19 2000/10/30 13:32:01 keithw Exp $ */
/*
* Mesa 3-D graphics library
- * Version: 3.3
+ * Version: 3.5
*
* Copyright (C) 1999-2000 Brian Paul All Rights Reserved.
*
#include "all.h"
#else
#include "glheader.h"
+#include "colormac.h"
#include "context.h"
#include "enums.h"
#include "extensions.h"
case GL_ADD:
case GL_COMBINE_EXT:
if (mode == GL_ADD &&
- !ctx->Extensions.HaveTextureEnvAdd) {
+ !ctx->Extensions.EXT_texture_env_add) {
gl_error(ctx, GL_INVALID_ENUM, "glTexEnv(param)");
return;
}
if (mode == GL_COMBINE_EXT &&
- !ctx->Extensions.HaveTextureEnvCombine) {
+ !ctx->Extensions.EXT_texture_env_combine) {
gl_error(ctx, GL_INVALID_ENUM, "glTexEnv(param)");
return;
}
if (texUnit->EnvMode == mode)
return; /* no change */
texUnit->EnvMode = mode;
- ctx->NewState |= NEW_TEXTURE_ENV;
break;
default:
gl_error( ctx, GL_INVALID_VALUE, "glTexEnv(param)" );
texUnit->EnvColor[3] = CLAMP( param[3], 0.0F, 1.0F );
break;
case GL_COMBINE_RGB_EXT:
- if (ctx->Extensions.HaveTextureEnvCombine) {
+ if (ctx->Extensions.EXT_texture_env_combine) {
GLenum mode = (GLenum) (GLint) *param;
switch (mode) {
case GL_REPLACE:
if (texUnit->CombineModeRGB == mode)
return; /* no change */
texUnit->CombineModeRGB = mode;
- ctx->NewState |= NEW_TEXTURE_ENV;
break;
default:
gl_error( ctx, GL_INVALID_ENUM, "glTexEnv(param)" );
}
break;
case GL_COMBINE_ALPHA_EXT:
- if (ctx->Extensions.HaveTextureEnvCombine) {
+ if (ctx->Extensions.EXT_texture_env_combine) {
GLenum mode = (GLenum) (GLint) *param;
switch (mode) {
case GL_REPLACE:
if (texUnit->CombineModeA == mode)
return; /* no change */
texUnit->CombineModeA = mode;
- ctx->NewState |= NEW_TEXTURE_ENV;
break;
default:
gl_error( ctx, GL_INVALID_ENUM, "glTexEnv(param)" );
case GL_SOURCE0_RGB_EXT:
case GL_SOURCE1_RGB_EXT:
case GL_SOURCE2_RGB_EXT:
- if (ctx->Extensions.HaveTextureEnvCombine) {
+ if (ctx->Extensions.EXT_texture_env_combine) {
GLenum source = (GLenum) (GLint) *param;
GLuint s = pname - GL_SOURCE0_RGB_EXT;
switch (source) {
if (texUnit->CombineSourceRGB[s] == source)
return; /* no change */
texUnit->CombineSourceRGB[s] = source;
- ctx->NewState |= NEW_TEXTURE_ENV;
break;
default:
gl_error( ctx, GL_INVALID_ENUM, "glTexEnv(param)" );
case GL_SOURCE0_ALPHA_EXT:
case GL_SOURCE1_ALPHA_EXT:
case GL_SOURCE2_ALPHA_EXT:
- if (ctx->Extensions.HaveTextureEnvCombine) {
+ if (ctx->Extensions.EXT_texture_env_combine) {
GLenum source = (GLenum) (GLint) *param;
GLuint s = pname - GL_SOURCE0_ALPHA_EXT;
switch (source) {
case GL_PREVIOUS_EXT:
if (texUnit->CombineSourceA[s] == source) return;
texUnit->CombineSourceA[s] = source;
- ctx->NewState |= NEW_TEXTURE_ENV;
break;
default:
gl_error( ctx, GL_INVALID_ENUM, "glTexEnv(param)" );
break;
case GL_OPERAND0_RGB_EXT:
case GL_OPERAND1_RGB_EXT:
- if (ctx->Extensions.HaveTextureEnvCombine) {
+ if (ctx->Extensions.EXT_texture_env_combine) {
GLenum operand = (GLenum) (GLint) *param;
GLuint s = pname - GL_OPERAND0_RGB_EXT;
switch (operand) {
case GL_SRC_COLOR:
case GL_ONE_MINUS_SRC_COLOR:
- texUnit->CombineOperandRGB[s] = operand;
- ctx->NewState |= NEW_TEXTURE_ENV;
- break;
case GL_SRC_ALPHA:
case GL_ONE_MINUS_SRC_ALPHA:
- texUnit->CombineOperandA[s] = operand;
- ctx->NewState |= NEW_TEXTURE_ENV;
+ texUnit->CombineOperandRGB[s] = operand;
break;
default:
gl_error( ctx, GL_INVALID_ENUM, "glTexEnv(param)" );
break;
case GL_OPERAND0_ALPHA_EXT:
case GL_OPERAND1_ALPHA_EXT:
- if (ctx->Extensions.HaveTextureEnvCombine) {
+ if (ctx->Extensions.EXT_texture_env_combine) {
GLenum operand = (GLenum) (GLint) *param;
switch (operand) {
case GL_SRC_ALPHA:
case GL_ONE_MINUS_SRC_ALPHA:
texUnit->CombineOperandA[pname-GL_OPERAND0_ALPHA_EXT]
= operand;
- ctx->NewState |= NEW_TEXTURE_ENV;
break;
default:
gl_error( ctx, GL_INVALID_ENUM, "glTexEnv(param)" );
}
break;
case GL_OPERAND2_RGB_EXT:
- if (ctx->Extensions.HaveTextureEnvCombine) {
+ if (ctx->Extensions.EXT_texture_env_combine) {
if ((GLenum) (GLint) *param == GL_SRC_ALPHA) {
texUnit->CombineOperandRGB[2] = (GLenum) (GLint) *param;
- ctx->NewState |= NEW_TEXTURE_ENV;
}
else {
gl_error( ctx, GL_INVALID_ENUM, "glTexEnv(param)" );
}
break;
case GL_OPERAND2_ALPHA_EXT:
- if (ctx->Extensions.HaveTextureEnvCombine) {
+ if (ctx->Extensions.EXT_texture_env_combine) {
if ((GLenum) (GLint) *param == GL_SRC_ALPHA) {
texUnit->CombineOperandA[2] = (GLenum) (GLint) *param;
- ctx->NewState |= NEW_TEXTURE_ENV;
}
else {
gl_error( ctx, GL_INVALID_ENUM, "glTexEnv(param)" );
}
break;
case GL_RGB_SCALE_EXT:
- if (ctx->Extensions.HaveTextureEnvCombine) {
+ if (ctx->Extensions.EXT_texture_env_combine) {
if (*param == 1.0) {
texUnit->CombineScaleShiftRGB = 0;
- ctx->NewState |= NEW_TEXTURE_ENV;
}
else if (*param == 2.0) {
texUnit->CombineScaleShiftRGB = 1;
- ctx->NewState |= NEW_TEXTURE_ENV;
}
else if (*param == 4.0) {
texUnit->CombineScaleShiftRGB = 2;
- ctx->NewState |= NEW_TEXTURE_ENV;
}
else {
gl_error( ctx, GL_INVALID_VALUE, "glTexEnv(param)" );
}
break;
case GL_ALPHA_SCALE:
- if (ctx->Extensions.HaveTextureEnvCombine) {
+ if (ctx->Extensions.EXT_texture_env_combine) {
if (*param == 1.0) {
texUnit->CombineScaleShiftA = 0;
- ctx->NewState |= NEW_TEXTURE_ENV;
}
else if (*param == 2.0) {
texUnit->CombineScaleShiftA = 1;
- ctx->NewState |= NEW_TEXTURE_ENV;
}
else if (*param == 4.0) {
texUnit->CombineScaleShiftA = 2;
- ctx->NewState |= NEW_TEXTURE_ENV;
}
else {
gl_error( ctx, GL_INVALID_VALUE, "glTexEnv(param)" );
}
}
else if (target==GL_TEXTURE_FILTER_CONTROL_EXT) {
- if (!ctx->Extensions.HaveTextureLodBias) {
+ if (!ctx->Extensions.EXT_texture_lod_bias) {
gl_error( ctx, GL_INVALID_ENUM, "glTexEnv(param)" );
return;
}
(*ctx->Driver.TexEnv)( ctx, target, pname, param );
}
+ ctx->NewState |= _NEW_TEXTURE;
}
COPY_4FV( params, texUnit->EnvColor );
break;
case GL_RGB_SCALE_EXT:
- if (ctx->Extensions.HaveTextureEnvCombine) {
+ if (ctx->Extensions.EXT_texture_env_combine) {
if (texUnit->CombineScaleShiftRGB == 0)
*params = 1.0;
else if (texUnit->CombineScaleShiftRGB == 1)
}
break;
case GL_ALPHA_SCALE:
- if (ctx->Extensions.HaveTextureEnvCombine) {
+ if (ctx->Extensions.EXT_texture_env_combine) {
if (texUnit->CombineScaleShiftA == 0)
*params = 1.0;
else if (texUnit->CombineScaleShiftA == 1)
params[3] = FLOAT_TO_INT( texUnit->EnvColor[3] );
break;
case GL_COMBINE_RGB_EXT:
- if (ctx->Extensions.HaveTextureEnvCombine) {
+ if (ctx->Extensions.EXT_texture_env_combine) {
*params = (GLint) texUnit->CombineModeRGB;
}
else {
}
break;
case GL_COMBINE_ALPHA_EXT:
- if (ctx->Extensions.HaveTextureEnvCombine) {
+ if (ctx->Extensions.EXT_texture_env_combine) {
*params = (GLint) texUnit->CombineModeA;
}
else {
}
break;
case GL_SOURCE0_RGB_EXT:
- if (ctx->Extensions.HaveTextureEnvCombine) {
+ if (ctx->Extensions.EXT_texture_env_combine) {
*params = (GLint) texUnit->CombineSourceRGB[0];
}
else {
}
break;
case GL_SOURCE1_RGB_EXT:
- if (ctx->Extensions.HaveTextureEnvCombine) {
+ if (ctx->Extensions.EXT_texture_env_combine) {
*params = (GLint) texUnit->CombineSourceRGB[1];
}
else {
}
break;
case GL_SOURCE2_RGB_EXT:
- if (ctx->Extensions.HaveTextureEnvCombine) {
+ if (ctx->Extensions.EXT_texture_env_combine) {
*params = (GLint) texUnit->CombineSourceRGB[2];
}
else {
}
break;
case GL_SOURCE0_ALPHA_EXT:
- if (ctx->Extensions.HaveTextureEnvCombine) {
+ if (ctx->Extensions.EXT_texture_env_combine) {
*params = (GLint) texUnit->CombineSourceA[0];
}
else {
}
break;
case GL_SOURCE1_ALPHA_EXT:
- if (ctx->Extensions.HaveTextureEnvCombine) {
+ if (ctx->Extensions.EXT_texture_env_combine) {
*params = (GLint) texUnit->CombineSourceA[1];
}
else {
}
break;
case GL_SOURCE2_ALPHA_EXT:
- if (ctx->Extensions.HaveTextureEnvCombine) {
+ if (ctx->Extensions.EXT_texture_env_combine) {
*params = (GLint) texUnit->CombineSourceA[2];
}
else {
}
break;
case GL_OPERAND0_RGB_EXT:
- if (ctx->Extensions.HaveTextureEnvCombine) {
+ if (ctx->Extensions.EXT_texture_env_combine) {
*params = (GLint) texUnit->CombineOperandRGB[0];
}
else {
}
break;
case GL_OPERAND1_RGB_EXT:
- if (ctx->Extensions.HaveTextureEnvCombine) {
+ if (ctx->Extensions.EXT_texture_env_combine) {
*params = (GLint) texUnit->CombineOperandRGB[1];
}
else {
}
break;
case GL_OPERAND2_RGB_EXT:
- if (ctx->Extensions.HaveTextureEnvCombine) {
+ if (ctx->Extensions.EXT_texture_env_combine) {
*params = (GLint) texUnit->CombineOperandRGB[2];
}
else {
}
break;
case GL_OPERAND0_ALPHA_EXT:
- if (ctx->Extensions.HaveTextureEnvCombine) {
+ if (ctx->Extensions.EXT_texture_env_combine) {
*params = (GLint) texUnit->CombineOperandA[0];
}
else {
}
break;
case GL_OPERAND1_ALPHA_EXT:
- if (ctx->Extensions.HaveTextureEnvCombine) {
+ if (ctx->Extensions.EXT_texture_env_combine) {
*params = (GLint) texUnit->CombineOperandA[1];
}
else {
}
break;
case GL_OPERAND2_ALPHA_EXT:
- if (ctx->Extensions.HaveTextureEnvCombine) {
+ if (ctx->Extensions.EXT_texture_env_combine) {
*params = (GLint) texUnit->CombineOperandA[2];
}
else {
texObj = texUnit->CurrentD[3];
break;
case GL_TEXTURE_CUBE_MAP_ARB:
- if (ctx->Extensions.HaveTextureCubeMap) {
+ if (ctx->Extensions.ARB_texture_cube_map) {
texObj = texUnit->CurrentCubeMap;
break;
}
|| eparam==GL_NEAREST_MIPMAP_LINEAR
|| eparam==GL_LINEAR_MIPMAP_LINEAR) {
texObj->MinFilter = eparam;
- ctx->NewState |= NEW_TEXTURING;
}
else {
gl_error( ctx, GL_INVALID_VALUE, "glTexParameter(param)" );
if (eparam==GL_NEAREST || eparam==GL_LINEAR) {
texObj->MagFilter = eparam;
- ctx->NewState |= NEW_TEXTURING;
}
else {
gl_error( ctx, GL_INVALID_VALUE, "glTexParameter(param)" );
if (eparam==GL_CLAMP || eparam==GL_REPEAT || eparam==GL_CLAMP_TO_EDGE) {
texObj->WrapS = eparam;
- ctx->NewState |= NEW_TEXTURING;
}
else {
gl_error( ctx, GL_INVALID_VALUE, "glTexParameter(param)" );
if (eparam==GL_CLAMP || eparam==GL_REPEAT || eparam==GL_CLAMP_TO_EDGE) {
texObj->WrapT = eparam;
- ctx->NewState |= NEW_TEXTURING;
}
else {
gl_error( ctx, GL_INVALID_VALUE, "glTexParameter(param)" );
if (eparam==GL_CLAMP || eparam==GL_REPEAT || eparam==GL_CLAMP_TO_EDGE) {
texObj->WrapR = eparam;
- ctx->NewState |= NEW_TEXTURING;
}
else {
gl_error( ctx, GL_INVALID_VALUE, "glTexParameter(param)" );
}
break;
case GL_TEXTURE_BORDER_COLOR:
- texObj->BorderColor[0] = (GLubyte) CLAMP((GLint)(params[0]*255.0), 0, 255);
- texObj->BorderColor[1] = (GLubyte) CLAMP((GLint)(params[1]*255.0), 0, 255);
- texObj->BorderColor[2] = (GLubyte) CLAMP((GLint)(params[2]*255.0), 0, 255);
- texObj->BorderColor[3] = (GLubyte) CLAMP((GLint)(params[3]*255.0), 0, 255);
+ texObj->BorderColor[0] = (GLchan) CLAMP((GLint)(params[0]*CHAN_MAXF), 0, CHAN_MAX);
+ texObj->BorderColor[1] = (GLchan) CLAMP((GLint)(params[1]*CHAN_MAXF), 0, CHAN_MAX);
+ texObj->BorderColor[2] = (GLchan) CLAMP((GLint)(params[2]*CHAN_MAXF), 0, CHAN_MAX);
+ texObj->BorderColor[3] = (GLchan) CLAMP((GLint)(params[3]*CHAN_MAXF), 0, CHAN_MAX);
break;
case GL_TEXTURE_MIN_LOD:
texObj->MinLod = params[0];
- ctx->NewState |= NEW_TEXTURING;
break;
case GL_TEXTURE_MAX_LOD:
texObj->MaxLod = params[0];
- ctx->NewState |= NEW_TEXTURING;
break;
case GL_TEXTURE_BASE_LEVEL:
if (params[0] < 0.0) {
return;
}
texObj->BaseLevel = (GLint) params[0];
- ctx->NewState |= NEW_TEXTURING;
break;
case GL_TEXTURE_MAX_LEVEL:
if (params[0] < 0.0) {
return;
}
texObj->MaxLevel = (GLint) params[0];
- ctx->NewState |= NEW_TEXTURING;
break;
case GL_TEXTURE_PRIORITY:
/* (keithh@netcomuk.co.uk) */
return;
}
+ ctx->NewState |= _NEW_TEXTURE;
gl_put_texobj_on_dirty_list( ctx, texObj );
if (ctx->Driver.TexParameter) {
return 3;
case GL_TEXTURE_CUBE_MAP_ARB:
case GL_PROXY_TEXTURE_CUBE_MAP_ARB:
- return ctx->Extensions.HaveTextureCubeMap ? 2 : 0;
+ return ctx->Extensions.ARB_texture_cube_map ? 2 : 0;
default:
gl_problem(ctx, "bad target in _mesa_tex_target_dimensions()");
return 0;
/* GL_ARB_texture_compression */
case GL_TEXTURE_COMPRESSED_IMAGE_SIZE_ARB:
- if (ctx->Extensions.HaveTextureCompression) {
+ if (ctx->Extensions.ARB_texture_compression) {
if (img->IsCompressed && !isProxy)
*params = img->CompressedSize;
else
}
return;
case GL_TEXTURE_COMPRESSED_ARB:
- if (ctx->Extensions.HaveTextureCompression) {
+ if (ctx->Extensions.ARB_texture_compression) {
*params = (GLint) img->IsCompressed;
}
else {
*params = ENUM_TO_FLOAT(obj->WrapR);
break;
case GL_TEXTURE_BORDER_COLOR:
- params[0] = obj->BorderColor[0] / 255.0F;
- params[1] = obj->BorderColor[1] / 255.0F;
- params[2] = obj->BorderColor[2] / 255.0F;
- params[3] = obj->BorderColor[3] / 255.0F;
+ params[0] = obj->BorderColor[0] / CHAN_MAXF;
+ params[1] = obj->BorderColor[1] / CHAN_MAXF;
+ params[2] = obj->BorderColor[2] / CHAN_MAXF;
+ params[3] = obj->BorderColor[3] / CHAN_MAXF;
break;
case GL_TEXTURE_RESIDENT:
- *params = ENUM_TO_FLOAT(GL_TRUE);
+ {
+ GLboolean resident;
+ if (ctx->Driver.IsTextureResident)
+ resident = ctx->Driver.IsTextureResident(ctx, obj);
+ else
+ resident = GL_TRUE;
+ *params = ENUM_TO_FLOAT(resident);
+ }
break;
case GL_TEXTURE_PRIORITY:
*params = obj->Priority;
case GL_TEXTURE_BORDER_COLOR:
{
GLfloat color[4];
- color[0] = obj->BorderColor[0] / 255.0F;
- color[1] = obj->BorderColor[1] / 255.0F;
- color[2] = obj->BorderColor[2] / 255.0F;
- color[3] = obj->BorderColor[3] / 255.0F;
+ color[0] = obj->BorderColor[0] / CHAN_MAXF;
+ color[1] = obj->BorderColor[1] / CHAN_MAXF;
+ color[2] = obj->BorderColor[2] / CHAN_MAXF;
+ color[3] = obj->BorderColor[3] / CHAN_MAXF;
params[0] = FLOAT_TO_INT( color[0] );
params[1] = FLOAT_TO_INT( color[1] );
params[2] = FLOAT_TO_INT( color[2] );
}
break;
case GL_TEXTURE_RESIDENT:
- *params = (GLint) GL_TRUE;
+ {
+ GLboolean resident;
+ if (ctx->Driver.IsTextureResident)
+ resident = ctx->Driver.IsTextureResident(ctx, obj);
+ else
+ resident = GL_TRUE;
+ *params = (GLint) resident;
+ }
break;
case GL_TEXTURE_PRIORITY:
*params = (GLint) obj->Priority;
return;
}
- ctx->NewState |= NEW_TEXTURING;
+ ctx->NewState |= _NEW_TEXTURE;
}
if (ctx->Driver.ActiveTexture) {
(*ctx->Driver.ActiveTexture)( ctx, (GLuint) texUnit );
}
+ ctx->NewState |= _NEW_TEXTURE;
}
else {
gl_error(ctx, GL_INVALID_OPERATION, "glActiveTextureARB(target)");
if (target >= GL_TEXTURE0_ARB && target < GL_TEXTURE0_ARB + maxUnits) {
GLint texUnit = target - GL_TEXTURE0_ARB;
ctx->Array.ActiveTexture = texUnit;
+ ctx->NewState |= _NEW_ARRAY;
}
else {
gl_error(ctx, GL_INVALID_OPERATION, "glActiveTextureARB(target)");
/*
- * This is called by gl_update_state() if the NEW_TEXTURING bit in
+ * This is called by gl_update_state() if the _NEW_TEXTURE bit in
* ctx->NewState is set.
*/
void gl_update_dirty_texobjs( GLcontext *ctx )