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

Francisco Jerez currojerez at riseup.net
Mon Mar 19 18:26:56 UTC 2018


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

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