[Bf-blender-cvs] [f5aabf6f7f5] cycles-x: Make state tracking more reliable in Cycles X scheduler

Sergey Sharybin noreply at git.blender.org
Wed Sep 1 11:34:10 CEST 2021


Commit: f5aabf6f7f59a043dddbc21d4ef4b3947d67ba99
Author: Sergey Sharybin
Date:   Wed Sep 1 11:31:39 2021 +0200
Branches: cycles-x
https://developer.blender.org/rBf5aabf6f7f59a043dddbc21d4ef4b3947d67ba99

Make state tracking more reliable in Cycles X scheduler

Move logic to a re-usable function, so that state can be checked for
"regular" and "post-processing" render works.

Also corrected state tracking for tile written flag: it is a "sticky"
flag, meaning once the tile is written is always considered written.
Before this change it was possible that canceling render will write
tile again.

Should be no difference on user level, just preparing ground work for
tiles support.

===================================================================

M	intern/cycles/integrator/render_scheduler.cpp
M	intern/cycles/integrator/render_scheduler.h

===================================================================

diff --git a/intern/cycles/integrator/render_scheduler.cpp b/intern/cycles/integrator/render_scheduler.cpp
index 515992e17a5..059d2df922e 100644
--- a/intern/cycles/integrator/render_scheduler.cpp
+++ b/intern/cycles/integrator/render_scheduler.cpp
@@ -244,11 +244,15 @@ RenderWork RenderScheduler::get_render_work()
 
   if (done()) {
     RenderWork render_work;
+
     if (!set_postprocess_render_work(&render_work)) {
       if (state_.end_render_time == 0.0) {
         state_.end_render_time = time_now;
       }
     }
+
+    update_state_for_render_work(render_work);
+
     return render_work;
   }
 
@@ -269,10 +273,6 @@ RenderWork RenderScheduler::get_render_work()
 
   /* NOTE: Rebalance scheduler requires current number of samples to not be advanced forward. */
   render_work.rebalance = work_need_rebalance();
-  if (render_work.rebalance) {
-    state_.last_rebalance_time = time_now;
-    ++state_.num_rebalance_requested;
-  }
 
   /* NOTE: Advance number of samples now, so that filter and denoising check can see that all the
    * samples are rendered. */
@@ -284,13 +284,29 @@ RenderWork RenderScheduler::get_render_work()
 
   bool denoiser_delayed;
   render_work.denoise = work_need_denoise(denoiser_delayed);
-  state_.last_work_was_denoised = render_work.denoise;
 
   render_work.write_final_result = done();
-  state_.final_result_was_written = render_work.write_final_result;
 
   render_work.update_display = work_need_update_display(denoiser_delayed);
 
+  if (done()) {
+    set_postprocess_render_work(&render_work);
+  }
+
+  update_state_for_render_work(render_work);
+
+  return render_work;
+}
+
+void RenderScheduler::update_state_for_render_work(const RenderWork &render_work)
+{
+  const double time_now = time_dt();
+
+  if (render_work.rebalance) {
+    state_.last_rebalance_time = time_now;
+    ++state_.num_rebalance_requested;
+  }
+
   /* A fallback display update time, for the case there is an error of display update, or when
    * there is no display at all. */
   if (render_work.update_display) {
@@ -298,11 +314,8 @@ RenderWork RenderScheduler::get_render_work()
     state_.last_display_update_sample = state_.num_rendered_samples;
   }
 
-  if (done()) {
-    set_postprocess_render_work(&render_work);
-  }
-
-  return render_work;
+  state_.last_work_was_denoised = render_work.denoise;
+  state_.final_result_was_written |= render_work.write_final_result;
 }
 
 bool RenderScheduler::set_postprocess_render_work(RenderWork *render_work)
diff --git a/intern/cycles/integrator/render_scheduler.h b/intern/cycles/integrator/render_scheduler.h
index 78772c603e6..bbe2c8424f2 100644
--- a/intern/cycles/integrator/render_scheduler.h
+++ b/intern/cycles/integrator/render_scheduler.h
@@ -176,6 +176,11 @@ class RenderScheduler {
    * extra work needs to be scheduled to denoise and write final result. */
   bool done() const;
 
+  /* Update scheduling state for a newely scheduled work.
+   * Takes care of things like checking whether work was ever denoised, tile was written and states
+   * like that. */
+  void update_state_for_render_work(const RenderWork &render_work);
+
   /* Returns true if any work was scheduled. */
   bool set_postprocess_render_work(RenderWork *render_work);



More information about the Bf-blender-cvs mailing list