[Bf-blender-cvs] [e2856c85e45] cycles-x: Cycles X: first step to restore baking support

Brecht Van Lommel noreply at git.blender.org
Mon Jun 7 18:39:36 CEST 2021


Commit: e2856c85e45d4ef23eea22926da09d3bab9ce724
Author: Brecht Van Lommel
Date:   Tue May 4 14:51:10 2021 +0200
Branches: cycles-x
https://developer.blender.org/rBe2856c85e45d4ef23eea22926da09d3bab9ce724

Cycles X: first step to restore baking support

Minimal changes to get the baking pipeline operational, only bakes the Combined
pass.
* Add integrator_init_from_bake kernel, that reads the primitive and uv from
  the render passes and sets up data structures for shade_surface.
* Add back support for reading render passes from Blender.

Since this reuses most of the path tracing code, baking now works with OptiX,
adaptive sampling and denoising.

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

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

M	intern/cycles/blender/addon/ui.py
M	intern/cycles/blender/blender_session.cpp
M	intern/cycles/blender/blender_session.h
M	intern/cycles/device/cpu/kernel.cpp
M	intern/cycles/device/cpu/kernel.h
M	intern/cycles/device/cuda/queue.cpp
M	intern/cycles/device/device_kernel.cpp
M	intern/cycles/device/optix/device_impl.cpp
M	intern/cycles/device/optix/queue.cpp
M	intern/cycles/integrator/pass_accessor.cpp
M	intern/cycles/integrator/pass_accessor.h
M	intern/cycles/integrator/path_trace.cpp
M	intern/cycles/integrator/path_trace.h
M	intern/cycles/integrator/path_trace_work_cpu.cpp
M	intern/cycles/integrator/path_trace_work_gpu.cpp
M	intern/cycles/kernel/CMakeLists.txt
M	intern/cycles/kernel/device/cpu/kernel_arch.h
M	intern/cycles/kernel/device/cpu/kernel_arch_impl.h
M	intern/cycles/kernel/device/cuda/kernel.cu
A	intern/cycles/kernel/integrator/integrator_init_from_bake.h
M	intern/cycles/kernel/integrator/integrator_state_flow.h
M	intern/cycles/kernel/kernel_types.h
M	intern/cycles/render/bake.cpp
M	intern/cycles/render/buffers.cpp
M	intern/cycles/render/buffers.h
M	intern/cycles/render/session.cpp
M	intern/cycles/render/session.h

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

diff --git a/intern/cycles/blender/addon/ui.py b/intern/cycles/blender/addon/ui.py
index 307445a722d..6f764c84fba 100644
--- a/intern/cycles/blender/addon/ui.py
+++ b/intern/cycles/blender/addon/ui.py
@@ -1643,9 +1643,6 @@ class CYCLES_RENDER_PT_bake(CyclesButtonsPanel, Panel):
         cbk = scene.render.bake
         rd = scene.render
 
-        if use_optix(context):
-            layout.label(text="Baking is performed using CUDA instead of OptiX", icon='INFO')
-
         if rd.use_bake_multires:
             layout.operator("object.bake_image", icon='RENDER_STILL')
             layout.prop(rd, "use_bake_multires")
diff --git a/intern/cycles/blender/blender_session.cpp b/intern/cycles/blender/blender_session.cpp
index c52934c3e73..3f1a47da5aa 100644
--- a/intern/cycles/blender/blender_session.cpp
+++ b/intern/cycles/blender/blender_session.cpp
@@ -352,6 +352,44 @@ void BlenderSession::do_write_update_render_tile(bool do_update_only)
   b_engine.end_result(b_rr, true, false, true);
 }
 
+void BlenderSession::read_render_tile()
+{
+  const int2 tile_offset = session->get_render_tile_offset();
+  const int2 tile_size = session->get_render_tile_size();
+
+  /* get render result */
+  BL::RenderResult b_rr = b_engine.begin_result(tile_offset.x,
+                                                tile_offset.y,
+                                                tile_size.x,
+                                                tile_size.y,
+                                                b_rlay_name.c_str(),
+                                                b_rview_name.c_str());
+
+  /* can happen if the intersected rectangle gives 0 width or height */
+  if (b_rr.ptr.data == NULL) {
+    return;
+  }
+
+  BL::RenderResult::layers_iterator b_single_rlay;
+  b_rr.layers.begin(b_single_rlay);
+
+  /* layer will be missing if it was disabled in the UI */
+  if (b_single_rlay == b_rr.layers.end())
+    return;
+
+  BL::RenderLayer b_rlay = *b_single_rlay;
+
+  vector<float> pixels(tile_size.x * tile_size.y * 4);
+
+  /* Copy each pass.
+   * TODO:copy only the required ones for better performance? */
+  for (BL::RenderPass &b_pass : b_rlay.passes) {
+    session->set_render_tile_pixels(b_pass.name(), b_pass.channels(), (float *)b_pass.rect());
+  }
+
+  b_engine.end_result(b_rr, false, false, false);
+}
+
 void BlenderSession::write_render_tile()
 {
   do_write_update_render_tile(false);
@@ -594,6 +632,7 @@ void BlenderSession::bake(BL::Depsgraph &b_depsgraph_,
    * name. */
   Pass::add(PASS_COMBINED, scene->passes, "Combined");
 
+  session->read_render_tile_cb = [&]() { read_render_tile(); };
   session->write_render_tile_cb = [&]() { write_render_tile(); };
 
   if (!session->progress.get_cancel()) {
@@ -637,6 +676,7 @@ void BlenderSession::bake(BL::Depsgraph &b_depsgraph_,
     session->wait();
   }
 
+  session->read_render_tile_cb = function_null;
   session->write_render_tile_cb = function_null;
 }
 
diff --git a/intern/cycles/blender/blender_session.h b/intern/cycles/blender/blender_session.h
index ce491615b89..439ae292c56 100644
--- a/intern/cycles/blender/blender_session.h
+++ b/intern/cycles/blender/blender_session.h
@@ -75,6 +75,9 @@ class BlenderSession {
   void update_render_result(BL::RenderLayer &b_rlay);
   void update_render_tile();
 
+  /* read functions for baking input */
+  void read_render_tile();
+
   /* interactive updates */
   void synchronize(BL::Depsgraph &b_depsgraph);
 
diff --git a/intern/cycles/device/cpu/kernel.cpp b/intern/cycles/device/cpu/kernel.cpp
index 59daf836560..d9c8e5bd373 100644
--- a/intern/cycles/device/cpu/kernel.cpp
+++ b/intern/cycles/device/cpu/kernel.cpp
@@ -30,6 +30,7 @@ CCL_NAMESPACE_BEGIN
 CPUKernels::CPUKernels()
     : /* Integrator. */
       REGISTER_KERNEL(integrator_init_from_camera),
+      REGISTER_KERNEL(integrator_init_from_bake),
       REGISTER_KERNEL(integrator_intersect_closest),
       REGISTER_KERNEL(integrator_intersect_shadow),
       REGISTER_KERNEL(integrator_intersect_subsurface),
diff --git a/intern/cycles/device/cpu/kernel.h b/intern/cycles/device/cpu/kernel.h
index b691061b2a3..62497d21ecd 100644
--- a/intern/cycles/device/cpu/kernel.h
+++ b/intern/cycles/device/cpu/kernel.h
@@ -39,6 +39,7 @@ class CPUKernels {
                                                             ccl_global float *render_buffer)>;
 
   IntegratorInitFunction integrator_init_from_camera;
+  IntegratorInitFunction integrator_init_from_bake;
   IntegratorFunction integrator_intersect_closest;
   IntegratorFunction integrator_intersect_shadow;
   IntegratorFunction integrator_intersect_subsurface;
diff --git a/intern/cycles/device/cuda/queue.cpp b/intern/cycles/device/cuda/queue.cpp
index 09131176223..7b00e918a1d 100644
--- a/intern/cycles/device/cuda/queue.cpp
+++ b/intern/cycles/device/cuda/queue.cpp
@@ -99,6 +99,7 @@ bool CUDADeviceQueue::enqueue(DeviceKernel kernel, const int work_size, void *ar
       shared_mem_bytes = (num_threads_per_block + 1) * sizeof(int);
       break;
     case DEVICE_KERNEL_INTEGRATOR_INIT_FROM_CAMERA:
+    case DEVICE_KERNEL_INTEGRATOR_INIT_FROM_BAKE:
     case DEVICE_KERNEL_INTEGRATOR_INTERSECT_CLOSEST:
     case DEVICE_KERNEL_INTEGRATOR_INTERSECT_SHADOW:
     case DEVICE_KERNEL_INTEGRATOR_INTERSECT_SUBSURFACE:
diff --git a/intern/cycles/device/device_kernel.cpp b/intern/cycles/device/device_kernel.cpp
index 49ab49d404d..345d0befc0e 100644
--- a/intern/cycles/device/device_kernel.cpp
+++ b/intern/cycles/device/device_kernel.cpp
@@ -26,6 +26,8 @@ const char *device_kernel_as_string(DeviceKernel kernel)
     /* Integrator. */
     case DEVICE_KERNEL_INTEGRATOR_INIT_FROM_CAMERA:
       return "integrator_init_from_camera";
+    case DEVICE_KERNEL_INTEGRATOR_INIT_FROM_BAKE:
+      return "integrator_init_from_bake";
     case DEVICE_KERNEL_INTEGRATOR_INTERSECT_CLOSEST:
       return "integrator_intersect_closest";
     case DEVICE_KERNEL_INTEGRATOR_INTERSECT_SHADOW:
diff --git a/intern/cycles/device/optix/device_impl.cpp b/intern/cycles/device/optix/device_impl.cpp
index 558fb09b3e0..c026daaf287 100644
--- a/intern/cycles/device/optix/device_impl.cpp
+++ b/intern/cycles/device/optix/device_impl.cpp
@@ -141,11 +141,6 @@ unique_ptr<DeviceQueue> OptiXDevice::gpu_queue_create()
 
 BVHLayoutMask OptiXDevice::get_bvh_layout_mask() const
 {
-  /* CUDA kernels are used when doing baking, so need to build a BVH those can understand too! */
-  if (optix_module == NULL) {
-    return CUDADevice::get_bvh_layout_mask();
-  }
-
   /* OptiX has its own internal acceleration structure format. */
   return BVH_LAYOUT_OPTIX;
 }
@@ -181,10 +176,8 @@ bool OptiXDevice::load_kernels(const DeviceRequestedFeatures &requested_features
     return false;
   }
 
-  /* Baking is currently performed using CUDA, so no need to load OptiX kernels.
-   * Can also skip creating OptiX module if only doing denoising (no path tracing).
-   */
-  if (requested_features.use_baking || !requested_features.use_path_tracing) {
+  /* Skip creating OptiX module if only doing denoising. */
+  if (!(requested_features.use_path_tracing || requested_features.use_baking)) {
     return true;
   }
 
@@ -930,12 +923,6 @@ bool OptiXDevice::build_optix_bvh(BVHOptiX *bvh,
 
 void OptiXDevice::build_bvh(BVH *bvh, Progress &progress, bool refit)
 {
-  if (bvh->params.bvh_layout == BVH_LAYOUT_BVH2) {
-    /* For baking CUDA is used, build appropriate BVH for that. */
-    Device::build_bvh(bvh, progress, refit);
-    return;
-  }
-
   const bool use_fast_trace_bvh = (bvh->params.bvh_type == BVH_TYPE_STATIC);
 
   free_bvh_memory_delayed();
diff --git a/intern/cycles/device/optix/queue.cpp b/intern/cycles/device/optix/queue.cpp
index 573a618a7c7..dc99e1e0ed7 100644
--- a/intern/cycles/device/optix/queue.cpp
+++ b/intern/cycles/device/optix/queue.cpp
@@ -105,6 +105,7 @@ bool OptiXDeviceQueue::enqueue(DeviceKernel kernel, const int work_size, void *a
       break;
 
     case DEVICE_KERNEL_INTEGRATOR_INIT_FROM_CAMERA:
+    case DEVICE_KERNEL_INTEGRATOR_INIT_FROM_BAKE:
     case DEVICE_KERNEL_INTEGRATOR_SHADE_BACKGROUND:
     case DEVICE_KERNEL_INTEGRATOR_SHADE_LIGHT:
     case DEVICE_KERNEL_INTEGRATOR_SHADE_SURFACE:
diff --git a/intern/cycles/integrator/pass_accessor.cpp b/intern/cycles/integrator/pass_accessor.cpp
index 0d8312932c1..5b75cb42660 100644
--- a/intern/cycles/integrator/pass_accessor.cpp
+++ b/intern/cycles/integrator/pass_accessor.cpp
@@ -71,6 +71,15 @@ PassAccessor::Destination::Destination(const PassType pass_type)
   }
 }
 
+/* --------------------------------------------------------------------
+ * Pass source.
+ */
+
+PassAccessor::Source::Source(const float *pixels, int num_components)
+    : pixels(pixels), num_components(num_components)
+{
+}
+
 /* --------------------------------------------------------------------
  * Pass accessor.
  */
@@ -266,4 +275,27 @@ void PassAccessor::init_kernel_film_convert(KernelFilmConvert *kfilm_convert,
   kfilm_convert->show_active_pixels = pass_access_info_.show_active_pixels;
 }
 
+bool PassAccessor::set_render_tile_pixels(RenderBuffers *render_buffers, const Source &source)
+{
+  if (render_buffers == nullptr || render_buffers->buffer.data() == nullptr) {
+    return false;
+  }
+
+  const BufferParams &buffer_params = render_buffers->params;
+
+  float *buffer_data = render_buffers->buffer.data();
+  const int pass_stride = buffer_params.pass_stride;
+  const int size = buffer_params.width * buffer_params.height;
+  const int num_components = source.num_components;
+
+  float *out = buffer_data + pass_access_info_.offset;
+  const float *in = source.pixels;
+
+  for (int i = 0; i < size; i++, out += pass_stride, in += num_components) {
+    memcpy(out, in, sizeof(float) * num_components);
+  }
+
+  return true;
+}
+
 CCL_NAMESPACE_END
diff --git a/intern/cycles/integrator/pass_accessor.h b/intern/cycles/integrator/pass_accessor.h
index 88e38e91003..69046533c64 100644
--- a/intern/cycles/integrator/pass_accessor.h
+++ b/intern/cycles/integrator/pass_accessor.h
@@ -70,6 +70,16 @@ class PassAccessor {
     int num_components = 0;
   };
 
+  class Source {
+   public:
+    Source() = default;
+    Source(const float *pixels, int num_components);
+
+    /* CPU-side pointers. only usable 

@@ Diff output truncated at 10240 characters. @@



More information about the Bf-blender-cvs mailing list