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. @@ _______________________________________________ Bf-blender-cvs mailing list [email protected] List details, subscription details or unsubscribe: https://lists.blender.org/mailman/listinfo/bf-blender-cvs
