mesa: Unbind deleted textures from the shader image units.
authorFrancisco Jerez <currojerez@riseup.net>
Sat, 23 Nov 2013 03:54:47 +0000 (19:54 -0800)
committerFrancisco Jerez <currojerez@riseup.net>
Wed, 15 Jan 2014 15:42:08 +0000 (16:42 +0100)
From ARB_shader_image_load_store:

   If a texture object bound to one or more image units is deleted by
   DeleteTextures, it is detached from each such image unit, as though
   BindImageTexture were called with <unit> identifying the image unit
   and <texture> set to zero.

Reviewed-by: Chris Forbes <chrisf@ijw.co.nz>
Reviewed-by: Paul Berry <stereotype441@gmail.com>
src/mesa/main/texobj.c

index 319dd1d5165613ba86f6d494a83d5b28df55b4a6..3c64c43764d1c60c7577979ca367f2f9a3b95a6b 100644 (file)
@@ -1099,6 +1099,25 @@ unbind_texobj_from_texunits(struct gl_context *ctx,
 }
 
 
+/**
+ * Check if the given texture object is bound to any shader image unit
+ * and unbind it if that's the case.
+ */
+static void
+unbind_texobj_from_imgunits(struct gl_context *ctx,
+                            struct gl_texture_object *texObj)
+{
+   int i;
+
+   for (i = 0; i < ctx->Const.MaxImageUnits; i++) {
+      struct gl_image_unit *unit = &ctx->ImageUnits[i];
+
+      if (texObj == unit->TexObj)
+         _mesa_reference_texobj(&unit->TexObj, NULL);
+   }
+}
+
+
 /**
  * Delete named textures.
  *
@@ -1146,6 +1165,12 @@ _mesa_DeleteTextures( GLsizei n, const GLuint *textures)
              */
             unbind_texobj_from_texunits(ctx, delObj);
 
+            /* Check if this texture is currently bound to any shader
+             * image unit.  If so, unbind it.
+             * See section 3.9.X of GL_ARB_shader_image_load_store.
+             */
+            unbind_texobj_from_imgunits(ctx, delObj);
+
             _mesa_unlock_texture(ctx, delObj);
 
             ctx->NewState |= _NEW_TEXTURE;