diff options
author | Sergey Sharybin <sergey@blender.org> | 2021-09-23 18:20:59 +0300 |
---|---|---|
committer | Sergey Sharybin <sergey@blender.org> | 2021-09-28 17:58:27 +0300 |
commit | 728ae33f3720894a59009e28d33ae82f77c380b3 (patch) | |
tree | e504c26dd92fccf3f0ba4021aceebb65fb9b028b | |
parent | 52a702468a59f1945ecfcf6dde6bccf648a27d36 (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.cpp | 39 | ||||
-rw-r--r-- | intern/cycles/blender/blender_session.h | 5 | ||||
-rw-r--r-- | intern/cycles/integrator/path_trace.cpp | 11 | ||||
-rw-r--r-- | intern/cycles/render/tile.cpp | 8 |
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; |