Welcome to mirror list, hosted at ThFree Co, Russian Federation.

git.blender.org/blender.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorSergey Sharybin <sergey@blender.org>2022-01-10 18:05:17 +0300
committerSergey Sharybin <sergey@blender.org>2022-01-10 18:54:12 +0300
commit292c2cefe30b3b4798324e0f04e3a4a529829c94 (patch)
treea2ef4c57898f432eedd895c1a83ba1af178e6155 /intern/cycles/session
parent20cb2c72a559786b69a3f45695b072dd0beae99a (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.cpp5
-rw-r--r--intern/cycles/session/session.h3
-rw-r--r--intern/cycles/session/tile.cpp9
-rw-r--r--intern/cycles/session/tile.h4
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 &params, 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 &params, 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_;