Changeset View
Changeset View
Standalone View
Standalone View
intern/cycles/integrator/render_scheduler.cpp
| Show First 20 Lines • Show All 109 Lines • ▼ Show 20 Lines | else { | ||||
| * first and then initialized render work. */ | * first and then initialized render work. */ | ||||
| state_.resolution_divider = start_resolution_divider_ * 2; | state_.resolution_divider = start_resolution_divider_ * 2; | ||||
| } | } | ||||
| state_.num_rendered_samples = 0; | state_.num_rendered_samples = 0; | ||||
| state_.last_display_update_time = 0.0; | state_.last_display_update_time = 0.0; | ||||
| state_.last_display_update_sample = -1; | state_.last_display_update_sample = -1; | ||||
| state_.last_rebalance_time = 0.0; | |||||
| /* TODO(sergey): Choose better initial value. */ | /* TODO(sergey): Choose better initial value. */ | ||||
| /* NOTE: The adaptive sampling settings might not be available here yet. */ | /* NOTE: The adaptive sampling settings might not be available here yet. */ | ||||
| state_.adaptive_sampling_threshold = 0.4f; | state_.adaptive_sampling_threshold = 0.4f; | ||||
| state_.path_trace_finished = false; | state_.path_trace_finished = false; | ||||
| state_.start_render_time = 0.0; | state_.start_render_time = 0.0; | ||||
| state_.end_render_time = 0.0; | state_.end_render_time = 0.0; | ||||
| ▲ Show 20 Lines • Show All 70 Lines • ▼ Show 20 Lines | bool RenderScheduler::done() const | ||||
| return get_num_rendered_samples() >= num_samples_; | return get_num_rendered_samples() >= num_samples_; | ||||
| } | } | ||||
| RenderWork RenderScheduler::get_render_work() | RenderWork RenderScheduler::get_render_work() | ||||
| { | { | ||||
| check_time_limit_reached(); | check_time_limit_reached(); | ||||
| const double time_now = time_dt(); | |||||
| if (done()) { | if (done()) { | ||||
| if (state_.end_render_time == 0.0) { | if (state_.end_render_time == 0.0) { | ||||
| state_.end_render_time = time_dt(); | state_.end_render_time = time_now; | ||||
| } | } | ||||
| return RenderWork(); | return RenderWork(); | ||||
| } | } | ||||
| RenderWork render_work; | RenderWork render_work; | ||||
| if (state_.resolution_divider != pixel_size_) { | if (state_.resolution_divider != pixel_size_) { | ||||
| state_.resolution_divider = max(state_.resolution_divider / 2, pixel_size_); | state_.resolution_divider = max(state_.resolution_divider / 2, pixel_size_); | ||||
| Show All 21 Lines | RenderWork RenderScheduler::get_render_work() | ||||
| bool denoiser_delayed; | bool denoiser_delayed; | ||||
| render_work.denoise = work_need_denoise(denoiser_delayed); | render_work.denoise = work_need_denoise(denoiser_delayed); | ||||
| render_work.update_display = work_need_update_display(denoiser_delayed); | render_work.update_display = work_need_update_display(denoiser_delayed); | ||||
| /* A fallback display update time, for the case there is an error of display update, or when | /* A fallback display update time, for the case there is an error of display update, or when | ||||
| * there is no display at all. */ | * there is no display at all. */ | ||||
| if (render_work.update_display) { | if (render_work.update_display) { | ||||
| state_.last_display_update_time = time_dt(); | state_.last_display_update_time = time_now; | ||||
| state_.last_display_update_sample = state_.num_rendered_samples; | state_.last_display_update_sample = state_.num_rendered_samples; | ||||
| } | } | ||||
| render_work.rebalance = work_need_rebalance(); | |||||
| if (render_work.rebalance) { | |||||
| state_.last_rebalance_time = time_now; | |||||
| } | |||||
| return render_work; | return render_work; | ||||
| } | } | ||||
| /* Knowing time which it took to complete a task at the current resolution divider approximate how | /* Knowing time which it took to complete a task at the current resolution divider approximate how | ||||
| * long it would have taken to complete it at a final resolution. */ | * long it would have taken to complete it at a final resolution. */ | ||||
| static double approximate_final_time(const RenderWork &render_work, double time) | static double approximate_final_time(const RenderWork &render_work, double time) | ||||
| { | { | ||||
| if (render_work.resolution_divider == 1) { | if (render_work.resolution_divider == 1) { | ||||
| ▲ Show 20 Lines • Show All 438 Lines • ▼ Show 20 Lines | bool RenderScheduler::work_need_update_display(const bool denoiser_delayed) | ||||
| /* When adaptive sampling is used, its possible that only handful of samples of a very simple | /* When adaptive sampling is used, its possible that only handful of samples of a very simple | ||||
| * scene will be scheduled to a powerful device (in order to not "miss" any of filtering points). | * scene will be scheduled to a powerful device (in order to not "miss" any of filtering points). | ||||
| * We take care of skipping updates here based on when previous display update did happen. */ | * We take care of skipping updates here based on when previous display update did happen. */ | ||||
| const double update_interval = guess_display_update_interval_in_seconds_for_num_samples( | const double update_interval = guess_display_update_interval_in_seconds_for_num_samples( | ||||
| state_.last_display_update_sample); | state_.last_display_update_sample); | ||||
| return (time_dt() - state_.last_display_update_time) > update_interval; | return (time_dt() - state_.last_display_update_time) > update_interval; | ||||
| } | } | ||||
| bool RenderScheduler::work_need_rebalance() | |||||
| { | |||||
| /* This is the minimum time, as the rebalancing can not happen more often than the path trace | |||||
| * work. */ | |||||
| static const double kRebalanceIntervalInSeconds = 1; | |||||
| if (state_.resolution_divider != pixel_size_) { | |||||
| /* Don't rebalance at a non-final resolution divider. Some reasons for this: | |||||
| * - It will introduce unnecessary during navigation. | |||||
| * - Per-render device timing information is not very reliable yet. */ | |||||
| return false; | |||||
| } | |||||
| if (state_.num_rendered_samples == 1) { | |||||
| return true; | |||||
| } | |||||
| return (time_dt() - state_.last_rebalance_time) > kRebalanceIntervalInSeconds; | |||||
| } | |||||
| void RenderScheduler::update_start_resolution_divider() | void RenderScheduler::update_start_resolution_divider() | ||||
| { | { | ||||
| if (start_resolution_divider_ == 0) { | if (start_resolution_divider_ == 0) { | ||||
| /* Resolution divider has never been calculated before: use default resolution, so that we have | /* Resolution divider has never been calculated before: use default resolution, so that we have | ||||
| * somewhat good initial behavior, giving a chance to collect real numbers. */ | * somewhat good initial behavior, giving a chance to collect real numbers. */ | ||||
| start_resolution_divider_ = default_start_resolution_divider_; | start_resolution_divider_ = default_start_resolution_divider_; | ||||
| VLOG(3) << "Initial resolution divider is " << start_resolution_divider_; | VLOG(3) << "Initial resolution divider is " << start_resolution_divider_; | ||||
| return; | return; | ||||
| ▲ Show 20 Lines • Show All 153 Lines • Show Last 20 Lines | |||||