[Mesa-stable] [PATCH 1/4] Revert "mesa: simplify _mesa_is_image_unit_valid for buffers"

Nanley Chery nanleychery at gmail.com
Thu May 10 18:41:17 UTC 2018


On Mon, Mar 19, 2018 at 11:26:56AM -0700, Francisco Jerez wrote:
> This reverts commit c0ed52f6146c7e24e1275451773bd47c1eda3145.  It was
> preventing the image format validation from being done on buffer
> textures, which is required to ensure that the application doesn't
> attempt to create a buffer texture with an internal format
> incompatible with the image unit format (e.g. of different texel
> size), which is not allowed by the spec (it's not allowed for *any*
> texture target, whether or not there is spec wording restricting this
> behavior specifically for buffer textures) and will cause the driver
> to calculate texel bounds incorrectly and potentially crash instead of
> the expected behavior.
> 
> Cc: mesa-stable at lists.freedesktop.org

I created a bugzilla entry so that we can remember to write a test for
this: https://bugs.freedesktop.org/show_bug.cgi?id=106465

> ---
>  src/mesa/main/shaderimage.c | 25 ++++++++++++-------------
>  1 file changed, 12 insertions(+), 13 deletions(-)
> 

This patch is
Reviewed-by: Nanley Chery <nanley.g.chery at intel.com>

> diff --git a/src/mesa/main/shaderimage.c b/src/mesa/main/shaderimage.c
> index 596eadd4f85..054ab1d95e4 100644
> --- a/src/mesa/main/shaderimage.c
> +++ b/src/mesa/main/shaderimage.c
> @@ -479,13 +479,6 @@ _mesa_is_image_unit_valid(struct gl_context *ctx, struct gl_image_unit *u)
>     if (!t)
>        return GL_FALSE;
>  
> -   /* The GL 4.5 Core spec doesn't say anything about buffers. In practice,
> -    * the image buffer format is always compatible with the underlying
> -    * buffer storage.
> -    */
> -   if (t->Target == GL_TEXTURE_BUFFER)
> -      return GL_TRUE;
> -
>     if (!t->_BaseComplete && !t->_MipmapComplete)
>         _mesa_test_texobj_completeness(ctx, t);
>  
> @@ -499,14 +492,20 @@ _mesa_is_image_unit_valid(struct gl_context *ctx, struct gl_image_unit *u)
>         u->_Layer >= _mesa_get_texture_layers(t, u->Level))
>        return GL_FALSE;
>  
> -   struct gl_texture_image *img = (t->Target == GL_TEXTURE_CUBE_MAP ?
> -                                   t->Image[u->_Layer][u->Level] :
> -                                   t->Image[0][u->Level]);
> +   if (t->Target == GL_TEXTURE_BUFFER) {
> +      tex_format = _mesa_get_shader_image_format(t->BufferObjectFormat);
>  
> -   if (!img || img->Border || img->NumSamples > ctx->Const.MaxImageSamples)
> -      return GL_FALSE;
> +   } else {
> +      struct gl_texture_image *img = (t->Target == GL_TEXTURE_CUBE_MAP ?
> +                                      t->Image[u->_Layer][u->Level] :
> +                                      t->Image[0][u->Level]);
> +
> +      if (!img || img->Border || img->NumSamples > ctx->Const.MaxImageSamples)
> +         return GL_FALSE;
> +
> +      tex_format = _mesa_get_shader_image_format(img->InternalFormat);
> +   }
>  
> -   tex_format = _mesa_get_shader_image_format(img->InternalFormat);
>     if (!tex_format)
>        return GL_FALSE;
>  
> -- 
> 2.16.1
> 


More information about the mesa-stable mailing list