[Bf-blender-cvs] [b64cd94cd25] cycles-x: Cycles X: Write all passes on cancel

Sergey Sharybin noreply at git.blender.org
Tue Aug 17 15:42:09 CEST 2021


Commit: b64cd94cd25f05795221c2d798c9889ccc132c6c
Author: Sergey Sharybin
Date:   Tue Aug 17 15:21:18 2021 +0200
Branches: cycles-x
https://developer.blender.org/rBb64cd94cd25f05795221c2d798c9889ccc132c6c

Cycles X: Write all passes on cancel

Makes it possible to cancel rendering and have current state of all
passes written to the render result, matching old behavior.

Differential Revision: https://developer.blender.org/D12246

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

M	intern/cycles/integrator/path_trace.cpp
M	intern/cycles/integrator/render_scheduler.cpp
M	intern/cycles/integrator/render_scheduler.h
M	intern/cycles/render/session.cpp

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

diff --git a/intern/cycles/integrator/path_trace.cpp b/intern/cycles/integrator/path_trace.cpp
index 044098baef0..b21a8c48e1d 100644
--- a/intern/cycles/integrator/path_trace.cpp
+++ b/intern/cycles/integrator/path_trace.cpp
@@ -154,6 +154,9 @@ void PathTrace::render(const RenderWork &render_work)
 
 void PathTrace::render_pipeline(RenderWork render_work)
 {
+  /* NOTE: Only check for "instant" cancel here. Ther user-requested cancel via progress is
+   * checked in Session and the work in the event of cancel is to be finished here. */
+
   render_scheduler_.set_need_schedule_cryptomatte(device_scene_->data.film.cryptomatte_passes !=
                                                   0);
 
@@ -166,22 +169,22 @@ void PathTrace::render_pipeline(RenderWork render_work)
   rebalance(render_work);
 
   path_trace(render_work);
-  if (is_cancel_requested()) {
+  if (render_cancel_.is_requested) {
     return;
   }
 
   adaptive_sample(render_work);
-  if (is_cancel_requested()) {
+  if (render_cancel_.is_requested) {
     return;
   }
 
   cryptomatte_postprocess(render_work);
-  if (is_cancel_requested()) {
+  if (render_cancel_.is_requested) {
     return;
   }
 
   denoise(render_work);
-  if (is_cancel_requested()) {
+  if (render_cancel_.is_requested) {
     return;
   }
 
diff --git a/intern/cycles/integrator/render_scheduler.cpp b/intern/cycles/integrator/render_scheduler.cpp
index b5e9c7d1a3b..7d0012ba705 100644
--- a/intern/cycles/integrator/render_scheduler.cpp
+++ b/intern/cycles/integrator/render_scheduler.cpp
@@ -210,6 +210,19 @@ bool RenderScheduler::render_work_reschedule_on_idle(RenderWork &render_work)
   return false;
 }
 
+void RenderScheduler::render_work_reschedule_on_cancel(RenderWork &render_work)
+{
+  /* Un-schedule samples: they will not be rendered and should not be counted. */
+  state_.num_rendered_samples -= render_work.path_trace.num_samples;
+
+  render_work = RenderWork();
+
+  if (!state_.final_result_was_written) {
+    render_work.write_final_result = true;
+    render_work.update_display = true;
+  }
+}
+
 bool RenderScheduler::done() const
 {
   if (state_.resolution_divider != pixel_size_) {
diff --git a/intern/cycles/integrator/render_scheduler.h b/intern/cycles/integrator/render_scheduler.h
index 261ba125cd3..1178acc7a3d 100644
--- a/intern/cycles/integrator/render_scheduler.h
+++ b/intern/cycles/integrator/render_scheduler.h
@@ -144,6 +144,15 @@ class RenderScheduler {
    * the path tracer is to finish the current pixels) then false is returned. */
   bool render_work_reschedule_on_idle(RenderWork &render_work);
 
+  /* Reschedule work when rendering has been requested to cancel.
+   *
+   * Will skip all work which is not needed anymore because no more samples will be added (for
+   * example, adaptive sampling filtering and convergence check will be skipped).
+   * Will enable all work needed to make sure all passes are communicated to the software.
+   *
+   * NOTE: Should be used before passing work to `PathTrace::render_samples()`. */
+  void render_work_reschedule_on_cancel(RenderWork &render_work);
+
   RenderWork get_render_work();
 
   /* Report that the path tracer started to work, after scene update and loading kernels. */
diff --git a/intern/cycles/render/session.cpp b/intern/cycles/render/session.cpp
index 69ca4df4d54..730d9142434 100644
--- a/intern/cycles/render/session.cpp
+++ b/intern/cycles/render/session.cpp
@@ -159,8 +159,10 @@ bool Session::ready_to_reset()
 
 void Session::run_main_render_loop()
 {
-  while (!progress.get_cancel()) {
-    const RenderWork render_work = run_update_for_next_iteration();
+  while (true) {
+    const bool did_cancel = progress.get_cancel();
+
+    RenderWork render_work = run_update_for_next_iteration();
 
     if (!render_work) {
       if (VLOG_IS_ON(2)) {
@@ -177,12 +179,14 @@ void Session::run_main_render_loop()
       }
     }
 
-    if (run_wait_for_work(render_work)) {
-      continue;
+    if (did_cancel) {
+      render_scheduler_.render_work_reschedule_on_cancel(render_work);
+      if (!render_work) {
+        break;
+      }
     }
-
-    if (progress.get_cancel()) {
-      break;
+    else if (run_wait_for_work(render_work)) {
+      continue;
     }
 
     {
@@ -209,6 +213,10 @@ void Session::run_main_render_loop()
     }
 
     progress.set_update();
+
+    if (did_cancel) {
+      break;
+    }
   }
 }



More information about the Bf-blender-cvs mailing list