gallium/util: Fix leak in the live shader cache

When the nir backend is used, the create_shader
call is supposed to release state->ir.nir.
When the cache hits, create_shader is not called,
thus state->ir.nir should be freed.

There is nothing to be done for the TGSI case as the
tokens release is done by the caller.

This fixes a leak noticed in:
https://gitlab.freedesktop.org/mesa/mesa/-/issues/2931

Fixes: 4bb919b0b8

Signed-off-by: Axel Davy <davyaxel0@gmail.com>
Reviewed-by: Marek Olšák <marek.olsak@amd.com>
Reviewed-by: Pierre-Eric Pelloux-Prayer <pierre-eric.pelloux-prayer@amd.com>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/4980>
(cherry picked from commit 47bfc799da)
This commit is contained in:
Axel Davy 2020-05-10 20:12:56 +02:00 committed by Dylan Baker
parent 787cecdb02
commit 50781aaa1b
2 changed files with 5 additions and 2 deletions

View file

@ -220,7 +220,7 @@
"description": "gallium/util: Fix leak in the live shader cache",
"nominated": true,
"nomination_type": 1,
"resolution": 0,
"resolution": 1,
"master_sha": null,
"because_sha": "4bb919b0b8b4ed6f6a7049c3f8d294b74b50e198"
},

View file

@ -125,8 +125,11 @@ util_live_shader_cache_get(struct pipe_context *ctx,
simple_mtx_unlock(&cache->lock);
/* Return if the shader already exists. */
if (shader)
if (shader) {
if (state->type == PIPE_SHADER_IR_NIR)
ralloc_free(state->ir.nir);
return shader;
}
/* The cache mutex is unlocked to allow multiple create_shader
* invocations to run simultaneously.