Commit: f0ed22812d75e7c2a82fbbc89f5aa0646a17f3e8 Author: Sergey Sharybin Date: Wed Aug 4 17:11:04 2021 +0200 Branches: cycles-x https://developer.blender.org/rBf0ed22812d75e7c2a82fbbc89f5aa0646a17f3e8
Cycles X: Internal API support for tiled rendering No visible changes on user level yet: just a tiny step towards tiled rendering support. Tested by hard-coding tile size to `make_int2(256, 256)`. Differential Revision: https://developer.blender.org/D12129 =================================================================== M intern/cycles/integrator/render_scheduler.cpp M intern/cycles/integrator/render_scheduler.h M intern/cycles/render/session.cpp M intern/cycles/render/tile.cpp M intern/cycles/render/tile.h =================================================================== diff --git a/intern/cycles/integrator/render_scheduler.cpp b/intern/cycles/integrator/render_scheduler.cpp index 2d672591188..b5e9c7d1a3b 100644 --- a/intern/cycles/integrator/render_scheduler.cpp +++ b/intern/cycles/integrator/render_scheduler.cpp @@ -156,6 +156,11 @@ void RenderScheduler::reset(const BufferParams &buffer_params, int num_samples) rebalance_time_.reset(); } +void RenderScheduler::reset_for_next_tile() +{ + reset(buffer_params_, num_samples_); +} + bool RenderScheduler::render_work_reschedule_on_converge(RenderWork &render_work) { /* Move to the next resolution divider. Assume adaptive filtering is not needed during diff --git a/intern/cycles/integrator/render_scheduler.h b/intern/cycles/integrator/render_scheduler.h index b205e05aa97..261ba125cd3 100644 --- a/intern/cycles/integrator/render_scheduler.h +++ b/intern/cycles/integrator/render_scheduler.h @@ -126,6 +126,11 @@ class RenderScheduler { * Resets current rendered state, as well as scheduling information. */ void reset(const BufferParams &buffer_params, int num_samples); + /* Reset scheduler upon switching to a next tile. + * Will keep the same number of samples and full-frame render parameters, but will reset progress + * and allow schedule renders works from the beginning of the new tile. */ + void reset_for_next_tile(); + /* Reschedule adaptive sampling work when all pixels did converge. * If there is nothing else to be done for the adaptive sampling (pixels did converge to the * final threshold) then false is returned and the render scheduler will stop scheduling path diff --git a/intern/cycles/render/session.cpp b/intern/cycles/render/session.cpp index 472dbab0a8c..f62e22532c3 100644 --- a/intern/cycles/render/session.cpp +++ b/intern/cycles/render/session.cpp @@ -43,9 +43,7 @@ CCL_NAMESPACE_BEGIN Session::Session(const SessionParams ¶ms_, const SceneParams &scene_params) - : params(params_), - tile_manager_(make_int2(4096, 4096)), - render_scheduler_(params.headless, params.background, params.pixel_size) + : params(params_), render_scheduler_(params.headless, params.background, params.pixel_size) { TaskScheduler::init(params.threads); @@ -245,6 +243,7 @@ RenderWork Session::run_update_for_next_iteration() thread_scoped_lock reset_lock(delayed_reset_.mutex); bool have_tiles = true; + bool switched_to_new_tile = false; if (delayed_reset_.do_reset) { thread_scoped_lock buffers_lock(buffers_mutex_); @@ -252,6 +251,7 @@ RenderWork Session::run_update_for_next_iteration() /* After reset make sure the tile manager is at the first big tile. */ have_tiles = tile_manager_.next(); + switched_to_new_tile = true; } /* Update number of samples in the integrator. @@ -280,13 +280,31 @@ RenderWork Session::run_update_for_next_iteration() break; } - /* TODO(sergey): Add support of the multiple big tile. */ - break; + have_tiles = tile_manager_.next(); + if (have_tiles) { + render_scheduler_.reset_for_next_tile(); + switched_to_new_tile = true; + } } if (render_work) { scoped_timer update_timer; + if (switched_to_new_tile) { + BufferParams tile_params = buffer_params_; + + const Tile &tile = tile_manager_.get_current_tile(); + tile_params.width = tile.width; + tile_params.height = tile.height; + tile_params.full_x = tile.x + buffer_params_.full_x; + tile_params.full_y = tile.y + buffer_params_.full_y; + tile_params.full_width = buffer_params_.full_width; + tile_params.full_height = buffer_params_.full_height; + tile_params.update_offset_stride(); + + path_trace_->reset(tile_params); + } + const int resolution = render_work.resolution_divider; const int width = max(1, buffer_params_.full_width / resolution); const int height = max(1, buffer_params_.full_height / resolution); @@ -349,8 +367,9 @@ void Session::do_delayed_reset() buffer_params_.update_passes(scene->passes); render_scheduler_.reset(buffer_params_, delayed_reset_.samples); - path_trace_->reset(buffer_params_); - tile_manager_.reset(buffer_params_); + + /* TODO(sergey): Use real big tile size. */ + tile_manager_.reset(buffer_params_, make_int2(buffer_params_.width, buffer_params_.height)); progress.reset_sample(); @@ -570,7 +589,7 @@ int2 Session::get_render_tile_offset() const { const Tile &tile = tile_manager_.get_current_tile(); - return make_int2(tile.x - tile.full_x, tile.y - tile.full_y); + return make_int2(tile.x, tile.y); } bool Session::copy_render_tile_from_device() diff --git a/intern/cycles/render/tile.cpp b/intern/cycles/render/tile.cpp index 7389efd20a2..f69fa21e1a5 100644 --- a/intern/cycles/render/tile.cpp +++ b/intern/cycles/render/tile.cpp @@ -22,20 +22,16 @@ CCL_NAMESPACE_BEGIN -TileManager::TileManager(int2 tile_size) : tile_size_(tile_size) -{ - BufferParams buffer_params; - reset(buffer_params); -} - -void TileManager::reset(BufferParams ¶ms) +void TileManager::reset(const BufferParams ¶ms, int2 tile_size) { + tile_size_ = tile_size; buffer_params_ = params; - /* TODO(sergey): Multiple big tile support. */ + num_tiles_x_ = divide_up(params.width, tile_size_.x); + num_tiles_y_ = divide_up(params.height, tile_size_.y); state_.next_tile_index = 0; - state_.num_tiles = 1; + state_.num_tiles = num_tiles_x_ * num_tiles_y_; state_.current_tile = Tile(); } @@ -51,15 +47,23 @@ bool TileManager::next() return false; } - ++state_.next_tile_index; + /* TODO(sergey): Consider using hilbert spiral, or. maybe, even configurable. Not sure this + * brings a lot of value since this is only applicable to BIG tiles. */ - state_.current_tile.x = buffer_params_.full_x; - state_.current_tile.y = buffer_params_.full_y; - state_.current_tile.width = buffer_params_.width; - state_.current_tile.height = buffer_params_.height; + const int tile_y = state_.next_tile_index / num_tiles_x_; + const int tile_x = state_.next_tile_index - tile_y * num_tiles_x_; - state_.current_tile.full_x = buffer_params_.full_x; - state_.current_tile.full_y = buffer_params_.full_y; + state_.current_tile.x = tile_x * tile_size_.x; + state_.current_tile.y = tile_y * tile_size_.y; + state_.current_tile.width = tile_size_.x; + state_.current_tile.height = tile_size_.y; + + state_.current_tile.width = min(state_.current_tile.width, + buffer_params_.width - state_.current_tile.x); + state_.current_tile.height = min(state_.current_tile.height, + buffer_params_.height - state_.current_tile.y); + + ++state_.next_tile_index; return true; } diff --git a/intern/cycles/render/tile.h b/intern/cycles/render/tile.h index 651a49ce874..19dd25a15c9 100644 --- a/intern/cycles/render/tile.h +++ b/intern/cycles/render/tile.h @@ -27,8 +27,6 @@ class Tile { int x = 0, y = 0; int width = 0, height = 0; - int full_x = 0, full_y = 0; - Tile() { } @@ -38,9 +36,13 @@ class Tile { class TileManager { public: - explicit TileManager(int2 tile_size); + TileManager() = default; - void reset(BufferParams ¶ms); + /* Reset current progress and start new rendering of the full-frame parameters in tiles of the + * given size. */ + /* TODO(sergey): Consider using tile area instead of exact size to help dealing with extreme + * cases of stretched renders. */ + void reset(const BufferParams ¶ms, int2 tile_size); bool next(); bool done(); @@ -48,7 +50,10 @@ class TileManager { const Tile &get_current_tile() const; protected: - int2 tile_size_; + int2 tile_size_ = make_int2(0, 0); + int num_tiles_x_ = 0; + int num_tiles_y_ = 0; + BufferParams buffer_params_; struct { _______________________________________________ Bf-blender-cvs mailing list [email protected] List details, subscription details or unsubscribe: https://lists.blender.org/mailman/listinfo/bf-blender-cvs
