diff options
author | Clément Foucault <foucault.clem@gmail.com> | 2017-05-18 21:32:06 +0300 |
---|---|---|
committer | Clément Foucault <foucault.clem@gmail.com> | 2017-05-18 21:32:36 +0300 |
commit | 13687e89d81518cad25a8e831bbcd20895dd6c60 (patch) | |
tree | 0d3be386129dbe47fdc61dbaace9dffe52209831 /source/blender/gpu | |
parent | 781e22c2df7397c8e9681ce826be94cc767e6a51 (diff) |
GPUViewport: Fix huge memory leak.
Diffstat (limited to 'source/blender/gpu')
-rw-r--r-- | source/blender/gpu/intern/gpu_viewport.c | 23 |
1 files changed, 23 insertions, 0 deletions
diff --git a/source/blender/gpu/intern/gpu_viewport.c b/source/blender/gpu/intern/gpu_viewport.c index a965d4ef135..49c8d37f6f1 100644 --- a/source/blender/gpu/intern/gpu_viewport.c +++ b/source/blender/gpu/intern/gpu_viewport.c @@ -246,6 +246,27 @@ GPUTexture *GPU_viewport_texture_pool_query(GPUViewport *viewport, void *engine, return tex; } +static void gpu_viewport_texture_pool_clear_users(GPUViewport *viewport) +{ + ViewportTempTexture *tmp_tex_next; + + for (ViewportTempTexture *tmp_tex = viewport->tex_pool.first; tmp_tex; tmp_tex = tmp_tex_next) { + tmp_tex_next = tmp_tex->next; + bool no_user = true; + for (int i = 0; i < MAX_ENGINE_BUFFER_SHARING; ++i) { + if (tmp_tex->user[i] != NULL) { + tmp_tex->user[i] = NULL; + no_user = false; + } + } + + if (no_user) { + GPU_texture_free(tmp_tex->texture); + BLI_freelinkN(&viewport->tex_pool, tmp_tex); + } + } +} + static void gpu_viewport_texture_pool_free(GPUViewport *viewport) { for (ViewportTempTexture *tmp_tex = viewport->tex_pool.first; tmp_tex; tmp_tex = tmp_tex->next) { @@ -306,6 +327,8 @@ void GPU_viewport_bind(GPUViewport *viewport, const rcti *rect) } } + gpu_viewport_texture_pool_clear_users(viewport); + if (!dfbl->default_fb) { bool ok = true; viewport->size[0] = rect_w; |