[Bf-blender-cvs] [e5cba662a41] cycles-x: Cycles X: support cameras inside volumes

Brecht Van Lommel noreply at git.blender.org
Fri Jul 9 17:22:12 CEST 2021


Commit: e5cba662a41884c0daaeb0eb246303180baa2f80
Author: Brecht Van Lommel
Date:   Fri Jul 9 14:16:56 2021 +0200
Branches: cycles-x
https://developer.blender.org/rBe5cba662a41884c0daaeb0eb246303180baa2f80

Cycles X: support cameras inside volumes

Adds a new integrator_intersect_volume_stack kernel to initialize the
volume stack after camera rays.

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

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

M	intern/cycles/device/cpu/kernel.cpp
M	intern/cycles/device/cpu/kernel.h
M	intern/cycles/device/device_kernel.cpp
M	intern/cycles/device/optix/device_impl.cpp
M	intern/cycles/device/optix/device_impl.h
M	intern/cycles/device/optix/queue.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
M	intern/cycles/kernel/device/optix/kernel.cu
M	intern/cycles/kernel/integrator/integrator_init_from_camera.h
A	intern/cycles/kernel/integrator/integrator_intersect_volume_stack.h
M	intern/cycles/kernel/integrator/integrator_megakernel.h
M	intern/cycles/kernel/integrator/integrator_volume_stack.h
M	intern/cycles/kernel/kernel_types.h

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

diff --git a/intern/cycles/device/cpu/kernel.cpp b/intern/cycles/device/cpu/kernel.cpp
index d9c8e5bd373..ed91644646e 100644
--- a/intern/cycles/device/cpu/kernel.cpp
+++ b/intern/cycles/device/cpu/kernel.cpp
@@ -34,6 +34,7 @@ CPUKernels::CPUKernels()
       REGISTER_KERNEL(integrator_intersect_closest),
       REGISTER_KERNEL(integrator_intersect_shadow),
       REGISTER_KERNEL(integrator_intersect_subsurface),
+      REGISTER_KERNEL(integrator_intersect_volume_stack),
       REGISTER_KERNEL(integrator_shade_background),
       REGISTER_KERNEL(integrator_shade_light),
       REGISTER_KERNEL(integrator_shade_shadow),
diff --git a/intern/cycles/device/cpu/kernel.h b/intern/cycles/device/cpu/kernel.h
index 62497d21ecd..f05c1e71d66 100644
--- a/intern/cycles/device/cpu/kernel.h
+++ b/intern/cycles/device/cpu/kernel.h
@@ -43,6 +43,7 @@ class CPUKernels {
   IntegratorFunction integrator_intersect_closest;
   IntegratorFunction integrator_intersect_shadow;
   IntegratorFunction integrator_intersect_subsurface;
+  IntegratorFunction integrator_intersect_volume_stack;
   IntegratorShadeFunction integrator_shade_background;
   IntegratorShadeFunction integrator_shade_light;
   IntegratorShadeFunction integrator_shade_shadow;
diff --git a/intern/cycles/device/device_kernel.cpp b/intern/cycles/device/device_kernel.cpp
index e5e1ff6859d..648ee090ce7 100644
--- a/intern/cycles/device/device_kernel.cpp
+++ b/intern/cycles/device/device_kernel.cpp
@@ -34,6 +34,8 @@ const char *device_kernel_as_string(DeviceKernel kernel)
       return "integrator_intersect_shadow";
     case DEVICE_KERNEL_INTEGRATOR_INTERSECT_SUBSURFACE:
       return "integrator_intersect_subsurface";
+    case DEVICE_KERNEL_INTEGRATOR_INTERSECT_VOLUME_STACK:
+      return "integrator_intersect_volume_stack";
     case DEVICE_KERNEL_INTEGRATOR_SHADE_BACKGROUND:
       return "integrator_shade_background";
     case DEVICE_KERNEL_INTEGRATOR_SHADE_LIGHT:
diff --git a/intern/cycles/device/optix/device_impl.cpp b/intern/cycles/device/optix/device_impl.cpp
index 0c0b69e37c7..298b384797e 100644
--- a/intern/cycles/device/optix/device_impl.cpp
+++ b/intern/cycles/device/optix/device_impl.cpp
@@ -311,6 +311,10 @@ bool OptiXDevice::load_kernels(const DeviceRequestedFeatures &requested_features
   group_descs[PG_RGEN_INTERSECT_SUBSURFACE].raygen.module = optix_module;
   group_descs[PG_RGEN_INTERSECT_SUBSURFACE].raygen.entryFunctionName =
       "__raygen__kernel_optix_integrator_intersect_subsurface";
+  group_descs[PG_RGEN_INTERSECT_VOLUME_STACK].kind = OPTIX_PROGRAM_GROUP_KIND_RAYGEN;
+  group_descs[PG_RGEN_INTERSECT_VOLUME_STACK].raygen.module = optix_module;
+  group_descs[PG_RGEN_INTERSECT_VOLUME_STACK].raygen.entryFunctionName =
+      "__raygen__kernel_optix_integrator_intersect_volume_stack";
   group_descs[PG_MISS].kind = OPTIX_PROGRAM_GROUP_KIND_MISS;
   group_descs[PG_MISS].miss.module = optix_module;
   group_descs[PG_MISS].miss.entryFunctionName = "__miss__kernel_optix_miss";
@@ -476,6 +480,7 @@ bool OptiXDevice::load_kernels(const DeviceRequestedFeatures &requested_features
     pipeline_groups.push_back(groups[PG_RGEN_INTERSECT_CLOSEST]);
     pipeline_groups.push_back(groups[PG_RGEN_INTERSECT_SHADOW]);
     pipeline_groups.push_back(groups[PG_RGEN_INTERSECT_SUBSURFACE]);
+    pipeline_groups.push_back(groups[PG_RGEN_INTERSECT_VOLUME_STACK]);
     pipeline_groups.push_back(groups[PG_MISS]);
     pipeline_groups.push_back(groups[PG_HITD]);
     pipeline_groups.push_back(groups[PG_HITS]);
@@ -497,10 +502,12 @@ bool OptiXDevice::load_kernels(const DeviceRequestedFeatures &requested_features
                                      &pipelines[PIP_INTERSECT]));
 
     /* Calculate continuation stack size based on the maximum of all ray generation stack sizes. */
-    const unsigned int css = std::max(stack_size[PG_RGEN_INTERSECT_CLOSEST].cssRG,
-                                      std::max(stack_size[PG_RGEN_INTERSECT_SHADOW].cssRG,
-                                               stack_size[PG_RGEN_INTERSECT_SUBSURFACE].cssRG)) +
-                             link_options.maxTraceDepth * trace_css;
+    const unsigned int css =
+        std::max(stack_size[PG_RGEN_INTERSECT_CLOSEST].cssRG,
+                 std::max(stack_size[PG_RGEN_INTERSECT_SHADOW].cssRG,
+                          std::max(stack_size[PG_RGEN_INTERSECT_SUBSURFACE].cssRG,
+                                   stack_size[PG_RGEN_INTERSECT_VOLUME_STACK].cssRG))) +
+        link_options.maxTraceDepth * trace_css;
 
     optix_assert(
         optixPipelineSetStackSize(pipelines[PIP_INTERSECT], 0, 0, css, motion_blur ? 3 : 2));
diff --git a/intern/cycles/device/optix/device_impl.h b/intern/cycles/device/optix/device_impl.h
index dff955363c5..55b0050aafb 100644
--- a/intern/cycles/device/optix/device_impl.h
+++ b/intern/cycles/device/optix/device_impl.h
@@ -34,6 +34,7 @@ enum {
   PG_RGEN_INTERSECT_CLOSEST,
   PG_RGEN_INTERSECT_SHADOW,
   PG_RGEN_INTERSECT_SUBSURFACE,
+  PG_RGEN_INTERSECT_VOLUME_STACK,
   PG_RGEN_SHADE_SURFACE_RAYTRACE,
   PG_MISS,
   PG_HITD, /* Default hit group. */
diff --git a/intern/cycles/device/optix/queue.cpp b/intern/cycles/device/optix/queue.cpp
index bd8cd7e4a75..458ed70baa8 100644
--- a/intern/cycles/device/optix/queue.cpp
+++ b/intern/cycles/device/optix/queue.cpp
@@ -43,7 +43,8 @@ static bool is_optix_specific_kernel(DeviceKernel kernel)
   return (kernel == DEVICE_KERNEL_INTEGRATOR_SHADE_SURFACE_RAYTRACE ||
           kernel == DEVICE_KERNEL_INTEGRATOR_INTERSECT_CLOSEST ||
           kernel == DEVICE_KERNEL_INTEGRATOR_INTERSECT_SHADOW ||
-          kernel == DEVICE_KERNEL_INTEGRATOR_INTERSECT_SUBSURFACE);
+          kernel == DEVICE_KERNEL_INTEGRATOR_INTERSECT_SUBSURFACE ||
+          kernel == DEVICE_KERNEL_INTEGRATOR_INTERSECT_VOLUME_STACK);
 }
 
 bool OptiXDeviceQueue::enqueue(DeviceKernel kernel, const int work_size, void *args[])
@@ -103,6 +104,10 @@ bool OptiXDeviceQueue::enqueue(DeviceKernel kernel, const int work_size, void *a
       pipeline = optix_device->pipelines[PIP_INTERSECT];
       sbt_params.raygenRecord = sbt_data_ptr + PG_RGEN_INTERSECT_SUBSURFACE * sizeof(SbtRecord);
       break;
+    case DEVICE_KERNEL_INTEGRATOR_INTERSECT_VOLUME_STACK:
+      pipeline = optix_device->pipelines[PIP_INTERSECT];
+      sbt_params.raygenRecord = sbt_data_ptr + PG_RGEN_INTERSECT_VOLUME_STACK * sizeof(SbtRecord);
+      break;
 
     default:
       LOG(ERROR) << "Invalid kernel " << device_kernel_as_string(kernel)
diff --git a/intern/cycles/integrator/path_trace_work_gpu.cpp b/intern/cycles/integrator/path_trace_work_gpu.cpp
index a152d987f41..35c85166252 100644
--- a/intern/cycles/integrator/path_trace_work_gpu.cpp
+++ b/intern/cycles/integrator/path_trace_work_gpu.cpp
@@ -316,7 +316,8 @@ void PathTraceWorkGPU::enqueue_path_iteration(DeviceKernel kernel)
   switch (kernel) {
     case DEVICE_KERNEL_INTEGRATOR_INTERSECT_CLOSEST:
     case DEVICE_KERNEL_INTEGRATOR_INTERSECT_SHADOW:
-    case DEVICE_KERNEL_INTEGRATOR_INTERSECT_SUBSURFACE: {
+    case DEVICE_KERNEL_INTEGRATOR_INTERSECT_SUBSURFACE:
+    case DEVICE_KERNEL_INTEGRATOR_INTERSECT_VOLUME_STACK: {
       /* Ray intersection kernels with integrator state. */
       void *args[] = {&d_path_index, const_cast<int *>(&work_size)};
 
diff --git a/intern/cycles/kernel/CMakeLists.txt b/intern/cycles/kernel/CMakeLists.txt
index e09d1907e84..a1dc2d8b902 100644
--- a/intern/cycles/kernel/CMakeLists.txt
+++ b/intern/cycles/kernel/CMakeLists.txt
@@ -234,6 +234,7 @@ set(SRC_INTEGRATOR_HEADERS
   integrator/integrator_intersect_closest.h
   integrator/integrator_intersect_shadow.h
   integrator/integrator_intersect_subsurface.h
+  integrator/integrator_intersect_volume_stack.h
   integrator/integrator_megakernel.h
   integrator/integrator_shade_background.h
   integrator/integrator_shade_light.h
diff --git a/intern/cycles/kernel/device/cpu/kernel_arch.h b/intern/cycles/kernel/device/cpu/kernel_arch.h
index 8856bdd4160..91eaebf6147 100644
--- a/intern/cycles/kernel/device/cpu/kernel_arch.h
+++ b/intern/cycles/kernel/device/cpu/kernel_arch.h
@@ -38,6 +38,7 @@ KERNEL_INTEGRATOR_INIT_FUNCTION(init_from_bake);
 KERNEL_INTEGRATOR_FUNCTION(intersect_closest);
 KERNEL_INTEGRATOR_FUNCTION(intersect_shadow);
 KERNEL_INTEGRATOR_FUNCTION(intersect_subsurface);
+KERNEL_INTEGRATOR_FUNCTION(intersect_volume_stack);
 KERNEL_INTEGRATOR_SHADE_FUNCTION(shade_background);
 KERNEL_INTEGRATOR_SHADE_FUNCTION(shade_light);
 KERNEL_INTEGRATOR_SHADE_FUNCTION(shade_shadow);
diff --git a/intern/cycles/kernel/device/cpu/kernel_arch_impl.h b/intern/cycles/kernel/device/cpu/kernel_arch_impl.h
index 2b6624314c8..b68fec9c1a3 100644
--- a/intern/cycles/kernel/device/cpu/kernel_arch_impl.h
+++ b/intern/cycles/kernel/device/cpu/kernel_arch_impl.h
@@ -38,6 +38,7 @@
 #    include "kernel/integrator/integrator_intersect_closest.h"
 #    include "kernel/integrator/integrator_intersect_shadow.h"
 #    include "kernel/integrator/integrator_intersect_subsurface.h"
+#    include "kernel/integrator/integrator_intersect_volume_stack.h"
 #    include "kernel/integrator/integrator_shade_background.h"
 #    include "kernel/integrator/integrator_shade_light.h"
 #    include "kernel/integrator/integrator_shade_shadow.h"
@@ -96,6 +97,7 @@ DEFINE_INTEGRATOR_INIT_KERNEL(init_from_bake)
 DEFINE_INTEGRATOR_KERNEL(intersect_closest)
 DEFINE_INTEGRATOR_KERNEL(intersect_shadow)
 DEFINE_INTEGRATOR_KERNEL(intersect_subsurface)
+DEFINE_INTEGRATOR_KERNEL(intersect_volume_stack)
 DEFINE_INTEGRATOR_SHADE_KERNEL(shade_background)
 DEFINE_INTEGRATOR_SHADE_KERNEL(shade_light)
 DEFINE_INTEGRATOR_SHADE_KERNEL(shade_shadow)
diff --git a/intern/cycles/kernel/device/cuda/kernel.cu b/intern/cycles/kernel/device/cuda/kernel.cu
index 3f3c9aa6703..42844211cbc 100644
--- a/intern/cycles/kernel/device/cuda/kernel.cu
+++ b/intern/cycles/kernel/device/cuda/kernel.cu
@@ -35,6 +35,7 @@
 #  include "kernel/integrator/integrator_intersect_closest.h"
 #  include "kernel/integrator/integrator_intersect_shadow.h"
 #  include "kernel/integrator/integrator_intersect_subsurface.h"
+#  include "kernel/integrator/integrator_intersect_volume_stack.h"
 #  include "kernel/integrator/integrator_shade_background.h"
 #  include "kernel/integrator/in

@@ Diff output truncated at 10240 characters. @@



More information about the Bf-blender-cvs mailing list