[Mesa-dev] [PATCH] mesa: fix maximum allowed proxy texture size condition

Brian Paul brian.e.paul at gmail.com
Mon Jan 30 17:15:37 PST 2012


On Mon, Jan 30, 2012 at 12:52 PM, Anuj Phogat <anuj.phogat at gmail.com> wrote:
> width, height parameter of glTexImage2D() includes: texture image
> width + 2 * border (if any). So when doing the texture size check
> in _mesa_test_proxy_teximage() width and height should not exceed
> maximum supported size for target texture type + 2 * border.
> i.e. 1 << (ctx->Const.MaxTextureLevels - 1) + 2 * border
>
> Texture border is anyway stripped out before it is given to intel
> hardware driver.
>
> This patch fixes Intel oglconform test case: max_values
> Bugzilla: https://bugs.freedesktop.org/show_bug.cgi?id=44970
>
> Note: This is a candidate for mesa 8.0 branch.
>
> Signed-off-by: Anuj Phogat <anuj.phogat at gmail.com>
> ---
>  Made the changes as per comments by Jose. This patch fixes the
>  segfault issue on intel h/w. I'll soon add a piglit testcase
>  which tests this patch.
>
>  src/mesa/main/teximage.c |   22 +++++++++++-----------
>  1 files changed, 11 insertions(+), 11 deletions(-)
>
> diff --git a/src/mesa/main/teximage.c b/src/mesa/main/teximage.c
> index d11425d..1b45d66 100644
> --- a/src/mesa/main/teximage.c
> +++ b/src/mesa/main/teximage.c
> @@ -1179,7 +1179,7 @@ _mesa_test_proxy_teximage(struct gl_context *ctx, GLenum target, GLint level,
>    switch (target) {
>    case GL_PROXY_TEXTURE_1D:
>       maxSize = 1 << (ctx->Const.MaxTextureLevels - 1);
> -      if (width < 2 * border || width > 2 + maxSize)
> +      if (width < 2 * border || width > 2 * border + maxSize)
>          return GL_FALSE;
>       if (level >= ctx->Const.MaxTextureLevels)
>          return GL_FALSE;
> @@ -1191,9 +1191,9 @@ _mesa_test_proxy_teximage(struct gl_context *ctx, GLenum target, GLint level,
>
>    case GL_PROXY_TEXTURE_2D:
>       maxSize = 1 << (ctx->Const.MaxTextureLevels - 1);
> -      if (width < 2 * border || width > 2 + maxSize)
> +      if (width < 2 * border || width > 2 * border + maxSize)
>          return GL_FALSE;
> -      if (height < 2 * border || height > 2 + maxSize)
> +      if (height < 2 * border || height > 2 * border + maxSize)
>          return GL_FALSE;
>       if (level >= ctx->Const.MaxTextureLevels)
>          return GL_FALSE;
> @@ -1207,11 +1207,11 @@ _mesa_test_proxy_teximage(struct gl_context *ctx, GLenum target, GLint level,
>
>    case GL_PROXY_TEXTURE_3D:
>       maxSize = 1 << (ctx->Const.Max3DTextureLevels - 1);
> -      if (width < 2 * border || width > 2 + maxSize)
> +      if (width < 2 * border || width > 2 * border + maxSize)
>          return GL_FALSE;
> -      if (height < 2 * border || height > 2 + maxSize)
> +      if (height < 2 * border || height > 2 * border + maxSize)
>          return GL_FALSE;
> -      if (depth < 2 * border || depth > 2 + maxSize)
> +      if (depth < 2 * border || depth > 2 * border + maxSize)
>          return GL_FALSE;
>       if (level >= ctx->Const.Max3DTextureLevels)
>          return GL_FALSE;
> @@ -1237,9 +1237,9 @@ _mesa_test_proxy_teximage(struct gl_context *ctx, GLenum target, GLint level,
>
>    case GL_PROXY_TEXTURE_CUBE_MAP_ARB:
>       maxSize = 1 << (ctx->Const.MaxCubeTextureLevels - 1);
> -      if (width < 2 * border || width > 2 + maxSize)
> +      if (width < 2 * border || width > 2 * border + maxSize)
>          return GL_FALSE;
> -      if (height < 2 * border || height > 2 + maxSize)
> +      if (height < 2 * border || height > 2 * border + maxSize)
>          return GL_FALSE;
>       if (level >= ctx->Const.MaxCubeTextureLevels)
>          return GL_FALSE;
> @@ -1253,7 +1253,7 @@ _mesa_test_proxy_teximage(struct gl_context *ctx, GLenum target, GLint level,
>
>    case GL_PROXY_TEXTURE_1D_ARRAY_EXT:
>       maxSize = 1 << (ctx->Const.MaxTextureLevels - 1);
> -      if (width < 2 * border || width > 2 + maxSize)
> +      if (width < 2 * border || width > 2 * border + maxSize)
>          return GL_FALSE;
>       if (height < 1 || height > ctx->Const.MaxArrayTextureLayers)
>          return GL_FALSE;
> @@ -1267,9 +1267,9 @@ _mesa_test_proxy_teximage(struct gl_context *ctx, GLenum target, GLint level,
>
>    case GL_PROXY_TEXTURE_2D_ARRAY_EXT:
>       maxSize = 1 << (ctx->Const.MaxTextureLevels - 1);
> -      if (width < 2 * border || width > 2 + maxSize)
> +      if (width < 2 * border || width > 2 * border + maxSize)
>          return GL_FALSE;
> -      if (height < 2 * border || height > 2 + maxSize)
> +      if (height < 2 * border || height > 2 * border + maxSize)
>          return GL_FALSE;
>       if (depth < 1 || depth > ctx->Const.MaxArrayTextureLayers)
>          return GL_FALSE;

Looks good to me.  You should probably wait for Jose to double-check though.

Reviewed-by: Brian Paul <brianp at vmware.com>


More information about the mesa-dev mailing list