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>2021-09-23 18:20:59 +0300
committerSergey Sharybin <sergey@blender.org>2021-09-28 17:58:27 +0300
commit728ae33f3720894a59009e28d33ae82f77c380b3 (patch)
treee504c26dd92fccf3f0ba4021aceebb65fb9b028b
parent52a702468a59f1945ecfcf6dde6bccf648a27d36 (diff)
Cycles: Improve handling of tile file error
Expose them to the interface, and stop rendering as soon as possible. Differential Revision: https://developer.blender.org/D12617
-rw-r--r--intern/cycles/blender/blender_session.cpp39
-rw-r--r--intern/cycles/blender/blender_session.h5
-rw-r--r--intern/cycles/integrator/path_trace.cpp11
-rw-r--r--intern/cycles/render/tile.cpp8
4 files changed, 47 insertions, 16 deletions
diff --git a/intern/cycles/blender/blender_session.cpp b/intern/cycles/blender/blender_session.cpp
index 8d6db30f1a8..88edc7eafe7 100644
--- a/intern/cycles/blender/blender_session.cpp
+++ b/intern/cycles/blender/blender_session.cpp
@@ -589,6 +589,12 @@ void BlenderSession::render_frame_finish()
for (string_view filename : full_buffer_files_) {
session->process_full_buffer_from_disk(filename);
+ if (check_and_report_session_error()) {
+ break;
+ }
+ }
+
+ for (string_view filename : full_buffer_files_) {
path_remove(filename);
}
@@ -1036,20 +1042,27 @@ void BlenderSession::update_status_progress()
last_progress = progress;
}
- if (session->progress.get_error()) {
- string error = session->progress.get_error_message();
- if (error != last_error) {
- /* TODO(sergey): Currently C++ RNA API doesn't let us to
- * use mnemonic name for the variable. Would be nice to
- * have this figured out.
- *
- * For until then, 1 << 5 means RPT_ERROR.
- */
- b_engine.report(1 << 5, error.c_str());
- b_engine.error_set(error.c_str());
- last_error = error;
- }
+ check_and_report_session_error();
+}
+
+bool BlenderSession::check_and_report_session_error()
+{
+ if (!session->progress.get_error()) {
+ return false;
}
+
+ const string error = session->progress.get_error_message();
+ if (error != last_error) {
+ /* TODO(sergey): Currently C++ RNA API doesn't let us to use mnemonic name for the variable.
+ * Would be nice to have this figured out.
+ *
+ * For until then, 1 << 5 means RPT_ERROR. */
+ b_engine.report(1 << 5, error.c_str());
+ b_engine.error_set(error.c_str());
+ last_error = error;
+ }
+
+ return true;
}
void BlenderSession::tag_update()
diff --git a/intern/cycles/blender/blender_session.h b/intern/cycles/blender/blender_session.h
index 11e2657a325..fb0e5252e3b 100644
--- a/intern/cycles/blender/blender_session.h
+++ b/intern/cycles/blender/blender_session.h
@@ -147,6 +147,11 @@ class BlenderSession {
protected:
void stamp_view_layer_metadata(Scene *scene, const string &view_layer_name);
+ /* Check whether session error happenned.
+ * If so, it is reported to the render engine and true is returned.
+ * Otherwise false is returned. */
+ bool check_and_report_session_error();
+
void builtin_images_load();
/* Is used after each render layer synchronization is done with the goal
diff --git a/intern/cycles/integrator/path_trace.cpp b/intern/cycles/integrator/path_trace.cpp
index e785c0d1b19..10d0c5e7b4c 100644
--- a/intern/cycles/integrator/path_trace.cpp
+++ b/intern/cycles/integrator/path_trace.cpp
@@ -801,7 +801,7 @@ void PathTrace::tile_buffer_write_to_disk()
}
if (!tile_manager_.write_tile(*buffers)) {
- LOG(ERROR) << "Error writing tile to file.";
+ device_->set_error("Error writing tile to file");
}
}
@@ -894,7 +894,14 @@ void PathTrace::process_full_buffer_from_disk(string_view filename)
DenoiseParams denoise_params;
if (!tile_manager_.read_full_buffer_from_disk(filename, &full_frame_buffers, &denoise_params)) {
- LOG(ERROR) << "Error reading tiles from file.";
+ const string error_message = "Error reading tiles from file";
+ if (progress_) {
+ progress_->set_error(error_message);
+ progress_->set_cancel(error_message);
+ }
+ else {
+ LOG(ERROR) << error_message;
+ }
return;
}
diff --git a/intern/cycles/render/tile.cpp b/intern/cycles/render/tile.cpp
index 580931504f3..4ab2e856c5d 100644
--- a/intern/cycles/render/tile.cpp
+++ b/intern/cycles/render/tile.cpp
@@ -436,7 +436,12 @@ bool TileManager::open_tile_output()
return false;
}
- write_state_.tile_out->open(write_state_.filename, write_state_.image_spec);
+ if (!write_state_.tile_out->open(write_state_.filename, write_state_.image_spec)) {
+ LOG(ERROR) << "Error opening tile file: " << write_state_.tile_out->geterror();
+ write_state_.tile_out = nullptr;
+ return false;
+ }
+
write_state_.num_tiles_written = 0;
VLOG(3) << "Opened tile file " << write_state_.filename;
@@ -497,6 +502,7 @@ bool TileManager::write_tile(const RenderBuffers &tile_buffers)
TypeDesc::FLOAT,
pixels)) {
LOG(ERROR) << "Error writing tile " << write_state_.tile_out->geterror();
+ return false;
}
++write_state_.num_tiles_written;