diff options
author | Sergey Sharybin <sergey@blender.org> | 2021-09-16 16:37:51 +0300 |
---|---|---|
committer | Sergey Sharybin <sergey@blender.org> | 2021-09-17 11:38:30 +0300 |
commit | e597e6aab28dd03f4a736ab9f324d6a7726842a0 (patch) | |
tree | cd6caa445dd26846447906134a432ee9f7b4e1b4 | |
parent | d80d23e542f1e49d827f77b29e107057c1bc9a58 (diff) |
Fix persistent data not allowing to change sample count and time limit
The root cause was that `session->params` were never updated to the new
parameters.
Made it so `session->reset()` will make sure the session is fully up to
date with the desired parameters.
Investigation by @dingto, code by self.
Differential Revision: https://developer.blender.org/D12515
-rw-r--r-- | intern/cycles/blender/blender_session.cpp | 59 | ||||
-rw-r--r-- | intern/cycles/render/session.cpp | 15 | ||||
-rw-r--r-- | intern/cycles/render/session.h | 6 |
3 files changed, 39 insertions, 41 deletions
diff --git a/intern/cycles/blender/blender_session.cpp b/intern/cycles/blender/blender_session.cpp index 1cfb7d062eb..ea365617590 100644 --- a/intern/cycles/blender/blender_session.cpp +++ b/intern/cycles/blender/blender_session.cpp @@ -122,10 +122,10 @@ BlenderSession::~BlenderSession() void BlenderSession::create_session() { - SessionParams session_params = BlenderSync::get_session_params( + const SessionParams session_params = BlenderSync::get_session_params( b_engine, b_userpref, b_scene, background); - SceneParams scene_params = BlenderSync::get_scene_params(b_scene, background); - bool session_pause = BlenderSync::get_session_pause(b_scene, background); + const SceneParams scene_params = BlenderSync::get_scene_params(b_scene, background); + const bool session_pause = BlenderSync::get_session_pause(b_scene, background); /* reset status/progress */ last_status = ""; @@ -155,9 +155,9 @@ void BlenderSession::create_session() } /* set buffer parameters */ - BufferParams buffer_params = BlenderSync::get_buffer_params( + const BufferParams buffer_params = BlenderSync::get_buffer_params( b_v3d, b_rv3d, scene->camera, width, height); - session->reset(buffer_params, session_params.samples); + session->reset(session_params, buffer_params); /* Create GPU display. */ if (!b_engine.is_preview() && !headless) { @@ -215,9 +215,9 @@ void BlenderSession::reset_session(BL::BlendData &b_data, BL::Depsgraph &b_depsg return; } - SessionParams session_params = BlenderSync::get_session_params( + const SessionParams session_params = BlenderSync::get_session_params( b_engine, b_userpref, b_scene, background); - SceneParams scene_params = BlenderSync::get_scene_params(b_scene, background); + const SceneParams scene_params = BlenderSync::get_scene_params(b_scene, background); if (scene->params.modified(scene_params) || session->params.modified(session_params) || !this->b_render.use_persistent_data()) { @@ -254,9 +254,9 @@ void BlenderSession::reset_session(BL::BlendData &b_data, BL::Depsgraph &b_depsg BL::SpaceView3D b_null_space_view3d(PointerRNA_NULL); BL::RegionView3D b_null_region_view3d(PointerRNA_NULL); - BufferParams buffer_params = BlenderSync::get_buffer_params( + const BufferParams buffer_params = BlenderSync::get_buffer_params( b_null_space_view3d, b_null_region_view3d, scene->camera, width, height); - session->reset(buffer_params, session_params.samples); + session->reset(session_params, buffer_params); /* reset time */ start_resize_time = 0.0; @@ -424,7 +424,7 @@ void BlenderSession::render(BL::Depsgraph &b_depsgraph_) BL::ViewLayer b_view_layer = b_depsgraph.view_layer_eval(); /* get buffer parameters */ - SessionParams session_params = BlenderSync::get_session_params( + const SessionParams session_params = BlenderSync::get_session_params( b_engine, b_userpref, b_scene, background); BufferParams buffer_params = BlenderSync::get_buffer_params( b_v3d, b_rv3d, scene->camera, width, height); @@ -487,20 +487,19 @@ void BlenderSession::render(BL::Depsgraph &b_depsgraph_) } /* Update number of samples per layer. */ - int samples = sync->get_layer_samples(); - bool bound_samples = sync->get_layer_bound_samples(); - int effective_layer_samples; + const int samples = sync->get_layer_samples(); + const bool bound_samples = sync->get_layer_bound_samples(); - if (samples != 0 && (!bound_samples || (samples < session_params.samples))) - effective_layer_samples = samples; - else - effective_layer_samples = session_params.samples; + SessionParams effective_session_params = session_params; + if (samples != 0 && (!bound_samples || (samples < session_params.samples))) { + effective_session_params.samples = samples; + } /* Update tile manager if we're doing resumable render. */ - update_resumable_tile_manager(effective_layer_samples); + update_resumable_tile_manager(effective_session_params.samples); /* Update session itself. */ - session->reset(buffer_params, effective_layer_samples); + session->reset(effective_session_params, buffer_params); /* render */ if (!b_engine.is_preview() && background && print_render_stats) { @@ -662,7 +661,7 @@ void BlenderSession::bake(BL::Depsgraph &b_depsgraph_, if (object_found && !session->progress.get_cancel()) { /* Get session and buffer parameters. */ - SessionParams session_params = BlenderSync::get_session_params( + const SessionParams session_params = BlenderSync::get_session_params( b_engine, b_userpref, b_scene, background); BufferParams buffer_params; @@ -670,7 +669,7 @@ void BlenderSession::bake(BL::Depsgraph &b_depsgraph_, buffer_params.height = bake_height; /* Update session. */ - session->reset(buffer_params, session_params.samples); + session->reset(session_params, buffer_params); session->progress.set_update_callback( function_bind(&BlenderSession::update_bake_progress, this)); @@ -728,10 +727,10 @@ void BlenderSession::synchronize(BL::Depsgraph &b_depsgraph_) return; /* on session/scene parameter changes, we recreate session entirely */ - SessionParams session_params = BlenderSync::get_session_params( + const SessionParams session_params = BlenderSync::get_session_params( b_engine, b_userpref, b_scene, background); - SceneParams scene_params = BlenderSync::get_scene_params(b_scene, background); - bool session_pause = BlenderSync::get_session_pause(b_scene, background); + const SceneParams scene_params = BlenderSync::get_scene_params(b_scene, background); + const bool session_pause = BlenderSync::get_session_pause(b_scene, background); if (session->params.modified(session_params) || scene->params.modified(scene_params)) { free_session(); @@ -772,12 +771,12 @@ void BlenderSession::synchronize(BL::Depsgraph &b_depsgraph_) sync->sync_camera(b_render, b_camera_override, width, height, ""); /* get buffer parameters */ - BufferParams buffer_params = BlenderSync::get_buffer_params( + const BufferParams buffer_params = BlenderSync::get_buffer_params( b_v3d, b_rv3d, scene->camera, width, height); /* reset if needed */ if (scene->need_reset()) { - session->reset(buffer_params, session_params.samples); + session->reset(session_params, buffer_params); /* After session reset, so device is not accessing image data anymore. */ builtin_images_load(); @@ -874,14 +873,14 @@ void BlenderSession::view_draw(int w, int h) /* reset if requested */ if (reset) { - SessionParams session_params = BlenderSync::get_session_params( + const SessionParams session_params = BlenderSync::get_session_params( b_engine, b_userpref, b_scene, background); - BufferParams buffer_params = BlenderSync::get_buffer_params( + const BufferParams buffer_params = BlenderSync::get_buffer_params( b_v3d, b_rv3d, scene->camera, width, height); - bool session_pause = BlenderSync::get_session_pause(b_scene, background); + const bool session_pause = BlenderSync::get_session_pause(b_scene, background); if (session_pause == false) { - session->reset(buffer_params, session_params.samples); + session->reset(session_params, buffer_params); start_resize_time = 0.0; } } diff --git a/intern/cycles/render/session.cpp b/intern/cycles/render/session.cpp index 53a4cd633be..41a6893b713 100644 --- a/intern/cycles/render/session.cpp +++ b/intern/cycles/render/session.cpp @@ -50,7 +50,6 @@ Session::Session(const SessionParams ¶ms_, const SceneParams &scene_params) session_thread_ = nullptr; delayed_reset_.do_reset = false; - delayed_reset_.samples = 0; pause_ = false; cancel_ = false; @@ -392,11 +391,12 @@ void Session::do_delayed_reset() } delayed_reset_.do_reset = false; - buffer_params_ = delayed_reset_.params; + params = delayed_reset_.session_params; + buffer_params_ = delayed_reset_.buffer_params; /* Tile and work scheduling. */ tile_manager_.reset(buffer_params_, get_effective_tile_size()); - render_scheduler_.reset(buffer_params_, delayed_reset_.samples); + render_scheduler_.reset(buffer_params_, params.samples); /* Passes. */ /* When multiple tiles are used SAMPLE_COUNT pass is used to keep track of possible partial @@ -411,8 +411,7 @@ void Session::do_delayed_reset() /* Progress. */ progress.reset_sample(); - progress.set_total_pixel_samples(delayed_reset_.params.width * delayed_reset_.params.height * - delayed_reset_.samples); + progress.set_total_pixel_samples(buffer_params_.width * buffer_params_.height * params.samples); if (!params.background) { progress.set_start_time(); @@ -420,15 +419,15 @@ void Session::do_delayed_reset() progress.set_render_start_time(); } -void Session::reset(BufferParams &buffer_params, int samples) +void Session::reset(const SessionParams &session_params, const BufferParams &buffer_params) { { thread_scoped_lock reset_lock(delayed_reset_.mutex); thread_scoped_lock pause_lock(pause_mutex_); - delayed_reset_.params = buffer_params; - delayed_reset_.samples = samples; delayed_reset_.do_reset = true; + delayed_reset_.session_params = session_params; + delayed_reset_.buffer_params = buffer_params; path_trace_->cancel(); } diff --git a/intern/cycles/render/session.h b/intern/cycles/render/session.h index 01f6aa4ed84..fe3303fb8a3 100644 --- a/intern/cycles/render/session.h +++ b/intern/cycles/render/session.h @@ -131,7 +131,7 @@ class Session { void wait(); bool ready_to_reset(); - void reset(BufferParams ¶ms, int samples); + void reset(const SessionParams &session_params, const BufferParams &buffer_params); void set_pause(bool pause); @@ -168,8 +168,8 @@ class Session { struct DelayedReset { thread_mutex mutex; bool do_reset; - BufferParams params; - int samples; + SessionParams session_params; + BufferParams buffer_params; } delayed_reset_; void run(); |