[Bf-blender-cvs] [da855bfa2e5] temp-gpu-image-engine: Load tile buffers when performing a full update.

Jeroen Bakker noreply at git.blender.org
Fri Dec 3 10:15:09 CET 2021


Commit: da855bfa2e5785cbfa0eeb9672081a9dde7792dc
Author: Jeroen Bakker
Date:   Wed Dec 1 16:05:25 2021 +0100
Branches: temp-gpu-image-engine
https://developer.blender.org/rBda855bfa2e5785cbfa0eeb9672081a9dde7792dc

Load tile buffers when performing a full update.

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

M	source/blender/draw/engines/image/image_drawing_mode_screen_space.hh

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

diff --git a/source/blender/draw/engines/image/image_drawing_mode_screen_space.hh b/source/blender/draw/engines/image/image_drawing_mode_screen_space.hh
index e251b91fc10..8f6c11bbdde 100644
--- a/source/blender/draw/engines/image/image_drawing_mode_screen_space.hh
+++ b/source/blender/draw/engines/image/image_drawing_mode_screen_space.hh
@@ -115,15 +115,20 @@ struct ImageTileAccessor {
   {
   }
 
+  int get_tile_number()
+  {
+    return image_tile->tile_number;
+  }
+
   int get_tile_x_offset()
   {
-    int tile_number = image_tile->tile_number;
+    int tile_number = get_tile_number();
     return (tile_number - 1001) % 10;
   }
 
   int get_tile_y_offset()
   {
-    int tile_number = image_tile->tile_number;
+    int tile_number = get_tile_number();
     return (tile_number - 1001) / 10;
   }
 };
@@ -243,6 +248,12 @@ class ScreenSpaceDrawingMode : public AbstractDrawingMode {
     }
   }
 
+  /**
+   * \brief Update GPUTextures for drawing the image.
+   *
+   * GPUTextures that are marked dirty are rebuild. GPUTextures that aren't marked dirty are
+   * updated with changed region of the image.
+   */
   void update_textures(IMAGE_TextureList *txl,
                        IMAGE_PrivateData *pd,
                        Image *image,
@@ -262,7 +273,7 @@ class ScreenSpaceDrawingMode : public AbstractDrawingMode {
         do_partial_update(changes, txl, pd, image);
         break;
     }
-    do_full_update_for_dirty_textures(txl, pd);
+    do_full_update_for_dirty_textures(txl, pd, image_user);
   }
 
   void do_partial_update(PartialUpdateChecker<ImageTileData>::CollectResult &iterator,
@@ -381,7 +392,9 @@ class ScreenSpaceDrawingMode : public AbstractDrawingMode {
   {
   }
 
-  void do_full_update_for_dirty_textures(IMAGE_TextureList *txl, IMAGE_PrivateData *pd) const
+  void do_full_update_for_dirty_textures(IMAGE_TextureList *txl,
+                                         IMAGE_PrivateData *pd,
+                                         const ImageUser *image_user) const
   {
     for (int i = 0; i < SCREEN_SPACE_DRAWING_MODE_TEXTURE_LEN; i++) {
       IMAGE_ScreenSpaceTextureInfo *info = &pd->screen_space.texture_infos[i];
@@ -398,40 +411,40 @@ class ScreenSpaceDrawingMode : public AbstractDrawingMode {
 
       ImBuf tmp;
       IMB_initImBuf(&tmp, texture_width, texture_height, 0, IB_rectfloat);
+      ImageUser tile_user = *image_user;
 
       LISTBASE_FOREACH (ImageTile *, image_tile_ptr, &pd->image->tiles) {
         ImageTileAccessor image_tile(image_tile_ptr);
+        tile_user.tile = image_tile.get_tile_number();
+        ImBuf *tile_buffer = BKE_image_acquire_ibuf(pd->image, &tile_user, NULL);
 
-        ImBuf *image_buffer = pd->ibuf;
-        if (image_buffer == nullptr) {
-          /* TODO: remove break when tiles are supported. */
-          break;
+        if (tile_buffer == nullptr) {
+          /* Couldn't load the image buffer of the tile. So continue to the next change. */
+          continue;
         }
-        if (image_buffer->rect_float == nullptr) {
-          IMB_float_from_rect(image_buffer);
+        if (tile_buffer->rect_float == nullptr) {
+          IMB_float_from_rect(tile_buffer);
         }
         /* TODO(jbakker): add IMB_transform without cropping. */
         /* TODO(jbakker): add IMB_transform with repeat. */
         rctf crop;
-        BLI_rctf_init(&crop, 0.0, image_buffer->x, 0.0, image_buffer->y);
+        BLI_rctf_init(&crop, 0.0, tile_buffer->x, 0.0, tile_buffer->y);
         float uv_to_texel[4][4];
 
         /* 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
          * transformation.*/
         copy_m4_m4(uv_to_texel, info->uv_to_texture);
-        float scale[3] = {static_cast<float>(texture_width) / static_cast<float>(image_buffer->x),
-                          static_cast<float>(texture_height) / static_cast<float>(image_buffer->y),
+        float scale[3] = {static_cast<float>(texture_width) / static_cast<float>(tile_buffer->x),
+                          static_cast<float>(texture_height) / static_cast<float>(tile_buffer->y),
                           1.0f};
         rescale_m4(uv_to_texel, scale);
         uv_to_texel[3][0] *= texture_width;
         uv_to_texel[3][1] *= texture_height;
         invert_m4(uv_to_texel);
-        IMB_transform(image_buffer, &tmp, uv_to_texel, &crop, IMB_FILTER_NEAREST);
+        IMB_transform(tile_buffer, &tmp, uv_to_texel, &crop, IMB_FILTER_NEAREST);
 
-        /* TODO: render other tiles as well. But we should do that with a scale copy algo in stead
-         * of the pixel sampling we do currently. */
-        break;
+        BKE_image_release_ibuf(pd->image, tile_buffer, nullptr);
       }
 
       GPU_texture_update(gpu_texture, GPU_DATA_FLOAT, tmp.rect_float);



More information about the Bf-blender-cvs mailing list