mesa/es: Validate glTexEnv parameters in Mesa code rather than the ES wrapper

Signed-off-by: Ian Romanick <ian.d.romanick@intel.com>
This commit is contained in:
Ian Romanick 2012-07-27 17:22:42 -07:00
parent d2b03f6e99
commit 8a263b6efd
3 changed files with 43 additions and 329 deletions

View File

@ -182,155 +182,6 @@
<param name="param" type="GLtype"/>
</vector>
</proto>
<desc name="target" category="OES_point_sprite">
<value name="GL_POINT_SPRITE_OES"/>
<desc name="pname">
<value name="GL_COORD_REPLACE_OES"/>
</desc>
</desc>
<desc name="pname" category="OES_point_sprite">
<value name="GL_COORD_REPLACE_OES"/>
<desc name="param">
<value name="GL_TRUE"/>
<value name="GL_FALSE"/>
</desc>
</desc>
<desc name="target" category="EXT_texture_lod_bias">
<value name="GL_TEXTURE_FILTER_CONTROL_EXT"/>
<desc name="pname">
<value name="GL_TEXTURE_LOD_BIAS_EXT"/>
</desc>
</desc>
<desc name="pname" category="EXT_texture_lod_bias">
<value name="GL_TEXTURE_LOD_BIAS_EXT"/>
<desc name="params" vector_size="1"/>
</desc>
<desc name="target">
<value name="GL_TEXTURE_ENV"/>
<desc name="pname">
<value name="GL_TEXTURE_ENV_MODE"/>
<value name="GL_COMBINE_RGB"/>
<value name="GL_COMBINE_ALPHA"/>
<value name="GL_RGB_SCALE"/>
<value name="GL_ALPHA_SCALE"/>
<value name="GL_SRC0_RGB"/>
<value name="GL_SRC1_RGB"/>
<value name="GL_SRC2_RGB"/>
<value name="GL_SRC0_ALPHA"/>
<value name="GL_SRC1_ALPHA"/>
<value name="GL_SRC2_ALPHA"/>
<value name="GL_OPERAND0_RGB"/>
<value name="GL_OPERAND1_RGB"/>
<value name="GL_OPERAND2_RGB"/>
<value name="GL_OPERAND0_ALPHA"/>
<value name="GL_OPERAND1_ALPHA"/>
<value name="GL_OPERAND2_ALPHA"/>
<value name="GL_TEXTURE_ENV_COLOR"/>
</desc>
</desc>
<desc name="pname">
<value name="GL_TEXTURE_ENV_MODE"/>
<desc name="param">
<value name="GL_REPLACE"/>
<value name="GL_MODULATE"/>
<value name="GL_DECAL"/>
<value name="GL_BLEND"/>
<value name="GL_ADD"/>
<value name="GL_COMBINE"/>
</desc>
</desc>
<desc name="pname">
<value name="GL_COMBINE_RGB"/>
<desc name="param">
<value name="GL_REPLACE"/>
<value name="GL_MODULATE"/>
<value name="GL_ADD"/>
<value name="GL_ADD_SIGNED"/>
<value name="GL_INTERPOLATE"/>
<value name="GL_SUBTRACT"/>
<value name="GL_DOT3_RGB"/>
<value name="GL_DOT3_RGBA"/>
</desc>
</desc>
<desc name="pname">
<value name="GL_COMBINE_ALPHA"/>
<desc name="param">
<value name="GL_REPLACE"/>
<value name="GL_MODULATE"/>
<value name="GL_ADD"/>
<value name="GL_ADD_SIGNED"/>
<value name="GL_INTERPOLATE"/>
<value name="GL_SUBTRACT"/>
</desc>
</desc>
<desc name="pname">
<value name="GL_RGB_SCALE"/>
<value name="GL_ALPHA_SCALE"/>
</desc>
<desc name="pname">
<value name="GL_SRC0_RGB"/>
<value name="GL_SRC1_RGB"/>
<value name="GL_SRC2_RGB"/>
<value name="GL_SRC0_ALPHA"/>
<value name="GL_SRC1_ALPHA"/>
<value name="GL_SRC2_ALPHA"/>
<desc name="param">
<value name="GL_TEXTURE"/>
<value name="GL_CONSTANT"/>
<value name="GL_PRIMARY_COLOR"/>
<value name="GL_PREVIOUS"/>
<range base="GL_TEXTURE" from="0" to="31" category="OES_texture_env_crossbar"/>
</desc>
</desc>
<desc name="pname">
<value name="GL_OPERAND0_RGB"/>
<value name="GL_OPERAND1_RGB"/>
<value name="GL_OPERAND2_RGB"/>
<desc name="param">
<value name="GL_SRC_COLOR"/>
<value name="GL_ONE_MINUS_SRC_COLOR"/>
<value name="GL_SRC_ALPHA"/>
<value name="GL_ONE_MINUS_SRC_ALPHA"/>
</desc>
</desc>
<desc name="pname">
<value name="GL_OPERAND0_ALPHA"/>
<value name="GL_OPERAND1_ALPHA"/>
<value name="GL_OPERAND2_ALPHA"/>
<desc name="param">
<value name="GL_SRC_ALPHA"/>
<value name="GL_ONE_MINUS_SRC_ALPHA"/>
</desc>
</desc>
<desc name="pname">
<value name="GL_TEXTURE_ENV_COLOR"/>
<desc name="params" vector_size="4"/>
</desc>
</template>
<template name="TexGen">

View File

@ -759,246 +759,102 @@ _es_Scalex(GLfixed x, GLfixed y, GLfixed z)
void GL_APIENTRY
_es_TexEnvx(GLenum target, GLenum pname, GLfixed param)
{
GLfloat converted_param;
bool convert_param_value = true;
switch(target) {
case GL_POINT_SPRITE:
if (pname != GL_COORD_REPLACE) {
_mesa_error(_mesa_get_current_context(), GL_INVALID_ENUM,
"glTexEnvx(target=0x%x)", target);
return;
}
break;
case GL_TEXTURE_FILTER_CONTROL_EXT:
if (pname != GL_TEXTURE_LOD_BIAS_EXT) {
_mesa_error(_mesa_get_current_context(), GL_INVALID_ENUM,
"glTexEnvx(target=0x%x)", target);
return;
}
break;
case GL_TEXTURE_ENV:
if (pname != GL_TEXTURE_ENV_MODE && pname != GL_COMBINE_RGB && pname != GL_COMBINE_ALPHA && pname != GL_RGB_SCALE && pname != GL_ALPHA_SCALE && pname != GL_SRC0_RGB && pname != GL_SRC1_RGB && pname != GL_SRC2_RGB && pname != GL_SRC0_ALPHA && pname != GL_SRC1_ALPHA && pname != GL_SRC2_ALPHA && pname != GL_OPERAND0_RGB && pname != GL_OPERAND1_RGB && pname != GL_OPERAND2_RGB && pname != GL_OPERAND0_ALPHA && pname != GL_OPERAND1_ALPHA && pname != GL_OPERAND2_ALPHA && pname != GL_TEXTURE_ENV_COLOR) {
_mesa_error(_mesa_get_current_context(), GL_INVALID_ENUM,
"glTexEnvx(target=0x%x)", target);
return;
}
break;
default:
_mesa_error(_mesa_get_current_context(), GL_INVALID_ENUM,
"glTexEnvx(target=0x%x)", target);
return;
}
switch(pname) {
case GL_COORD_REPLACE:
if (param != GL_TRUE && param != GL_FALSE) {
_mesa_error(_mesa_get_current_context(), GL_INVALID_ENUM,
"glTexEnvx(pname=0x%x)", pname);
return;
}
convert_param_value = false;
break;
case GL_TEXTURE_LOD_BIAS_EXT:
break;
case GL_TEXTURE_ENV_MODE:
if (param != GL_REPLACE && param != GL_MODULATE && param != GL_DECAL && param != GL_BLEND && param != GL_ADD && param != GL_COMBINE) {
_mesa_error(_mesa_get_current_context(), GL_INVALID_ENUM,
"glTexEnvx(pname=0x%x)", pname);
return;
}
convert_param_value = false;
break;
case GL_COMBINE_RGB:
if (param != GL_REPLACE && param != GL_MODULATE && param != GL_ADD && param != GL_ADD_SIGNED && param != GL_INTERPOLATE && param != GL_SUBTRACT && param != GL_DOT3_RGB && param != GL_DOT3_RGBA) {
_mesa_error(_mesa_get_current_context(), GL_INVALID_ENUM,
"glTexEnvx(pname=0x%x)", pname);
return;
}
convert_param_value = false;
break;
case GL_COMBINE_ALPHA:
if (param != GL_REPLACE && param != GL_MODULATE && param != GL_ADD && param != GL_ADD_SIGNED && param != GL_INTERPOLATE && param != GL_SUBTRACT) {
_mesa_error(_mesa_get_current_context(), GL_INVALID_ENUM,
"glTexEnvx(pname=0x%x)", pname);
return;
}
convert_param_value = false;
break;
case GL_RGB_SCALE:
case GL_ALPHA_SCALE:
break;
case GL_SRC0_RGB:
case GL_SRC1_RGB:
case GL_SRC2_RGB:
case GL_SRC0_ALPHA:
case GL_SRC1_ALPHA:
case GL_SRC2_ALPHA:
convert_param_value = false;
break;
case GL_OPERAND0_RGB:
case GL_OPERAND1_RGB:
case GL_OPERAND2_RGB:
if (param != GL_SRC_COLOR && param != GL_ONE_MINUS_SRC_COLOR && param != GL_SRC_ALPHA && param != GL_ONE_MINUS_SRC_ALPHA) {
_mesa_error(_mesa_get_current_context(), GL_INVALID_ENUM,
"glTexEnvx(pname=0x%x)", pname);
return;
}
convert_param_value = false;
break;
case GL_OPERAND0_ALPHA:
case GL_OPERAND1_ALPHA:
case GL_OPERAND2_ALPHA:
if (param != GL_SRC_ALPHA && param != GL_ONE_MINUS_SRC_ALPHA) {
_mesa_error(_mesa_get_current_context(), GL_INVALID_ENUM,
"glTexEnvx(pname=0x%x)", pname);
return;
}
convert_param_value = false;
_mesa_TexEnvf(target, pname, (GLfloat) param);
break;
case GL_TEXTURE_LOD_BIAS_EXT:
case GL_RGB_SCALE:
case GL_ALPHA_SCALE:
_mesa_TexEnvf(target, pname, (GLfloat) (param / 65536.0f));
break;
default:
_mesa_error(_mesa_get_current_context(), GL_INVALID_ENUM,
"glTexEnvx(pname=0x%x)", pname);
return;
}
if (convert_param_value) {
converted_param = (GLfloat) (param / 65536.0f);
} else {
converted_param = (GLfloat) param;
}
_mesa_TexEnvf(target, pname, converted_param);
}
void GL_APIENTRY
_es_TexEnvxv(GLenum target, GLenum pname, const GLfixed *params)
{
unsigned int i;
unsigned int n_params = 4;
GLfloat converted_params[4];
bool convert_params_value = true;
switch(target) {
case GL_POINT_SPRITE:
if (pname != GL_COORD_REPLACE) {
_mesa_error(_mesa_get_current_context(), GL_INVALID_ENUM,
"glTexEnvxv(target=0x%x)", target);
return;
}
break;
case GL_TEXTURE_FILTER_CONTROL_EXT:
if (pname != GL_TEXTURE_LOD_BIAS_EXT) {
_mesa_error(_mesa_get_current_context(), GL_INVALID_ENUM,
"glTexEnvxv(target=0x%x)", target);
return;
}
break;
case GL_TEXTURE_ENV:
if (pname != GL_TEXTURE_ENV_MODE && pname != GL_COMBINE_RGB && pname != GL_COMBINE_ALPHA && pname != GL_RGB_SCALE && pname != GL_ALPHA_SCALE && pname != GL_SRC0_RGB && pname != GL_SRC1_RGB && pname != GL_SRC2_RGB && pname != GL_SRC0_ALPHA && pname != GL_SRC1_ALPHA && pname != GL_SRC2_ALPHA && pname != GL_OPERAND0_RGB && pname != GL_OPERAND1_RGB && pname != GL_OPERAND2_RGB && pname != GL_OPERAND0_ALPHA && pname != GL_OPERAND1_ALPHA && pname != GL_OPERAND2_ALPHA && pname != GL_TEXTURE_ENV_COLOR) {
_mesa_error(_mesa_get_current_context(), GL_INVALID_ENUM,
"glTexEnvxv(target=0x%x)", target);
return;
}
break;
default:
_mesa_error(_mesa_get_current_context(), GL_INVALID_ENUM,
"glTexEnvxv(target=0x%x)", target);
return;
}
switch(pname) {
case GL_COORD_REPLACE:
if (params[0] != GL_TRUE && params[0] != GL_FALSE) {
_mesa_error(_mesa_get_current_context(), GL_INVALID_ENUM,
"glTexEnvxv(pname=0x%x)", pname);
return;
}
convert_params_value = false;
n_params = 1;
break;
case GL_TEXTURE_LOD_BIAS_EXT:
n_params = 1;
break;
case GL_TEXTURE_ENV_MODE:
if (params[0] != GL_REPLACE && params[0] != GL_MODULATE && params[0] != GL_DECAL && params[0] != GL_BLEND && params[0] != GL_ADD && params[0] != GL_COMBINE) {
_mesa_error(_mesa_get_current_context(), GL_INVALID_ENUM,
"glTexEnvxv(pname=0x%x)", pname);
return;
}
convert_params_value = false;
n_params = 1;
break;
case GL_COMBINE_RGB:
if (params[0] != GL_REPLACE && params[0] != GL_MODULATE && params[0] != GL_ADD && params[0] != GL_ADD_SIGNED && params[0] != GL_INTERPOLATE && params[0] != GL_SUBTRACT && params[0] != GL_DOT3_RGB && params[0] != GL_DOT3_RGBA) {
_mesa_error(_mesa_get_current_context(), GL_INVALID_ENUM,
"glTexEnvxv(pname=0x%x)", pname);
return;
}
convert_params_value = false;
n_params = 1;
break;
case GL_COMBINE_ALPHA:
if (params[0] != GL_REPLACE && params[0] != GL_MODULATE && params[0] != GL_ADD && params[0] != GL_ADD_SIGNED && params[0] != GL_INTERPOLATE && params[0] != GL_SUBTRACT) {
_mesa_error(_mesa_get_current_context(), GL_INVALID_ENUM,
"glTexEnvxv(pname=0x%x)", pname);
return;
}
convert_params_value = false;
n_params = 1;
break;
case GL_RGB_SCALE:
case GL_ALPHA_SCALE:
break;
case GL_SRC0_RGB:
case GL_SRC1_RGB:
case GL_SRC2_RGB:
case GL_SRC0_ALPHA:
case GL_SRC1_ALPHA:
case GL_SRC2_ALPHA:
convert_params_value = false;
n_params = 1;
break;
case GL_OPERAND0_RGB:
case GL_OPERAND1_RGB:
case GL_OPERAND2_RGB:
if (params[0] != GL_SRC_COLOR && params[0] != GL_ONE_MINUS_SRC_COLOR && params[0] != GL_SRC_ALPHA && params[0] != GL_ONE_MINUS_SRC_ALPHA) {
_mesa_error(_mesa_get_current_context(), GL_INVALID_ENUM,
"glTexEnvxv(pname=0x%x)", pname);
return;
}
convert_params_value = false;
n_params = 1;
break;
case GL_OPERAND0_ALPHA:
case GL_OPERAND1_ALPHA:
case GL_OPERAND2_ALPHA:
if (params[0] != GL_SRC_ALPHA && params[0] != GL_ONE_MINUS_SRC_ALPHA) {
_mesa_error(_mesa_get_current_context(), GL_INVALID_ENUM,
"glTexEnvxv(pname=0x%x)", pname);
return;
_mesa_TexEnvf(target, pname, (GLfloat) params[0]);
break;
case GL_TEXTURE_LOD_BIAS_EXT:
case GL_RGB_SCALE:
case GL_ALPHA_SCALE:
_mesa_TexEnvf(target, pname, (GLfloat) (params[0] / 65536.0f));
break;
case GL_TEXTURE_ENV_COLOR: {
unsigned int i;
GLfloat converted_params[4];
for (i = 0; i < Elements(converted_params); i++) {
converted_params[i] = (GLfloat) (params[i] / 65536.0f);
}
convert_params_value = false;
n_params = 1;
break;
case GL_TEXTURE_ENV_COLOR:
n_params = 4;
_mesa_TexEnvfv(target, pname, converted_params);
break;
}
default:
_mesa_error(_mesa_get_current_context(), GL_INVALID_ENUM,
"glTexEnvxv(pname=0x%x)", pname);
return;
}
if (convert_params_value) {
for (i = 0; i < n_params; i++) {
converted_params[i] = (GLfloat) (params[i] / 65536.0f);
}
} else {
for (i = 0; i < n_params; i++) {
converted_params[i] = (GLfloat) params[i];
}
}
_mesa_TexEnvfv(target, pname, converted_params);
}
void GL_APIENTRY

View File

@ -122,7 +122,8 @@ set_combiner_mode(struct gl_context *ctx,
break;
case GL_DOT3_RGB_EXT:
case GL_DOT3_RGBA_EXT:
legal = (ctx->Extensions.EXT_texture_env_dot3 &&
legal = (ctx->API == API_OPENGL &&
ctx->Extensions.EXT_texture_env_dot3 &&
pname == GL_COMBINE_RGB);
break;
case GL_DOT3_RGB:
@ -133,10 +134,12 @@ set_combiner_mode(struct gl_context *ctx,
case GL_MODULATE_ADD_ATI:
case GL_MODULATE_SIGNED_ADD_ATI:
case GL_MODULATE_SUBTRACT_ATI:
legal = ctx->Extensions.ATI_texture_env_combine3;
legal = (ctx->API == API_OPENGL &&
ctx->Extensions.ATI_texture_env_combine3);
break;
case GL_BUMP_ENVMAP_ATI:
legal = (ctx->Extensions.ATI_envmap_bumpmap &&
legal = (ctx->API == API_OPENGL &&
ctx->Extensions.ATI_envmap_bumpmap &&
pname == GL_COMBINE_RGB);
break;
default:
@ -203,7 +206,8 @@ set_combiner_source(struct gl_context *ctx,
return;
}
if ((term == 3) && !ctx->Extensions.NV_texture_env_combine4) {
if ((term == 3) && (ctx->API != API_OPENGL
|| !ctx->Extensions.NV_texture_env_combine4)) {
TE_ERROR(GL_INVALID_ENUM, "glTexEnv(pname=%s)", pname);
return;
}
@ -232,11 +236,13 @@ set_combiner_source(struct gl_context *ctx,
param - GL_TEXTURE0 < ctx->Const.MaxTextureUnits);
break;
case GL_ZERO:
legal = (ctx->Extensions.ATI_texture_env_combine3 ||
ctx->Extensions.NV_texture_env_combine4);
legal = (ctx->API == API_OPENGL &&
(ctx->Extensions.ATI_texture_env_combine3 ||
ctx->Extensions.NV_texture_env_combine4));
break;
case GL_ONE:
legal = ctx->Extensions.ATI_texture_env_combine3;
legal = (ctx->API == API_OPENGL &&
ctx->Extensions.ATI_texture_env_combine3);
break;
default:
legal = GL_FALSE;
@ -287,7 +293,8 @@ set_combiner_operand(struct gl_context *ctx,
return;
}
if ((term == 3) && !ctx->Extensions.NV_texture_env_combine4) {
if ((term == 3) && (ctx->API != API_OPENGL
|| !ctx->Extensions.NV_texture_env_combine4)) {
TE_ERROR(GL_INVALID_ENUM, "glTexEnv(pname=%s)", pname);
return;
}
@ -301,8 +308,8 @@ set_combiner_operand(struct gl_context *ctx,
case GL_SRC_COLOR:
case GL_ONE_MINUS_SRC_COLOR:
/* The color input can only be used with GL_OPERAND[01]_RGB in the EXT
* version. In the ARB and NV versions they can be used for any RGB
* operand.
* version. In the ARB and NV versions and OpenGL ES 1.x they can be
* used for any RGB operand.
*/
legal = !alpha
&& ((term < 2) || ctx->Extensions.ARB_texture_env_combine
@ -311,7 +318,7 @@ set_combiner_operand(struct gl_context *ctx,
case GL_ONE_MINUS_SRC_ALPHA:
/* GL_ONE_MINUS_SRC_ALPHA can only be used with
* GL_OPERAND[01]_(RGB|ALPHA) in the EXT version. In the ARB and NV
* versions it can be used for any operand.
* versions and OpenGL ES 1.x it can be used for any operand.
*/
legal = (term < 2) || ctx->Extensions.ARB_texture_env_combine
|| ctx->Extensions.NV_texture_env_combine4;
@ -435,7 +442,7 @@ _mesa_TexEnvfv( GLenum target, GLenum pname, const GLfloat *param )
set_combiner_scale(ctx, texUnit, pname, param[0]);
break;
case GL_BUMP_TARGET_ATI:
if (!ctx->Extensions.ATI_envmap_bumpmap) {
if (ctx->API != API_OPENGL || !ctx->Extensions.ATI_envmap_bumpmap) {
_mesa_error( ctx, GL_INVALID_ENUM, "glTexEnv(pname=0x%x)", pname );
return;
}