diff options
Diffstat (limited to 'intern/cycles/session/session.cpp')
-rw-r--r-- | intern/cycles/session/session.cpp | 34 |
1 files changed, 25 insertions, 9 deletions
diff --git a/intern/cycles/session/session.cpp b/intern/cycles/session/session.cpp index e7de82a6e1b..acaa55f4990 100644 --- a/intern/cycles/session/session.cpp +++ b/intern/cycles/session/session.cpp @@ -43,6 +43,10 @@ Session::Session(const SessionParams ¶ms_, const SceneParams &scene_params) device = Device::create(params.device, stats, profiler); + if (device->have_error()) { + progress.set_error(device->error_message()); + } + scene = new Scene(scene_params, device); /* Configure path tracer. */ @@ -318,6 +322,13 @@ RenderWork Session::run_update_for_next_iteration() path_trace_->set_adaptive_sampling(adaptive_sampling); } + /* Update path guiding. */ + { + const GuidingParams guiding_params = scene->integrator->get_guiding_params(device); + const bool guiding_reset = (guiding_params.use) ? scene->need_reset(false) : false; + path_trace_->set_guiding_params(guiding_params, guiding_reset); + } + render_scheduler_.set_num_samples(params.samples); render_scheduler_.set_start_sample(params.sample_offset); render_scheduler_.set_time_limit(params.time_limit); @@ -370,6 +381,14 @@ RenderWork Session::run_update_for_next_iteration() if (update_scene(width, height)) { profiler.reset(scene->shaders.size(), scene->objects.size()); } + + /* Unlock scene mutex before loading denoiser kernels, since that may attempt to activate + * graphics interop, which can deadlock when the scene mutex is still being held. */ + scene_lock.unlock(); + + path_trace_->load_kernels(); + path_trace_->alloc_work_memory(); + progress.add_skip_time(update_timer, params.background); } @@ -428,8 +447,7 @@ int2 Session::get_effective_tile_size() const const int image_width = buffer_params_.width; const int image_height = buffer_params_.height; - /* No support yet for baking with tiles. */ - if (!params.use_auto_tile || scene->bake_manager->get_baking()) { + if (!params.use_auto_tile) { return make_int2(image_width, image_height); } @@ -495,7 +513,9 @@ void Session::do_delayed_reset() if (!params.background) { progress.set_start_time(); } + const double time_limit = params.time_limit * ((double)tile_manager_.get_num_tiles()); progress.set_render_start_time(); + progress.set_time_limit(time_limit); } void Session::reset(const SessionParams &session_params, const BufferParams &buffer_params) @@ -590,7 +610,8 @@ double Session::get_estimated_remaining_time() const progress.get_time(total_time, render_time); double remaining = (1.0 - (double)completed) * (render_time / (double)completed); - const double time_limit = render_scheduler_.get_time_limit(); + const double time_limit = render_scheduler_.get_time_limit() * + ((double)tile_manager_.get_num_tiles()); if (time_limit != 0.0) { remaining = min(remaining, max(time_limit - render_time, 0.0)); } @@ -618,12 +639,7 @@ bool Session::update_scene(int width, int height) Camera *cam = scene->camera; cam->set_screen_size(width, height); - const bool scene_update_result = scene->update(progress); - - path_trace_->load_kernels(); - path_trace_->alloc_work_memory(); - - return scene_update_result; + return scene->update(progress); } static string status_append(const string &status, const string &suffix) |