Blender V5.0
kernel/device/oneapi/kernel.cpp
Go to the documentation of this file.
1/* SPDX-FileCopyrightText: 2021-2022 Intel Corporation
2 *
3 * SPDX-License-Identifier: Apache-2.0 */
4
5#ifdef WITH_ONEAPI
6
7# include "kernel.h"
8# include <iostream>
9# include <map>
10# include <set>
11
12/* <algorithm> is needed until included upstream in sycl/detail/property_list_base.hpp */
13# include <algorithm>
14# include <sycl/sycl.hpp>
15
19
21
22# include "device/kernel.cpp"
23
24static OneAPIErrorCallback s_error_cb = nullptr;
25static void *s_error_user_ptr = nullptr;
26
27# ifdef WITH_EMBREE_GPU
28static RTCFeatureFlags oneapi_embree_features_from_kernel_features(const uint kernel_features)
29{
30 unsigned int feature_flags = RTC_FEATURE_FLAG_TRIANGLE | RTC_FEATURE_FLAG_INSTANCE |
31 RTC_FEATURE_FLAG_FILTER_FUNCTION_IN_ARGUMENTS;
32
33 if (kernel_features & KERNEL_FEATURE_HAIR_THICK) {
34 feature_flags |= RTC_FEATURE_FLAG_ROUND_CATMULL_ROM_CURVE |
35 RTC_FEATURE_FLAG_ROUND_LINEAR_CURVE;
36 }
37 if (kernel_features & KERNEL_FEATURE_HAIR) {
38 feature_flags |= RTC_FEATURE_FLAG_FLAT_CATMULL_ROM_CURVE;
39 }
40 if (kernel_features & KERNEL_FEATURE_POINTCLOUD) {
41 feature_flags |= RTC_FEATURE_FLAG_POINT;
42 }
43 if (kernel_features & KERNEL_FEATURE_OBJECT_MOTION) {
44 feature_flags |= RTC_FEATURE_FLAG_MOTION_BLUR;
45 }
46
47 return (RTCFeatureFlags)feature_flags;
48}
49# endif
50
51void oneapi_set_error_cb(OneAPIErrorCallback cb, void *user_ptr)
52{
53 s_error_cb = cb;
54 s_error_user_ptr = user_ptr;
55}
56
57size_t oneapi_suggested_gpu_kernel_size(const DeviceKernel kernel)
58{
59 /* This defines are available only to the device code, so making this function
60 * seems to be the most reasonable way to provide access to them for the host code. */
61 switch (kernel) {
70
75
79
82
83 default:
84 return (size_t)0;
85 }
86}
87
88/* NOTE(@nsirgien): Execution of this simple kernel will check basic functionality like
89 * memory allocations, memory transfers and execution of kernel with USM memory. */
90bool oneapi_run_test_kernel(SyclQueue *queue_)
91{
92 assert(queue_);
93 sycl::queue *queue = reinterpret_cast<sycl::queue *>(queue_);
94 const size_t N = 8;
95 const size_t memory_byte_size = sizeof(int) * N;
96
97 bool is_computation_correct = true;
98 try {
99 int *A_host = (int *)sycl::aligned_alloc_host(16, memory_byte_size, *queue);
100
101 for (size_t i = (size_t)0; i < N; i++) {
102 A_host[i] = rand() % 32;
103 }
104
105 int *A_device = (int *)sycl::malloc_device(memory_byte_size, *queue);
106 int *B_device = (int *)sycl::malloc_device(memory_byte_size, *queue);
107
108 queue->memcpy(A_device, A_host, memory_byte_size);
109 queue->wait_and_throw();
110
111 queue->submit([&](sycl::handler &cgh) {
112 cgh.parallel_for(N, [=](sycl::id<1> idx) { B_device[idx] = A_device[idx] + idx.get(0); });
113 });
114 queue->wait_and_throw();
115
116 int *B_host = (int *)sycl::aligned_alloc_host(16, memory_byte_size, *queue);
117
118 queue->memcpy(B_host, B_device, memory_byte_size);
119 queue->wait_and_throw();
120
121 for (size_t i = (size_t)0; i < N; i++) {
122 const int expected_result = i + A_host[i];
123 if (B_host[i] != expected_result) {
124 is_computation_correct = false;
125 if (s_error_cb) {
126 s_error_cb(("Incorrect result in test kernel execution - expected " +
127 std::to_string(expected_result) + ", got " + std::to_string(B_host[i]))
128 .c_str(),
129 s_error_user_ptr);
130 }
131 }
132 }
133
134 sycl::free(A_host, *queue);
135 sycl::free(B_host, *queue);
136 sycl::free(A_device, *queue);
137 sycl::free(B_device, *queue);
138 queue->wait_and_throw();
139 }
140 catch (const sycl::exception &e) {
141 if (s_error_cb) {
142 s_error_cb(e.what(), s_error_user_ptr);
143 }
144 return false;
145 }
146
147 return is_computation_correct;
148}
149
150bool oneapi_zero_memory_on_device(SyclQueue *queue_, void *device_pointer, const size_t num_bytes)
151{
152 assert(queue_);
153 sycl::queue *queue = reinterpret_cast<sycl::queue *>(queue_);
154 try {
155 queue->memset(device_pointer, 0, num_bytes);
156 queue->wait_and_throw();
157 return true;
158 }
159 catch (const sycl::exception &e) {
160 if (s_error_cb) {
161 s_error_cb(e.what(), s_error_user_ptr);
162 }
163 return false;
164 }
165}
166
167bool oneapi_kernel_is_required_for_features(const std::string &kernel_name,
168 const uint kernel_features)
169{
170 /* Skip all non-Cycles kernels */
171 if (kernel_name.find("oneapi_kernel_") == std::string::npos) {
172 return false;
173 }
174
175 if ((kernel_features & KERNEL_FEATURE_NODE_RAYTRACE) == 0 &&
177 std::string::npos)
178 {
179 return false;
180 }
181
182 if ((kernel_features & KERNEL_FEATURE_MNEE) == 0 &&
184 std::string::npos)
185 {
186 return false;
187 }
188
189 if ((kernel_features & KERNEL_FEATURE_VOLUME) == 0 &&
191 std::string::npos)
192 {
193 return false;
194 }
195
196 if (((kernel_features & (KERNEL_FEATURE_PATH_TRACING | KERNEL_FEATURE_BAKING)) == 0) &&
198 std::string::npos) ||
200 std::string::npos) ||
202 std::string::npos) ||
203 (kernel_name.find(device_kernel_as_string(
205 {
206 return false;
207 }
208
209 return true;
210}
211
212bool oneapi_kernel_is_compatible_with_hardware_raytracing(const std::string &kernel_name)
213{
214 /* MNEE and Ray-trace kernels work correctly with Hardware Ray-tracing starting with Embree 4.1.
215 */
216# if defined(RTC_VERSION) && RTC_VERSION < 40100
218 std::string::npos) &&
219 (kernel_name.find(device_kernel_as_string(
221# else
222 return true;
223# endif
224}
225
226bool oneapi_kernel_has_intersections(const std::string &kernel_name)
227{
228 for (int i = 0; i < (int)DEVICE_KERNEL_NUM; i++) {
229 DeviceKernel kernel = (DeviceKernel)i;
230 if (device_kernel_has_intersection(kernel)) {
231 if (kernel_name.find(device_kernel_as_string(kernel)) != std::string::npos) {
232 return true;
233 }
234 }
235 }
236 return false;
237}
238
239bool oneapi_load_kernels(SyclQueue *queue_,
240 const uint kernel_features,
241 bool use_hardware_raytracing)
242{
243 assert(queue_);
244 sycl::queue *queue = reinterpret_cast<sycl::queue *>(queue_);
245
246# ifdef WITH_EMBREE_GPU
247 /* For best performance, we always JIT compile the kernels that are using Embree. */
248 if (use_hardware_raytracing) {
249 try {
250 sycl::kernel_bundle<sycl::bundle_state::input> all_kernels_bundle =
251 sycl::get_kernel_bundle<sycl::bundle_state::input>(queue->get_context(),
252 {queue->get_device()});
253
254 for (const sycl::kernel_id &kernel_id : all_kernels_bundle.get_kernel_ids()) {
255 const std::string &kernel_name = kernel_id.get_name();
256
257 if (!oneapi_kernel_is_required_for_features(kernel_name, kernel_features) ||
258 !(oneapi_kernel_has_intersections(kernel_name) &&
259 oneapi_kernel_is_compatible_with_hardware_raytracing(kernel_name)))
260 {
261 continue;
262 }
263
264 sycl::kernel_bundle<sycl::bundle_state::input> one_kernel_bundle_input =
265 sycl::get_kernel_bundle<sycl::bundle_state::input>(
266 queue->get_context(), {queue->get_device()}, {kernel_id});
267
268 const RTCFeatureFlags embree_features = oneapi_embree_features_from_kernel_features(
269 kernel_features);
270 one_kernel_bundle_input
271 .set_specialization_constant<ONEAPIKernelContext::oneapi_embree_features>(
272 embree_features);
273 sycl::build(one_kernel_bundle_input);
274 }
275 }
276 catch (const sycl::exception &e) {
277 if (s_error_cb) {
278 s_error_cb(e.what(), s_error_user_ptr);
279 }
280 return false;
281 }
282 }
283# endif
284
285 try {
286 sycl::kernel_bundle<sycl::bundle_state::input> all_kernels_bundle =
287 sycl::get_kernel_bundle<sycl::bundle_state::input>(queue->get_context(),
288 {queue->get_device()});
289
290 for (const sycl::kernel_id &kernel_id : all_kernels_bundle.get_kernel_ids()) {
291 const std::string &kernel_name = kernel_id.get_name();
292
293 /* In case HWRT is on, compilation of kernels using Embree is already handled in previous
294 * block. */
295 if (!oneapi_kernel_is_required_for_features(kernel_name, kernel_features) ||
296 (use_hardware_raytracing && oneapi_kernel_has_intersections(kernel_name) &&
297 oneapi_kernel_is_compatible_with_hardware_raytracing(kernel_name)))
298 {
299 continue;
300 }
301
302# ifdef WITH_EMBREE_GPU
303 if (oneapi_kernel_has_intersections(kernel_name)) {
304 sycl::kernel_bundle<sycl::bundle_state::input> one_kernel_bundle_input =
305 sycl::get_kernel_bundle<sycl::bundle_state::input>(
306 queue->get_context(), {queue->get_device()}, {kernel_id});
307 one_kernel_bundle_input
308 .set_specialization_constant<ONEAPIKernelContext::oneapi_embree_features>(
309 RTC_FEATURE_FLAG_NONE);
310 sycl::build(one_kernel_bundle_input);
311 continue;
312 }
313# endif
314 /* This call will ensure that AoT or cached JIT binaries are available
315 * for execution. It will trigger compilation if it is not already the case. */
316 (void)sycl::get_kernel_bundle<sycl::bundle_state::executable>(
317 queue->get_context(), {queue->get_device()}, {kernel_id});
318 }
319 }
320 catch (const sycl::exception &e) {
321 if (s_error_cb) {
322 s_error_cb(e.what(), s_error_user_ptr);
323 }
324 return false;
325 }
326 return true;
327}
328
329bool oneapi_enqueue_kernel(KernelContext *kernel_context,
330 const int kernel,
331 const size_t global_size,
332 const size_t local_size,
333 const uint kernel_features,
334 bool use_hardware_raytracing,
335 void **args)
336{
337 bool success = true;
338 ::DeviceKernel device_kernel = (::DeviceKernel)kernel;
339 KernelGlobalsGPU *kg = (KernelGlobalsGPU *)kernel_context->kernel_globals;
340 sycl::queue *queue = reinterpret_cast<sycl::queue *>(kernel_context->queue);
341 assert(queue);
342 if (!queue) {
343 return false;
344 }
345
346 /* Let the compiler throw an error if there are any kernels missing in this implementation. */
347# if defined(_WIN32)
348# pragma warning(error : 4062)
349# elif defined(__GNUC__)
350# pragma GCC diagnostic push
351# pragma GCC diagnostic error "-Wswitch"
352# endif
353
354 int max_shaders = 0;
355
356 if (device_kernel == DEVICE_KERNEL_INTEGRATOR_SORT_BUCKET_PASS ||
358 {
359 max_shaders = (kernel_context->scene_max_shaders);
360 }
361
362 try {
363 queue->submit([&](sycl::handler &cgh) {
364# ifdef WITH_EMBREE_GPU
365 /* Spec says it has no effect if the called kernel doesn't support the below specialization
366 * constant but it can still trigger a recompilation, so we set it only if needed. */
367 if (device_kernel_has_intersection(device_kernel)) {
368 const RTCFeatureFlags embree_features = use_hardware_raytracing ?
369 oneapi_embree_features_from_kernel_features(
370 kernel_features) :
371 RTC_FEATURE_FLAG_NONE;
372 cgh.set_specialization_constant<ONEAPIKernelContext::oneapi_embree_features>(
373 embree_features);
374 }
375# else
376 (void)kernel_features;
377# endif
378 switch (device_kernel) {
380 oneapi_call(kg, cgh, global_size, local_size, args, oneapi_kernel_integrator_reset);
381 break;
382 }
384 oneapi_call(
385 kg, cgh, global_size, local_size, args, oneapi_kernel_integrator_init_from_camera);
386 break;
387 }
389 oneapi_call(
390 kg, cgh, global_size, local_size, args, oneapi_kernel_integrator_init_from_bake);
391 break;
392 }
394 oneapi_call(
395 kg, cgh, global_size, local_size, args, oneapi_kernel_integrator_intersect_closest);
396 break;
397 }
399 oneapi_call(
400 kg, cgh, global_size, local_size, args, oneapi_kernel_integrator_intersect_shadow);
401 break;
402 }
404 oneapi_call(kg,
405 cgh,
406 global_size,
407 local_size,
408 args,
409 oneapi_kernel_integrator_intersect_subsurface);
410 break;
411 }
413 oneapi_call(kg,
414 cgh,
415 global_size,
416 local_size,
417 args,
418 oneapi_kernel_integrator_intersect_volume_stack);
419 break;
420 }
422 oneapi_call(kg,
423 cgh,
424 global_size,
425 local_size,
426 args,
427 oneapi_kernel_integrator_intersect_dedicated_light);
428 break;
429 }
431 oneapi_call(
432 kg, cgh, global_size, local_size, args, oneapi_kernel_integrator_shade_background);
433 break;
434 }
436 oneapi_call(
437 kg, cgh, global_size, local_size, args, oneapi_kernel_integrator_shade_light);
438 break;
439 }
441 oneapi_call(
442 kg, cgh, global_size, local_size, args, oneapi_kernel_integrator_shade_shadow);
443 break;
444 }
446 oneapi_call(
447 kg, cgh, global_size, local_size, args, oneapi_kernel_integrator_shade_surface);
448 break;
449 }
451 oneapi_call(kg,
452 cgh,
453 global_size,
454 local_size,
455 args,
456 oneapi_kernel_integrator_shade_surface_raytrace);
457 break;
458 }
460 oneapi_call(
461 kg, cgh, global_size, local_size, args, oneapi_kernel_integrator_shade_surface_mnee);
462 break;
463 }
465 oneapi_call(
466 kg, cgh, global_size, local_size, args, oneapi_kernel_integrator_shade_volume);
467 break;
468 }
470 oneapi_call(kg,
471 cgh,
472 global_size,
473 local_size,
474 args,
475 oneapi_kernel_integrator_shade_volume_ray_marching);
476 break;
477 }
479 oneapi_call(kg,
480 cgh,
481 global_size,
482 local_size,
483 args,
484 oneapi_kernel_integrator_shade_dedicated_light);
485 break;
486 }
488 oneapi_call(
489 kg, cgh, global_size, local_size, args, oneapi_kernel_integrator_queued_paths_array);
490 break;
491 }
493 oneapi_call(kg,
494 cgh,
495 global_size,
496 local_size,
497 args,
498 oneapi_kernel_integrator_queued_shadow_paths_array);
499 break;
500 }
502 oneapi_call(
503 kg, cgh, global_size, local_size, args, oneapi_kernel_integrator_active_paths_array);
504 break;
505 }
507 oneapi_call(kg,
508 cgh,
509 global_size,
510 local_size,
511 args,
512 oneapi_kernel_integrator_terminated_paths_array);
513 break;
514 }
516 oneapi_call(kg,
517 cgh,
518 global_size,
519 local_size,
520 args,
521 oneapi_kernel_integrator_terminated_shadow_paths_array);
522 break;
523 }
525 oneapi_call(
526 kg, cgh, global_size, local_size, args, oneapi_kernel_integrator_sorted_paths_array);
527 break;
528 }
530 sycl::local_accessor<int> local_mem(max_shaders, cgh);
531 oneapi_kernel_integrator_sort_bucket_pass(kg,
532 global_size,
533 local_size,
534 cgh,
535 *(int *)(args[0]),
536 *(int *)(args[1]),
537 *(int *)(args[2]),
538 *(int **)(args[3]),
539 *(int *)(args[4]),
540 local_mem);
541 break;
542 }
544 sycl::local_accessor<int> local_mem(max_shaders, cgh);
545 oneapi_kernel_integrator_sort_write_pass(kg,
546 global_size,
547 local_size,
548 cgh,
549 *(int *)(args[0]),
550 *(int *)(args[1]),
551 *(int *)(args[2]),
552 *(int **)(args[3]),
553 *(int *)(args[4]),
554 local_mem);
555 break;
556 }
558 oneapi_call(kg,
559 cgh,
560 global_size,
561 local_size,
562 args,
563 oneapi_kernel_integrator_compact_paths_array);
564 break;
565 }
567 oneapi_call(kg,
568 cgh,
569 global_size,
570 local_size,
571 args,
572 oneapi_kernel_integrator_compact_shadow_paths_array);
573 break;
574 }
576 oneapi_call(kg,
577 cgh,
578 global_size,
579 local_size,
580 args,
581 oneapi_kernel_adaptive_sampling_convergence_check);
582 break;
583 }
585 oneapi_call(
586 kg, cgh, global_size, local_size, args, oneapi_kernel_adaptive_sampling_filter_x);
587 break;
588 }
590 oneapi_call(
591 kg, cgh, global_size, local_size, args, oneapi_kernel_adaptive_sampling_filter_y);
592 break;
593 }
595 oneapi_call(kg, cgh, global_size, local_size, args, oneapi_kernel_shader_eval_displace);
596 break;
597 }
599 oneapi_call(
600 kg, cgh, global_size, local_size, args, oneapi_kernel_shader_eval_background);
601 break;
602 }
604 oneapi_call(kg,
605 cgh,
606 global_size,
607 local_size,
608 args,
609 oneapi_kernel_shader_eval_curve_shadow_transparency);
610 break;
611 }
613 oneapi_call(
614 kg, cgh, global_size, local_size, args, oneapi_kernel_shader_eval_volume_density);
615 break;
616 }
618 oneapi_call(kg, cgh, global_size, local_size, args, oneapi_kernel_prefix_sum);
619 break;
620 }
622 oneapi_call(
623 kg, cgh, global_size, local_size, args, oneapi_kernel_volume_guiding_filter_x);
624 break;
625 }
627 oneapi_call(
628 kg, cgh, global_size, local_size, args, oneapi_kernel_volume_guiding_filter_y);
629 break;
630 }
631
632 /* clang-format off */
633 # define DEVICE_KERNEL_FILM_CONVERT_PARTIAL(VARIANT, variant) \
634 case DEVICE_KERNEL_FILM_CONVERT_##VARIANT: { \
635 oneapi_call(kg, cgh, \
636 global_size, \
637 local_size, \
638 args, \
639 oneapi_kernel_film_convert_##variant); \
640 break; \
641 }
642
643# define DEVICE_KERNEL_FILM_CONVERT(variant, VARIANT) \
644 DEVICE_KERNEL_FILM_CONVERT_PARTIAL(VARIANT, variant) \
645 DEVICE_KERNEL_FILM_CONVERT_PARTIAL(VARIANT##_HALF_RGBA, variant##_half_rgba)
646
647 DEVICE_KERNEL_FILM_CONVERT(depth, DEPTH);
648 DEVICE_KERNEL_FILM_CONVERT(mist, MIST);
649 DEVICE_KERNEL_FILM_CONVERT(volume_majorant, VOLUME_MAJORANT);
650 DEVICE_KERNEL_FILM_CONVERT(sample_count, SAMPLE_COUNT);
651 DEVICE_KERNEL_FILM_CONVERT(float, FLOAT);
652 DEVICE_KERNEL_FILM_CONVERT(light_path, LIGHT_PATH);
653 DEVICE_KERNEL_FILM_CONVERT(rgbe, RGBE);
654 DEVICE_KERNEL_FILM_CONVERT(float3, FLOAT3);
655 DEVICE_KERNEL_FILM_CONVERT(motion, MOTION);
656 DEVICE_KERNEL_FILM_CONVERT(cryptomatte, CRYPTOMATTE);
657 DEVICE_KERNEL_FILM_CONVERT(shadow_catcher, SHADOW_CATCHER);
658 DEVICE_KERNEL_FILM_CONVERT(shadow_catcher_matte_with_shadow,
659 SHADOW_CATCHER_MATTE_WITH_SHADOW);
660 DEVICE_KERNEL_FILM_CONVERT(combined, COMBINED);
661 DEVICE_KERNEL_FILM_CONVERT(float4, FLOAT4);
662
663# undef DEVICE_KERNEL_FILM_CONVERT
664# undef DEVICE_KERNEL_FILM_CONVERT_PARTIAL
665 /* clang-format on */
666
668 oneapi_call(
669 kg, cgh, global_size, local_size, args, oneapi_kernel_filter_guiding_preprocess);
670 break;
671 }
673 oneapi_call(kg,
674 cgh,
675 global_size,
676 local_size,
677 args,
678 oneapi_kernel_filter_guiding_set_fake_albedo);
679 break;
680 }
682 oneapi_call(
683 kg, cgh, global_size, local_size, args, oneapi_kernel_filter_color_preprocess);
684 break;
685 }
687 oneapi_call(
688 kg, cgh, global_size, local_size, args, oneapi_kernel_filter_color_postprocess);
689 break;
690 }
692 oneapi_call(kg, cgh, global_size, local_size, args, oneapi_kernel_filter_color_flip_y);
693 break;
694 }
696 oneapi_call(
697 kg, cgh, global_size, local_size, args, oneapi_kernel_cryptomatte_postprocess);
698 break;
699 }
701 oneapi_call(
702 kg, cgh, global_size, local_size, args, oneapi_kernel_integrator_compact_states);
703 break;
704 }
706 oneapi_call(kg,
707 cgh,
708 global_size,
709 local_size,
710 args,
711 oneapi_kernel_integrator_compact_shadow_states);
712 break;
713 }
715 oneapi_call(kg,
716 cgh,
717 global_size,
718 local_size,
719 args,
720 oneapi_kernel_integrator_shadow_catcher_count_possible_splits);
721 break;
722 }
723 /* Unsupported kernels */
726 kernel_assert(0);
727 break;
728 }
729 });
730 }
731 catch (const sycl::exception &e) {
732 if (s_error_cb) {
733 s_error_cb(e.what(), s_error_user_ptr);
734 success = false;
735 }
736 }
737
738# if defined(_WIN32)
739# pragma warning(default : 4062)
740# elif defined(__GNUC__)
741# pragma GCC diagnostic pop
742# endif
743 return success;
744}
745
746#endif /* WITH_ONEAPI */
unsigned int uint
#define GPU_PARALLEL_SORTED_INDEX_DEFAULT_BLOCK_SIZE
Definition block_sizes.h:14
#define GPU_PARALLEL_PREFIX_SUM_DEFAULT_BLOCK_SIZE
Definition block_sizes.h:13
#define GPU_PARALLEL_ACTIVE_INDEX_DEFAULT_BLOCK_SIZE
Definition block_sizes.h:12
#define GPU_PARALLEL_SORT_BLOCK_SIZE
Definition block_sizes.h:18
ATTR_WARN_UNUSED_RESULT const BMVert const BMEdge * e
nullptr FLOAT
#define kernel_assert(cond)
#define KERNEL_FEATURE_VOLUME
#define KERNEL_FEATURE_OBJECT_MOTION
#define KERNEL_FEATURE_HAIR_THICK
#define KERNEL_FEATURE_PATH_TRACING
#define KERNEL_FEATURE_HAIR
#define KERNEL_FEATURE_NODE_RAYTRACE
#define KERNEL_FEATURE_BAKING
#define KERNEL_FEATURE_MNEE
#define KERNEL_FEATURE_POINTCLOUD
bool device_kernel_has_intersection(DeviceKernel kernel)
const char * device_kernel_as_string(DeviceKernel kernel)
#define assert(assertion)
DeviceKernel
@ DEVICE_KERNEL_ADAPTIVE_SAMPLING_CONVERGENCE_CHECK
@ DEVICE_KERNEL_INTEGRATOR_RESET
@ DEVICE_KERNEL_INTEGRATOR_QUEUED_PATHS_ARRAY
@ DEVICE_KERNEL_INTEGRATOR_SHADE_LIGHT
@ DEVICE_KERNEL_INTEGRATOR_SHADE_DEDICATED_LIGHT
@ DEVICE_KERNEL_FILTER_COLOR_PREPROCESS
@ DEVICE_KERNEL_INTEGRATOR_SHADE_SURFACE
@ DEVICE_KERNEL_INTEGRATOR_SORT_WRITE_PASS
@ DEVICE_KERNEL_SHADER_EVAL_DISPLACE
@ DEVICE_KERNEL_INTEGRATOR_SHADOW_CATCHER_COUNT_POSSIBLE_SPLITS
@ DEVICE_KERNEL_SHADER_EVAL_VOLUME_DENSITY
@ DEVICE_KERNEL_INTEGRATOR_INTERSECT_SUBSURFACE
@ DEVICE_KERNEL_VOLUME_GUIDING_FILTER_X
@ DEVICE_KERNEL_INTEGRATOR_QUEUED_SHADOW_PATHS_ARRAY
@ DEVICE_KERNEL_FILTER_GUIDING_SET_FAKE_ALBEDO
@ DEVICE_KERNEL_FILTER_COLOR_FLIP_Y
@ DEVICE_KERNEL_FILTER_COLOR_POSTPROCESS
@ DEVICE_KERNEL_INTEGRATOR_SHADE_SHADOW
@ DEVICE_KERNEL_INTEGRATOR_TERMINATED_PATHS_ARRAY
@ DEVICE_KERNEL_INTEGRATOR_INTERSECT_VOLUME_STACK
@ DEVICE_KERNEL_SHADER_EVAL_BACKGROUND
@ DEVICE_KERNEL_INTEGRATOR_SORTED_PATHS_ARRAY
@ DEVICE_KERNEL_INTEGRATOR_COMPACT_SHADOW_PATHS_ARRAY
@ DEVICE_KERNEL_INTEGRATOR_COMPACT_SHADOW_STATES
@ DEVICE_KERNEL_INTEGRATOR_SHADE_SURFACE_RAYTRACE
@ DEVICE_KERNEL_INTEGRATOR_SORT_BUCKET_PASS
@ DEVICE_KERNEL_INTEGRATOR_INTERSECT_DEDICATED_LIGHT
@ DEVICE_KERNEL_FILTER_GUIDING_PREPROCESS
@ DEVICE_KERNEL_INTEGRATOR_COMPACT_STATES
@ DEVICE_KERNEL_INTEGRATOR_SHADE_SURFACE_MNEE
@ DEVICE_KERNEL_INTEGRATOR_TERMINATED_SHADOW_PATHS_ARRAY
@ DEVICE_KERNEL_INTEGRATOR_MEGAKERNEL
@ DEVICE_KERNEL_NUM
@ DEVICE_KERNEL_INTEGRATOR_ACTIVE_PATHS_ARRAY
@ DEVICE_KERNEL_INTEGRATOR_INIT_FROM_CAMERA
@ DEVICE_KERNEL_ADAPTIVE_SAMPLING_CONVERGENCE_FILTER_Y
@ DEVICE_KERNEL_INTEGRATOR_SHADE_VOLUME_RAY_MARCHING
@ DEVICE_KERNEL_ADAPTIVE_SAMPLING_CONVERGENCE_FILTER_X
@ DEVICE_KERNEL_CRYPTOMATTE_POSTPROCESS
@ DEVICE_KERNEL_INTEGRATOR_COMPACT_PATHS_ARRAY
@ DEVICE_KERNEL_INTEGRATOR_INIT_FROM_BAKE
@ 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
@ DEVICE_KERNEL_VOLUME_GUIDING_FILTER_Y
@ DEVICE_KERNEL_PREFIX_SUM
#define N
@ FLOAT4
@ FLOAT3
i
Definition text_draw.cc:230