From f0cfc1bbdcf2e1c7060275b8baec8f797c4b4da2 Mon Sep 17 00:00:00 2001 From: Patrick Lerda Date: Tue, 6 Feb 2024 01:28:47 +0100 Subject: [PATCH] i915: fix draw_create_fragment_shader() related memory leak For instance, this issue is triggered with "piglit/bin/fcc-blit-between-clears -auto -fbo": Direct leak of 16400 byte(s) in 5 object(s) allocated from: #0 0xb720689a in __interceptor_calloc (/usr/lib/libasan.so.6+0xb289a) #1 0xaf10f896 in draw_create_fragment_shader ../src/gallium/auxiliary/draw/draw_fs.c:47 #2 0xaef64619 in i915_create_fs_state ../src/gallium/drivers/i915/i915_state.c:550 #3 0xae16a955 in ureg_create_shader ../src/gallium/auxiliary/tgsi/tgsi_ureg.c:2194 #4 0xae17f45f in ureg_create_shader_with_so_and_destroy ../src/gallium/auxiliary/tgsi/tgsi_ureg.h:150 #5 0xae17f45f in ureg_create_shader_and_destroy ../src/gallium/auxiliary/tgsi/tgsi_ureg.h:159 #6 0xae17f45f in util_make_fs_blit_zs ../src/gallium/auxiliary/util/u_simple_shaders.c:365 #7 0xaf13300e in blitter_get_fs_texfetch_depth ../src/gallium/auxiliary/util/u_blitter.c:1157 #8 0xaf13300e in util_blitter_cache_all_shaders ../src/gallium/auxiliary/util/u_blitter.c:1322 #9 0xaef6b738 in i915_create_context ../src/gallium/drivers/i915/i915_context.c:233 #10 0xacb33c49 in st_api_create_context ../src/mesa/state_tracker/st_manager.c:986 #11 0xac845740 in dri_create_context ../src/gallium/frontends/dri/dri_context.c:178 #12 0xac854d97 in driCreateContextAttribs ../src/gallium/frontends/dri/dri_util.c:631 #13 0xb6ce79a3 in dri2_create_context_attribs ../src/glx/dri2_glx.c:240 #14 0xb6c9606f in dri_common_create_context ../src/glx/dri_common.c:665 #15 0xb6ca4f00 in CreateContext ../src/glx/glxcmds.c:322 #16 0xb6ca5c0b in glXCreateNewContext ../src/glx/glxcmds.c:1449 Fixes: 1a69b50b3b44 ("i915g: Fix point sprites.") Signed-off-by: Patrick Lerda Reviewed-by: Emma Anholt Part-of: --- src/gallium/drivers/i915/i915_state.c | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/src/gallium/drivers/i915/i915_state.c b/src/gallium/drivers/i915/i915_state.c index 2aa30784688..c2628d39bae 100644 --- a/src/gallium/drivers/i915/i915_state.c +++ b/src/gallium/drivers/i915/i915_state.c @@ -640,6 +640,7 @@ i915_bind_fs_state(struct pipe_context *pipe, void *shader) static void i915_delete_fs_state(struct pipe_context *pipe, void *shader) { + struct i915_context *i915 = i915_context(pipe); struct i915_fragment_shader *ifs = (struct i915_fragment_shader *)shader; ralloc_free(ifs->error); @@ -648,6 +649,13 @@ i915_delete_fs_state(struct pipe_context *pipe, void *shader) FREE((struct tgsi_token *)ifs->state.tokens); ifs->state.tokens = NULL; + if (ifs->draw_data) { + if (likely(i915)) + draw_delete_fragment_shader(i915->draw, ifs->draw_data); + else + draw_delete_fragment_shader(NULL, ifs->draw_data); + } + ifs->program_len = 0; FREE(ifs);