[Mesa-dev] [PATCH 2/2] Correct clamping of TEXTURE_{MAX, BASE}_LEVEL

Brian Paul brianp at vmware.com
Wed Jul 31 06:40:19 PDT 2013


On 07/31/2013 05:19 AM, Corey Richardson wrote:
> Previously, if TEXTURE_IMMUTABLE_FORMAT was TRUE, the levels were allowed to
> be set like usual, but ARB_texture_storage states:
>
>> if TEXTURE_IMMUTABLE_FORMAT is TRUE, then level_base is clamped to the range
>> [0, <levels> - 1] and level_max is then clamped to the range [level_base,
>> <levels> - 1], where <levels> is the parameter passed the call to
>> TexStorage* for the texture object
>
> Signed-off-by: Corey Richardson <corey at octayn.net>
> ---
>   src/mesa/main/texparam.c | 28 ++++++++++++++++++++++++++--
>   1 file changed, 26 insertions(+), 2 deletions(-)
>
> diff --git a/src/mesa/main/texparam.c b/src/mesa/main/texparam.c
> index 141cbe3..f07d755 100644
> --- a/src/mesa/main/texparam.c
> +++ b/src/mesa/main/texparam.c
> @@ -386,7 +386,14 @@ set_tex_parameteri(struct gl_context *ctx,
>            return GL_FALSE;
>         }
>         incomplete(ctx, texObj);
> -      texObj->BaseLevel = params[0];
> +
> +      /** See note about ARB_texture_storage below */
> +      if (texObj->Immutable)
> +         texObj->BaseLevel = (params[0] >= texObj->ImmutableLevels) ?
> +            texObj->ImmutableLevels - 1 : params[0];

This would be more clear as:

texObj->BaseLevel = MIN2(texObj->ImmutableLevels - 1, params[0]);


> +      else
> +         texObj->BaseLevel = params[0];
> +
>         return GL_TRUE;
>
>      case GL_TEXTURE_MAX_LEVEL:
> @@ -399,7 +406,24 @@ set_tex_parameteri(struct gl_context *ctx,
>            return GL_FALSE;
>         }
>         incomplete(ctx, texObj);
> -      texObj->MaxLevel = params[0];
> +
> +      /** From ARB_texture_storage:
> +       * However, if TEXTURE_IMMUTABLE_FORMAT is TRUE, then level_base is
> +       * clamped to the range [0, <levels> - 1] and level_max is then clamped to
> +       * the range [level_base, <levels> - 1], where <levels> is the parameter
> +       * passed the call to TexStorage* for the texture object.
> +       */
> +      if (texObj->Immutable) {
> +         if (*params < texObj->BaseLevel)
> +            texObj->MaxLevel = texObj->BaseLevel;
> +         else if (*params >= texObj->ImmutableLevels)
> +            texObj->MaxLevel = texObj->ImmutableLevels - 1;
> +         else
> +            texObj->MaxLevel = params[0];

texObj->MaxLevel = CLAMP(params[0], texObj->BaseLevel, 
texObj->ImmutableLevels - 1);


> +      }
> +      else
> +         texObj->MaxLevel = params[0];
> +
>         return GL_TRUE;
>
>      case GL_GENERATE_MIPMAP_SGIS:
>

-Brian



More information about the mesa-dev mailing list