[Bf-blender-cvs] [318e1764b70] temp-image-engine-float-cache: Free when images aren't used.
Jeroen Bakker
noreply at git.blender.org
Tue Mar 22 12:45:56 CET 2022
Commit: 318e1764b70665d19d129aff85c66691e13a4640
Author: Jeroen Bakker
Date: Tue Mar 22 12:43:41 2022 +0100
Branches: temp-image-engine-float-cache
https://developer.blender.org/rB318e1764b70665d19d129aff85c66691e13a4640
Free when images aren't used.
===================================================================
M source/blender/draw/engines/image/image_buffer_cache.cc
M source/blender/draw/engines/image/image_buffer_cache.hh
M source/blender/draw/engines/image/image_drawing_mode.hh
===================================================================
diff --git a/source/blender/draw/engines/image/image_buffer_cache.cc b/source/blender/draw/engines/image/image_buffer_cache.cc
index bd6363b9fd2..dd3c32f6cbf 100644
--- a/source/blender/draw/engines/image/image_buffer_cache.cc
+++ b/source/blender/draw/engines/image/image_buffer_cache.cc
@@ -7,28 +7,29 @@
#include "BLI_vector.hh"
-#include "IMB_imbuf.h"
-#include "IMB_imbuf_types.h"
#include "PIL_time.h"
#include "image_buffer_cache.hh"
struct FloatImageBuffer {
+ /* Non owning pointer to the source image buffer. Only use to check pointers. The instance might
+ * already be freed.*/
ImBuf *source_buffer = nullptr;
ImBuf *float_buffer = nullptr;
- double last_used_time =0.0;
+ double last_used_time = 0.0;
FloatImageBuffer(ImBuf *source_buffer, ImBuf *float_buffer)
- : source_buffer(source_buffer), float_buffer(float_buffer), last_used_time(PIL_check_seconds_timer())
+ : source_buffer(source_buffer),
+ float_buffer(float_buffer),
+ last_used_time(PIL_check_seconds_timer())
{
-
}
FloatImageBuffer(FloatImageBuffer &&other) noexcept
{
source_buffer = other.source_buffer;
float_buffer = other.float_buffer;
- last_used_time = other.last_used_time;
+ last_used_time = other.last_used_time;
other.source_buffer = nullptr;
other.float_buffer = nullptr;
}
@@ -44,15 +45,16 @@ struct FloatImageBuffer {
{
this->source_buffer = other.source_buffer;
this->float_buffer = other.float_buffer;
- last_used_time = other.last_used_time;
+ last_used_time = other.last_used_time;
other.source_buffer = nullptr;
other.float_buffer = nullptr;
return *this;
}
-
- void mark_used() {
- last_used_time = PIL_check_seconds_timer();
- }
+
+ void mark_used()
+ {
+ last_used_time = PIL_check_seconds_timer();
+ }
};
struct FloatBufferCache {
@@ -70,7 +72,7 @@ struct FloatBufferCache {
/* Do we have a cached float buffer. */
for (FloatImageBuffer &item : cache_) {
if (item.source_buffer == image_buffer) {
- item.last_used_time = PIL_check_seconds_timer();
+ item.mark_used();
return item.float_buffer;
}
}
@@ -93,32 +95,30 @@ struct FloatBufferCache {
{
for (FloatImageBuffer &item : cache_) {
if (item.source_buffer == image_buffer) {
- item.mark_used();
+ item.mark_used();
return;
}
}
}
- /**
- * Free unused buffers.
- *
- * Buffer are freed when:
- * - Usage is more than a minute in the future (in case user/time service has reset time).
- * - Usage is more than a minute in the past.
- *
- */
+ /**
+ * Free unused buffers.
+ *
+ * Buffer are freed when:
+ * - Usage is more than a minute in the future (in case user/time service has reset time).
+ * - Usage is more than a minute in the past.
+ *
+ */
void free_unused_buffers()
{
- const double minute_in_seconds = 60.0;
- const double current_time = PIL_check_seconds_timer();
-
+ const double minute_in_seconds = 60.0;
+ const double current_time = PIL_check_seconds_timer();
+
for (int64_t i = cache_.size() - 1; i >= 0; i--) {
- const FloatImageBuffer &item = cache_[i];
- bool remove = false;
- remove |= item.last_used_time - current_time < minute_in_seconds;
- remove |= current_time - item.last_used_time < minute_in_seconds;
- if (remove) {
-
+ const FloatImageBuffer &item = cache_[i];
+ const double delta_time = item.last_used_time - current_time;
+ const bool remove = fabs(delta_time) > minute_in_seconds;
+ if (remove) {
cache_.remove_and_reorder(i);
}
}
@@ -132,23 +132,24 @@ struct FloatBufferCache {
static struct {
FloatBufferCache float_buffers;
-} e_data; /* Engine data */
+} g_data; /* Engine data */
-ImBuf* IMAGE_buffer_cache_float_get(ImBuf *image_buffer)
+ImBuf *IMAGE_buffer_cache_float_ensure(ImBuf *image_buffer)
{
- return e_data.float_buffers.ensure_float_buffer(image_buffer);
+ return g_data.float_buffers.ensure_float_buffer(image_buffer);
}
-void IMAGE_buffer_cache_mark_used(ImBuf *image_buffer){
- e_data.float_buffers.mark_used(image_buffer);
+void IMAGE_buffer_cache_mark_used(ImBuf *image_buffer)
+{
+ g_data.float_buffers.mark_used(image_buffer);
}
void IMAGE_buffer_cache_free_unused()
{
- e_data.float_buffers.free_unused_buffers();
+ g_data.float_buffers.free_unused_buffers();
}
-void IMAGE_buffer_cache_free() {
- e_data.float_buffers.free();
-
+void IMAGE_buffer_cache_free()
+{
+ g_data.float_buffers.free();
}
diff --git a/source/blender/draw/engines/image/image_buffer_cache.hh b/source/blender/draw/engines/image/image_buffer_cache.hh
index 6c4c8af98b2..d8b6c163ff5 100644
--- a/source/blender/draw/engines/image/image_buffer_cache.hh
+++ b/source/blender/draw/engines/image/image_buffer_cache.hh
@@ -10,8 +10,22 @@
#include "IMB_imbuf.h"
#include "IMB_imbuf_types.h"
-ImBuf* IMAGE_buffer_cache_float_get(ImBuf *image_buffer);
+/**
+ * Returns a float buffer of the given image buffer.
+ * This could be the given image buffer when it already has a float buffer.
+ * or a copy of the given image buffer where only the float buffer is available.
+ */
+ImBuf *IMAGE_buffer_cache_float_ensure(ImBuf *image_buffer);
+
+/**
+ * Mark an image and its cached float buffer to be still in use.
+ */
void IMAGE_buffer_cache_mark_used(ImBuf *image_buffer);
+
+/**
+ * Free cached float buffers that aren't used anymore.
+ */
void IMAGE_buffer_cache_free_unused();
+
/** Free all buffers (when exiting blender). */
void IMAGE_buffer_cache_free();
diff --git a/source/blender/draw/engines/image/image_drawing_mode.hh b/source/blender/draw/engines/image/image_drawing_mode.hh
index 4eaa60477ce..ad0d5cd16ca 100644
--- a/source/blender/draw/engines/image/image_drawing_mode.hh
+++ b/source/blender/draw/engines/image/image_drawing_mode.hh
@@ -237,7 +237,7 @@ template<typename TextureMethod> class ScreenSpaceDrawingMode : public AbstractD
if (iterator.tile_data.tile_buffer == nullptr) {
continue;
}
- ImBuf *tile_buffer = ensure_float_buffer(instance_data, iterator.tile_data.tile_buffer);
+ ImBuf *tile_buffer = IMAGE_buffer_cache_float_ensure(iterator.tile_data.tile_buffer);
if (tile_buffer != iterator.tile_data.tile_buffer) {
do_partial_update_float_buffer(tile_buffer, iterator);
}
@@ -396,19 +396,6 @@ template<typename TextureMethod> class ScreenSpaceDrawingMode : public AbstractD
imb_freerectImbuf_all(&texture_buffer);
}
- /**
- * \brief Ensure that the float buffer of the given image buffer is available.
- *
- * Returns true when a float buffer was created. Somehow the sequencer cache increases the ref
- * counter, but might use a different mechanism for destructing the image, that doesn't free the
- * rect_float as the reference-counter isn't 0. To work around this we destruct any created local
- * buffers ourself.
- */
- ImBuf *ensure_float_buffer(IMAGE_InstanceData &instance_data, ImBuf *image_buffer) const
- {
- return IMAGE_buffer_cache_float_get( image_buffer);
- }
-
void do_full_update_texture_slot(IMAGE_InstanceData &instance_data,
const TextureInfo &texture_info,
ImBuf &texture_buffer,
@@ -417,7 +404,7 @@ template<typename TextureMethod> class ScreenSpaceDrawingMode : public AbstractD
{
const int texture_width = texture_buffer.x;
const int texture_height = texture_buffer.y;
- ImBuf *float_tile_buffer = ensure_float_buffer(instance_data, &tile_buffer);
+ ImBuf *float_tile_buffer = IMAGE_buffer_cache_float_ensure(&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
@@ -494,9 +481,9 @@ template<typename TextureMethod> class ScreenSpaceDrawingMode : public AbstractD
add_shgroups(instance_data);
}
- void draw_finish(IMAGE_Data *vedata) const override
+ void draw_finish(IMAGE_Data *UNUSED(vedata)) const override
{
- IMAGE_buffer_cache_free_unused();
+ IMAGE_buffer_cache_free_unused();
}
void draw_scene(IMAGE_Data *vedata) const override
More information about the Bf-blender-cvs
mailing list