From b0b3de2be750966343fca96b7123340f8656f056 Mon Sep 17 00:00:00 2001 From: Gert Wollny Date: Sat, 2 Feb 2019 13:17:16 +0100 Subject: [PATCH] mesa: release references to image textures when a context is destroyed MIME-Version: 1.0 Content-Type: text/plain; charset=utf8 Content-Transfer-Encoding: 8bit When a texture is still bound as an image and the context it was bound in is destroyed but not the texture, then the texture will still hold the resource and will not be freed when it is finally destroyed. Hence, release these references when the context is destroyed. This leak was triggered by virglrenderer: https://gitlab.freedesktop.org/virgl/virglrenderer/issues/86 Signed-off-by: Gert Wollny Reviewed-by: Marek Olšák --- src/mesa/main/context.c | 2 ++ src/mesa/main/shaderimage.c | 10 ++++++++++ src/mesa/main/shaderimage.h | 3 +++ 3 files changed, 15 insertions(+) diff --git a/src/mesa/main/context.c b/src/mesa/main/context.c index 492f01de957..e5a89d9c2fc 100644 --- a/src/mesa/main/context.c +++ b/src/mesa/main/context.c @@ -129,6 +129,7 @@ #include "util/disk_cache.h" #include "util/strtod.h" #include "stencil.h" +#include "shaderimage.h" #include "texcompress_s3tc.h" #include "texstate.h" #include "transformfeedback.h" @@ -1345,6 +1346,7 @@ _mesa_free_context_data( struct gl_context *ctx ) _mesa_free_buffer_objects(ctx); _mesa_free_eval_data( ctx ); _mesa_free_texture_data( ctx ); + _mesa_free_image_textures(ctx); _mesa_free_matrix_data( ctx ); _mesa_free_pipeline_data(ctx); _mesa_free_program_data(ctx); diff --git a/src/mesa/main/shaderimage.c b/src/mesa/main/shaderimage.c index 31ac852d37f..242a8c29909 100644 --- a/src/mesa/main/shaderimage.c +++ b/src/mesa/main/shaderimage.c @@ -469,6 +469,16 @@ _mesa_init_image_units(struct gl_context *ctx) ctx->ImageUnits[i] = _mesa_default_image_unit(ctx); } + +void +_mesa_free_image_textures(struct gl_context *ctx) +{ + unsigned i; + + for (i = 0; i < ARRAY_SIZE(ctx->ImageUnits); ++i) + _mesa_reference_texobj(&ctx->ImageUnits[i].TexObj, NULL); +} + GLboolean _mesa_is_image_unit_valid(struct gl_context *ctx, struct gl_image_unit *u) { diff --git a/src/mesa/main/shaderimage.h b/src/mesa/main/shaderimage.h index 6a9e3d67e92..daed27508a7 100644 --- a/src/mesa/main/shaderimage.h +++ b/src/mesa/main/shaderimage.h @@ -68,6 +68,9 @@ _mesa_default_image_unit(struct gl_context *ctx); void _mesa_init_image_units(struct gl_context *ctx); +void +_mesa_free_image_textures(struct gl_context *ctx); + /** * Return GL_TRUE if the state of the image unit passed as argument is valid * and access from the shader is allowed. Otherwise loads from this unit -- 2.30.2