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-16 16:37:51 +0300
committerSergey Sharybin <sergey@blender.org>2021-09-17 11:38:30 +0300
commite597e6aab28dd03f4a736ab9f324d6a7726842a0 (patch)
treecd6caa445dd26846447906134a432ee9f7b4e1b4
parentd80d23e542f1e49d827f77b29e107057c1bc9a58 (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.cpp59
-rw-r--r--intern/cycles/render/session.cpp15
-rw-r--r--intern/cycles/render/session.h6
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 &params_, 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 &params, 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();