diff options
author | Francisco Jerez <[email protected]> | 2013-11-22 19:54:47 -0800 |
---|---|---|
committer | Francisco Jerez <[email protected]> | 2014-01-15 16:42:08 +0100 |
commit | ace31f4bc05ad35ef42626ecd667a4bbbe044ddc (patch) | |
tree | 1aa0596491391d596ccb67dd0dd554e5f35eae89 | |
parent | 902f9df36bec7d67a2d8bc4c24d89d9d57964903 (diff) |
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 <[email protected]>
Reviewed-by: Paul Berry <[email protected]>
-rw-r--r-- | src/mesa/main/texobj.c | 25 |
1 files changed, 25 insertions, 0 deletions
diff --git a/src/mesa/main/texobj.c b/src/mesa/main/texobj.c index 319dd1d5165..3c64c43764d 100644 --- a/src/mesa/main/texobj.c +++ b/src/mesa/main/texobj.c @@ -1100,6 +1100,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. * * \param n number of textures to be deleted. @@ -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; |