mesa: Unbind deleted textures from the shader image units.

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>
This commit is contained in:
Francisco Jerez 2013-11-22 19:54:47 -08:00
parent 902f9df36b
commit ace31f4bc0

View 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;