Blender V4.3
kernel/types.h
Go to the documentation of this file.
1/* SPDX-FileCopyrightText: 2011-2022 Blender Foundation
2 *
3 * SPDX-License-Identifier: Apache-2.0 */
4
5#pragma once
6
7#if (!defined(__KERNEL_GPU__) || (defined(__KERNEL_ONEAPI__) && defined(WITH_EMBREE_GPU))) && \
8 defined(WITH_EMBREE)
9# if EMBREE_MAJOR_VERSION == 4
10# include <embree4/rtcore.h>
11# include <embree4/rtcore_scene.h>
12# else
13# include <embree3/rtcore.h>
14# include <embree3/rtcore_scene.h>
15# endif
16# define __EMBREE__
17#endif
18
19#ifdef __APPLE__
20# include <TargetConditionals.h>
21#endif
22
23#include "util/math.h"
24#include "util/math_fast.h"
25#include "util/math_intersect.h"
26#include "util/projection.h"
27#include "util/static_assert.h"
28#include "util/texture.h"
29#include "util/transform.h"
30
31#include "kernel/svm/types.h"
32
34
35/* Constants */
36#define OBJECT_MOTION_PASS_SIZE 2
37#define FILTER_TABLE_SIZE 1024
38#define RAMP_TABLE_SIZE 256
39#define SHUTTER_TABLE_SIZE 256
40
41#define BSSRDF_MIN_RADIUS 1e-8f
42#define BSSRDF_MAX_HITS 4
43#define BSSRDF_MAX_BOUNCES 256
44#define LOCAL_MAX_HITS 4
45
46#define VOLUME_BOUNDS_MAX 1024
47
48#define SHADER_NONE (~0)
49#define OBJECT_NONE (~0)
50#define PRIM_NONE (~0)
51#define LAMP_NONE (~0)
52#define EMITTER_NONE (~0)
53#define ID_NONE (0.0f)
54#define PASS_UNUSED (~0)
55#define LIGHTGROUP_NONE (~0)
56
57#define LIGHT_LINK_SET_MAX 64
58#define LIGHT_LINK_MASK_ALL (~uint64_t(0))
59
60#define INTEGRATOR_SHADOW_ISECT_SIZE_CPU 1024U
61#define INTEGRATOR_SHADOW_ISECT_SIZE_GPU 4U
62
63#ifdef __KERNEL_GPU__
64# define INTEGRATOR_SHADOW_ISECT_SIZE INTEGRATOR_SHADOW_ISECT_SIZE_GPU
65#else
66# define INTEGRATOR_SHADOW_ISECT_SIZE INTEGRATOR_SHADOW_ISECT_SIZE_CPU
67#endif
68
69/* Kernel Features */
70
71/* Shader nodes. */
72#define KERNEL_FEATURE_NODE_BSDF (1U << 0U)
73#define KERNEL_FEATURE_NODE_EMISSION (1U << 1U)
74#define KERNEL_FEATURE_NODE_VOLUME (1U << 2U)
75#define KERNEL_FEATURE_NODE_BUMP (1U << 3U)
76#define KERNEL_FEATURE_NODE_BUMP_STATE (1U << 4U)
77#define KERNEL_FEATURE_NODE_VORONOI_EXTRA (1U << 5U)
78#define KERNEL_FEATURE_NODE_RAYTRACE (1U << 6U)
79#define KERNEL_FEATURE_NODE_AOV (1U << 7U)
80#define KERNEL_FEATURE_NODE_LIGHT_PATH (1U << 8U)
81#define KERNEL_FEATURE_NODE_PRINCIPLED_HAIR (1U << 9U)
82
83/* Use path tracing kernels. */
84#define KERNEL_FEATURE_PATH_TRACING (1U << 10U)
85
86/* BVH/sampling kernel features. */
87#define KERNEL_FEATURE_POINTCLOUD (1U << 11U)
88#define KERNEL_FEATURE_HAIR (1U << 12U)
89#define KERNEL_FEATURE_HAIR_THICK (1U << 13U)
90#define KERNEL_FEATURE_OBJECT_MOTION (1U << 14U)
91
92/* Denotes whether baking functionality is needed. */
93#define KERNEL_FEATURE_BAKING (1U << 15U)
94
95/* Use subsurface scattering materials. */
96#define KERNEL_FEATURE_SUBSURFACE (1U << 16U)
97
98/* Use volume materials. */
99#define KERNEL_FEATURE_VOLUME (1U << 17U)
100
101/* Use OpenSubdiv patch evaluation */
102#define KERNEL_FEATURE_PATCH_EVALUATION (1U << 18U)
103
104/* Use Transparent shadows */
105#define KERNEL_FEATURE_TRANSPARENT (1U << 19U)
106
107/* Use shadow catcher. */
108#define KERNEL_FEATURE_SHADOW_CATCHER (1U << 20U)
109
110/* Light render passes. */
111#define KERNEL_FEATURE_LIGHT_PASSES (1U << 21U)
112
113/* AO. */
114#define KERNEL_FEATURE_AO_PASS (1U << 22U)
115#define KERNEL_FEATURE_AO_ADDITIVE (1U << 23U)
116#define KERNEL_FEATURE_AO (KERNEL_FEATURE_AO_PASS | KERNEL_FEATURE_AO_ADDITIVE)
117
118/* MNEE. */
119#define KERNEL_FEATURE_MNEE (1U << 24U)
120
121/* Path guiding. */
122#define KERNEL_FEATURE_PATH_GUIDING (1U << 25U)
123
124/* OSL. */
125#define KERNEL_FEATURE_OSL (1U << 26U)
126
127/* Light and shadow linking. */
128#define KERNEL_FEATURE_LIGHT_LINKING (1U << 27U)
129#define KERNEL_FEATURE_SHADOW_LINKING (1U << 28U)
130
131/* Use denoising kernels and output denoising passes. */
132#define KERNEL_FEATURE_DENOISING (1U << 29U)
133
134/* Light tree. */
135#define KERNEL_FEATURE_LIGHT_TREE (1U << 30U)
136
137/* Shader node feature mask, to specialize shader evaluation for kernels. */
138
139#define KERNEL_FEATURE_NODE_MASK_SURFACE_LIGHT \
140 (KERNEL_FEATURE_NODE_EMISSION | KERNEL_FEATURE_NODE_VORONOI_EXTRA | \
141 KERNEL_FEATURE_NODE_LIGHT_PATH)
142#define KERNEL_FEATURE_NODE_MASK_SURFACE_BACKGROUND \
143 (KERNEL_FEATURE_NODE_MASK_SURFACE_LIGHT | KERNEL_FEATURE_NODE_AOV)
144#define KERNEL_FEATURE_NODE_MASK_SURFACE_SHADOW \
145 (KERNEL_FEATURE_NODE_BSDF | KERNEL_FEATURE_NODE_EMISSION | KERNEL_FEATURE_NODE_BUMP | \
146 KERNEL_FEATURE_NODE_BUMP_STATE | KERNEL_FEATURE_NODE_VORONOI_EXTRA | \
147 KERNEL_FEATURE_NODE_LIGHT_PATH | KERNEL_FEATURE_NODE_PRINCIPLED_HAIR)
148#define KERNEL_FEATURE_NODE_MASK_SURFACE \
149 (KERNEL_FEATURE_NODE_MASK_SURFACE_SHADOW | KERNEL_FEATURE_NODE_RAYTRACE | \
150 KERNEL_FEATURE_NODE_AOV | KERNEL_FEATURE_NODE_LIGHT_PATH)
151#define KERNEL_FEATURE_NODE_MASK_VOLUME \
152 (KERNEL_FEATURE_NODE_EMISSION | KERNEL_FEATURE_NODE_VOLUME | \
153 KERNEL_FEATURE_NODE_VORONOI_EXTRA | KERNEL_FEATURE_NODE_LIGHT_PATH)
154#define KERNEL_FEATURE_NODE_MASK_DISPLACEMENT \
155 (KERNEL_FEATURE_NODE_VORONOI_EXTRA | KERNEL_FEATURE_NODE_BUMP | KERNEL_FEATURE_NODE_BUMP_STATE)
156#define KERNEL_FEATURE_NODE_MASK_BUMP KERNEL_FEATURE_NODE_MASK_DISPLACEMENT
157
158/* Must be constexpr on the CPU to avoid compile errors because the state types
159 * are different depending on the main, shadow or null path. For GPU we don't have
160 * C++17 everywhere so need to check it. */
161#if __cplusplus < 201703L
162# define IF_KERNEL_FEATURE(feature) if ((node_feature_mask & (KERNEL_FEATURE_##feature)) != 0U)
163# define IF_KERNEL_NODES_FEATURE(feature) \
164 if ((node_feature_mask & (KERNEL_FEATURE_NODE_##feature)) != 0U)
165#else
166# define IF_KERNEL_FEATURE(feature) \
167 if constexpr ((node_feature_mask & (KERNEL_FEATURE_##feature)) != 0U)
168# define IF_KERNEL_NODES_FEATURE(feature) \
169 if constexpr ((node_feature_mask & (KERNEL_FEATURE_NODE_##feature)) != 0U)
170#endif
171
172/* Kernel features */
173#define __AO__
174#define __CAUSTICS_TRICKS__
175#define __CLAMP_SAMPLE__
176#define __DENOISING_FEATURES__
177#define __DPDU__
178#define __HAIR__
179#define __LIGHT_LINKING__
180#define __SHADOW_LINKING__
181#define __LIGHT_TREE__
182#define __OBJECT_MOTION__
183#define __MNEE__
184#define __PASSES__
185#define __PATCH_EVAL__
186#define __POINTCLOUD__
187#define __PRINCIPLED_HAIR__
188#define __RAY_DIFFERENTIALS__
189#define __SHADER_RAYTRACE__
190#define __SHADOW_CATCHER__
191#define __SHADOW_RECORD_ALL__
192#define __SUBSURFACE__
193#define __SVM__
194#define __TRANSPARENT_SHADOWS__
195#define __VISIBILITY_FLAG__
196#define __VOLUME__
197
198/* Device specific features */
199#ifdef WITH_OSL
200# define __OSL__
201# ifdef __KERNEL_OPTIX__
202/* Kernels with OSL support are built separately in OptiX and don't need SVM. */
203# undef __SVM__
204# endif
205#endif
206#ifndef __KERNEL_GPU__
207# ifdef WITH_PATH_GUIDING
208# define __PATH_GUIDING__
209# endif
210# define __VOLUME_RECORD_ALL__
211#endif /* !__KERNEL_GPU__ */
212
213/* MNEE caused "Compute function exceeds available temporary registers" in macOS < 13 due to a bug
214 * in spill buffer allocation sizing. */
215#if defined(__KERNEL_METAL__) && (__KERNEL_METAL_MACOS__ < 13)
216# undef __MNEE__
217#endif
218
219/* Scene-based selective features compilation. */
220/* Scene-based selective features compilation. */
221#ifdef __KERNEL_FEATURES__
222# if !(__KERNEL_FEATURES__ & KERNEL_FEATURE_OBJECT_MOTION)
223# undef __OBJECT_MOTION__
224# endif
225# if !(__KERNEL_FEATURES__ & KERNEL_FEATURE_HAIR)
226# undef __HAIR__
227# endif
228# if !(__KERNEL_FEATURES__ & KERNEL_FEATURE_POINTCLOUD)
229# undef __POINTCLOUD__
230# endif
231# if !(__KERNEL_FEATURES__ & KERNEL_FEATURE_VOLUME)
232# undef __VOLUME__
233# if !(__KERNEL_FEATURES__ & KERNEL_FEATURE_TRANSPARENT)
234# undef __TRANSPARENT_SHADOWS__
235# undef __SHADOW_RECORD_ALL__
236# endif
237# endif
238# if !(__KERNEL_FEATURES__ & KERNEL_FEATURE_SUBSURFACE)
239# undef __SUBSURFACE__
240# endif
241# if !(__KERNEL_FEATURES__ & KERNEL_FEATURE_PATCH_EVALUATION)
242# undef __PATCH_EVAL__
243# endif
244# if !(__KERNEL_FEATURES__ & KERNEL_FEATURE_SHADOW_CATCHER)
245# undef __SHADOW_CATCHER__
246# endif
247# if !(__KERNEL_FEATURES__ & KERNEL_FEATURE_DENOISING)
248# undef __DENOISING_FEATURES__
249# endif
250# if !(__KERNEL_FEATURES__ & KERNEL_FEATURE_AO)
251# undef __AO__
252# endif
253# if !(__KERNEL_FEATURES__ & KERNEL_FEATURE_MNEE)
254# undef __MNEE__
255# endif
256# if !(__KERNEL_FEATURES__ & KERNEL_FEATURE_PATH_GUIDING)
257# undef __PATH_GUIDING__
258# endif
259# if !(__KERNEL_FEATURES__ & KERNEL_FEATURE_NODE_PRINCIPLED_HAIR)
260# undef __PRINCIPLED_HAIR__
261# endif
262# if !(__KERNEL_FEATURES__ & KERNEL_FEATURE_LIGHT_LINKING)
263# undef __LIGHT_LINKING__
264# endif
265# if !(__KERNEL_FEATURES__ & KERNEL_FEATURE_SHADOW_LINKING)
266# undef __SHADOW_LINKING__
267# endif
268#endif
269
270#ifdef WITH_CYCLES_DEBUG_NAN
271# define __KERNEL_DEBUG_NAN__
272#endif
273
274/* Features that enable others */
275
276#if defined(__SUBSURFACE__) || defined(__SHADER_RAYTRACE__)
277# define __BVH_LOCAL__
278#endif
279
280/* Sampling Patterns */
281
282/* Unique numbers for sampling patterns in each bounce. */
284 /* Init bounce */
287
288 /* Shade bounce */
292 /* Surface */
297
298 /* Guiding RIS */
301
302 /* Volume */
310
311 /* Subsurface random walk bounces */
317
318 /* Subsurface disk bounce */
321
322 /* High enough number so we don't need to change it when adding new dimensions,
323 * low enough so there is no uint16_t overflow with many bounces. */
325};
326
338
339/* These flags values correspond to `raytypes` in `osl.cpp`, so keep them in sync! */
340
342 /* --------------------------------------------------------------------
343 * Ray visibility.
344 *
345 * NOTE: Recalculated after a surface bounce.
346 */
347
348 PATH_RAY_CAMERA = (1U << 0U),
349 PATH_RAY_REFLECT = (1U << 1U),
350 PATH_RAY_TRANSMIT = (1U << 2U),
351 PATH_RAY_DIFFUSE = (1U << 3U),
352 PATH_RAY_GLOSSY = (1U << 4U),
353 PATH_RAY_SINGULAR = (1U << 5U),
357
358 /* Shadow ray visibility. */
362
363 /* Subset of flags used for ray visibility for intersection.
364 *
365 * NOTE: SHADOW_CATCHER macros below assume there are no more than
366 * 16 visibility bits. */
367 PATH_RAY_ALL_VISIBILITY = ((1U << 11U) - 1U),
368
369 /* Special flag to tag unaligned BVH nodes.
370 * Only set and used in BVH nodes to distinguish how to interpret bounding box information stored
371 * in the node (either it should be intersected as AABB or as OBBU).
372 * So this can overlap with path flags. */
374
375 /* --------------------------------------------------------------------
376 * Path flags.
377 */
378
379 /* Surface had transmission component at previous bounce. Used for light tree
380 * traversal and culling to be consistent with MIS PDF at the next bounce. */
382
383 /* Don't apply multiple importance sampling weights to emission from
384 * lamp or surface hits, because they were not direct light sampled. */
385 PATH_RAY_MIS_SKIP = (1U << 12U),
386
387 /* Diffuse bounce earlier in the path, skip SSS to improve performance
388 * and avoid branching twice with disk sampling SSS. */
390
391 /* Single pass has been written. */
393
394 /* Zero background alpha, for camera or transparent glass rays. */
396
397 /* Terminate ray immediately at next bounce. */
400
401 /* Ray is to be terminated, but continue with transparent bounces and
402 * emission as long as we encounter them. This is required to make the
403 * MIS between direct and indirect light rays match, as shadow rays go
404 * through transparent surfaces to reach emission too. */
406
407 /* Terminate ray immediately after volume shading. */
409
410 /* Ray is to be terminated. */
413
414 /* Path and shader is being evaluated for direct lighting emission. */
415 PATH_RAY_EMISSION = (1U << 20U),
416
417 /* Perform subsurface scattering. */
423
424 /* Contribute to denoising features. */
426
427 /* Render pass categories. */
429 PATH_RAY_VOLUME_PASS = (1U << 27U),
431
432 /* Shadow ray is for AO. */
434
435 /* A shadow catcher object was hit and the path was split into two. */
437
438 /* A shadow catcher object was hit and this path traces only shadow catchers, writing them into
439 * their dedicated pass for later division.
440 *
441 * NOTE: Is not covered with `PATH_RAY_ANY_PASS` because shadow catcher does special handling
442 * which is separate from the light passes. */
444
445 /* Path is evaluating background for an approximate shadow catcher with non-transparent film. */
447};
448
449// 8bit enum, just in case we need to move more variables in it
457
458/* Configure ray visibility bits for rays and objects respectively,
459 * to make shadow catchers work.
460 *
461 * On shadow catcher paths we want to ignore any intersections with non-catchers,
462 * whereas on regular paths we want to intersect all objects. */
463
464#define SHADOW_CATCHER_VISIBILITY_SHIFT(visibility) ((visibility) << 16)
465
466#define SHADOW_CATCHER_PATH_VISIBILITY(path_flag, visibility) \
467 (((path_flag) & PATH_RAY_SHADOW_CATCHER_PASS) ? SHADOW_CATCHER_VISIBILITY_SHIFT(visibility) : \
468 (visibility))
469
470#define SHADOW_CATCHER_OBJECT_VISIBILITY(is_shadow_catcher, visibility) \
471 (((is_shadow_catcher) ? SHADOW_CATCHER_VISIBILITY_SHIFT(visibility) : 0) | (visibility))
472
473/* Closure Label */
474
488
489/* Render Passes */
490
491#define PASS_NAME_JOIN(a, b) a##_##b
492#define PASSMASK(pass) (1 << ((PASS_NAME_JOIN(PASS, pass)) % 32))
493
494// NOTE: Keep in sync with `Pass::get_type_enum()`.
495typedef enum PassType {
497
498 /* Light Passes */
516
517 /* Data passes */
535 /* No Scatter color since it's tricky to define what it would even mean. */
541
542 /* PASS_SHADOW_CATCHER accumulates contribution of shadow catcher object which is not affected by
543 * any other object. The pass accessor will divide the combined pass by the shadow catcher. The
544 * result of this division is then to be multiplied with the backdrop. The alpha channel of this
545 * pass contains number of samples which contributed to the color components of the pass.
546 *
547 * PASS_SHADOW_CATCHER_SAMPLE_COUNT contains number of samples for which the path split
548 * happened.
549 *
550 * PASS_SHADOW_CATCHER_MATTE contains pass which contains non-catcher objects. This pass is to be
551 * alpha-overed onto the backdrop (after multiplication). */
555
556 /* Guiding related debug rendering passes */
557 /* The estimated sample color from the PathSegmentStorage. If everything is integrated correctly
558 * the output should be similar to PASS_COMBINED. */
560 /* The guiding probability at the first bounce. */
562 /* The avg. roughness at the first bounce. */
565
570
573
574#define PASS_ANY (~0)
575
583
589
590/* Closure Filter */
591
600
601/* Shader Flag */
602
621
631
632/* Light Type */
633
642
643/* Guiding Distribution Type */
644
652
653/* Guiding Directional Sampling Type */
654
662
663/* Camera Type */
664
666
667/* Panorama Type */
668
679
680/* Specifies an offset for the shutter's time interval. */
682 /* Shutter opens at the current frame. */
684 /* Shutter is fully open at the current frame. */
686 /* Shutter closes at the current frame. */
688
690};
691
692/* Direct Light Sampling */
693
701
702/* Differential */
703
708
709typedef struct differential {
710 float dx;
711 float dy;
713
714/* Ray */
715
716typedef struct RaySelfPrimitives {
717 int prim; /* Primitive the ray is starting from */
718 int object; /* Instance prim is a part of */
719 int light_prim; /* Light primitive */
720 int light_object; /* Light object */
721 int light; /* Light ID (the light the shadow ray is traced towards to) */
723
724typedef struct Ray {
725 float3 P; /* origin */
726 float3 D; /* direction */
727 float tmin; /* start distance */
728 float tmax; /* end distance */
729 float time; /* time (for motion blur) */
730
731#ifdef __RAY_DIFFERENTIALS__
732 float dP;
733 float dD;
734#endif
735
738
739/* Intersection */
740
741typedef struct Intersection {
742 float t, u, v;
743 int prim;
745 int type;
747
748/* On certain GPUs (Apple Silicon), splitting every integrator state field into its own separate
749 * array can be detrimental for cache utilization. By enabling __INTEGRATOR_GPU_PACKED_STATE__, we
750 * specify that certain fields should be packed together. This improves cache hit ratios in cases
751 * where fields are often accessed together (e.g. "ray" and "isect").
752 */
753#if (defined(__APPLE__) && TARGET_CPU_ARM64) || \
754 (defined(__KERNEL_METAL_APPLE__) && defined(__KERNEL_METAL_TARGET_CPU_ARM64__))
755# define __INTEGRATOR_GPU_PACKED_STATE__
756
757/* Generate packed layouts for structs declared with KERNEL_STRUCT_BEGIN_PACKED. For example the
758 * following template...
759 *
760 * KERNEL_STRUCT_BEGIN_PACKED(shadow_ray, KERNEL_FEATURE_PATH_TRACING)
761 * KERNEL_STRUCT_MEMBER_PACKED(shadow_ray, packed_float3, P, KERNEL_FEATURE_PATH_TRACING)
762 * KERNEL_STRUCT_MEMBER_PACKED(shadow_ray, packed_float3, D, KERNEL_FEATURE_PATH_TRACING)
763 * KERNEL_STRUCT_MEMBER_PACKED(shadow_ray, float, tmin, KERNEL_FEATURE_PATH_TRACING)
764 * KERNEL_STRUCT_MEMBER_PACKED(shadow_ray, float, tmax, KERNEL_FEATURE_PATH_TRACING)
765 * KERNEL_STRUCT_MEMBER_PACKED(shadow_ray, float, time, KERNEL_FEATURE_PATH_TRACING)
766 * KERNEL_STRUCT_MEMBER_PACKED(shadow_ray, float, dP, KERNEL_FEATURE_PATH_TRACING)
767 * KERNEL_STRUCT_MEMBER_PACKED(shadow_ray, int, self_light, KERNEL_FEATURE_SHADOW_LINKING)
768 * KERNEL_STRUCT_END(shadow_ray)
769 *
770 * ...will produce the following packed struct:
771 *
772 * struct packed_shadow_ray {
773 * packed_float3 P;
774 * packed_float3 D;
775 * float tmin;
776 * float tmax;
777 * float time;
778 * float dP;
779 * int self_light;
780 * };
781 */
782
783# define KERNEL_STRUCT_BEGIN(name) struct dummy_##name {
784# define KERNEL_STRUCT_BEGIN_PACKED(parent_struct, feature) struct packed_##parent_struct {
785# define KERNEL_STRUCT_MEMBER(parent_struct, type, name, feature)
786# define KERNEL_STRUCT_MEMBER_PACKED(parent_struct, type, name, feature) type name;
787# define KERNEL_STRUCT_ARRAY_MEMBER(parent_struct, type, name, feature) type name;
788# define KERNEL_STRUCT_END(name) \
789 } \
790 ;
791# define KERNEL_STRUCT_END_ARRAY(name, cpu_size, gpu_size) \
792 } \
793 ;
794# define KERNEL_STRUCT_VOLUME_STACK_SIZE MAX_VOLUME_STACK_SIZE
795
798
799# undef KERNEL_STRUCT_BEGIN
800# undef KERNEL_STRUCT_BEGIN_PACKED
801# undef KERNEL_STRUCT_MEMBER
802# undef KERNEL_STRUCT_MEMBER_PACKED
803# undef KERNEL_STRUCT_ARRAY_MEMBER
804# undef KERNEL_STRUCT_END
805# undef KERNEL_STRUCT_END_ARRAY
806# undef KERNEL_STRUCT_VOLUME_STACK_SIZE
807
808#endif
809
810/* Primitives */
811
836
837/* Convert type to index in range 0..PRIMITIVE_NUM-1. */
838#define PRIMITIVE_INDEX(type) \
839 (bitscan((uint32_t)(type)) * 2 + (((type) & PRIMITIVE_MOTION) ? 1 : 0))
840
841/* Pack segment into type value to save space. */
842#define PRIMITIVE_PACK_SEGMENT(type, segment) ((segment << PRIMITIVE_NUM_BITS) | (type))
843#define PRIMITIVE_UNPACK_SEGMENT(type) (type >> PRIMITIVE_NUM_BITS)
844
851
852/* Attributes */
853
860
875
913
918
925
926/* For looking up attributes on objects and geometry. */
927typedef struct AttributeMap {
928 uint64_t id; /* Global unique identifier. */
929 int offset; /* Offset into __attributes global arrays. */
930 uint16_t element; /* AttributeElement. */
931 uint8_t type; /* NodeAttributeType. */
932 uint8_t flags; /* AttributeFlag. */
934
935/* Closure data */
936
937#ifndef __MAX_CLOSURE__
938# define MAX_CLOSURE 64
939#else
940# define MAX_CLOSURE __MAX_CLOSURE__
941#endif
942
943/* For manifold next event estimation, we need space to store and evaluate
944 * 2 closures (with extra data) on the refractive interfaces, in addition
945 * to keeping the full sd at the current shading point. We need 4 because a
946 * refractive BSDF is instanced with a companion reflection BSDF, even though
947 * we only need the refractive one, and each of them requires 2 slots. */
948#ifndef __CAUSTICS_MAX_CLOSURE__
949# define CAUSTICS_MAX_CLOSURE 4
950#else
951# define CAUSTICS_MAX_CLOSURE __CAUSTICS_MAX_CLOSURE__
952#endif
953
954#ifndef __MAX_VOLUME_STACK_SIZE__
955# define MAX_VOLUME_STACK_SIZE 32
956#else
957# define MAX_VOLUME_STACK_SIZE __MAX_VOLUME_STACK_SIZE__
958#endif
959
960#define MAX_VOLUME_CLOSURE 8
961
962/* This struct is the base class for all closures. The common members are
963 * duplicated in all derived classes since we don't have C++ in the kernel
964 * yet, and because it lets us lay out the members to minimize padding. The
965 * weight member is located at the beginning of the struct for this reason.
966 *
967 * ShaderClosure has a fixed size, and any extra space must be allocated
968 * with closure_alloc_extra().
969 *
970 * We pad the struct to align to 16 bytes. All shader closures are assumed
971 * to fit in this struct size. CPU sizes are a bit larger because float3 is
972 * padded to be 16 bytes, while it's only 12 bytes on the GPU. */
973
974#define SHADER_CLOSURE_BASE \
975 Spectrum weight; \
976 ClosureType type; \
977 float sample_weight; \
978 float3 N
979
980/* To save some space, volume closures (phase functions) don't store a normal.
981 * They are still allocated as ShaderClosures first, but get assigned to
982 * slots of type ShaderVolumeClosure later, so make sure to keep the layout
983 * in sync. */
984#define SHADER_CLOSURE_VOLUME_BASE \
985 Spectrum weight; \
986 ClosureType type; \
987 float sample_weight
988
989typedef struct ccl_align(16) ShaderClosure
990{
992
993 /* Extra space for closures to store data, somewhat arbitrary but closures
994 * assert that their size fits. */
995 char pad[sizeof(Spectrum) * 2 + sizeof(float) * 4];
996}
998
999/* Shader Data
1000 *
1001 * Main shader state at a point on the surface or in a volume. All coordinates
1002 * are in world space.
1003 */
1004
1006 /* Runtime flags. */
1007
1008 /* Set when ray hits backside of surface. */
1009 SD_BACKFACING = (1 << 0),
1010 /* Shader has non-zero emission. */
1011 SD_EMISSION = (1 << 1),
1012 /* Shader has BSDF closure. */
1013 SD_BSDF = (1 << 2),
1014 /* Shader has non-singular BSDF closure. */
1016 /* Shader has BSSRDF closure. */
1017 SD_BSSRDF = (1 << 4),
1018 /* Shader has holdout closure. */
1019 SD_HOLDOUT = (1 << 5),
1020 /* Shader has non-zero volume extinction. */
1021 SD_EXTINCTION = (1 << 6),
1022 /* Shader has have volume phase (scatter) closure. */
1023 SD_SCATTER = (1 << 7),
1024 /* Shader is being evaluated in a volume. */
1026 /* Shader has transparent closure. */
1027 SD_TRANSPARENT = (1 << 9),
1028 /* BSDF requires LCG for evaluation. */
1030 /* BSDF has a transmissive component. */
1032 /* Shader has ray portal closure. */
1033 SD_RAY_PORTAL = (1 << 12),
1034
1038
1039 /* Shader flags. */
1040
1041 /* Apply a correction term to smooth illumination on grazing angles when using bump mapping.. */
1043 /* Use front side for direct light sampling. */
1044 SD_MIS_FRONT = (1 << 16),
1045 /* Has transparent shadow. */
1047 /* Has volume shader. */
1048 SD_HAS_VOLUME = (1 << 18),
1049 /* Has only volume shader, no surface. */
1051 /* Has heterogeneous volume. */
1053 /* BSSRDF normal uses bump. */
1055 /* Use equiangular volume sampling */
1057 /* Use multiple importance volume sampling. */
1058 SD_VOLUME_MIS = (1 << 23),
1059 /* Use cubic interpolation for voxels. */
1060 SD_VOLUME_CUBIC = (1 << 24),
1061 /* Has data connected to the displacement input or uses bump map. */
1062 SD_HAS_BUMP = (1 << 25),
1063 /* Has true displacement. */
1065 /* Has constant emission (value stored in __shaders) */
1067 /* Needs to access attributes for volume rendering */
1069 /* Shader has emission */
1070 SD_HAS_EMISSION = (1 << 29),
1071 /* Shader has ray-tracing. */
1072 SD_HAS_RAYTRACE = (1 << 30),
1073 /* Use back side for direct light sampling. */
1074 SD_MIS_BACK = (1 << 31),
1075
1082
1083/* Object flags. */
1085 /* Holdout for camera rays. */
1087 /* Has object motion blur. */
1089 /* Vertices have transform applied. */
1091 /* The object's transform applies a negative scale. */
1093 /* Object has a volume shader. */
1095 /* Object intersects AABB of an object with volume shader. */
1097 /* Has position for motion vertices. */
1099 /* object is used to catch shadows */
1101 /* object has volume attributes */
1103 /* object is caustics caster */
1105 /* object is caustics receiver */
1107 /* object has attribute for volume motion */
1109
1110 /* object is using caustics */
1112
1119
1120typedef struct ccl_align(16) ShaderData
1121{
1122 /* position */
1123 float3 P;
1124 /* smooth normal for shading */
1125 float3 N;
1126 /* true geometric normal */
1127 float3 Ng;
1128 /* view/incoming direction */
1129 float3 wi;
1130 /* shader id */
1131 int shader;
1132 /* booleans describing shader, see ShaderDataFlag */
1133 int flag;
1134 /* booleans describing object of the shader, see ShaderDataObjectFlag */
1135 int object_flag;
1136
1137 /* primitive id if there is one, ~0 otherwise */
1138 int prim;
1139
1140 /* combined type and curve segment for hair */
1141 int type;
1142
1143 /* parametric coordinates
1144 * - barycentric weights for triangles */
1145 float u;
1146 float v;
1147 /* object id if there is one, ~0 otherwise */
1148 int object;
1149 /* lamp id if there is one, ~0 otherwise */
1150 int lamp;
1151
1152 /* motion blur sample time */
1153 float time;
1154
1155 /* length of the ray being shaded */
1156 float ray_length;
1157
1158#ifdef __RAY_DIFFERENTIALS__
1159 /* Radius of differential of P. */
1160 float dP;
1161 /* Radius of differential of wi. */
1162 float dI;
1163 /* differential of u, v */
1164 differential du;
1165 differential dv;
1166#endif
1167#ifdef __DPDU__
1168 /* differential of P w.r.t. parametric coordinates. note that dPdu is
1169 * not readily suitable as a tangent for shading on triangles. */
1170 float3 dPdu;
1171 float3 dPdv;
1172#endif
1173
1174#ifdef __OBJECT_MOTION__
1175 /* Object <-> world space transformations for motion blur, cached to avoid
1176 * re-interpolating them constantly for shading. */
1177 Transform ob_tfm_motion;
1178 Transform ob_itfm_motion;
1179#endif
1180
1181 /* ray start position, only set for backgrounds */
1182 float3 ray_P;
1183 float ray_dP;
1184
1185#ifdef __OSL__
1186# ifdef __KERNEL_GPU__
1187 ccl_private uint8_t *osl_closure_pool;
1188# else
1189 const struct KernelGlobalsCPU *osl_globals;
1190 const struct IntegratorStateCPU *osl_path_state;
1191 const struct IntegratorShadowStateCPU *osl_shadow_path_state;
1192# endif
1193#endif
1194
1195 /* LCG state for closures that require additional random numbers. */
1196 uint lcg_state;
1197
1198 /* Closure data, we store a fixed array of closures */
1199 int num_closure;
1200 int num_closure_left;
1201
1202 /* Closure weights summed directly, so we can evaluate
1203 * emission and shadow transparency with MAX_CLOSURE 0. */
1204 Spectrum closure_emission_background;
1205 Spectrum closure_transparent_extinction;
1206
1207 /* At the end so we can adjust size in ShaderDataTinyStorage. */
1208 struct ShaderClosure closure[MAX_CLOSURE];
1209}
1211
1212/* ShaderDataTinyStorage needs the same alignment as ShaderData, or else
1213 * the pointer cast in AS_SHADER_DATA invokes undefined behavior. */
1214typedef struct ccl_align(16) ShaderDataTinyStorage
1215{
1216 char pad[sizeof(ShaderData) - sizeof(ShaderClosure) * MAX_CLOSURE];
1217}
1219
1220/* ShaderDataCausticsStorage needs the same alignment as ShaderData, or else
1221 * the pointer cast in AS_SHADER_DATA invokes undefined behavior. */
1222typedef struct ccl_align(16) ShaderDataCausticsStorage
1223{
1224 char pad[sizeof(ShaderData) - sizeof(ShaderClosure) * (MAX_CLOSURE - CAUSTICS_MAX_CLOSURE)];
1225}
1227
1228#define AS_SHADER_DATA(shader_data_tiny_storage) \
1229 ((ccl_private ShaderData *)shader_data_tiny_storage)
1230
1231/* Compact volume closures storage.
1232 *
1233 * Used for decoupled direct/indirect light closure storage.
1234 *
1235 * This shares its basic layout with SHADER_CLOSURE_VOLUME_BASE and ShaderClosure,
1236 * just without the normal and with less space for closure-specific parameters.
1237 * That way, we can just cast ShaderClosure* to ShaderVolumeClosure* and assign it.
1238 */
1239typedef struct ShaderVolumeClosure {
1243 /* Space for closure-specific parameters. */
1244 float param[3];
1246
1251
1252/* Volume Stack */
1253
1254#ifdef __VOLUME__
1259#endif
1260
1261/* Struct to gather multiple nearby intersections. */
1267
1268/* Constant Kernel Data
1269 *
1270 * These structs are passed from CPU to various devices, and the struct layout
1271 * must match exactly. Structs are padded to ensure 16 byte alignment, and we
1272 * do not use float3 because its size may not be the same on all devices. */
1273
1274typedef struct KernelCamera {
1275 /* type */
1276 int type;
1278
1279 /* depth of field */
1281 float blades;
1284
1285 /* motion blur */
1288
1289 int pad1;
1290 int pad2;
1291 int pad3;
1292
1293 /* panorama */
1301
1302 /* stereo */
1307
1308 /* matrices */
1311
1312 /* differentials */
1313 float4 dx;
1314 float4 dy;
1315
1316 /* clipping */
1319
1320 /* sensor size */
1323
1324 /* render size */
1326
1327 /* anamorphic lens bokeh */
1329
1331
1332 /* more matrices */
1340
1341 /* Stores changes in the projection matrix. Use for camera zoom motion
1342 * blur and motion pass output for perspective camera. */
1345
1346 /* Transforms for motion pass. */
1349
1351
1352 /* Rolling shutter */
1355
1359
1360typedef struct KernelFilmConvert {
1363
1366
1369
1378
1379 float scale;
1382
1386
1387 /* Number of components to write to. */
1389
1390 /* Number of floats per pixel. When zero is the same as `num_components`.
1391 * NOTE: Is ignored for half4 destination. */
1393
1395
1396 /* Padding. */
1397 int pad1;
1400
1426
1427/* Specialized struct that can become constants in dynamic compilation. */
1428#define KERNEL_STRUCT_BEGIN(name, parent) \
1429 struct ccl_align(16) name \
1430 {
1431#define KERNEL_STRUCT_END(name) \
1432 } \
1433 ; \
1434 static_assert_align(name, 16);
1435
1436#ifdef __KERNEL_USE_DATA_CONSTANTS__
1437# define KERNEL_STRUCT_MEMBER(parent, type, name) type __unused_##name;
1438#else
1439# define KERNEL_STRUCT_MEMBER(parent, type, name) type name;
1440#endif
1441
1442#include "kernel/data_template.h"
1443
1459
1467
1471
1472typedef struct ccl_align(16) KernelData
1473{
1474 /* Features and limits. */
1475 uint kernel_features;
1476 uint max_closures;
1477 uint max_shaders;
1478 uint volume_stack_size;
1479
1480 /* Always dynamic data members. */
1481 KernelCamera cam;
1483 KernelTables tables;
1484 KernelLightLinkSet light_link_sets[LIGHT_LINK_SET_MAX];
1485
1486 /* Potentially specialized data members. */
1487#define KERNEL_STRUCT_BEGIN(name, parent) name parent;
1488#include "kernel/data_template.h"
1489
1490 /* Device specific BVH. */
1491#ifdef __KERNEL_OPTIX__
1492 OptixTraversableHandle device_bvh;
1493#elif defined __METALRT__
1494 metalrt_as_type device_bvh;
1495#elif defined(__HIPRT__)
1496 void *device_bvh;
1497#else
1498# ifdef __EMBREE__
1499 RTCScene device_bvh;
1500# ifndef __KERNEL_64_BIT__
1501 int pad1;
1502# endif
1503# else
1504 int device_bvh, pad1;
1505# endif
1506#endif
1507 int pad2, pad3;
1508}
1511
1512/* Kernel data structures. */
1513
1559
1567
1573
1574typedef struct KernelSpotLight {
1576 float radius;
1582 /* For non-uniform object scaling, the actual spread might be different. */
1584 /* Distance from the apex of the smallest enclosing cone of the light spread to light center. */
1587
1588/* PointLight is SpotLight with only radius and invarea being used. */
1589
1601
1610
1631
1632using MeshLight = struct MeshLight {
1633 int shader_flag;
1634 int object_id;
1635};
1636
1643
1644/* Bounding box. */
1645using BoundingBox = struct BoundingBox {
1648};
1649
1651 packed_float3 axis;
1652 float theta_o;
1653 float theta_e;
1654};
1655
1662
1663typedef struct KernelLightTreeNode {
1664 /* Bounding box. */
1666
1667 /* Bounding cone. */
1669
1670 /* Energy. */
1671 float energy;
1672
1674
1675 /* Leaf nodes need to know the number of emitters stored. */
1677
1678 union {
1679 struct {
1680 int first_emitter; /* The index of the first emitter. */
1682 struct {
1683 /* Indices of the children. */
1687 struct {
1688 int reference; /* A reference to the node with the subtree. */
1690 };
1691
1692 /* Bit trail. */
1694
1695 /* Bits to skip in the bit trail, to skip nodes in for specialized trees. */
1697
1698 /* Padding. */
1702
1704 /* Bounding cone. */
1705 float theta_o;
1706 float theta_e;
1707
1708 /* Energy. */
1709 float energy;
1710
1711 union {
1712 struct {
1713 int id; /* The location in the triangles array. */
1716
1717 struct {
1718 int id; /* The location in the lights array. */
1720
1721 struct {
1725 };
1726
1728
1729 /* Bit trail from root node to leaf node containing emitter. */
1733
1734typedef struct KernelParticle {
1736 float age;
1738 float size;
1739 float4 rotation;
1740 /* Only XYZ are used of the following. float4 instead of float3 are used
1741 * to ensure consistent padding/alignment across devices. */
1742 float4 location;
1743 float4 velocity;
1747
1756
1757/* Patches */
1758
1759#define PATCH_MAX_CONTROL_VERTS 16
1760
1761/* Patch map node flags */
1762
1763#define PATCH_MAP_NODE_IS_SET (1 << 30)
1764#define PATCH_MAP_NODE_IS_LEAF (1u << 31)
1765#define PATCH_MAP_NODE_INDEX_MASK (~(PATCH_MAP_NODE_IS_SET | PATCH_MAP_NODE_IS_LEAF))
1766
1767/* Work Tiles */
1768
1769typedef struct KernelWorkTile {
1770 uint x, y, w, h;
1771
1775
1778
1779 /* Precalculated parameters used by init_from_camera kernel on GPU. */
1783
1784/* Shader Evaluation.
1785 *
1786 * Position on a primitive on an object at which we want to evaluate the
1787 * shader for e.g. mesh displacement or light importance map. */
1788
1795
1796/* Pre-computed sample table sizes for the tabulated Sobol sampler.
1797 *
1798 * NOTE: min and max samples *must* be a power of two, and patterns
1799 * ideally should be as well.
1800 */
1801#define MIN_TAB_SOBOL_SAMPLES 256
1802#define MAX_TAB_SOBOL_SAMPLES 8192
1803#define NUM_TAB_SOBOL_DIMENSIONS 4
1804#define NUM_TAB_SOBOL_PATTERNS 256
1805
1806/* Device kernels.
1807 *
1808 * Identifier for kernels that can be executed in device queues.
1809 *
1810 * Some implementation details.
1811 *
1812 * If the kernel uses shared CUDA memory, `CUDADeviceQueue::enqueue` is to be modified.
1813 * The path iteration kernels are handled in `PathTraceWorkGPU::enqueue_path_iteration`. */
1814
1815typedef enum DeviceKernel : int {
1832
1847
1851
1852#define DECLARE_FILM_CONVERT_KERNEL(variant) \
1853 DEVICE_KERNEL_FILM_CONVERT_##variant, DEVICE_KERNEL_FILM_CONVERT_##variant##_HALF_RGBA
1854
1857 DECLARE_FILM_CONVERT_KERNEL(SAMPLE_COUNT),
1859 DECLARE_FILM_CONVERT_KERNEL(LIGHT_PATH),
1862 DECLARE_FILM_CONVERT_KERNEL(CRYPTOMATTE),
1863 DECLARE_FILM_CONVERT_KERNEL(SHADOW_CATCHER),
1864 DECLARE_FILM_CONVERT_KERNEL(SHADOW_CATCHER_MATTE_WITH_SHADOW),
1867
1868#undef DECLARE_FILM_CONVERT_KERNEL
1869
1873
1878
1880
1882
1885
1886enum {
1888};
1889
unsigned int uint
int pad[32 - sizeof(int)]
#define U
ATTR_WARN_UNUSED_RESULT const BMVert * v
double time
#define ccl_private
#define CCL_NAMESPACE_END
#define ccl_align(n)
ClosureType
NodeAttributeType
struct KernelDistantLight KernelDistantLight
struct KernelShaderEvalInput KernelShaderEvalInput
PathRayMNEE
@ PATH_MNEE_RECEIVER_ANCESTOR
@ PATH_MNEE_VALID
@ PATH_MNEE_NONE
@ PATH_MNEE_CULL_LIGHT_CONNECTION
struct BoundingCone { packed_float3 axis; float theta_o; float theta_e;} BoundingCone
struct KernelParticle KernelParticle
FilterClosures
@ FILTER_CLOSURE_EMISSION
@ FILTER_CLOSURE_GLOSSY
@ FILTER_CLOSURE_DIFFUSE
@ FILTER_CLOSURE_TRANSPARENT
@ FILTER_CLOSURE_DIRECT_LIGHT
@ FILTER_CLOSURE_TRANSMISSION
#define DECLARE_FILM_CONVERT_KERNEL(variant)
struct differential differential
struct LocalIntersection LocalIntersection
#define LIGHT_LINK_SET_MAX
struct KernelTables KernelTables
ShaderDataFlag
@ SD_VOLUME_MIS
@ SD_CLOSURE_FLAGS
@ SD_MIS_BACK
@ SD_HAS_TRANSPARENT_SHADOW
@ SD_BSDF_HAS_EVAL
@ SD_VOLUME_EQUIANGULAR
@ SD_SHADER_FLAGS
@ SD_HAS_BUMP
@ SD_HAS_CONSTANT_EMISSION
@ SD_HAS_DISPLACEMENT
@ SD_HAS_EMISSION
@ SD_IS_VOLUME_SHADER_EVAL
@ SD_BACKFACING
@ SD_MIS_FRONT
@ SD_BSSRDF
@ SD_BSDF_NEEDS_LCG
@ SD_HAS_BSSRDF_BUMP
@ SD_HAS_ONLY_VOLUME
@ SD_EXTINCTION
@ SD_HAS_RAYTRACE
@ SD_BSDF
@ SD_VOLUME_CUBIC
@ SD_HAS_VOLUME
@ SD_RAY_PORTAL
@ SD_NEED_VOLUME_ATTRIBUTES
@ SD_BSDF_HAS_TRANSMISSION
@ SD_SCATTER
@ SD_USE_BUMP_MAP_CORRECTION
@ SD_TRANSPARENT
@ SD_HETEROGENEOUS_VOLUME
@ SD_HOLDOUT
@ SD_EMISSION
struct AttributeDescriptor AttributeDescriptor
PrimitiveType
@ PRIMITIVE_LAMP
@ PRIMITIVE_MOTION_CURVE_RIBBON
@ PRIMITIVE_ALL
@ PRIMITIVE_MOTION
@ PRIMITIVE_MOTION_TRIANGLE
@ PRIMITIVE_NONE
@ PRIMITIVE_NUM_SHAPES
@ PRIMITIVE_CURVE_RIBBON
@ PRIMITIVE_VOLUME
@ PRIMITIVE_NUM
@ PRIMITIVE_MOTION_CURVE_THICK
@ PRIMITIVE_CURVE
@ PRIMITIVE_CURVE_THICK
@ PRIMITIVE_NUM_BITS
@ PRIMITIVE_TRIANGLE
@ PRIMITIVE_MOTION_POINT
@ PRIMITIVE_POINT
#define MAX_VOLUME_CLOSURE
AttributeStandard
@ ATTR_STD_CURVE_INTERCEPT
@ ATTR_STD_GENERATED_TRANSFORM
@ ATTR_STD_UV
@ ATTR_STD_MOTION_VERTEX_NORMAL
@ ATTR_STD_VOLUME_VELOCITY_Y
@ ATTR_STD_VOLUME_TEMPERATURE
@ ATTR_STD_VERTEX_NORMAL
@ ATTR_STD_UV_TANGENT
@ ATTR_STD_NOT_FOUND
@ ATTR_STD_NONE
@ ATTR_STD_VOLUME_VELOCITY_Z
@ ATTR_STD_POINT_RANDOM
@ ATTR_STD_VERTEX_COLOR
@ ATTR_STD_VOLUME_DENSITY
@ ATTR_STD_NUM
@ ATTR_STD_POSITION_UNDISPLACED
@ ATTR_STD_VOLUME_FLAME
@ ATTR_STD_PTEX_FACE_ID
@ ATTR_STD_VOLUME_VELOCITY
@ ATTR_STD_POSITION_UNDEFORMED
@ ATTR_STD_VOLUME_COLOR
@ ATTR_STD_MOTION_VERTEX_POSITION
@ ATTR_STD_VOLUME_HEAT
@ ATTR_STD_UV_TANGENT_SIGN
@ ATTR_STD_CURVE_RANDOM
@ ATTR_STD_SHADOW_TRANSPARENCY
@ ATTR_STD_FACE_NORMAL
@ ATTR_STD_PTEX_UV
@ ATTR_STD_POINTINESS
@ ATTR_STD_GENERATED
@ ATTR_STD_CURVE_LENGTH
@ ATTR_STD_VOLUME_VELOCITY_X
@ ATTR_STD_RANDOM_PER_ISLAND
@ ATTR_STD_PARTICLE
#define SHADER_CLOSURE_BASE
struct Intersection Intersection
LightTreeNodeType
@ LIGHT_TREE_INSTANCE
@ LIGHT_TREE_DISTANT
@ LIGHT_TREE_INNER
@ LIGHT_TREE_LEAF
DirectLightSamplingType
@ DIRECT_LIGHT_SAMPLING_MIS
@ DIRECT_LIGHT_SAMPLING_NUM
@ DIRECT_LIGHT_SAMPLING_NEE
@ DIRECT_LIGHT_SAMPLING_FORWARD
struct ShaderVolumeClosure ShaderVolumeClosure
PathTraceDimension
@ PRNG_SUBSURFACE_COLOR_CHANNEL
@ PRNG_SURFACE_BSDF_GUIDING
@ PRNG_BOUNCE_NUM
@ PRNG_LIGHT_TERMINATE
@ PRNG_VOLUME_PHASE
@ PRNG_SUBSURFACE_BSDF
@ PRNG_LIGHT
@ PRNG_VOLUME_OFFSET
@ PRNG_SURFACE_BSDF
@ PRNG_SUBSURFACE_DISK_RESAMPLE
@ PRNG_LENS_TIME
@ PRNG_VOLUME_SHADE_OFFSET
@ PRNG_SUBSURFACE_GUIDE_STRATEGY
@ PRNG_TERMINATE
@ PRNG_SUBSURFACE_DISK
@ PRNG_SURFACE_AO
@ PRNG_SUBSURFACE_SCATTER_DISTANCE
@ PRNG_VOLUME_PHASE_GUIDING_DISTANCE
@ PRNG_SURFACE_RIS_GUIDING_0
@ PRNG_SURFACE_BEVEL
@ PRNG_VOLUME_PHASE_GUIDING_EQUIANGULAR
@ PRNG_SUBSURFACE_GUIDE_DIRECTION
@ PRNG_FILTER
@ PRNG_VOLUME_COLOR_CHANNEL
@ PRNG_VOLUME_SCATTER_DISTANCE
@ PRNG_SURFACE_RIS_GUIDING_1
PathRayFlag
@ PATH_RAY_SHADOW_FOR_AO
@ PATH_RAY_SHADOW
@ PATH_RAY_SHADOW_CATCHER_HIT
@ PATH_RAY_VOLUME_PASS
@ PATH_RAY_TERMINATE_AFTER_TRANSPARENT
@ PATH_RAY_SINGULAR
@ PATH_RAY_REFLECT
@ PATH_RAY_IMPORTANCE_BAKE
@ PATH_RAY_MIS_HAD_TRANSMISSION
@ PATH_RAY_SUBSURFACE_BACKFACING
@ PATH_RAY_TRANSPARENT
@ PATH_RAY_TERMINATE_AFTER_VOLUME
@ PATH_RAY_SHADOW_CATCHER_PASS
@ PATH_RAY_SHADOW_OPAQUE
@ PATH_RAY_TERMINATE
@ PATH_RAY_SINGLE_PASS_DONE
@ PATH_RAY_TRANSMIT
@ PATH_RAY_SHADOW_TRANSPARENT
@ PATH_RAY_EMISSION
@ PATH_RAY_VOLUME_SCATTER
@ PATH_RAY_TERMINATE_IN_NEXT_VOLUME
@ PATH_RAY_MIS_SKIP
@ PATH_RAY_DENOISING_FEATURES
@ PATH_RAY_GLOSSY
@ PATH_RAY_SUBSURFACE
@ PATH_RAY_SURFACE_PASS
@ PATH_RAY_ALL_VISIBILITY
@ PATH_RAY_SUBSURFACE_DISK
@ PATH_RAY_NODE_UNALIGNED
@ PATH_RAY_DIFFUSE
@ PATH_RAY_TRANSPARENT_BACKGROUND
@ PATH_RAY_SHADOW_CATCHER_BACKGROUND
@ PATH_RAY_CAMERA
@ PATH_RAY_ANY_PASS
@ PATH_RAY_TERMINATE_ON_NEXT_SURFACE
@ PATH_RAY_DIFFUSE_ANCESTOR
@ PATH_RAY_SUBSURFACE_RANDOM_WALK
struct KernelFilmConvert KernelFilmConvert
struct KernelCurveSegment KernelCurveSegment
AttributeFlag
@ ATTR_FINAL_SIZE
@ ATTR_SUBDIVIDED
CryptomatteType
@ CRYPT_ASSET
@ CRYPT_NONE
@ CRYPT_ACCURATE
@ CRYPT_OBJECT
@ CRYPT_MATERIAL
struct KernelLight KernelLight
struct Ray Ray
CurveShapeType
@ CURVE_THICK
@ CURVE_NUM_SHAPE_TYPES
@ CURVE_RIBBON
struct KernelShader KernelShader
struct KernelLightDistribution KernelLightDistribution
ShaderDataTinyStorage
struct AttributeMap AttributeMap
struct KernelBake KernelBake
EmissionSampling
@ EMISSION_SAMPLING_NUM
@ EMISSION_SAMPLING_NONE
@ EMISSION_SAMPLING_AUTO
@ EMISSION_SAMPLING_BACK
@ EMISSION_SAMPLING_FRONT_BACK
@ EMISSION_SAMPLING_FRONT
#define LOCAL_MAX_HITS
struct RaySelfPrimitives RaySelfPrimitives
ShaderData
ShaderFlag
@ SHADER_EXCLUDE_SHADOW_CATCHER
@ SHADER_EXCLUDE_CAMERA
@ SHADER_EXCLUDE_DIFFUSE
@ SHADER_USE_MIS
@ SHADER_EXCLUDE_ANY
@ SHADER_EXCLUDE_SCATTER
@ SHADER_EXCLUDE_GLOSSY
@ SHADER_AREA_LIGHT
@ SHADER_EXCLUDE_TRANSMIT
@ SHADER_SMOOTH_NORMAL
@ SHADER_CAST_SHADOW
@ SHADER_MASK
MotionPosition
@ MOTION_POSITION_END
@ MOTION_POSITION_START
@ MOTION_POSITION_CENTER
@ MOTION_NUM_POSITIONS
struct KernelCurve KernelCurve
struct KernelSpotLight KernelSpotLight
GuidingDirectionalSamplingType
@ GUIDING_DIRECTIONAL_SAMPLING_NUM_TYPES
@ GUIDING_DIRECTIONAL_SAMPLING_TYPE_PRODUCT_MIS
@ GUIDING_DIRECTIONAL_SAMPLING_TYPE_RIS
@ GUIDING_DIRECTIONAL_SAMPLING_TYPE_ROUGHNESS
KernelData
ShaderDataObjectFlag
@ SD_OBJECT_MOTION
@ SD_OBJECT_HAS_VOLUME_ATTRIBUTES
@ SD_OBJECT_HAS_VOLUME
@ SD_OBJECT_CAUSTICS
@ SD_OBJECT_INTERSECTS_VOLUME
@ SD_OBJECT_NEGATIVE_SCALE
@ SD_OBJECT_HOLDOUT_MASK
@ SD_OBJECT_HAS_VOLUME_MOTION
@ SD_OBJECT_CAUSTICS_RECEIVER
@ SD_OBJECT_FLAGS
@ SD_OBJECT_SHADOW_CATCHER
@ SD_OBJECT_TRANSFORM_APPLIED
@ SD_OBJECT_HAS_VERTEX_MOTION
@ SD_OBJECT_CAUSTICS_CASTER
@ DEVICE_KERNEL_INTEGRATOR_NUM
SamplingPattern
@ SAMPLING_PATTERN_AUTOMATIC
@ SAMPLING_PATTERN_BLUE_NOISE_FIRST
@ SAMPLING_PATTERN_TABULATED_SOBOL
@ SAMPLING_PATTERN_BLUE_NOISE_PURE
@ SAMPLING_PATTERN_SOBOL_BURLEY
@ SAMPLING_NUM_PATTERNS
@ SAMPLING_PATTERN_BLUE_NOISE_ROUND
struct KernelLightTreeEmitter KernelLightTreeEmitter
KernelBVHLayout
@ BVH_LAYOUT_OPTIX
@ BVH_LAYOUT_MULTI_HIPRT_EMBREE
@ BVH_LAYOUT_NONE
@ BVH_LAYOUT_MULTI_EMBREEGPU
@ BVH_LAYOUT_METAL
@ BVH_LAYOUT_MULTI_HIPRT
@ BVH_LAYOUT_HIPRT
@ BVH_LAYOUT_EMBREE
@ BVH_LAYOUT_AUTO
@ BVH_LAYOUT_MULTI_OPTIX
@ BVH_LAYOUT_BVH2
@ BVH_LAYOUT_EMBREEGPU
@ BVH_LAYOUT_MULTI_METAL
@ BVH_LAYOUT_MULTI_METAL_EMBREE
@ BVH_LAYOUT_MULTI_EMBREEGPU_EMBREE
@ BVH_LAYOUT_ALL
@ BVH_LAYOUT_MULTI_OPTIX_EMBREE
AttributeElement
@ ATTR_ELEMENT_NONE
@ ATTR_ELEMENT_CORNER_BYTE
@ ATTR_ELEMENT_CURVE_KEY
@ ATTR_ELEMENT_CURVE_KEY_MOTION
@ ATTR_ELEMENT_VOXEL
@ ATTR_ELEMENT_CORNER
@ ATTR_ELEMENT_OBJECT
@ ATTR_ELEMENT_VERTEX_MOTION
@ ATTR_ELEMENT_VERTEX
@ ATTR_ELEMENT_FACE
@ ATTR_ELEMENT_MESH
@ ATTR_ELEMENT_CURVE
ClosureLabel
@ LABEL_TRANSMIT
@ LABEL_RAY_PORTAL
@ LABEL_TRANSMIT_TRANSPARENT
@ LABEL_VOLUME_SCATTER
@ LABEL_DIFFUSE
@ LABEL_NONE
@ LABEL_SINGULAR
@ LABEL_GLOSSY
@ LABEL_REFLECT
@ LABEL_TRANSPARENT
@ LABEL_SUBSURFACE_SCATTER
struct VolumeStack VolumeStack
struct MeshLight { int shader_flag; int object_id;} MeshLight
struct ShaderVolumePhases ShaderVolumePhases
struct KernelLightTreeNode KernelLightTreeNode
struct KernelObject KernelObject
#define MAX_CLOSURE
PassType
@ PASS_SHADOW_CATCHER_SAMPLE_COUNT
@ PASS_EMISSION
@ PASS_POSITION
@ PASS_BACKGROUND
@ PASS_TRANSMISSION_DIRECT
@ PASS_VOLUME_DIRECT
@ PASS_UV
@ PASS_TRANSMISSION_COLOR
@ PASS_SHADOW_CATCHER_MATTE
@ PASS_GUIDING_COLOR
@ PASS_DEPTH
@ PASS_MIST
@ PASS_TRANSMISSION_INDIRECT
@ PASS_BAKE_SEED
@ PASS_SHADOW_CATCHER
@ PASS_DENOISING_NORMAL
@ PASS_ROUGHNESS
@ PASS_DIFFUSE_DIRECT
@ PASS_MOTION
@ PASS_CATEGORY_BAKE_END
@ PASS_MATERIAL_ID
@ PASS_AO
@ PASS_COMBINED
@ PASS_DIFFUSE
@ PASS_DIFFUSE_INDIRECT
@ PASS_GUIDING_PROBABILITY
@ PASS_CATEGORY_DATA_END
@ PASS_ADAPTIVE_AUX_BUFFER
@ PASS_GLOSSY
@ PASS_OBJECT_ID
@ PASS_AOV_COLOR
@ PASS_NUM
@ PASS_NONE
@ PASS_VOLUME_INDIRECT
@ PASS_TRANSMISSION
@ PASS_NORMAL
@ PASS_CRYPTOMATTE
@ PASS_DIFFUSE_COLOR
@ PASS_SAMPLE_COUNT
@ PASS_GLOSSY_DIRECT
@ PASS_MOTION_WEIGHT
@ PASS_DENOISING_ALBEDO
@ PASS_VOLUME
@ PASS_AOV_VALUE
@ PASS_GUIDING_AVG_ROUGHNESS
@ PASS_GLOSSY_COLOR
@ PASS_DENOISING_PREVIOUS
@ PASS_GLOSSY_INDIRECT
@ PASS_BAKE_DIFFERENTIAL
@ PASS_DENOISING_DEPTH
@ PASS_BAKE_PRIMITIVE
@ PASS_CATEGORY_LIGHT_END
struct KernelWorkTile KernelWorkTile
ShaderClosure
AttributePrimitive
@ ATTR_PRIM_SUBD
@ ATTR_PRIM_TYPES
@ ATTR_PRIM_GEOMETRY
struct KernelAreaLight KernelAreaLight
PanoramaType
@ PANORAMA_MIRRORBALL
@ PANORAMA_FISHEYE_EQUISOLID
@ PANORAMA_NUM_TYPES
@ PANORAMA_CENTRAL_CYLINDRICAL
@ PANORAMA_EQUIANGULAR_CUBEMAP_FACE
@ PANORAMA_FISHEYE_EQUIDISTANT
@ PANORAMA_FISHEYE_LENS_POLYNOMIAL
@ PANORAMA_EQUIRECTANGULAR
struct BsdfEval BsdfEval
LightType
@ LIGHT_AREA
@ LIGHT_DISTANT
@ LIGHT_SPOT
@ LIGHT_BACKGROUND
@ LIGHT_TRIANGLE
@ LIGHT_POINT
#define CAUSTICS_MAX_CLOSURE
struct KernelLightLinkSet KernelLightLinkSet
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
GuidingDistributionType
@ GUIDING_TYPE_VMM
@ GUIDING_NUM_TYPES
@ GUIDING_TYPE_DIRECTIONAL_QUAD_TREE
@ GUIDING_TYPE_PARALLAX_AWARE_VMM
struct differential3 differential3
struct KernelCamera KernelCamera
CameraType
@ CAMERA_PERSPECTIVE
@ CAMERA_PANORAMA
@ CAMERA_ORTHOGRAPHIC
ShaderDataCausticsStorage
#define N
@ FLOAT4
@ FLOAT3
@ FLOAT
#define min(a, b)
Definition sort.c:32
#define static_assert_align(st, align)
unsigned short uint16_t
Definition stdint.h:79
unsigned int uint32_t
Definition stdint.h:80
unsigned char uint8_t
Definition stdint.h:78
unsigned __int64 uint64_t
Definition stdint.h:90
AttributeElement element
NodeAttributeType type
uint16_t element
Spectrum sum
Spectrum diffuse
Spectrum glossy
packed_float3 axis_u
packed_float3 axis_v
packed_float3 dir
ProjectionTransform ndctoworld
float pole_merge_angle_to
int have_perspective_motion
ProjectionTransform rastertocamera
float pole_merge_angle_from
float4 central_cylindrical_range
int use_dof_or_motion_blur
ProjectionTransform worldtoraster
float fisheye_lens_polynomial_bias
Transform motion_pass_post
Transform cameratoworld
float4 equirectangular_range
float interocular_offset
Transform worldtocamera
ProjectionTransform screentoworld
float inv_aperture_ratio
ProjectionTransform perspective_post
float rolling_shutter_duration
ProjectionTransform perspective_pre
ProjectionTransform worldtoscreen
Transform motion_pass_pre
ProjectionTransform worldtondc
float convergence_distance
ProjectionTransform rastertoworld
float4 fisheye_lens_polynomial_coefficients
int use_approximate_shadow_catcher_background
int pass_shadow_catcher_sample_count
struct KernelLightTreeEmitter::@1445::@1448 light
struct KernelLightTreeEmitter::@1445::@1447 triangle
EmissionSampling emission_sampling
struct KernelLightTreeEmitter::@1445::@1449 mesh
struct KernelLightTreeNode::@1440::@1444 instance
struct KernelLightTreeNode::@1440::@1442 leaf
LightTreeNodeType type
struct KernelLightTreeNode::@1440::@1443 inner
uint64_t light_set_membership
Transform itfm
uint64_t shadow_set_membership
float strength[3]
KernelSpotLight spot
Transform tfm
packed_float3 co
KernelDistantLight distant
KernelAreaLight area
Transform tfm
uint64_t shadow_set_membership
Transform itfm
float dupli_uv[2]
float shadow_terminator_geometry_offset
float cryptomatte_asset
uint blocker_shadow_set
uint attribute_map_offset
uint receiver_light_set
uint64_t light_set_membership
float shadow_terminator_shading_offset
float dupli_generated[3]
float cryptomatte_object
float4 angular_velocity
float constant_emission[3]
float half_cot_half_spot_angle
packed_float3 dir
float cos_half_larger_spread
int ggx_gen_schlick_ior_s
struct Intersection hits[LOCAL_MAX_HITS]
float3 Ng[LOCAL_MAX_HITS]
float tmax
float tmin
float dD
float3 P
float time
float dP
RaySelfPrimitives self
float3 D
ShaderVolumeClosure closure[MAX_VOLUME_CLOSURE]
float max
SPECTRUM_DATA_TYPE Spectrum
uint8_t flag
Definition wm_window.cc:138