[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, ®ion);
/* 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