[Bf-blender-cvs] [d6e52462f91] temp-gpu-texture-partial-updates: Limit the tiles to the resolution of the tile buffer.

Jeroen Bakker noreply at git.blender.org
Fri Nov 19 15:23:18 CET 2021


Commit: d6e52462f910abb92993caf8e9ea671d97ba59e1
Author: Jeroen Bakker
Date:   Fri Nov 19 14:59:16 2021 +0100
Branches: temp-gpu-texture-partial-updates
https://developer.blender.org/rBd6e52462f910abb92993caf8e9ea671d97ba59e1

Limit the tiles to the resolution of the tile buffer.

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

M	source/blender/blenkernel/intern/image_gpu.c

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

diff --git a/source/blender/blenkernel/intern/image_gpu.c b/source/blender/blenkernel/intern/image_gpu.c
index 9e9e4121fda..eb6970b1c46 100644
--- a/source/blender/blenkernel/intern/image_gpu.c
+++ b/source/blender/blenkernel/intern/image_gpu.c
@@ -329,6 +329,44 @@ static void image_update_reusable_textures(Image *ima,
   }
 }
 
+static void image_gpu_texture_update_partial(Image *image, ImageUser *iuser)
+{
+  PartialUpdateRegion changed_region;
+  int last_tile_number = -1;
+  ImBuf *tile_buffer = NULL;
+  ImageTile *tile = NULL;
+  ImageUser tile_user = {0};
+  if (iuser) {
+    tile_user = *iuser;
+  }
+
+  while (BKE_image_partial_update_get_next_change(image->runtime.partial_update_user,
+                                                  &changed_region) ==
+         PARTIAL_UPDATE_ITER_CHANGE_AVAILABLE) {
+    if (last_tile_number != changed_region.tile_number) {
+      if (tile_buffer) {
+        BKE_image_release_ibuf(image, tile_buffer, NULL);
+        tile_buffer = NULL;
+      }
+      tile_user.tile = changed_region.tile_number;
+      tile = BKE_image_get_tile(image, changed_region.tile_number);
+      tile_buffer = BKE_image_acquire_ibuf(image, &tile_user, NULL);
+      last_tile_number = changed_region.tile_number;
+    }
+
+    const int tile_offset_x = changed_region.region.xmin;
+    const int tile_offset_y = changed_region.region.ymin;
+    const int tile_width = min_ii(tile_buffer->x, BLI_rcti_size_x(&changed_region.region));
+    const int tile_height = min_ii(tile_buffer->y, BLI_rcti_size_y(&changed_region.region));
+    image_update_gputexture_ex(
+        image, tile, tile_buffer, tile_offset_x, tile_offset_y, tile_width, tile_height);
+  }
+
+  if (tile_buffer) {
+    BKE_image_release_ibuf(image, tile_buffer, NULL);
+  }
+}
+
 static GPUTexture *image_get_gpu_texture(Image *ima,
                                          ImageUser *iuser,
                                          ImBuf *ibuf,
@@ -393,20 +431,7 @@ static GPUTexture *image_get_gpu_texture(Image *ima,
     }
 
     case PARTIAL_UPDATE_CHANGES_AVAILABLE: {
-      BLI_assert(ibuf_intern);
-      BLI_assert(tile);
-      PartialUpdateRegion changed_region;
-      while (BKE_image_partial_update_get_next_change(ima->runtime.partial_update_user,
-                                                      &changed_region) ==
-             PARTIAL_UPDATE_ITER_CHANGE_AVAILABLE) {
-        const int tile_offset_x = changed_region.region.xmin;
-        const int tile_offset_y = changed_region.region.ymin;
-        const int tile_width = BLI_rcti_size_x(&changed_region.region);
-        const int tile_height = BLI_rcti_size_y(&changed_region.region);
-        // TODO(jbakker): rect may not exceed image resolution.
-        image_update_gputexture_ex(
-            ima, tile, ibuf_intern, tile_offset_x, tile_offset_y, tile_width, tile_height);
-      }
+      image_gpu_texture_update_partial(ima, iuser);
       break;
     }



More information about the Bf-blender-cvs mailing list