From: Francisco Jerez Date: Sat, 23 Nov 2013 03:54:47 +0000 (-0800) Subject: mesa: Unbind deleted textures from the shader image units. X-Git-Url: https://git.libre-soc.org/?a=commitdiff_plain;h=ace31f4bc05ad35ef42626ecd667a4bbbe044ddc;p=mesa.git 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 identifying the image unit and set to zero. Reviewed-by: Chris Forbes Reviewed-by: Paul Berry --- 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 @@ -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;