diff options
author | Ian Romanick <[email protected]> | 2012-07-27 17:22:42 -0700 |
---|---|---|
committer | Ian Romanick <[email protected]> | 2012-08-29 15:09:35 -0700 |
commit | 8a263b6efd2c520a4ed9c98b9c8142c6c2c6f389 (patch) | |
tree | 803aea0762193072cc36c413d04451533644443b /src | |
parent | d2b03f6e993f08b0a80a206d7bf6f0d42b308266 (diff) |
mesa/es: Validate glTexEnv parameters in Mesa code rather than the ES wrapper
Signed-off-by: Ian Romanick <[email protected]>
Diffstat (limited to 'src')
-rw-r--r-- | src/mesa/main/APIspec.xml | 149 | ||||
-rw-r--r-- | src/mesa/main/es1_conversion.c | 192 | ||||
-rw-r--r-- | src/mesa/main/texenv.c | 31 |
3 files changed, 43 insertions, 329 deletions
diff --git a/src/mesa/main/APIspec.xml b/src/mesa/main/APIspec.xml index ff204fc35c5..c72dcb5018f 100644 --- a/src/mesa/main/APIspec.xml +++ b/src/mesa/main/APIspec.xml @@ -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"> diff --git a/src/mesa/main/es1_conversion.c b/src/mesa/main/es1_conversion.c index 851dc726bc2..d7935894439 100644 --- a/src/mesa/main/es1_conversion.c +++ b/src/mesa/main/es1_conversion.c @@ -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; - } - convert_params_value = false; - n_params = 1; + _mesa_TexEnvf(target, pname, (GLfloat) params[0]); break; - case GL_TEXTURE_ENV_COLOR: - n_params = 4; + 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); + } + + _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 diff --git a/src/mesa/main/texenv.c b/src/mesa/main/texenv.c index e5f1bd39ee7..c2044a8c2c0 100644 --- a/src/mesa/main/texenv.c +++ b/src/mesa/main/texenv.c @@ -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; } |