diff options
author | Sergey Sharybin <sergey@blender.org> | 2022-01-10 18:05:17 +0300 |
---|---|---|
committer | Sergey Sharybin <sergey@blender.org> | 2022-01-10 18:54:12 +0300 |
commit | 292c2cefe30b3b4798324e0f04e3a4a529829c94 (patch) | |
tree | a2ef4c57898f432eedd895c1a83ba1af178e6155 /intern/cycles/session | |
parent | 20cb2c72a559786b69a3f45695b072dd0beae99a (diff) |
Fix T93727: Tiled render error in Cycles after changing temp directory
Consider temporary directory to be variant part of session configuration
which gets communicated to the tile manager on render reset.
This allows to be able to render with one temp directory, change the
directory, render again and have proper render result even with enabled
persistent data.
For the ease of access to the temp directory expose it via the render
engine API (engine.temp_directory).
Differential Revision: https://developer.blender.org/D13790
Diffstat (limited to 'intern/cycles/session')
-rw-r--r-- | intern/cycles/session/session.cpp | 5 | ||||
-rw-r--r-- | intern/cycles/session/session.h | 3 | ||||
-rw-r--r-- | intern/cycles/session/tile.cpp | 9 | ||||
-rw-r--r-- | intern/cycles/session/tile.h | 4 |
4 files changed, 20 insertions, 1 deletions
diff --git a/intern/cycles/session/session.cpp b/intern/cycles/session/session.cpp index a839303debc..2c50a9a6d7f 100644 --- a/intern/cycles/session/session.cpp +++ b/intern/cycles/session/session.cpp @@ -426,6 +426,11 @@ void Session::do_delayed_reset() buffer_params_.update_passes(scene->passes); tile_manager_.update(buffer_params_, scene); + /* Update temp directory on reset. + * This potentially allows to finish the existing rendering with a previously configure temporary + * direcotry in the host software and switch to a new temp directory when new render starts. */ + tile_manager_.set_temp_dir(params.temp_dir); + /* Progress. */ progress.reset_sample(); progress.set_total_pixel_samples(static_cast<uint64_t>(buffer_params_.width) * diff --git a/intern/cycles/session/session.h b/intern/cycles/session/session.h index 3f73593f008..adfd1346600 100644 --- a/intern/cycles/session/session.h +++ b/intern/cycles/session/session.h @@ -69,6 +69,9 @@ class SessionParams { ShadingSystem shadingsystem; + /* Session-specific temporary directory to store in-progress EXR files in. */ + string temp_dir; + SessionParams() { headless = false; diff --git a/intern/cycles/session/tile.cpp b/intern/cycles/session/tile.cpp index afd1f334120..ab1b3b8ec36 100644 --- a/intern/cycles/session/tile.cpp +++ b/intern/cycles/session/tile.cpp @@ -23,6 +23,7 @@ #include "scene/film.h" #include "scene/integrator.h" #include "scene/scene.h" +#include "session/session.h" #include "util/algorithm.h" #include "util/foreach.h" #include "util/log.h" @@ -394,6 +395,11 @@ void TileManager::update(const BufferParams ¶ms, const Scene *scene) } } +void TileManager::set_temp_dir(const string &temp_dir) +{ + temp_dir_ = temp_dir; +} + bool TileManager::done() { return tile_state_.next_tile_index == tile_state_.num_tiles; @@ -452,7 +458,8 @@ const int2 TileManager::get_size() const bool TileManager::open_tile_output() { - write_state_.filename = path_temp_get("cycles-tile-buffer-" + tile_file_unique_part_ + "-" + + write_state_.filename = path_join(temp_dir_, + "cycles-tile-buffer-" + tile_file_unique_part_ + "-" + to_string(write_state_.tile_file_index) + ".exr"); write_state_.tile_out = ImageOutput::create(write_state_.filename); diff --git a/intern/cycles/session/tile.h b/intern/cycles/session/tile.h index 7c8f7570d3e..80a5db543cd 100644 --- a/intern/cycles/session/tile.h +++ b/intern/cycles/session/tile.h @@ -71,6 +71,8 @@ class TileManager { * Will store all parameters needed for buffers access outside of the scene graph. */ void update(const BufferParams ¶ms, const Scene *scene); + void set_temp_dir(const string &temp_dir); + inline int get_num_tiles() const { return tile_state_.num_tiles; @@ -136,6 +138,8 @@ class TileManager { bool open_tile_output(); bool close_tile_output(); + string temp_dir_; + /* Part of an on-disk tile file name which avoids conflicts between several Cycles instances or * several sessions. */ string tile_file_unique_part_; |