[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