Fix T41197: Blender freezes to infinite loop when switching to PAUSED Cycles rendered viewport

This commit is contained in:
Sergey Sharybin 2014-08-01 16:39:05 +06:00
parent 2f2bf513e9
commit 42aef164f4
Notes: blender-bot 2023-02-14 10:17:44 +01:00
Referenced by issue #41197, Blender freezes to infinite loop when switching to PAUSED Cycles rendered viewport
1 changed files with 20 additions and 8 deletions

View File

@ -88,6 +88,7 @@ void BlenderSession::create_session()
{
SceneParams scene_params = BlenderSync::get_scene_params(b_scene, background);
SessionParams session_params = BlenderSync::get_session_params(b_engine, b_userpref, b_scene, background);
bool session_pause = BlenderSync::get_session_pause(b_scene, background);
/* reset status/progress */
last_status = "";
@ -107,15 +108,17 @@ void BlenderSession::create_session()
session->scene = scene;
session->progress.set_update_callback(function_bind(&BlenderSession::tag_redraw, this));
session->progress.set_cancel_callback(function_bind(&BlenderSession::test_cancel, this));
session->set_pause(BlenderSync::get_session_pause(b_scene, background));
session->set_pause(session_pause);
/* create sync */
sync = new BlenderSync(b_engine, b_data, b_scene, scene, !background, session->progress, session_params.device.type == DEVICE_CPU);
if(b_v3d) {
/* full data sync */
sync->sync_data(b_v3d, b_engine.camera_override(), &python_thread_state);
sync->sync_view(b_v3d, b_rv3d, width, height);
if(session_pause == false) {
/* full data sync */
sync->sync_data(b_v3d, b_engine.camera_override(), &python_thread_state);
sync->sync_view(b_v3d, b_rv3d, width, height);
}
}
else {
/* for final render we will do full data sync per render layer, only
@ -627,6 +630,7 @@ void BlenderSession::synchronize()
/* on session/scene parameter changes, we recreate session entirely */
SceneParams scene_params = BlenderSync::get_scene_params(b_scene, background);
SessionParams session_params = BlenderSync::get_session_params(b_engine, b_userpref, b_scene, background);
bool session_pause = BlenderSync::get_session_pause(b_scene, background);
if(session->params.modified(session_params) ||
scene->params.modified(scene_params))
@ -639,12 +643,18 @@ void BlenderSession::synchronize()
/* increase samples, but never decrease */
session->set_samples(session_params.samples);
session->set_pause(BlenderSync::get_session_pause(b_scene, background));
session->set_pause(session_pause);
/* copy recalc flags, outside of mutex so we can decide to do the real
* synchronization at a later time to not block on running updates */
sync->sync_recalc();
/* don't do synchronization if on pause */
if(session_pause) {
tag_update();
return;
}
/* try to acquire mutex. if we don't want to or can't, come back later */
if(!session->ready_to_reset() || !session->scene->mutex.try_lock()) {
tag_update();
@ -720,10 +730,12 @@ bool BlenderSession::draw(int w, int h)
if(reset) {
SessionParams session_params = BlenderSync::get_session_params(b_engine, b_userpref, b_scene, background);
BufferParams buffer_params = BlenderSync::get_buffer_params(b_render, b_scene, b_v3d, b_rv3d, scene->camera, width, height);
bool session_pause = BlenderSync::get_session_pause(b_scene, background);
session->reset(buffer_params, session_params.samples);
start_resize_time = 0.0;
if(session_pause == false) {
session->reset(buffer_params, session_params.samples);
start_resize_time = 0.0;
}
}
}
else {