Blender V4.5
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 const RTCFeatureFlags CYCLES_ONEAPI_EMBREE_BASIC_FEATURES = (const RTCFeatureFlags)(
29 RTC_FEATURE_FLAG_TRIANGLE | RTC_FEATURE_FLAG_INSTANCE |
30 RTC_FEATURE_FLAG_FILTER_FUNCTION_IN_ARGUMENTS | RTC_FEATURE_FLAG_POINT |
31 RTC_FEATURE_FLAG_MOTION_BLUR);
32static const RTCFeatureFlags CYCLES_ONEAPI_EMBREE_ALL_FEATURES = (const RTCFeatureFlags)(
33 CYCLES_ONEAPI_EMBREE_BASIC_FEATURES | RTC_FEATURE_FLAG_ROUND_CATMULL_ROM_CURVE |
34 RTC_FEATURE_FLAG_FLAT_CATMULL_ROM_CURVE);
35# endif
36
37void oneapi_set_error_cb(OneAPIErrorCallback cb, void *user_ptr)
38{
39 s_error_cb = cb;
40 s_error_user_ptr = user_ptr;
41}
42
43size_t oneapi_suggested_gpu_kernel_size(const DeviceKernel kernel)
44{
45 /* This defines are available only to the device code, so making this function
46 * seems to be the most reasonable way to provide access to them for the host code. */
47 switch (kernel) {
56
61
65
68
69 default:
70 return (size_t)0;
71 }
72}
73
74/* NOTE(@nsirgien): Execution of this simple kernel will check basic functionality like
75 * memory allocations, memory transfers and execution of kernel with USM memory. */
76bool oneapi_run_test_kernel(SyclQueue *queue_)
77{
78 assert(queue_);
79 sycl::queue *queue = reinterpret_cast<sycl::queue *>(queue_);
80 const size_t N = 8;
81 const size_t memory_byte_size = sizeof(int) * N;
82
83 bool is_computation_correct = true;
84 try {
85 int *A_host = (int *)sycl::aligned_alloc_host(16, memory_byte_size, *queue);
86
87 for (size_t i = (size_t)0; i < N; i++) {
88 A_host[i] = rand() % 32;
89 }
90
91 int *A_device = (int *)sycl::malloc_device(memory_byte_size, *queue);
92 int *B_device = (int *)sycl::malloc_device(memory_byte_size, *queue);
93
94 queue->memcpy(A_device, A_host, memory_byte_size);
95 queue->wait_and_throw();
96
97 queue->submit([&](sycl::handler &cgh) {
98 cgh.parallel_for(N, [=](sycl::id<1> idx) { B_device[idx] = A_device[idx] + idx.get(0); });
99 });
100 queue->wait_and_throw();
101
102 int *B_host = (int *)sycl::aligned_alloc_host(16, memory_byte_size, *queue);
103
104 queue->memcpy(B_host, B_device, memory_byte_size);
105 queue->wait_and_throw();
106
107 for (size_t i = (size_t)0; i < N; i++) {
108 const int expected_result = i + A_host[i];
109 if (B_host[i] != expected_result) {
110 is_computation_correct = false;
111 if (s_error_cb) {
112 s_error_cb(("Incorrect result in test kernel execution - expected " +
113 std::to_string(expected_result) + ", got " + std::to_string(B_host[i]))
114 .c_str(),
115 s_error_user_ptr);
116 }
117 }
118 }
119
120 sycl::free(A_host, *queue);
121 sycl::free(B_host, *queue);
122 sycl::free(A_device, *queue);
123 sycl::free(B_device, *queue);
124 queue->wait_and_throw();
125 }
126 catch (const sycl::exception &e) {
127 if (s_error_cb) {
128 s_error_cb(e.what(), s_error_user_ptr);
129 }
130 return false;
131 }
132
133 return is_computation_correct;
134}
135
136bool oneapi_zero_memory_on_device(SyclQueue *queue_, void *device_pointer, const size_t num_bytes)
137{
138 assert(queue_);
139 sycl::queue *queue = reinterpret_cast<sycl::queue *>(queue_);
140 try {
141 queue->memset(device_pointer, 0, num_bytes);
142 queue->wait_and_throw();
143 return true;
144 }
145 catch (const sycl::exception &e) {
146 if (s_error_cb) {
147 s_error_cb(e.what(), s_error_user_ptr);
148 }
149 return false;
150 }
151}
152
153bool oneapi_kernel_is_required_for_features(const std::string &kernel_name,
154 const uint kernel_features)
155{
156 /* Skip all non-Cycles kernels */
157 if (kernel_name.find("oneapi_kernel_") == std::string::npos) {
158 return false;
159 }
160
161 if ((kernel_features & KERNEL_FEATURE_NODE_RAYTRACE) == 0 &&
163 std::string::npos)
164 {
165 return false;
166 }
167
168 if ((kernel_features & KERNEL_FEATURE_MNEE) == 0 &&
170 std::string::npos)
171 {
172 return false;
173 }
174
175 if ((kernel_features & KERNEL_FEATURE_VOLUME) == 0 &&
177 std::string::npos)
178 {
179 return false;
180 }
181
182 if (((kernel_features & (KERNEL_FEATURE_PATH_TRACING | KERNEL_FEATURE_BAKING)) == 0) &&
184 std::string::npos) ||
186 std::string::npos) ||
188 std::string::npos) ||
189 (kernel_name.find(device_kernel_as_string(
191 {
192 return false;
193 }
194
195 return true;
196}
197
198bool oneapi_kernel_is_compatible_with_hardware_raytracing(const std::string &kernel_name)
199{
200 /* MNEE and Ray-trace kernels work correctly with Hardware Ray-tracing starting with Embree 4.1.
201 */
202# if defined(RTC_VERSION) && RTC_VERSION < 40100
204 std::string::npos) &&
205 (kernel_name.find(device_kernel_as_string(
207# else
208 return true;
209# endif
210}
211
212bool oneapi_kernel_has_intersections(const std::string &kernel_name)
213{
214 for (int i = 0; i < (int)DEVICE_KERNEL_NUM; i++) {
215 DeviceKernel kernel = (DeviceKernel)i;
216 if (device_kernel_has_intersection(kernel)) {
217 if (kernel_name.find(device_kernel_as_string(kernel)) != std::string::npos) {
218 return true;
219 }
220 }
221 }
222 return false;
223}
224
225bool oneapi_load_kernels(SyclQueue *queue_,
226 const uint kernel_features,
227 bool use_hardware_raytracing)
228{
229 assert(queue_);
230 sycl::queue *queue = reinterpret_cast<sycl::queue *>(queue_);
231
232# ifdef WITH_EMBREE_GPU
233 /* For best performance, we always JIT compile the kernels that are using Embree. */
234 if (use_hardware_raytracing) {
235 try {
236 sycl::kernel_bundle<sycl::bundle_state::input> all_kernels_bundle =
237 sycl::get_kernel_bundle<sycl::bundle_state::input>(queue->get_context(),
238 {queue->get_device()});
239
240 for (const sycl::kernel_id &kernel_id : all_kernels_bundle.get_kernel_ids()) {
241 const std::string &kernel_name = kernel_id.get_name();
242
243 if (!oneapi_kernel_is_required_for_features(kernel_name, kernel_features) ||
244 !(oneapi_kernel_has_intersections(kernel_name) &&
245 oneapi_kernel_is_compatible_with_hardware_raytracing(kernel_name)))
246 {
247 continue;
248 }
249
250 sycl::kernel_bundle<sycl::bundle_state::input> one_kernel_bundle_input =
251 sycl::get_kernel_bundle<sycl::bundle_state::input>(
252 queue->get_context(), {queue->get_device()}, {kernel_id});
253
254 /* Hair requires embree curves support. */
255 if (kernel_features & KERNEL_FEATURE_HAIR) {
256 one_kernel_bundle_input
257 .set_specialization_constant<ONEAPIKernelContext::oneapi_embree_features>(
258 CYCLES_ONEAPI_EMBREE_ALL_FEATURES);
259 sycl::build(one_kernel_bundle_input);
260 }
261 else {
262 one_kernel_bundle_input
263 .set_specialization_constant<ONEAPIKernelContext::oneapi_embree_features>(
264 CYCLES_ONEAPI_EMBREE_BASIC_FEATURES);
265 sycl::build(one_kernel_bundle_input);
266 }
267 }
268 }
269 catch (const sycl::exception &e) {
270 if (s_error_cb) {
271 s_error_cb(e.what(), s_error_user_ptr);
272 }
273 return false;
274 }
275 }
276# endif
277
278 try {
279 sycl::kernel_bundle<sycl::bundle_state::input> all_kernels_bundle =
280 sycl::get_kernel_bundle<sycl::bundle_state::input>(queue->get_context(),
281 {queue->get_device()});
282
283 for (const sycl::kernel_id &kernel_id : all_kernels_bundle.get_kernel_ids()) {
284 const std::string &kernel_name = kernel_id.get_name();
285
286 /* In case HWRT is on, compilation of kernels using Embree is already handled in previous
287 * block. */
288 if (!oneapi_kernel_is_required_for_features(kernel_name, kernel_features) ||
289 (use_hardware_raytracing && oneapi_kernel_has_intersections(kernel_name) &&
290 oneapi_kernel_is_compatible_with_hardware_raytracing(kernel_name)))
291 {
292 continue;
293 }
294
295# ifdef WITH_EMBREE_GPU
296 if (oneapi_kernel_has_intersections(kernel_name)) {
297 sycl::kernel_bundle<sycl::bundle_state::input> one_kernel_bundle_input =
298 sycl::get_kernel_bundle<sycl::bundle_state::input>(
299 queue->get_context(), {queue->get_device()}, {kernel_id});
300 one_kernel_bundle_input
301 .set_specialization_constant<ONEAPIKernelContext::oneapi_embree_features>(
302 RTC_FEATURE_FLAG_NONE);
303 sycl::build(one_kernel_bundle_input);
304 continue;
305 }
306# endif
307 /* This call will ensure that AoT or cached JIT binaries are available
308 * for execution. It will trigger compilation if it is not already the case. */
309 (void)sycl::get_kernel_bundle<sycl::bundle_state::executable>(
310 queue->get_context(), {queue->get_device()}, {kernel_id});
311 }
312 }
313 catch (const sycl::exception &e) {
314 if (s_error_cb) {
315 s_error_cb(e.what(), s_error_user_ptr);
316 }
317 return false;
318 }
319 return true;
320}
321
322bool oneapi_enqueue_kernel(KernelContext *kernel_context,
323 const int kernel,
324 const size_t global_size,
325 const size_t local_size,
326 const uint kernel_features,
327 bool use_hardware_raytracing,
328 void **args)
329{
330 bool success = true;
331 ::DeviceKernel device_kernel = (::DeviceKernel)kernel;
332 KernelGlobalsGPU *kg = (KernelGlobalsGPU *)kernel_context->kernel_globals;
333 sycl::queue *queue = reinterpret_cast<sycl::queue *>(kernel_context->queue);
334 assert(queue);
335 if (!queue) {
336 return false;
337 }
338
339 /* Let the compiler throw an error if there are any kernels missing in this implementation. */
340# if defined(_WIN32)
341# pragma warning(error : 4062)
342# elif defined(__GNUC__)
343# pragma GCC diagnostic push
344# pragma GCC diagnostic error "-Wswitch"
345# endif
346
347 int max_shaders = 0;
348
349 if (device_kernel == DEVICE_KERNEL_INTEGRATOR_SORT_BUCKET_PASS ||
351 {
352 max_shaders = (kernel_context->scene_max_shaders);
353 }
354
355 try {
356 queue->submit([&](sycl::handler &cgh) {
357# ifdef WITH_EMBREE_GPU
358 /* Spec says it has no effect if the called kernel doesn't support the below specialization
359 * constant but it can still trigger a recompilation, so we set it only if needed. */
360 if (device_kernel_has_intersection(device_kernel)) {
361 const RTCFeatureFlags used_embree_features = !use_hardware_raytracing ?
362 RTC_FEATURE_FLAG_NONE :
363 !(kernel_features & KERNEL_FEATURE_HAIR) ?
364 CYCLES_ONEAPI_EMBREE_BASIC_FEATURES :
365 CYCLES_ONEAPI_EMBREE_ALL_FEATURES;
366 cgh.set_specialization_constant<ONEAPIKernelContext::oneapi_embree_features>(
367 used_embree_features);
368 }
369# else
370 (void)kernel_features;
371# endif
372 switch (device_kernel) {
374 oneapi_call(kg, cgh, global_size, local_size, args, oneapi_kernel_integrator_reset);
375 break;
376 }
378 oneapi_call(
379 kg, cgh, global_size, local_size, args, oneapi_kernel_integrator_init_from_camera);
380 break;
381 }
383 oneapi_call(
384 kg, cgh, global_size, local_size, args, oneapi_kernel_integrator_init_from_bake);
385 break;
386 }
388 oneapi_call(
389 kg, cgh, global_size, local_size, args, oneapi_kernel_integrator_intersect_closest);
390 break;
391 }
393 oneapi_call(
394 kg, cgh, global_size, local_size, args, oneapi_kernel_integrator_intersect_shadow);
395 break;
396 }
398 oneapi_call(kg,
399 cgh,
400 global_size,
401 local_size,
402 args,
403 oneapi_kernel_integrator_intersect_subsurface);
404 break;
405 }
407 oneapi_call(kg,
408 cgh,
409 global_size,
410 local_size,
411 args,
412 oneapi_kernel_integrator_intersect_volume_stack);
413 break;
414 }
416 oneapi_call(kg,
417 cgh,
418 global_size,
419 local_size,
420 args,
421 oneapi_kernel_integrator_intersect_dedicated_light);
422 break;
423 }
425 oneapi_call(
426 kg, cgh, global_size, local_size, args, oneapi_kernel_integrator_shade_background);
427 break;
428 }
430 oneapi_call(
431 kg, cgh, global_size, local_size, args, oneapi_kernel_integrator_shade_light);
432 break;
433 }
435 oneapi_call(
436 kg, cgh, global_size, local_size, args, oneapi_kernel_integrator_shade_shadow);
437 break;
438 }
440 oneapi_call(
441 kg, cgh, global_size, local_size, args, oneapi_kernel_integrator_shade_surface);
442 break;
443 }
445 oneapi_call(kg,
446 cgh,
447 global_size,
448 local_size,
449 args,
450 oneapi_kernel_integrator_shade_surface_raytrace);
451 break;
452 }
454 oneapi_call(
455 kg, cgh, global_size, local_size, args, oneapi_kernel_integrator_shade_surface_mnee);
456 break;
457 }
459 oneapi_call(
460 kg, cgh, global_size, local_size, args, oneapi_kernel_integrator_shade_volume);
461 break;
462 }
464 oneapi_call(kg,
465 cgh,
466 global_size,
467 local_size,
468 args,
469 oneapi_kernel_integrator_shade_dedicated_light);
470 break;
471 }
473 oneapi_call(
474 kg, cgh, global_size, local_size, args, oneapi_kernel_integrator_queued_paths_array);
475 break;
476 }
478 oneapi_call(kg,
479 cgh,
480 global_size,
481 local_size,
482 args,
483 oneapi_kernel_integrator_queued_shadow_paths_array);
484 break;
485 }
487 oneapi_call(
488 kg, cgh, global_size, local_size, args, oneapi_kernel_integrator_active_paths_array);
489 break;
490 }
492 oneapi_call(kg,
493 cgh,
494 global_size,
495 local_size,
496 args,
497 oneapi_kernel_integrator_terminated_paths_array);
498 break;
499 }
501 oneapi_call(kg,
502 cgh,
503 global_size,
504 local_size,
505 args,
506 oneapi_kernel_integrator_terminated_shadow_paths_array);
507 break;
508 }
510 oneapi_call(
511 kg, cgh, global_size, local_size, args, oneapi_kernel_integrator_sorted_paths_array);
512 break;
513 }
515 sycl::local_accessor<int> local_mem(max_shaders, cgh);
516 oneapi_kernel_integrator_sort_bucket_pass(kg,
517 global_size,
518 local_size,
519 cgh,
520 *(int *)(args[0]),
521 *(int *)(args[1]),
522 *(int *)(args[2]),
523 *(int **)(args[3]),
524 *(int *)(args[4]),
525 local_mem);
526 break;
527 }
529 sycl::local_accessor<int> local_mem(max_shaders, cgh);
530 oneapi_kernel_integrator_sort_write_pass(kg,
531 global_size,
532 local_size,
533 cgh,
534 *(int *)(args[0]),
535 *(int *)(args[1]),
536 *(int *)(args[2]),
537 *(int **)(args[3]),
538 *(int *)(args[4]),
539 local_mem);
540 break;
541 }
543 oneapi_call(kg,
544 cgh,
545 global_size,
546 local_size,
547 args,
548 oneapi_kernel_integrator_compact_paths_array);
549 break;
550 }
552 oneapi_call(kg,
553 cgh,
554 global_size,
555 local_size,
556 args,
557 oneapi_kernel_integrator_compact_shadow_paths_array);
558 break;
559 }
561 oneapi_call(kg,
562 cgh,
563 global_size,
564 local_size,
565 args,
566 oneapi_kernel_adaptive_sampling_convergence_check);
567 break;
568 }
570 oneapi_call(
571 kg, cgh, global_size, local_size, args, oneapi_kernel_adaptive_sampling_filter_x);
572 break;
573 }
575 oneapi_call(
576 kg, cgh, global_size, local_size, args, oneapi_kernel_adaptive_sampling_filter_y);
577 break;
578 }
580 oneapi_call(kg, cgh, global_size, local_size, args, oneapi_kernel_shader_eval_displace);
581 break;
582 }
584 oneapi_call(
585 kg, cgh, global_size, local_size, args, oneapi_kernel_shader_eval_background);
586 break;
587 }
589 oneapi_call(kg,
590 cgh,
591 global_size,
592 local_size,
593 args,
594 oneapi_kernel_shader_eval_curve_shadow_transparency);
595 break;
596 }
598 oneapi_call(kg, cgh, global_size, local_size, args, oneapi_kernel_prefix_sum);
599 break;
600 }
601
602 /* clang-format off */
603 # define DEVICE_KERNEL_FILM_CONVERT_PARTIAL(VARIANT, variant) \
604 case DEVICE_KERNEL_FILM_CONVERT_##VARIANT: { \
605 oneapi_call(kg, cgh, \
606 global_size, \
607 local_size, \
608 args, \
609 oneapi_kernel_film_convert_##variant); \
610 break; \
611 }
612
613# define DEVICE_KERNEL_FILM_CONVERT(variant, VARIANT) \
614 DEVICE_KERNEL_FILM_CONVERT_PARTIAL(VARIANT, variant) \
615 DEVICE_KERNEL_FILM_CONVERT_PARTIAL(VARIANT##_HALF_RGBA, variant##_half_rgba)
616
617 DEVICE_KERNEL_FILM_CONVERT(depth, DEPTH);
618 DEVICE_KERNEL_FILM_CONVERT(mist, MIST);
619 DEVICE_KERNEL_FILM_CONVERT(sample_count, SAMPLE_COUNT);
620 DEVICE_KERNEL_FILM_CONVERT(float, FLOAT);
621 DEVICE_KERNEL_FILM_CONVERT(light_path, LIGHT_PATH);
622 DEVICE_KERNEL_FILM_CONVERT(float3, FLOAT3);
623 DEVICE_KERNEL_FILM_CONVERT(motion, MOTION);
624 DEVICE_KERNEL_FILM_CONVERT(cryptomatte, CRYPTOMATTE);
625 DEVICE_KERNEL_FILM_CONVERT(shadow_catcher, SHADOW_CATCHER);
626 DEVICE_KERNEL_FILM_CONVERT(shadow_catcher_matte_with_shadow,
627 SHADOW_CATCHER_MATTE_WITH_SHADOW);
628 DEVICE_KERNEL_FILM_CONVERT(combined, COMBINED);
629 DEVICE_KERNEL_FILM_CONVERT(float4, FLOAT4);
630
631# undef DEVICE_KERNEL_FILM_CONVERT
632# undef DEVICE_KERNEL_FILM_CONVERT_PARTIAL
633 /* clang-format on */
634
636 oneapi_call(
637 kg, cgh, global_size, local_size, args, oneapi_kernel_filter_guiding_preprocess);
638 break;
639 }
641 oneapi_call(kg,
642 cgh,
643 global_size,
644 local_size,
645 args,
646 oneapi_kernel_filter_guiding_set_fake_albedo);
647 break;
648 }
650 oneapi_call(
651 kg, cgh, global_size, local_size, args, oneapi_kernel_filter_color_preprocess);
652 break;
653 }
655 oneapi_call(
656 kg, cgh, global_size, local_size, args, oneapi_kernel_filter_color_postprocess);
657 break;
658 }
660 oneapi_call(
661 kg, cgh, global_size, local_size, args, oneapi_kernel_cryptomatte_postprocess);
662 break;
663 }
665 oneapi_call(
666 kg, cgh, global_size, local_size, args, oneapi_kernel_integrator_compact_states);
667 break;
668 }
670 oneapi_call(kg,
671 cgh,
672 global_size,
673 local_size,
674 args,
675 oneapi_kernel_integrator_compact_shadow_states);
676 break;
677 }
679 oneapi_call(kg,
680 cgh,
681 global_size,
682 local_size,
683 args,
684 oneapi_kernel_integrator_shadow_catcher_count_possible_splits);
685 break;
686 }
687 /* Unsupported kernels */
690 kernel_assert(0);
691 break;
692 }
693 });
694 }
695 catch (const sycl::exception &e) {
696 if (s_error_cb) {
697 s_error_cb(e.what(), s_error_user_ptr);
698 success = false;
699 }
700 }
701
702# if defined(_WIN32)
703# pragma warning(default : 4062)
704# elif defined(__GNUC__)
705# pragma GCC diagnostic pop
706# endif
707 return success;
708}
709
710#endif /* WITH_ONEAPI */
unsigned int uint
ATTR_WARN_UNUSED_RESULT const BMVert const BMEdge * e
#define kernel_assert(cond)
#define KERNEL_FEATURE_VOLUME
#define KERNEL_FEATURE_PATH_TRACING
#define KERNEL_FEATURE_HAIR
#define KERNEL_FEATURE_NODE_RAYTRACE
#define KERNEL_FEATURE_BAKING
#define KERNEL_FEATURE_MNEE
bool device_kernel_has_intersection(DeviceKernel kernel)
const char * device_kernel_as_string(DeviceKernel kernel)
VecBase< float, 4 > float4
#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_INTEGRATOR_INTERSECT_SUBSURFACE
@ DEVICE_KERNEL_INTEGRATOR_QUEUED_SHADOW_PATHS_ARRAY
@ DEVICE_KERNEL_FILTER_GUIDING_SET_FAKE_ALBEDO
@ 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_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_PREFIX_SUM
#define N
#define GPU_PARALLEL_ACTIVE_INDEX_DEFAULT_BLOCK_SIZE
#define GPU_PARALLEL_PREFIX_SUM_DEFAULT_BLOCK_SIZE
#define GPU_PARALLEL_SORTED_INDEX_DEFAULT_BLOCK_SIZE
#define GPU_PARALLEL_SORT_BLOCK_SIZE
@ FLOAT4
@ FLOAT3
@ FLOAT
i
Definition text_draw.cc:230