mesa/es: Validate glTexEnv parameters in Mesa code rather than the ES wrapper
authorIan Romanick <ian.d.romanick@intel.com>
Sat, 28 Jul 2012 00:22:42 +0000 (17:22 -0700)
committerIan Romanick <ian.d.romanick@intel.com>
Wed, 29 Aug 2012 22:09:35 +0000 (15:09 -0700)
Signed-off-by: Ian Romanick <ian.d.romanick@intel.com>
src/mesa/main/APIspec.xml
src/mesa/main/es1_conversion.c
src/mesa/main/texenv.c

index ff204fc35c5f3e3f218f438526f241bd7dff2554..c72dcb5018f78cfbe72262f453797e6e5e4c8106 100644 (file)
                        <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">
index 851dc726bc246377f2ad05405457f3ef236b5f7b..d79358944398f1d79235a32249ae4ae190566913 100644 (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;
-      }
-      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
index e5f1bd39ee74ddb56a5b22c192971643aeb95674..c2044a8c2c0ebac0111e602c3786faa9b9e5834f 100644 (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;
         }