[Bf-blender-cvs] [022c1859125] temp-gpu-texture-partial-updates: Reduces the requirements of interface.

Jeroen Bakker noreply at git.blender.org
Wed Nov 17 15:29:45 CET 2021


Commit: 022c185912563ce4a4757c5c4aebb904ef095647
Author: Jeroen Bakker
Date:   Wed Nov 17 14:16:45 2021 +0100
Branches: temp-gpu-texture-partial-updates
https://developer.blender.org/rB022c185912563ce4a4757c5c4aebb904ef095647

Reduces the requirements of interface.

===================================================================

M	source/blender/blenkernel/BKE_image.h
M	source/blender/blenkernel/intern/image_gpu.c
M	source/blender/blenkernel/intern/image_partial_update.cc
M	source/blender/blenkernel/intern/image_partial_update_test.cc

===================================================================

diff --git a/source/blender/blenkernel/BKE_image.h b/source/blender/blenkernel/BKE_image.h
index e6ddeaae895..610865e699a 100644
--- a/source/blender/blenkernel/BKE_image.h
+++ b/source/blender/blenkernel/BKE_image.h
@@ -459,7 +459,7 @@ void BKE_image_partial_update_free(struct PartialUpdateUser *user);
  *              using #BKE_image_partial_update_get_next_change.
  */
 ePartialUpdateCollectResult BKE_image_partial_update_collect_changes(
-    struct Image *image, struct ImBuf *image_buffer, struct PartialUpdateUser *user);
+    struct Image *image, struct PartialUpdateUser *user);
 
 ePartialUpdateIterResult BKE_image_partial_update_get_next_change(
     struct PartialUpdateUser *user, struct PartialUpdateRegion *r_tile);
@@ -467,15 +467,13 @@ ePartialUpdateIterResult BKE_image_partial_update_get_next_change(
 /* --- partial updater (image side) --- */
 struct PartialUpdateRegister;
 
-struct PartialUpdateRegister *BKE_image_partial_update_register_ensure(struct Image *image,
-                                                                       struct ImBuf *image_buffer);
 void BKE_image_partial_update_register_free(struct Image *image);
 /** \brief Mark a region of the image to update. */
 void BKE_image_partial_update_mark_region(struct Image *image,
                                           struct ImBuf *image_buffer,
                                           rcti *updated_region);
 /** \brief Mark the whole image to be updated. */
-void BKE_image_partial_update_mark_full_update(struct Image *image, struct ImBuf *image_buffer);
+void BKE_image_partial_update_mark_full_update(struct Image *image);
 
 #ifdef __cplusplus
 }
diff --git a/source/blender/blenkernel/intern/image_gpu.c b/source/blender/blenkernel/intern/image_gpu.c
index daf59c8d13e..17ecc82809a 100644
--- a/source/blender/blenkernel/intern/image_gpu.c
+++ b/source/blender/blenkernel/intern/image_gpu.c
@@ -378,7 +378,7 @@ static GPUTexture *image_get_gpu_texture(Image *ima,
   /* TODO(jbakker): bad call. Or we should do this everywhere where image is changed, or we should
    * make it possible to initialize an empty register. */
   if ((ima->gpuflag & IMA_GPU_REFRESH) != 0) {
-    BKE_image_partial_update_mark_full_update(ima, ibuf_intern);
+    BKE_image_partial_update_mark_full_update(ima);
     ima->gpuflag &= ~IMA_GPU_REFRESH;
   }
 
@@ -386,8 +386,7 @@ static GPUTexture *image_get_gpu_texture(Image *ima,
     ima->runtime.partial_update_user = BKE_image_partial_update_create(ima);
   }
 
-  switch (BKE_image_partial_update_collect_changes(
-      ima, ibuf_intern, ima->runtime.partial_update_user)) {
+  switch (BKE_image_partial_update_collect_changes(ima, ima->runtime.partial_update_user)) {
     case PARTIAL_UPDATE_NEED_FULL_UPDATE: {
       image_free_gpu(ima, true);
       break;
@@ -941,7 +940,7 @@ void BKE_image_update_gputexture_delayed(
 {
   /* Check for full refresh. */
   if (ibuf && x == 0 && y == 0 && w == ibuf->x && h == ibuf->y) {
-    BKE_image_partial_update_mark_full_update(ima, ibuf);
+    BKE_image_partial_update_mark_full_update(ima);
   }
   else {
     rcti dirty_region;
diff --git a/source/blender/blenkernel/intern/image_partial_update.cc b/source/blender/blenkernel/intern/image_partial_update.cc
index 8921199319c..a2ee522e0f3 100644
--- a/source/blender/blenkernel/intern/image_partial_update.cc
+++ b/source/blender/blenkernel/intern/image_partial_update.cc
@@ -215,7 +215,7 @@ struct PartialUpdateRegisterImpl {
   int image_width;
   int image_height;
 
-  void set_resolution(ImBuf *image_buffer)
+  void update_resolution(ImBuf *image_buffer)
   {
     if (image_width != image_buffer->x || image_height != image_buffer->y) {
       image_width = image_buffer->x;
@@ -225,7 +225,10 @@ struct PartialUpdateRegisterImpl {
       int tile_y_len = image_height / TILE_SIZE;
       current_changeset.init_tiles(tile_x_len, tile_y_len);
 
-      mark_full_update();
+      /* Only perform a full update when the cache contains data. */
+      if (current_changeset.has_dirty_tiles() || !history.is_empty()) {
+        mark_full_update();
+      }
     }
   }
 
@@ -333,6 +336,16 @@ extern "C" {
 
 using namespace blender::bke::image::partial_update;
 
+static struct PartialUpdateRegister *image_partial_update_register_ensure(Image *image)
+{
+  if (image->runtime.partial_update_register == nullptr) {
+    PartialUpdateRegisterImpl *partial_update_register = OBJECT_GUARDED_NEW(
+        PartialUpdateRegisterImpl);
+    image->runtime.partial_update_register = wrap(partial_update_register);
+  }
+  return image->runtime.partial_update_register;
+}
+
 // TODO(jbakker): cleanup parameter.
 struct PartialUpdateUser *BKE_image_partial_update_create(struct Image *image)
 {
@@ -348,14 +361,12 @@ void BKE_image_partial_update_free(PartialUpdateUser *user)
 }
 
 ePartialUpdateCollectResult BKE_image_partial_update_collect_changes(Image *image,
-                                                                     ImBuf *image_buffer,
                                                                      PartialUpdateUser *user)
 {
   PartialUpdateUserImpl *user_impl = unwrap(user);
   user_impl->clear_updated_regions();
 
-  PartialUpdateRegisterImpl *partial_updater = unwrap(
-      BKE_image_partial_update_register_ensure(image, image_buffer));
+  PartialUpdateRegisterImpl *partial_updater = unwrap(image_partial_update_register_ensure(image));
   partial_updater->ensure_empty_changeset();
 
   if (!partial_updater->can_construct(user_impl->last_changeset_id)) {
@@ -407,18 +418,6 @@ ePartialUpdateIterResult BKE_image_partial_update_get_next_change(PartialUpdateU
 
 /* --- Image side --- */
 
-struct PartialUpdateRegister *BKE_image_partial_update_register_ensure(Image *image,
-                                                                       ImBuf *image_buffer)
-{
-  if (image->runtime.partial_update_register == nullptr) {
-    PartialUpdateRegisterImpl *partial_update_register = OBJECT_GUARDED_NEW(
-        PartialUpdateRegisterImpl);
-    partial_update_register->set_resolution(image_buffer);
-    image->runtime.partial_update_register = wrap(partial_update_register);
-  }
-  return image->runtime.partial_update_register;
-}
-
 void BKE_image_partial_update_register_free(Image *image)
 {
   PartialUpdateRegisterImpl *partial_update_register = unwrap(
@@ -431,16 +430,14 @@ void BKE_image_partial_update_register_free(Image *image)
 
 void BKE_image_partial_update_mark_region(Image *image, ImBuf *image_buffer, rcti *updated_region)
 {
-  PartialUpdateRegisterImpl *partial_updater = unwrap(
-      BKE_image_partial_update_register_ensure(image, image_buffer));
+  PartialUpdateRegisterImpl *partial_updater = unwrap(image_partial_update_register_ensure(image));
+  partial_updater->update_resolution(image_buffer);
   partial_updater->mark_region(updated_region);
 }
 
-void BKE_image_partial_update_mark_full_update(Image *image, ImBuf *image_buffer)
+void BKE_image_partial_update_mark_full_update(Image *image)
 {
-  PartialUpdateRegisterImpl *partial_updater = unwrap(
-      BKE_image_partial_update_register_ensure(image, image_buffer));
+  PartialUpdateRegisterImpl *partial_updater = unwrap(image_partial_update_register_ensure(image));
   partial_updater->mark_full_update();
-  partial_updater->set_resolution(image_buffer);
 }
 }
diff --git a/source/blender/blenkernel/intern/image_partial_update_test.cc b/source/blender/blenkernel/intern/image_partial_update_test.cc
index 2fd31706ef6..b4cc203ae99 100644
--- a/source/blender/blenkernel/intern/image_partial_update_test.cc
+++ b/source/blender/blenkernel/intern/image_partial_update_test.cc
@@ -89,19 +89,19 @@ TEST_F(ImagePartialUpdateTest, mark_full_update)
 {
   ePartialUpdateCollectResult result;
   /* First tile should always return a full update. */
-  result = BKE_image_partial_update_collect_changes(image, image_buffer, partial_update_user);
+  result = BKE_image_partial_update_collect_changes(image, partial_update_user);
   EXPECT_EQ(result, PARTIAL_UPDATE_NEED_FULL_UPDATE);
   /* Second invoke should now detect no changes. */
-  result = BKE_image_partial_update_collect_changes(image, image_buffer, partial_update_user);
+  result = BKE_image_partial_update_collect_changes(image, partial_update_user);
   EXPECT_EQ(result, PARTIAL_UPDATE_NO_CHANGES);
 
   /* Mark full update */
-  BKE_image_partial_update_mark_full_update(image, image_buffer);
+  BKE_image_partial_update_mark_full_update(image);
 
   /* Validate need full update followed by no changes. */
-  result = BKE_image_partial_update_collect_changes(image, image_buffer, partial_update_user);
+  result = BKE_image_partial_update_collect_changes(image, partial_update_user);
   EXPECT_EQ(result, PARTIAL_UPDATE_NEED_FULL_UPDATE);
-  result = BKE_image_partial_update_collect_changes(image, image_buffer, partial_update_user);
+  result = BKE_image_partial_update_collect_changes(image, partial_update_user);
   EXPECT_EQ(result, PARTIAL_UPDATE_NO_CHANGES);
 }
 
@@ -109,10 +109,10 @@ TEST_F(ImagePartialUpdateTest, mark_single_tile)
 {
   ePartialUpdateCollectResult result;
   /* First tile should always return a full update. */
-  result = BKE_image_partial_update_collect_changes(image, image_buffer, partial_update_user);
+  result = BKE_image_partial_update_collect_changes(image, partial_update_user);
   EXPECT_EQ(result, PARTIAL_UPDATE_NEED_FULL_UPDATE);
   /* Second invoke should now detect no changes. */
-  result = BKE_image_partial_update_collect_changes(image, image_buffer, partial_update_user);
+  result = BKE_image_partial_update_collect_changes(image, partial_update_user);
   EXPECT_EQ(result, PARTIAL_UPDATE_NO_CHANGES);
 
   /* Mark region. */
@@ -121,7 +121,7 @@ TEST_F(ImagePartialUpdateTest, mark_single_tile)
   BKE_image_partial_update_mark_region(image, image_buffer, &region);
 
   /* Partial Update should be available. */
-  result = BKE_image_partial_update_collect_changes(image, image_buffer, partial_update_user);
+  result = BKE_image_partial_update_collect_changes(image, partial_update_user);
   EXPECT_EQ(result, PARTIAL_UPDATE_CHANGES_AVAILABLE);
 
   /* Check tiles. */
@@ -133,7 +133,7 @@ TEST_F(ImagePartialUpdateTest, mark_single_tile)
   iter_r

@@ Diff output truncated at 10240 characters. @@



More information about the Bf-blender-cvs mailing list