[Bf-blender-cvs] [03848955463] cycles-x: Cycles X: Use display pass directly from Film

Sergey Sharybin noreply at git.blender.org
Wed Aug 18 17:10:18 CEST 2021


Commit: 03848955463fbacd9f4621f92309e090999aff02
Author: Sergey Sharybin
Date:   Tue Aug 17 14:31:52 2021 +0200
Branches: cycles-x
https://developer.blender.org/rB03848955463fbacd9f4621f92309e090999aff02

Cycles X: Use display pass directly from Film

Previously the display pass was used from the KernelFilm, which
requires a device update between display pass modification and GPU
display update. Such update is avoidable by using display pass from
film.

With the current state of the code should not be user level changes,
but this allows to have more instant display pass update when GPU
display is used for non-interactive rendering.

Possible improvement would be to separate display pass from node graph
so that change to film's display pass does not cause `device_update`.

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

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

M	intern/cycles/integrator/pass_accessor.cpp
M	intern/cycles/integrator/path_trace.cpp
M	intern/cycles/integrator/path_trace.h
M	intern/cycles/integrator/path_trace_work.cpp
M	intern/cycles/integrator/path_trace_work.h
M	intern/cycles/integrator/path_trace_work_cpu.cpp
M	intern/cycles/integrator/path_trace_work_cpu.h
M	intern/cycles/integrator/path_trace_work_gpu.cpp
M	intern/cycles/integrator/path_trace_work_gpu.h
M	intern/cycles/kernel/kernel_types.h
M	intern/cycles/render/film.cpp
M	intern/cycles/render/session.cpp

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

diff --git a/intern/cycles/integrator/pass_accessor.cpp b/intern/cycles/integrator/pass_accessor.cpp
index bc137195e8e..60737af1871 100644
--- a/intern/cycles/integrator/pass_accessor.cpp
+++ b/intern/cycles/integrator/pass_accessor.cpp
@@ -146,6 +146,10 @@ bool PassAccessor::get_render_tile_pixels(const RenderBuffers *render_buffers,
     return false;
   }
 
+  if (pass_access_info_.offset == PASS_UNUSED) {
+    return false;
+  }
+
   const PassType type = pass_access_info_.type;
   const PassMode mode = pass_access_info_.mode;
   const PassInfo pass_info = Pass::get_info(type, pass_access_info_.include_albedo);
diff --git a/intern/cycles/integrator/path_trace.cpp b/intern/cycles/integrator/path_trace.cpp
index b21a8c48e1d..af995d7500f 100644
--- a/intern/cycles/integrator/path_trace.cpp
+++ b/intern/cycles/integrator/path_trace.cpp
@@ -53,7 +53,10 @@ class TempCPURenderBuffers {
 
 }  // namespace
 
-PathTrace::PathTrace(Device *device, DeviceScene *device_scene, RenderScheduler &render_scheduler)
+PathTrace::PathTrace(Device *device,
+                     Film *film,
+                     DeviceScene *device_scene,
+                     RenderScheduler &render_scheduler)
     : device_(device), device_scene_(device_scene), render_scheduler_(render_scheduler)
 {
   DCHECK_NE(device_, nullptr);
@@ -61,8 +64,8 @@ PathTrace::PathTrace(Device *device, DeviceScene *device_scene, RenderScheduler
   /* Create path tracing work in advance, so that it can be reused by incremental sampling as much
    * as possible. */
   device_->foreach_device([&](Device *path_trace_device) {
-    path_trace_works_.emplace_back(
-        PathTraceWork::create(path_trace_device, device_scene, &render_cancel_.is_requested));
+    path_trace_works_.emplace_back(PathTraceWork::create(
+        path_trace_device, film, device_scene, &render_cancel_.is_requested));
   });
 
   work_balance_infos_.resize(path_trace_works_.size());
diff --git a/intern/cycles/integrator/path_trace.h b/intern/cycles/integrator/path_trace.h
index 8911ca0b698..0e4f94c0811 100644
--- a/intern/cycles/integrator/path_trace.h
+++ b/intern/cycles/integrator/path_trace.h
@@ -31,6 +31,7 @@ CCL_NAMESPACE_BEGIN
 class AdaptiveSampling;
 class Device;
 class DeviceScene;
+class Film;
 class RenderBuffers;
 class RenderScheduler;
 class RenderWork;
@@ -48,7 +49,10 @@ class PathTrace {
  public:
   /* Render scheduler is used to report timing information and access things like start/finish
    * sample. */
-  PathTrace(Device *device, DeviceScene *device_scene, RenderScheduler &render_scheduler);
+  PathTrace(Device *device,
+            Film *film,
+            DeviceScene *device_scene,
+            RenderScheduler &render_scheduler);
 
   /* Create devices and load kernels which are created on-demand (for example, denoising devices).
    * The progress is reported to the currently configure progress object (via `set_progress`). */
diff --git a/intern/cycles/integrator/path_trace_work.cpp b/intern/cycles/integrator/path_trace_work.cpp
index e7a026d472c..5df80038342 100644
--- a/intern/cycles/integrator/path_trace_work.cpp
+++ b/intern/cycles/integrator/path_trace_work.cpp
@@ -20,6 +20,7 @@
 #include "integrator/path_trace_work_cpu.h"
 #include "integrator/path_trace_work_gpu.h"
 #include "render/buffers.h"
+#include "render/film.h"
 #include "render/scene.h"
 
 #include "kernel/kernel_types.h"
@@ -27,20 +28,23 @@
 CCL_NAMESPACE_BEGIN
 
 unique_ptr<PathTraceWork> PathTraceWork::create(Device *device,
+                                                Film *film,
                                                 DeviceScene *device_scene,
                                                 bool *cancel_requested_flag)
 {
   if (device->info.type == DEVICE_CPU) {
-    return make_unique<PathTraceWorkCPU>(device, device_scene, cancel_requested_flag);
+    return make_unique<PathTraceWorkCPU>(device, film, device_scene, cancel_requested_flag);
   }
 
-  return make_unique<PathTraceWorkGPU>(device, device_scene, cancel_requested_flag);
+  return make_unique<PathTraceWorkGPU>(device, film, device_scene, cancel_requested_flag);
 }
 
 PathTraceWork::PathTraceWork(Device *device,
+                             Film *film,
                              DeviceScene *device_scene,
                              bool *cancel_requested_flag)
     : device_(device),
+      film_(film),
       device_scene_(device_scene),
       buffers_(make_unique<RenderBuffers>(device)),
       effective_buffer_params_(buffers_->params),
@@ -153,22 +157,27 @@ PassAccessor::PassAccessInfo PathTraceWork::get_display_pass_access_info(PassMod
   const KernelFilm &kfilm = device_scene_->data.film;
   const KernelBackground &kbackground = device_scene_->data.background;
 
+  const BufferParams &params = buffers_->params;
+
   PassAccessor::PassAccessInfo pass_access_info;
-  pass_access_info.type = static_cast<PassType>(kfilm.display_pass_type);
+  pass_access_info.type = film_->get_display_pass();
+  pass_access_info.offset = PASS_UNUSED;
 
-  if (pass_mode == PassMode::DENOISED && kfilm.display_pass_denoised_offset != PASS_UNUSED) {
+  if (pass_mode == PassMode::DENOISED) {
     pass_access_info.mode = PassMode::DENOISED;
-    pass_access_info.offset = kfilm.display_pass_denoised_offset;
+    pass_access_info.offset = params.get_pass_offset(pass_access_info.type, PassMode::DENOISED);
   }
-  else {
+
+  if (pass_access_info.offset == PASS_UNUSED) {
     pass_access_info.mode = PassMode::NOISY;
-    pass_access_info.offset = kfilm.display_pass_offset;
+    pass_access_info.offset = params.get_pass_offset(pass_access_info.type);
   }
 
   pass_access_info.use_approximate_shadow_catcher = kfilm.use_approximate_shadow_catcher;
   pass_access_info.use_approximate_shadow_catcher_background =
       kfilm.use_approximate_shadow_catcher && !kbackground.transparent;
-  pass_access_info.show_active_pixels = kfilm.show_active_pixels;
+
+  pass_access_info.show_active_pixels = film_->get_show_active_pixels();
 
   return pass_access_info;
 }
diff --git a/intern/cycles/integrator/path_trace_work.h b/intern/cycles/integrator/path_trace_work.h
index 84f0dc182bb..d770ac6e59d 100644
--- a/intern/cycles/integrator/path_trace_work.h
+++ b/intern/cycles/integrator/path_trace_work.h
@@ -27,6 +27,7 @@ CCL_NAMESPACE_BEGIN
 class BufferParams;
 class Device;
 class DeviceScene;
+class Film;
 class GPUDisplay;
 class RenderBuffers;
 
@@ -38,6 +39,7 @@ class PathTraceWork {
    * possible. This could be, for rexample, request to cancel rendering on camera navigation in
    * viewport. */
   static unique_ptr<PathTraceWork> create(Device *device,
+                                          Film *film,
                                           DeviceScene *device_scene,
                                           bool *cancel_requested_flag);
 
@@ -143,7 +145,10 @@ class PathTraceWork {
   }
 
  protected:
-  PathTraceWork(Device *device, DeviceScene *device_scene, bool *cancel_requested_flag);
+  PathTraceWork(Device *device,
+                Film *film,
+                DeviceScene *device_scene,
+                bool *cancel_requested_flag);
 
   virtual PassAccessor::PassAccessInfo get_display_pass_access_info(PassMode pass_mode) const;
 
@@ -151,6 +156,10 @@ class PathTraceWork {
    * Note that it is an actual render device (and never is a multi-device). */
   Device *device_;
 
+  /* Film is used to access display pass configuration for GPU display update.
+   * Note that only fields which are not a part of kernel data can be accessed via the Film. */
+  Film *film_;
+
   /* Device side scene storage, that may be used for integrator logic. */
   DeviceScene *device_scene_;
 
diff --git a/intern/cycles/integrator/path_trace_work_cpu.cpp b/intern/cycles/integrator/path_trace_work_cpu.cpp
index fe26b66ca79..9e0026dec0a 100644
--- a/intern/cycles/integrator/path_trace_work_cpu.cpp
+++ b/intern/cycles/integrator/path_trace_work_cpu.cpp
@@ -52,9 +52,10 @@ static inline CPUKernelThreadGlobals *kernel_thread_globals_get(
 }
 
 PathTraceWorkCPU::PathTraceWorkCPU(Device *device,
+                                   Film *film,
                                    DeviceScene *device_scene,
                                    bool *cancel_requested_flag)
-    : PathTraceWork(device, device_scene, cancel_requested_flag),
+    : PathTraceWork(device, film, device_scene, cancel_requested_flag),
       kernels_(*(device->get_cpu_kernels()))
 {
   DCHECK_EQ(device->info.type, DEVICE_CPU);
diff --git a/intern/cycles/integrator/path_trace_work_cpu.h b/intern/cycles/integrator/path_trace_work_cpu.h
index 34027150661..c94f8c0fb89 100644
--- a/intern/cycles/integrator/path_trace_work_cpu.h
+++ b/intern/cycles/integrator/path_trace_work_cpu.h
@@ -39,7 +39,10 @@ class CPUKernels;
  * queues on the render device which makes this work be only usable on CPU. */
 class PathTraceWorkCPU : public PathTraceWork {
  public:
-  PathTraceWorkCPU(Device *device, DeviceScene *device_scene, bool *cancel_requested_flag);
+  PathTraceWorkCPU(Device *device,
+                   Film *film,
+                   DeviceScene *device_scene,
+                   bool *cancel_requested_flag);
 
   virtual void init_execution() override;
 
diff --git a/intern/cycles/integrator/path_trace_work_gpu.cpp b/intern/cycles/integrator/path_trace_work_gpu.cpp
index a37b678cd91..9c380f51195 100644
--- a/intern/cycles/integrator/path_trace_work_gpu.cpp
+++ b/intern/cycles/integrator/path_trace_work_gpu.cpp
@@ -31,9 +31,10 @@
 CCL_NAMESPACE_BEGIN
 
 PathTraceWorkGPU::PathTraceWorkGPU(Device *device,
+                                   Film *film,
                                    DeviceScene *device_scene,
                                    bool *cancel_requested_flag)
-    : PathTraceWork(device, device_scene, cancel_requested_flag),
+    : PathTraceWork(device, film, device_scene, cancel_requested_flag),
       queue_(device->gpu_queue_create()),
       integrator_state_soa_kernel_features_(0),
       integrator_queue_counter_(device, "integrator_queue_counter", MEM_READ_WRITE),
diff --git a/intern/cycles/integrator/path_trace_work_gpu.h b/intern/cycles/integrator/path_trace_work_gpu.h
index f339be59799..3631980aa81 100644

@@ Diff output truncated at 10240 characters. @@



More information about the Bf-blender-cvs mailing list