Welcome to mirror list, hosted at ThFree Co, Russian Federation.

git.blender.org/blender.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorClément Foucault <foucault.clem@gmail.com>2017-05-18 21:32:06 +0300
committerClément Foucault <foucault.clem@gmail.com>2017-05-18 21:32:36 +0300
commit13687e89d81518cad25a8e831bbcd20895dd6c60 (patch)
tree0d3be386129dbe47fdc61dbaace9dffe52209831 /source/blender/gpu/intern/gpu_viewport.c
parent781e22c2df7397c8e9681ce826be94cc767e6a51 (diff)
GPUViewport: Fix huge memory leak.
Diffstat (limited to 'source/blender/gpu/intern/gpu_viewport.c')
-rw-r--r--source/blender/gpu/intern/gpu_viewport.c23
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;