On 08/17/2015 07:45 PM, Francisco Jerez wrote:
The ES31-CTS.shader_image_load_store.basic-api-bind conformance test
expects the whole image unit state to be reset when the bound texture
object is deleted.  The ARB_shader_image_load_store extension is
rather vague regarding what should happen with image unit state other
than the texture object in that case -- In any case it shouldn't make

FWIW this seems to be specified in the desktop GL (and ES 3.1) spec in section "Automatic Unbinding of Deleted Objects".

Reviewed-by: Tapani Pälli <tapani.pa...@intel.com>

any practical difference because one cannot sensibly use an image unit
not bound to any texture object without re-specifying its state, so
just make the test happy.
---
  src/mesa/main/shaderimage.c | 19 +++++++++++++------
  src/mesa/main/shaderimage.h |  6 ++++++
  src/mesa/main/texobj.c      |  5 ++++-
  3 files changed, 23 insertions(+), 7 deletions(-)

diff --git a/src/mesa/main/shaderimage.c b/src/mesa/main/shaderimage.c
index 2d86931..48e3e09 100644
--- a/src/mesa/main/shaderimage.c
+++ b/src/mesa/main/shaderimage.c
@@ -394,17 +394,24 @@ is_image_format_supported(const struct gl_context *ctx, 
GLenum format)
     }
  }

+struct gl_image_unit
+_mesa_default_image_unit(struct gl_context *ctx)
+{
+   const struct gl_image_unit u = {
+      .Access = GL_READ_ONLY,
+      .Format = GL_R8,
+      ._ActualFormat = _mesa_get_shader_image_format(GL_R8)
+   };
+   return u;
+}
+
  void
  _mesa_init_image_units(struct gl_context *ctx)
  {
     unsigned i;

-   for (i = 0; i < ARRAY_SIZE(ctx->ImageUnits); ++i) {
-      struct gl_image_unit *u = &ctx->ImageUnits[i];
-      u->Access = GL_READ_ONLY;
-      u->Format = GL_R8;
-      u->_ActualFormat = _mesa_get_shader_image_format(u->Format);
-   }
+   for (i = 0; i < ARRAY_SIZE(ctx->ImageUnits); ++i)
+      ctx->ImageUnits[i] = _mesa_default_image_unit(ctx);
  }

  static GLboolean
diff --git a/src/mesa/main/shaderimage.h b/src/mesa/main/shaderimage.h
index d08ece8..bbe088a 100644
--- a/src/mesa/main/shaderimage.h
+++ b/src/mesa/main/shaderimage.h
@@ -43,6 +43,12 @@ mesa_format
  _mesa_get_shader_image_format(GLenum format);

  /**
+ * Get a single image unit struct with the default state.
+ */
+struct gl_image_unit
+_mesa_default_image_unit(struct gl_context *ctx);
+
+/**
   * Initialize a context's shader image units to the default state.
   */
  void
diff --git a/src/mesa/main/texobj.c b/src/mesa/main/texobj.c
index cd7cfd6..395e4d3 100644
--- a/src/mesa/main/texobj.c
+++ b/src/mesa/main/texobj.c
@@ -37,6 +37,7 @@
  #include "hash.h"
  #include "imports.h"
  #include "macros.h"
+#include "shaderimage.h"
  #include "teximage.h"
  #include "texobj.h"
  #include "texstate.h"
@@ -1411,8 +1412,10 @@ unbind_texobj_from_image_units(struct gl_context *ctx,
     for (i = 0; i < ctx->Const.MaxImageUnits; i++) {
        struct gl_image_unit *unit = &ctx->ImageUnits[i];

-      if (texObj == unit->TexObj)
+      if (texObj == unit->TexObj) {
           _mesa_reference_texobj(&unit->TexObj, NULL);
+         *unit = _mesa_default_image_unit(ctx);
+      }
     }
  }


_______________________________________________
mesa-dev mailing list
mesa-dev@lists.freedesktop.org
http://lists.freedesktop.org/mailman/listinfo/mesa-dev

Reply via email to