[Bf-blender-cvs] [9726498525e] temp-gpu-texture-partial-updates: Add struct between tiles and images.
Jeroen Bakker
noreply at git.blender.org
Wed Nov 17 15:29:45 CET 2021
Commit: 9726498525e0d0588473d8d4f71c3f23eca66527
Author: Jeroen Bakker
Date: Wed Nov 17 14:58:41 2021 +0100
Branches: temp-gpu-texture-partial-updates
https://developer.blender.org/rB9726498525e0d0588473d8d4f71c3f23eca66527
Add struct between tiles and images.
===================================================================
M source/blender/blenkernel/intern/image_partial_update.cc
===================================================================
diff --git a/source/blender/blenkernel/intern/image_partial_update.cc b/source/blender/blenkernel/intern/image_partial_update.cc
index 9aabc5d802f..1502a18bd61 100644
--- a/source/blender/blenkernel/intern/image_partial_update.cc
+++ b/source/blender/blenkernel/intern/image_partial_update.cc
@@ -123,7 +123,8 @@ struct PartialUpdateUserImpl {
* Internally dirty tiles are grouped together in change sets to make sure that the correct
* answer can be built for different users reducing the amount of merges.
*/
-struct Changeset {
+// TODO(jbakker): TileChangeset is per UDIM tile. There should be an
+struct TileChangeset {
private:
/** \brief Dirty flag for each tile. */
std::vector<bool> tile_dirty_flags_;
@@ -176,7 +177,7 @@ struct Changeset {
}
/** \brief Merge the given changeset into the receiver. */
- void merge(const Changeset &other)
+ void merge(const TileChangeset &other)
{
BLI_assert(tile_x_len_ == other.tile_x_len_);
BLI_assert(tile_y_len_ == other.tile_y_len_);
@@ -197,6 +198,10 @@ struct Changeset {
}
};
+struct Changeset {
+ TileChangeset tile_changeset;
+};
+
/**
* \brief Partial update changes stored inside the image runtime.
*
@@ -228,10 +233,10 @@ struct PartialUpdateRegisterImpl {
int tile_x_len = image_width / TILE_SIZE;
int tile_y_len = image_height / TILE_SIZE;
- current_changeset.init_tiles(tile_x_len, tile_y_len);
+ current_changeset.tile_changeset.init_tiles(tile_x_len, tile_y_len);
/* Only perform a full update when the cache contains data. */
- if (current_changeset.has_dirty_tiles() || !history.is_empty()) {
+ if (current_changeset.tile_changeset.has_dirty_tiles() || !history.is_empty()) {
mark_full_update();
}
}
@@ -241,7 +246,7 @@ struct PartialUpdateRegisterImpl {
{
history.clear();
last_changeset_id++;
- current_changeset.reset();
+ current_changeset.tile_changeset.reset();
first_changeset_id = last_changeset_id;
}
@@ -269,14 +274,14 @@ struct PartialUpdateRegisterImpl {
/* Clamp tiles to tiles in image. */
start_x_tile = max_ii(0, start_x_tile);
start_y_tile = max_ii(0, start_y_tile);
- end_x_tile = min_ii(current_changeset.tile_x_len_ - 1, end_x_tile);
- end_y_tile = min_ii(current_changeset.tile_y_len_ - 1, end_y_tile);
+ end_x_tile = min_ii(current_changeset.tile_changeset.tile_x_len_ - 1, end_x_tile);
+ end_y_tile = min_ii(current_changeset.tile_changeset.tile_y_len_ - 1, end_y_tile);
/* Early exit when no tiles need to be updated. */
- if (start_x_tile >= current_changeset.tile_x_len_) {
+ if (start_x_tile >= current_changeset.tile_changeset.tile_x_len_) {
return;
}
- if (start_y_tile >= current_changeset.tile_y_len_) {
+ if (start_y_tile >= current_changeset.tile_changeset.tile_y_len_) {
return;
}
if (end_x_tile < 0) {
@@ -286,12 +291,13 @@ struct PartialUpdateRegisterImpl {
return;
}
- current_changeset.mark_tiles_dirty(start_x_tile, start_y_tile, end_x_tile, end_y_tile);
+ current_changeset.tile_changeset.mark_tiles_dirty(
+ start_x_tile, start_y_tile, end_x_tile, end_y_tile);
}
void ensure_empty_changeset()
{
- if (!current_changeset.has_dirty_tiles()) {
+ if (!current_changeset.tile_changeset.has_dirty_tiles()) {
/* No need to create a new changeset when previous changeset does not contain any dirty
* tiles. */
return;
@@ -303,7 +309,7 @@ struct PartialUpdateRegisterImpl {
void commit_current_changeset()
{
history.append_as(std::move(current_changeset));
- current_changeset.reset();
+ current_changeset.tile_changeset.reset();
last_changeset_id++;
}
@@ -326,10 +332,10 @@ struct PartialUpdateRegisterImpl {
std::unique_ptr<Changeset> changed_tiles = std::make_unique<Changeset>();
int tile_x_len = image_width / TILE_SIZE;
int tile_y_len = image_height / TILE_SIZE;
- changed_tiles->init_tiles(tile_x_len, tile_y_len);
+ changed_tiles->tile_changeset.init_tiles(tile_x_len, tile_y_len);
for (int index = from_changeset - first_changeset_id; index < history.size(); index++) {
- changed_tiles->merge(history[index]);
+ changed_tiles->tile_changeset.merge(history[index].tile_changeset);
}
return changed_tiles;
}
@@ -399,9 +405,9 @@ ePartialUpdateCollectResult BKE_image_partial_update_collect_changes(Image *imag
user_impl->last_changeset_id);
/* Convert tiles in the changeset to rectangles that are dirty. */
- for (int tile_y = 0; tile_y < changed_tiles->tile_y_len_; tile_y++) {
- for (int tile_x = 0; tile_x < changed_tiles->tile_x_len_; tile_x++) {
- if (!changed_tiles->is_tile_dirty(tile_x, tile_y)) {
+ for (int tile_y = 0; tile_y < changed_tiles->tile_changeset.tile_y_len_; tile_y++) {
+ for (int tile_x = 0; tile_x < changed_tiles->tile_changeset.tile_x_len_; tile_x++) {
+ if (!changed_tiles->tile_changeset.is_tile_dirty(tile_x, tile_y)) {
continue;
}
More information about the Bf-blender-cvs
mailing list