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:
authorJeroen Bakker <jeroen@blender.org>2022-02-02 16:16:09 +0300
committerJeroen Bakker <jeroen@blender.org>2022-02-02 16:20:18 +0300
commitfd35aa48d154283617ce6f33857b5783599d2d08 (patch)
treeca4057d6b351f40f47fa3532c34a9f49981496a0
parentbf8597febe2020e654020ad60e8af35c635c1a9a (diff)
Workaround for VSE memory leak.
This is a temp fix for a memory leak where the VSE isn't aware that a float representation of the image could exist. The VSE somehow doens't clears it (refcounter is still 1). The work around is just to let the image engine clean up all the data it created. Potential this would add more overhead when buffers are needed more than once.
-rw-r--r--source/blender/draw/engines/image/image_drawing_mode.hh21
1 files changed, 18 insertions, 3 deletions
diff --git a/source/blender/draw/engines/image/image_drawing_mode.hh b/source/blender/draw/engines/image/image_drawing_mode.hh
index 4cb0023ccb9..a355b42d66c 100644
--- a/source/blender/draw/engines/image/image_drawing_mode.hh
+++ b/source/blender/draw/engines/image/image_drawing_mode.hh
@@ -211,7 +211,7 @@ template<typename TextureMethod> class ScreenSpaceDrawingMode : public AbstractD
if (iterator.tile_data.tile_buffer == nullptr) {
continue;
}
- ensure_float_buffer(*iterator.tile_data.tile_buffer);
+ const bool float_buffer_created = ensure_float_buffer(*iterator.tile_data.tile_buffer);
const float tile_width = static_cast<float>(iterator.tile_data.tile_buffer->x);
const float tile_height = static_cast<float>(iterator.tile_data.tile_buffer->y);
@@ -314,6 +314,10 @@ template<typename TextureMethod> class ScreenSpaceDrawingMode : public AbstractD
0);
imb_freerectImbuf_all(&extracted_buffer);
}
+
+ if (float_buffer_created) {
+ imb_freerectfloatImBuf(iterator.tile_data.tile_buffer);
+ }
}
}
@@ -367,12 +371,19 @@ template<typename TextureMethod> class ScreenSpaceDrawingMode : public AbstractD
/**
* \brief Ensure that the float buffer of the given image buffer is available.
+ *
+ * Returns true when a float buffer was created. Somehow the VSE cache increases the ref
+ * counter, but might use a different mechanism for destructing the image, that doesn't free the
+ * rect_float as the refcounter isn't 0. To work around this we destruct any created local
+ * buffers ourself.
*/
- void ensure_float_buffer(ImBuf &image_buffer) const
+ bool ensure_float_buffer(ImBuf &image_buffer) const
{
if (image_buffer.rect_float == nullptr) {
IMB_float_from_rect(&image_buffer);
+ return true;
}
+ return false;
}
void do_full_update_texture_slot(const IMAGE_InstanceData &instance_data,
@@ -383,7 +394,7 @@ template<typename TextureMethod> class ScreenSpaceDrawingMode : public AbstractD
{
const int texture_width = texture_buffer.x;
const int texture_height = texture_buffer.y;
- ensure_float_buffer(tile_buffer);
+ const bool float_buffer_created = ensure_float_buffer(tile_buffer);
/* IMB_transform works in a non-consistent space. This should be documented or fixed!.
* Construct a variant of the info_uv_to_texture that adds the texel space
@@ -418,6 +429,10 @@ template<typename TextureMethod> class ScreenSpaceDrawingMode : public AbstractD
IMB_FILTER_NEAREST,
uv_to_texel,
crop_rect_ptr);
+
+ if (float_buffer_created) {
+ imb_freerectfloatImBuf(&tile_buffer);
+ }
}
public: