mesa: decrease the array size of ctx->Texture.FixedFuncUnit to 8
authorMarek Olšák <marek.olsak@amd.com>
Wed, 15 Nov 2017 21:10:43 +0000 (22:10 +0100)
committerMarek Olšák <marek.olsak@amd.com>
Tue, 13 Feb 2018 00:00:45 +0000 (01:00 +0100)
GL allows doing glTexEnv on 192 texture units, while in reality,
only MaxTextureCoordUnits units are used by fixed-func shaders.

There is a piglit patch that adjusts piglits/texunits to check only
MaxTextureCoordUnits units.

Reviewed-by: Brian Paul <brianp@vmware.com>
src/mesa/main/enable.c
src/mesa/main/mtypes.h
src/mesa/main/texenv.c
src/mesa/main/texstate.c
src/mesa/main/texstate.h

index 4c5f9dce5e4c740002627112dde5e0926a7b946d..f23673a6cdc23eeb4d5bf68a42b8434542c425b0 100644 (file)
@@ -209,6 +209,8 @@ enable_texture(struct gl_context *ctx, GLboolean state, GLbitfield texBit)
 {
    struct gl_fixedfunc_texture_unit *texUnit =
       _mesa_get_current_fixedfunc_tex_unit(ctx);
+   if (!texUnit)
+      return GL_FALSE;
 
    const GLbitfield newenabled = state
       ? (texUnit->Enabled | texBit) : (texUnit->Enabled & ~texBit);
@@ -1293,6 +1295,9 @@ is_texture_enabled(struct gl_context *ctx, GLbitfield bit)
    const struct gl_fixedfunc_texture_unit *const texUnit =
       _mesa_get_current_fixedfunc_tex_unit(ctx);
 
+   if (!texUnit)
+      return GL_FALSE;
+
    return (texUnit->Enabled & bit) ? GL_TRUE : GL_FALSE;
 }
 
index 562fb17c10fa99a97e0dc60a8bd050fa0400daa4..3a4fdb57c1c3d447fbce64fb8bfc6c4dceaacd10 100644 (file)
@@ -1370,7 +1370,7 @@ struct gl_texture_attrib
    GLint NumCurrentTexUsed;
 
    struct gl_texture_unit Unit[MAX_COMBINED_TEXTURE_IMAGE_UNITS];
-   struct gl_fixedfunc_texture_unit FixedFuncUnit[MAX_COMBINED_TEXTURE_IMAGE_UNITS];
+   struct gl_fixedfunc_texture_unit FixedFuncUnit[MAX_TEXTURE_COORD_UNITS];
 };
 
 
index 9018ce9bc4c83be5fb7633de2a5aa53f9fe84e56..22fc8da1cab49bffeecd8963164fda489ac61387 100644 (file)
@@ -400,6 +400,15 @@ _mesa_TexEnvfv( GLenum target, GLenum pname, const GLfloat *param )
       struct gl_fixedfunc_texture_unit *texUnit =
          _mesa_get_current_fixedfunc_tex_unit(ctx);
 
+      /* The GL spec says that we should report an error if the unit is greater
+       * than GL_MAX_COMBINED_TEXTURE_IMAGE_UNITS, but in practice, only
+       * fixed-function units are usable. This is probably a spec bug.
+       * Ignore glTexEnv(GL_TEXTURE_ENV) calls for non-fixed-func units,
+       * because we don't want to process calls that have no effect.
+       */
+      if (!texUnit)
+         return;
+
       switch (pname) {
       case GL_TEXTURE_ENV_MODE:
          set_env_mode(ctx, texUnit, (GLenum) iparam0);
@@ -649,6 +658,15 @@ _mesa_GetTexEnvfv( GLenum target, GLenum pname, GLfloat *params )
       struct gl_fixedfunc_texture_unit *texUnit =
          _mesa_get_current_fixedfunc_tex_unit(ctx);
 
+      /* The GL spec says that we should report an error if the unit is greater
+       * than GL_MAX_COMBINED_TEXTURE_IMAGE_UNITS, but in practice, only
+       * fixed-function units are usable. This is probably a spec bug.
+       * Ignore calls for non-fixed-func units, because we don't process
+       * glTexEnv for them either.
+       */
+      if (!texUnit)
+         return;
+
       if (pname == GL_TEXTURE_ENV_COLOR) {
          if(ctx->NewState & (_NEW_BUFFERS | _NEW_FRAG_CLAMP))
             _mesa_update_state(ctx);
@@ -717,6 +735,15 @@ _mesa_GetTexEnviv( GLenum target, GLenum pname, GLint *params )
       struct gl_fixedfunc_texture_unit *texUnit =
          _mesa_get_current_fixedfunc_tex_unit(ctx);
 
+      /* The GL spec says that we should report an error if the unit is greater
+       * than GL_MAX_COMBINED_TEXTURE_IMAGE_UNITS, but in practice, only
+       * fixed-function units are usable. This is probably a spec bug.
+       * Ignore calls for non-fixed-func units, because we don't process
+       * glTexEnv for them either.
+       */
+      if (!texUnit)
+         return;
+
       if (pname == GL_TEXTURE_ENV_COLOR) {
          params[0] = FLOAT_TO_INT( texUnit->EnvColor[0] );
          params[1] = FLOAT_TO_INT( texUnit->EnvColor[1] );
index 2b05630e6196b3ae07f5d0bfd67215302a8e74c4..f9f50a30054d4c160e8d47c13d03c6665e6415cd 100644 (file)
@@ -103,7 +103,7 @@ _mesa_copy_texture_state( const struct gl_context *src, struct gl_context *dst )
       }
    }
 
-   for (u = 0; u < src->Const.MaxCombinedTextureImageUnits; u++) {
+   for (u = 0; u < src->Const.MaxTextureCoordUnits; u++) {
       dst->Texture.FixedFuncUnit[u].Enabled = src->Texture.FixedFuncUnit[u].Enabled;
       dst->Texture.FixedFuncUnit[u].EnvMode = src->Texture.FixedFuncUnit[u].EnvMode;
       COPY_4V(dst->Texture.FixedFuncUnit[u].EnvColor, src->Texture.FixedFuncUnit[u].EnvColor);
index cf3f7e5a216feaddf4fd7a69b1cb471b71b0a555..c0b73b14e828ccbeb8d5bd765a46194c3faf5fdd 100644 (file)
@@ -65,6 +65,9 @@ _mesa_get_current_fixedfunc_tex_unit(struct gl_context *ctx)
 {
    unsigned unit = ctx->Texture.CurrentUnit;
 
+   if (unit >= ARRAY_SIZE(ctx->Texture.FixedFuncUnit))
+      return NULL;
+
    return &ctx->Texture.FixedFuncUnit[unit];
 }