10# define __KERNEL_OPTIX__
17OptiXDeviceQueue::OptiXDeviceQueue(OptiXDevice *device) : CUDADeviceQueue(device) {}
19void OptiXDeviceQueue::init_execution()
21 CUDADeviceQueue::init_execution();
24static bool is_optix_specific_kernel(
DeviceKernel kernel,
bool osl_shading,
bool osl_camera)
46 OptiXDevice *
const optix_device =
static_cast<OptiXDevice *
>(cuda_device_);
49 const OSLGlobals *og =
static_cast<const OSLGlobals *
>(optix_device->get_cpu_osl_memory());
50 const bool osl_shading = og->use_shading;
51 const bool osl_camera = og->use_camera;
53 const bool osl_shading =
false;
54 const bool osl_camera =
false;
57 if (!is_optix_specific_kernel(kernel, osl_shading, osl_camera)) {
58 return CUDADeviceQueue::enqueue(kernel,
work_size, args);
61 if (cuda_device_->have_error()) {
67 const CUDAContextScope scope(cuda_device_);
69 const device_ptr sbt_data_ptr = optix_device->sbt_data.device_pointer;
70 const device_ptr launch_params_ptr = optix_device->launch_params.device_pointer;
72 auto set_launch_param = [&](
size_t offset,
size_t size,
int arg) {
75 cuMemcpyHtoDAsync(launch_params_ptr + offset, args.
values[arg],
size, cuda_stream_));
97 cuda_device_assert(cuda_device_, cuStreamSynchronize(cuda_stream_));
99 OptixPipeline pipeline =
nullptr;
100 OptixShaderBindingTable sbt_params = {};
104 pipeline = optix_device->pipelines[PIP_SHADE];
105 sbt_params.raygenRecord = sbt_data_ptr + PG_RGEN_SHADE_BACKGROUND *
sizeof(SbtRecord);
108 pipeline = optix_device->pipelines[PIP_SHADE];
109 sbt_params.raygenRecord = sbt_data_ptr + PG_RGEN_SHADE_LIGHT *
sizeof(SbtRecord);
112 pipeline = optix_device->pipelines[PIP_SHADE];
113 sbt_params.raygenRecord = sbt_data_ptr + PG_RGEN_SHADE_SURFACE *
sizeof(SbtRecord);
116 pipeline = optix_device->pipelines[PIP_SHADE];
117 sbt_params.raygenRecord = sbt_data_ptr + PG_RGEN_SHADE_SURFACE_RAYTRACE *
sizeof(SbtRecord);
120 pipeline = optix_device->pipelines[PIP_SHADE];
121 sbt_params.raygenRecord = sbt_data_ptr + PG_RGEN_SHADE_SURFACE_MNEE *
sizeof(SbtRecord);
124 pipeline = optix_device->pipelines[PIP_SHADE];
125 sbt_params.raygenRecord = sbt_data_ptr + PG_RGEN_SHADE_VOLUME *
sizeof(SbtRecord);
128 pipeline = optix_device->pipelines[PIP_SHADE];
129 sbt_params.raygenRecord = sbt_data_ptr +
130 PG_RGEN_SHADE_VOLUME_RAY_MARCHING *
sizeof(SbtRecord);
133 pipeline = optix_device->pipelines[PIP_SHADE];
134 sbt_params.raygenRecord = sbt_data_ptr + PG_RGEN_SHADE_SHADOW *
sizeof(SbtRecord);
137 pipeline = optix_device->pipelines[PIP_SHADE];
138 sbt_params.raygenRecord = sbt_data_ptr + PG_RGEN_SHADE_DEDICATED_LIGHT *
sizeof(SbtRecord);
142 pipeline = optix_device->pipelines[PIP_INTERSECT];
143 sbt_params.raygenRecord = sbt_data_ptr + PG_RGEN_INTERSECT_CLOSEST *
sizeof(SbtRecord);
146 pipeline = optix_device->pipelines[PIP_INTERSECT];
147 sbt_params.raygenRecord = sbt_data_ptr + PG_RGEN_INTERSECT_SHADOW *
sizeof(SbtRecord);
150 pipeline = optix_device->pipelines[PIP_INTERSECT];
151 sbt_params.raygenRecord = sbt_data_ptr + PG_RGEN_INTERSECT_SUBSURFACE *
sizeof(SbtRecord);
154 pipeline = optix_device->pipelines[PIP_INTERSECT];
155 sbt_params.raygenRecord = sbt_data_ptr + PG_RGEN_INTERSECT_VOLUME_STACK *
sizeof(SbtRecord);
158 pipeline = optix_device->pipelines[PIP_INTERSECT];
159 sbt_params.raygenRecord = sbt_data_ptr +
160 PG_RGEN_INTERSECT_DEDICATED_LIGHT *
sizeof(SbtRecord);
164 pipeline = optix_device->pipelines[PIP_SHADE];
165 sbt_params.raygenRecord = sbt_data_ptr + PG_RGEN_EVAL_DISPLACE *
sizeof(SbtRecord);
168 pipeline = optix_device->pipelines[PIP_SHADE];
169 sbt_params.raygenRecord = sbt_data_ptr + PG_RGEN_EVAL_BACKGROUND *
sizeof(SbtRecord);
172 pipeline = optix_device->pipelines[PIP_SHADE];
173 sbt_params.raygenRecord = sbt_data_ptr +
174 PG_RGEN_EVAL_CURVE_SHADOW_TRANSPARENCY *
sizeof(SbtRecord);
177 pipeline = optix_device->pipelines[PIP_SHADE];
178 sbt_params.raygenRecord = sbt_data_ptr + PG_RGEN_EVAL_VOLUME_DENSITY *
sizeof(SbtRecord);
182 pipeline = optix_device->pipelines[PIP_SHADE];
183 sbt_params.raygenRecord = sbt_data_ptr + PG_RGEN_INIT_FROM_CAMERA *
sizeof(SbtRecord);
188 <<
" is attempted to be enqueued.";
192 sbt_params.missRecordBase = sbt_data_ptr + MISS_PROGRAM_GROUP_OFFSET *
sizeof(SbtRecord);
193 sbt_params.missRecordStrideInBytes =
sizeof(SbtRecord);
194 sbt_params.missRecordCount = NUM_MISS_PROGRAM_GROUPS;
195 sbt_params.hitgroupRecordBase = sbt_data_ptr + HIT_PROGAM_GROUP_OFFSET *
sizeof(SbtRecord);
196 sbt_params.hitgroupRecordStrideInBytes =
sizeof(SbtRecord);
197 sbt_params.hitgroupRecordCount = NUM_HIT_PROGRAM_GROUPS;
198 sbt_params.callablesRecordBase = sbt_data_ptr + CALLABLE_PROGRAM_GROUPS_BASE *
sizeof(SbtRecord);
199 sbt_params.callablesRecordCount = NUM_CALLABLE_PROGRAM_GROUPS;
200 sbt_params.callablesRecordStrideInBytes =
sizeof(SbtRecord);
203 if (osl_shading || osl_camera) {
204 sbt_params.callablesRecordCount +=
static_cast<unsigned int>(optix_device->osl_groups.size());
209 optix_device_assert(optix_device,
210 optixLaunch(pipeline,
213 optix_device->launch_params.data_elements,
221 return !(optix_device->have_error());
static DBVT_INLINE btScalar size(const btDbvtVolume &a)
#define CCL_NAMESPACE_END
CCL_NAMESPACE_BEGIN bool device_kernel_has_shading(DeviceKernel kernel)
bool device_kernel_has_intersection(DeviceKernel kernel)
const char * device_kernel_as_string(DeviceKernel kernel)
ccl_gpu_kernel_postfix ccl_global KernelWorkTile const int num_tiles
ccl_gpu_kernel_postfix const ccl_global int ccl_global float const int work_size
ccl_gpu_kernel_postfix ccl_global KernelWorkTile const int ccl_global float const int max_tile_work_size
ccl_gpu_kernel_postfix const ccl_global int * path_index_array
ccl_gpu_kernel_postfix ccl_global KernelWorkTile const int ccl_global float * render_buffer
@ DEVICE_KERNEL_INTEGRATOR_SHADE_LIGHT
@ DEVICE_KERNEL_INTEGRATOR_SHADE_DEDICATED_LIGHT
@ DEVICE_KERNEL_INTEGRATOR_SHADE_SURFACE
@ DEVICE_KERNEL_SHADER_EVAL_DISPLACE
@ DEVICE_KERNEL_SHADER_EVAL_VOLUME_DENSITY
@ DEVICE_KERNEL_INTEGRATOR_INTERSECT_SUBSURFACE
@ DEVICE_KERNEL_INTEGRATOR_SHADE_SHADOW
@ DEVICE_KERNEL_INTEGRATOR_INTERSECT_VOLUME_STACK
@ DEVICE_KERNEL_SHADER_EVAL_BACKGROUND
@ DEVICE_KERNEL_INTEGRATOR_SHADE_SURFACE_RAYTRACE
@ DEVICE_KERNEL_INTEGRATOR_INTERSECT_DEDICATED_LIGHT
@ DEVICE_KERNEL_INTEGRATOR_SHADE_SURFACE_MNEE
@ DEVICE_KERNEL_INTEGRATOR_INIT_FROM_CAMERA
@ DEVICE_KERNEL_INTEGRATOR_SHADE_VOLUME_RAY_MARCHING
@ DEVICE_KERNEL_SHADER_EVAL_CURVE_SHADOW_TRANSPARENCY
@ DEVICE_KERNEL_INTEGRATOR_SHADE_VOLUME
@ DEVICE_KERNEL_INTEGRATOR_INTERSECT_SHADOW
@ DEVICE_KERNEL_INTEGRATOR_INTERSECT_CLOSEST
@ DEVICE_KERNEL_INTEGRATOR_SHADE_BACKGROUND