Welcome to mirror list, hosted at ThFree Co, Russian Federation.

git.blender.org/blender.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
Diffstat (limited to 'intern/cycles/kernel/kernel_types.h')
-rw-r--r--intern/cycles/kernel/kernel_types.h1594
1 files changed, 0 insertions, 1594 deletions
diff --git a/intern/cycles/kernel/kernel_types.h b/intern/cycles/kernel/kernel_types.h
deleted file mode 100644
index 5cbe2939dfc..00000000000
--- a/intern/cycles/kernel/kernel_types.h
+++ /dev/null
@@ -1,1594 +0,0 @@
-/*
- * Copyright 2011-2013 Blender Foundation
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-#pragma once
-
-#if !defined(__KERNEL_GPU__) && defined(WITH_EMBREE)
-# include <embree3/rtcore.h>
-# include <embree3/rtcore_scene.h>
-# define __EMBREE__
-#endif
-
-#include "kernel/kernel_math.h"
-#include "kernel/svm/svm_types.h"
-#include "util/util_static_assert.h"
-
-#ifndef __KERNEL_GPU__
-# define __KERNEL_CPU__
-#endif
-
-/* TODO(sergey): This is only to make it possible to include this header
- * from outside of the kernel. but this could be done somewhat cleaner?
- */
-#ifndef ccl_addr_space
-# define ccl_addr_space
-#endif
-
-CCL_NAMESPACE_BEGIN
-
-/* Constants */
-#define OBJECT_MOTION_PASS_SIZE 2
-#define FILTER_TABLE_SIZE 1024
-#define RAMP_TABLE_SIZE 256
-#define SHUTTER_TABLE_SIZE 256
-
-#define BSSRDF_MIN_RADIUS 1e-8f
-#define BSSRDF_MAX_HITS 4
-#define BSSRDF_MAX_BOUNCES 256
-#define LOCAL_MAX_HITS 4
-
-#define VOLUME_BOUNDS_MAX 1024
-
-#define BECKMANN_TABLE_SIZE 256
-
-#define SHADER_NONE (~0)
-#define OBJECT_NONE (~0)
-#define PRIM_NONE (~0)
-#define LAMP_NONE (~0)
-#define ID_NONE (0.0f)
-#define PASS_UNUSED (~0)
-
-#define INTEGRATOR_SHADOW_ISECT_SIZE_CPU 1024U
-#define INTEGRATOR_SHADOW_ISECT_SIZE_GPU 4U
-
-#ifdef __KERNEL_CPU__
-# define INTEGRATOR_SHADOW_ISECT_SIZE INTEGRATOR_SHADOW_ISECT_SIZE_CPU
-#else
-# define INTEGRATOR_SHADOW_ISECT_SIZE INTEGRATOR_SHADOW_ISECT_SIZE_GPU
-#endif
-
-/* Kernel features */
-#define __SOBOL__
-#define __DPDU__
-#define __BACKGROUND__
-#define __CAUSTICS_TRICKS__
-#define __VISIBILITY_FLAG__
-#define __RAY_DIFFERENTIALS__
-#define __CAMERA_CLIPPING__
-#define __INTERSECTION_REFINE__
-#define __CLAMP_SAMPLE__
-#define __PATCH_EVAL__
-#define __SHADOW_CATCHER__
-#define __DENOISING_FEATURES__
-#define __SHADER_RAYTRACE__
-#define __AO__
-#define __PASSES__
-#define __HAIR__
-#define __SVM__
-#define __EMISSION__
-#define __HOLDOUT__
-#define __TRANSPARENT_SHADOWS__
-#define __BACKGROUND_MIS__
-#define __LAMP_MIS__
-#define __CAMERA_MOTION__
-#define __OBJECT_MOTION__
-#define __BAKING__
-#define __PRINCIPLED__
-#define __SUBSURFACE__
-#define __VOLUME__
-#define __CMJ__
-#define __SHADOW_RECORD_ALL__
-#define __BRANCHED_PATH__
-
-/* Device specific features */
-#ifdef __KERNEL_CPU__
-# ifdef WITH_OSL
-# define __OSL__
-# endif
-# define __VOLUME_RECORD_ALL__
-#endif /* __KERNEL_CPU__ */
-
-#ifdef __KERNEL_OPTIX__
-# undef __BAKING__
-#endif /* __KERNEL_OPTIX__ */
-
-/* Scene-based selective features compilation. */
-#ifdef __KERNEL_FEATURES__
-# if !(__KERNEL_FEATURES & KERNEL_FEATURE_CAMERA_MOTION)
-# undef __CAMERA_MOTION__
-# endif
-# if !(__KERNEL_FEATURES & KERNEL_FEATURE_OBJECT_MOTION)
-# undef __OBJECT_MOTION__
-# endif
-# if !(__KERNEL_FEATURES & KERNEL_FEATURE_HAIR)
-# undef __HAIR__
-# endif
-# if !(__KERNEL_FEATURES & KERNEL_FEATURE_VOLUME)
-# undef __VOLUME__
-# endif
-# if !(__KERNEL_FEATURES & KERNEL_FEATURE_SUBSURFACE)
-# undef __SUBSURFACE__
-# endif
-# if !(__KERNEL_FEATURES & KERNEL_FEATURE_BAKING)
-# undef __BAKING__
-# endif
-# if !(__KERNEL_FEATURES & KERNEL_FEATURE_PATCH_EVALUATION)
-# undef __PATCH_EVAL__
-# endif
-# if !(__KERNEL_FEATURES & KERNEL_FEATURE_TRANSPARENT)
-# undef __TRANSPARENT_SHADOWS__
-# endif
-# if !(__KERNEL_FEATURES & KERNEL_FEATURE_SHADOW_CATCHER)
-# undef __SHADOW_CATCHER__
-# endif
-# if !(__KERNEL_FEATURES & KERNEL_FEATURE_PRINCIPLED)
-# undef __PRINCIPLED__
-# endif
-# if !(__KERNEL_FEATURES & KERNEL_FEATURE_DENOISING)
-# undef __DENOISING_FEATURES__
-# endif
-#endif
-
-#ifdef WITH_CYCLES_DEBUG_NAN
-# define __KERNEL_DEBUG_NAN__
-#endif
-
-/* Features that enable others */
-
-#if defined(__SUBSURFACE__) || defined(__SHADER_RAYTRACE__)
-# define __BVH_LOCAL__
-#endif
-
-/* Path Tracing
- * note we need to keep the u/v pairs at even values */
-
-enum PathTraceDimension {
- PRNG_FILTER_U = 0,
- PRNG_FILTER_V = 1,
- PRNG_LENS_U = 2,
- PRNG_LENS_V = 3,
- PRNG_TIME = 4,
- PRNG_UNUSED_0 = 5,
- PRNG_UNUSED_1 = 6, /* for some reason (6, 7) is a bad sobol pattern */
- PRNG_UNUSED_2 = 7, /* with a low number of samples (< 64) */
- PRNG_BASE_NUM = 10,
-
- PRNG_BSDF_U = 0,
- PRNG_BSDF_V = 1,
- PRNG_LIGHT_U = 2,
- PRNG_LIGHT_V = 3,
- PRNG_LIGHT_TERMINATE = 4,
- PRNG_TERMINATE = 5,
- PRNG_PHASE_CHANNEL = 6,
- PRNG_SCATTER_DISTANCE = 7,
- PRNG_BOUNCE_NUM = 8,
-
- PRNG_BEVEL_U = 6, /* reuse volume dimension, correlation won't harm */
- PRNG_BEVEL_V = 7,
-};
-
-enum SamplingPattern {
- SAMPLING_PATTERN_SOBOL = 0,
- SAMPLING_PATTERN_PMJ = 1,
-
- SAMPLING_NUM_PATTERNS,
-};
-
-/* These flags values correspond to `raytypes` in `osl.cpp`, so keep them in sync! */
-
-enum PathRayFlag {
- /* --------------------------------------------------------------------
- * Ray visibility.
- *
- * NOTE: Recalculated after a surface bounce.
- */
-
- PATH_RAY_CAMERA = (1U << 0U),
- PATH_RAY_REFLECT = (1U << 1U),
- PATH_RAY_TRANSMIT = (1U << 2U),
- PATH_RAY_DIFFUSE = (1U << 3U),
- PATH_RAY_GLOSSY = (1U << 4U),
- PATH_RAY_SINGULAR = (1U << 5U),
- PATH_RAY_TRANSPARENT = (1U << 6U),
- PATH_RAY_VOLUME_SCATTER = (1U << 7U),
-
- /* Shadow ray visibility. */
- PATH_RAY_SHADOW_OPAQUE = (1U << 8U),
- PATH_RAY_SHADOW_TRANSPARENT = (1U << 9U),
- PATH_RAY_SHADOW = (PATH_RAY_SHADOW_OPAQUE | PATH_RAY_SHADOW_TRANSPARENT),
-
- /* Special flag to tag unaligned BVH nodes.
- * Only set and used in BVH nodes to distinguish how to interpret bounding box information stored
- * in the node (either it should be intersected as AABB or as OBBU). */
- PATH_RAY_NODE_UNALIGNED = (1U << 10U),
-
- /* Subset of flags used for ray visibility for intersection.
- *
- * NOTE: SHADOW_CATCHER macros below assume there are no more than
- * 16 visibility bits. */
- PATH_RAY_ALL_VISIBILITY = ((1U << 11U) - 1U),
-
- /* --------------------------------------------------------------------
- * Path flags.
- */
-
- /* Don't apply multiple importance sampling weights to emission from
- * lamp or surface hits, because they were not direct light sampled. */
- PATH_RAY_MIS_SKIP = (1U << 11U),
-
- /* Diffuse bounce earlier in the path, skip SSS to improve performance
- * and avoid branching twice with disk sampling SSS. */
- PATH_RAY_DIFFUSE_ANCESTOR = (1U << 12U),
-
- /* Single pass has been written. */
- PATH_RAY_SINGLE_PASS_DONE = (1U << 13U),
-
- /* Zero background alpha, for camera or transparent glass rays. */
- PATH_RAY_TRANSPARENT_BACKGROUND = (1U << 14U),
-
- /* Terminate ray immediately at next bounce. */
- PATH_RAY_TERMINATE_ON_NEXT_SURFACE = (1U << 15U),
- PATH_RAY_TERMINATE_IN_NEXT_VOLUME = (1U << 16U),
-
- /* Ray is to be terminated, but continue with transparent bounces and
- * emission as long as we encounter them. This is required to make the
- * MIS between direct and indirect light rays match, as shadow rays go
- * through transparent surfaces to reach emission too. */
- PATH_RAY_TERMINATE_AFTER_TRANSPARENT = (1U << 17U),
-
- /* Terminate ray immediately after volume shading. */
- PATH_RAY_TERMINATE_AFTER_VOLUME = (1U << 18U),
-
- /* Ray is to be terminated. */
- PATH_RAY_TERMINATE = (PATH_RAY_TERMINATE_ON_NEXT_SURFACE | PATH_RAY_TERMINATE_IN_NEXT_VOLUME |
- PATH_RAY_TERMINATE_AFTER_TRANSPARENT | PATH_RAY_TERMINATE_AFTER_VOLUME),
-
- /* Path and shader is being evaluated for direct lighting emission. */
- PATH_RAY_EMISSION = (1U << 19U),
-
- /* Perform subsurface scattering. */
- PATH_RAY_SUBSURFACE_RANDOM_WALK = (1U << 20U),
- PATH_RAY_SUBSURFACE_DISK = (1U << 21U),
- PATH_RAY_SUBSURFACE_USE_FRESNEL = (1U << 22U),
- PATH_RAY_SUBSURFACE = (PATH_RAY_SUBSURFACE_RANDOM_WALK | PATH_RAY_SUBSURFACE_DISK |
- PATH_RAY_SUBSURFACE_USE_FRESNEL),
-
- /* Contribute to denoising features. */
- PATH_RAY_DENOISING_FEATURES = (1U << 23U),
-
- /* Render pass categories. */
- PATH_RAY_REFLECT_PASS = (1U << 24U),
- PATH_RAY_TRANSMISSION_PASS = (1U << 25U),
- PATH_RAY_VOLUME_PASS = (1U << 26U),
- PATH_RAY_ANY_PASS = (PATH_RAY_REFLECT_PASS | PATH_RAY_TRANSMISSION_PASS | PATH_RAY_VOLUME_PASS),
-
- /* Shadow ray is for a light or surface, or AO. */
- PATH_RAY_SHADOW_FOR_LIGHT = (1U << 27U),
- PATH_RAY_SHADOW_FOR_AO = (1U << 28U),
-
- /* A shadow catcher object was hit and the path was split into two. */
- PATH_RAY_SHADOW_CATCHER_HIT = (1U << 29U),
-
- /* A shadow catcher object was hit and this path traces only shadow catchers, writing them into
- * their dedicated pass for later division.
- *
- * NOTE: Is not covered with `PATH_RAY_ANY_PASS` because shadow catcher does special handling
- * which is separate from the light passes. */
- PATH_RAY_SHADOW_CATCHER_PASS = (1U << 30U),
-
- /* Path is evaluating background for an approximate shadow catcher with non-transparent film. */
- PATH_RAY_SHADOW_CATCHER_BACKGROUND = (1U << 31U),
-};
-
-/* Configure ray visibility bits for rays and objects respectively,
- * to make shadow catchers work.
- *
- * On shadow catcher paths we want to ignore any intersections with non-catchers,
- * whereas on regular paths we want to intersect all objects. */
-
-#define SHADOW_CATCHER_VISIBILITY_SHIFT(visibility) ((visibility) << 16)
-
-#define SHADOW_CATCHER_PATH_VISIBILITY(path_flag, visibility) \
- (((path_flag)&PATH_RAY_SHADOW_CATCHER_PASS) ? SHADOW_CATCHER_VISIBILITY_SHIFT(visibility) : \
- (visibility))
-
-#define SHADOW_CATCHER_OBJECT_VISIBILITY(is_shadow_catcher, visibility) \
- (((is_shadow_catcher) ? SHADOW_CATCHER_VISIBILITY_SHIFT(visibility) : 0) | (visibility))
-
-/* Closure Label */
-
-typedef enum ClosureLabel {
- LABEL_NONE = 0,
- LABEL_TRANSMIT = 1,
- LABEL_REFLECT = 2,
- LABEL_DIFFUSE = 4,
- LABEL_GLOSSY = 8,
- LABEL_SINGULAR = 16,
- LABEL_TRANSPARENT = 32,
- LABEL_VOLUME_SCATTER = 64,
- LABEL_TRANSMIT_TRANSPARENT = 128,
- LABEL_SUBSURFACE_SCATTER = 256,
-} ClosureLabel;
-
-/* Render Passes */
-
-#define PASS_NAME_JOIN(a, b) a##_##b
-#define PASSMASK(pass) (1 << ((PASS_NAME_JOIN(PASS, pass)) % 32))
-
-// NOTE: Keep in sync with `Pass::get_type_enum()`.
-typedef enum PassType {
- PASS_NONE = 0,
-
- /* Light Passes */
- PASS_COMBINED = 1,
- PASS_EMISSION,
- PASS_BACKGROUND,
- PASS_AO,
- PASS_SHADOW,
- PASS_DIFFUSE,
- PASS_DIFFUSE_DIRECT,
- PASS_DIFFUSE_INDIRECT,
- PASS_GLOSSY,
- PASS_GLOSSY_DIRECT,
- PASS_GLOSSY_INDIRECT,
- PASS_TRANSMISSION,
- PASS_TRANSMISSION_DIRECT,
- PASS_TRANSMISSION_INDIRECT,
- PASS_VOLUME,
- PASS_VOLUME_DIRECT,
- PASS_VOLUME_INDIRECT,
- PASS_CATEGORY_LIGHT_END = 31,
-
- /* Data passes */
- PASS_DEPTH = 32,
- PASS_POSITION,
- PASS_NORMAL,
- PASS_ROUGHNESS,
- PASS_UV,
- PASS_OBJECT_ID,
- PASS_MATERIAL_ID,
- PASS_MOTION,
- PASS_MOTION_WEIGHT,
- PASS_CRYPTOMATTE,
- PASS_AOV_COLOR,
- PASS_AOV_VALUE,
- PASS_ADAPTIVE_AUX_BUFFER,
- PASS_SAMPLE_COUNT,
- PASS_DIFFUSE_COLOR,
- PASS_GLOSSY_COLOR,
- PASS_TRANSMISSION_COLOR,
- /* No Scatter color since it's tricky to define what it would even mean. */
- PASS_MIST,
- PASS_DENOISING_NORMAL,
- PASS_DENOISING_ALBEDO,
-
- /* PASS_SHADOW_CATCHER accumulates contribution of shadow catcher object which is not affected by
- * any other object. The pass accessor will divide the combined pass by the shadow catcher. The
- * result of this division is then to be multiplied with the backdrop. The alpha channel of this
- * pass contains number of samples which contributed to the color components of the pass.
- *
- * PASS_SHADOW_CATCHER_SAMPLE_COUNT contains number of samples for which the path split
- * happened.
- *
- * PASS_SHADOW_CATCHER_MATTE contains pass which contains non-catcher objects. This pass is to be
- * alpha-overed onto the backdrop (after multiplication). */
- PASS_SHADOW_CATCHER,
- PASS_SHADOW_CATCHER_SAMPLE_COUNT,
- PASS_SHADOW_CATCHER_MATTE,
-
- PASS_CATEGORY_DATA_END = 63,
-
- PASS_BAKE_PRIMITIVE,
- PASS_BAKE_DIFFERENTIAL,
- PASS_CATEGORY_BAKE_END = 95,
-
- PASS_NUM,
-} PassType;
-
-#define PASS_ANY (~0)
-
-typedef enum CryptomatteType {
- CRYPT_NONE = 0,
- CRYPT_OBJECT = (1 << 0),
- CRYPT_MATERIAL = (1 << 1),
- CRYPT_ASSET = (1 << 2),
- CRYPT_ACCURATE = (1 << 3),
-} CryptomatteType;
-
-typedef struct BsdfEval {
- float3 diffuse;
- float3 glossy;
-} BsdfEval;
-
-/* Shader Flag */
-
-typedef enum ShaderFlag {
- SHADER_SMOOTH_NORMAL = (1 << 31),
- SHADER_CAST_SHADOW = (1 << 30),
- SHADER_AREA_LIGHT = (1 << 29),
- SHADER_USE_MIS = (1 << 28),
- SHADER_EXCLUDE_DIFFUSE = (1 << 27),
- SHADER_EXCLUDE_GLOSSY = (1 << 26),
- SHADER_EXCLUDE_TRANSMIT = (1 << 25),
- SHADER_EXCLUDE_CAMERA = (1 << 24),
- SHADER_EXCLUDE_SCATTER = (1 << 23),
- SHADER_EXCLUDE_SHADOW_CATCHER = (1 << 22),
- SHADER_EXCLUDE_ANY = (SHADER_EXCLUDE_DIFFUSE | SHADER_EXCLUDE_GLOSSY | SHADER_EXCLUDE_TRANSMIT |
- SHADER_EXCLUDE_CAMERA | SHADER_EXCLUDE_SCATTER |
- SHADER_EXCLUDE_SHADOW_CATCHER),
-
- SHADER_MASK = ~(SHADER_SMOOTH_NORMAL | SHADER_CAST_SHADOW | SHADER_AREA_LIGHT | SHADER_USE_MIS |
- SHADER_EXCLUDE_ANY)
-} ShaderFlag;
-
-/* Light Type */
-
-typedef enum LightType {
- LIGHT_POINT,
- LIGHT_DISTANT,
- LIGHT_BACKGROUND,
- LIGHT_AREA,
- LIGHT_SPOT,
- LIGHT_TRIANGLE
-} LightType;
-
-/* Camera Type */
-
-enum CameraType { CAMERA_PERSPECTIVE, CAMERA_ORTHOGRAPHIC, CAMERA_PANORAMA };
-
-/* Panorama Type */
-
-enum PanoramaType {
- PANORAMA_EQUIRECTANGULAR = 0,
- PANORAMA_FISHEYE_EQUIDISTANT = 1,
- PANORAMA_FISHEYE_EQUISOLID = 2,
- PANORAMA_MIRRORBALL = 3,
-
- PANORAMA_NUM_TYPES,
-};
-
-/* Differential */
-
-typedef struct differential3 {
- float3 dx;
- float3 dy;
-} differential3;
-
-typedef struct differential {
- float dx;
- float dy;
-} differential;
-
-/* Ray */
-
-typedef struct Ray {
- float3 P; /* origin */
- float3 D; /* direction */
- float t; /* length of the ray */
- float time; /* time (for motion blur) */
-
-#ifdef __RAY_DIFFERENTIALS__
- float dP;
- float dD;
-#endif
-} Ray;
-
-/* Intersection */
-
-typedef struct Intersection {
- float t, u, v;
- int prim;
- int object;
- int type;
-} Intersection;
-
-/* Primitives */
-
-typedef enum PrimitiveType {
- PRIMITIVE_NONE = 0,
- PRIMITIVE_TRIANGLE = (1 << 0),
- PRIMITIVE_MOTION_TRIANGLE = (1 << 1),
- PRIMITIVE_CURVE_THICK = (1 << 2),
- PRIMITIVE_MOTION_CURVE_THICK = (1 << 3),
- PRIMITIVE_CURVE_RIBBON = (1 << 4),
- PRIMITIVE_MOTION_CURVE_RIBBON = (1 << 5),
- PRIMITIVE_VOLUME = (1 << 6),
- PRIMITIVE_LAMP = (1 << 7),
-
- PRIMITIVE_ALL_TRIANGLE = (PRIMITIVE_TRIANGLE | PRIMITIVE_MOTION_TRIANGLE),
- PRIMITIVE_ALL_CURVE = (PRIMITIVE_CURVE_THICK | PRIMITIVE_MOTION_CURVE_THICK |
- PRIMITIVE_CURVE_RIBBON | PRIMITIVE_MOTION_CURVE_RIBBON),
- PRIMITIVE_ALL_VOLUME = (PRIMITIVE_VOLUME),
- PRIMITIVE_ALL_MOTION = (PRIMITIVE_MOTION_TRIANGLE | PRIMITIVE_MOTION_CURVE_THICK |
- PRIMITIVE_MOTION_CURVE_RIBBON),
- PRIMITIVE_ALL = (PRIMITIVE_ALL_TRIANGLE | PRIMITIVE_ALL_CURVE | PRIMITIVE_ALL_VOLUME |
- PRIMITIVE_LAMP),
-
- PRIMITIVE_NUM = 8,
-} PrimitiveType;
-
-#define PRIMITIVE_PACK_SEGMENT(type, segment) ((segment << PRIMITIVE_NUM) | (type))
-#define PRIMITIVE_UNPACK_SEGMENT(type) (type >> PRIMITIVE_NUM)
-
-typedef enum CurveShapeType {
- CURVE_RIBBON = 0,
- CURVE_THICK = 1,
-
- CURVE_NUM_SHAPE_TYPES,
-} CurveShapeType;
-
-/* Attributes */
-
-typedef enum AttributePrimitive {
- ATTR_PRIM_GEOMETRY = 0,
- ATTR_PRIM_SUBD,
-
- ATTR_PRIM_TYPES
-} AttributePrimitive;
-
-typedef enum AttributeElement {
- ATTR_ELEMENT_NONE = 0,
- ATTR_ELEMENT_OBJECT = (1 << 0),
- ATTR_ELEMENT_MESH = (1 << 1),
- ATTR_ELEMENT_FACE = (1 << 2),
- ATTR_ELEMENT_VERTEX = (1 << 3),
- ATTR_ELEMENT_VERTEX_MOTION = (1 << 4),
- ATTR_ELEMENT_CORNER = (1 << 5),
- ATTR_ELEMENT_CORNER_BYTE = (1 << 6),
- ATTR_ELEMENT_CURVE = (1 << 7),
- ATTR_ELEMENT_CURVE_KEY = (1 << 8),
- ATTR_ELEMENT_CURVE_KEY_MOTION = (1 << 9),
- ATTR_ELEMENT_VOXEL = (1 << 10)
-} AttributeElement;
-
-typedef enum AttributeStandard {
- ATTR_STD_NONE = 0,
- ATTR_STD_VERTEX_NORMAL,
- ATTR_STD_FACE_NORMAL,
- ATTR_STD_UV,
- ATTR_STD_UV_TANGENT,
- ATTR_STD_UV_TANGENT_SIGN,
- ATTR_STD_VERTEX_COLOR,
- ATTR_STD_GENERATED,
- ATTR_STD_GENERATED_TRANSFORM,
- ATTR_STD_POSITION_UNDEFORMED,
- ATTR_STD_POSITION_UNDISPLACED,
- ATTR_STD_MOTION_VERTEX_POSITION,
- ATTR_STD_MOTION_VERTEX_NORMAL,
- ATTR_STD_PARTICLE,
- ATTR_STD_CURVE_INTERCEPT,
- ATTR_STD_CURVE_LENGTH,
- ATTR_STD_CURVE_RANDOM,
- ATTR_STD_PTEX_FACE_ID,
- ATTR_STD_PTEX_UV,
- ATTR_STD_VOLUME_DENSITY,
- ATTR_STD_VOLUME_COLOR,
- ATTR_STD_VOLUME_FLAME,
- ATTR_STD_VOLUME_HEAT,
- ATTR_STD_VOLUME_TEMPERATURE,
- ATTR_STD_VOLUME_VELOCITY,
- ATTR_STD_POINTINESS,
- ATTR_STD_RANDOM_PER_ISLAND,
- ATTR_STD_SHADOW_TRANSPARENCY,
- ATTR_STD_NUM,
-
- ATTR_STD_NOT_FOUND = ~0
-} AttributeStandard;
-
-typedef enum AttributeFlag {
- ATTR_FINAL_SIZE = (1 << 0),
- ATTR_SUBDIVIDED = (1 << 1),
-} AttributeFlag;
-
-typedef struct AttributeDescriptor {
- AttributeElement element;
- NodeAttributeType type;
- uint flags; /* see enum AttributeFlag */
- int offset;
-} AttributeDescriptor;
-
-/* Closure data */
-
-#ifndef __MAX_CLOSURE__
-# define MAX_CLOSURE 64
-#else
-# define MAX_CLOSURE __MAX_CLOSURE__
-#endif
-
-#ifndef __MAX_VOLUME_STACK_SIZE__
-# define MAX_VOLUME_STACK_SIZE 32
-#else
-# define MAX_VOLUME_STACK_SIZE __MAX_VOLUME_STACK_SIZE__
-#endif
-
-#define MAX_VOLUME_CLOSURE 8
-
-/* This struct is the base class for all closures. The common members are
- * duplicated in all derived classes since we don't have C++ in the kernel
- * yet, and because it lets us lay out the members to minimize padding. The
- * weight member is located at the beginning of the struct for this reason.
- *
- * ShaderClosure has a fixed size, and any extra space must be allocated
- * with closure_alloc_extra().
- *
- * We pad the struct to align to 16 bytes. All shader closures are assumed
- * to fit in this struct size. CPU sizes are a bit larger because float3 is
- * padded to be 16 bytes, while it's only 12 bytes on the GPU. */
-
-#define SHADER_CLOSURE_BASE \
- float3 weight; \
- ClosureType type; \
- float sample_weight; \
- float3 N
-
-typedef struct ccl_align(16) ShaderClosure
-{
- SHADER_CLOSURE_BASE;
-
-#ifdef __KERNEL_CPU__
- float pad[2];
-#endif
- float data[10];
-}
-ShaderClosure;
-
-/* Shader Data
- *
- * Main shader state at a point on the surface or in a volume. All coordinates
- * are in world space.
- */
-
-enum ShaderDataFlag {
- /* Runtime flags. */
-
- /* Set when ray hits backside of surface. */
- SD_BACKFACING = (1 << 0),
- /* Shader has non-zero emission. */
- SD_EMISSION = (1 << 1),
- /* Shader has BSDF closure. */
- SD_BSDF = (1 << 2),
- /* Shader has non-singular BSDF closure. */
- SD_BSDF_HAS_EVAL = (1 << 3),
- /* Shader has BSSRDF closure. */
- SD_BSSRDF = (1 << 4),
- /* Shader has holdout closure. */
- SD_HOLDOUT = (1 << 5),
- /* Shader has non-zero volume extinction. */
- SD_EXTINCTION = (1 << 6),
- /* Shader has have volume phase (scatter) closure. */
- SD_SCATTER = (1 << 7),
- /* Shader has transparent closure. */
- SD_TRANSPARENT = (1 << 9),
- /* BSDF requires LCG for evaluation. */
- SD_BSDF_NEEDS_LCG = (1 << 10),
-
- SD_CLOSURE_FLAGS = (SD_EMISSION | SD_BSDF | SD_BSDF_HAS_EVAL | SD_BSSRDF | SD_HOLDOUT |
- SD_EXTINCTION | SD_SCATTER | SD_BSDF_NEEDS_LCG),
-
- /* Shader flags. */
-
- /* direct light sample */
- SD_USE_MIS = (1 << 16),
- /* Has transparent shadow. */
- SD_HAS_TRANSPARENT_SHADOW = (1 << 17),
- /* Has volume shader. */
- SD_HAS_VOLUME = (1 << 18),
- /* Has only volume shader, no surface. */
- SD_HAS_ONLY_VOLUME = (1 << 19),
- /* Has heterogeneous volume. */
- SD_HETEROGENEOUS_VOLUME = (1 << 20),
- /* BSSRDF normal uses bump. */
- SD_HAS_BSSRDF_BUMP = (1 << 21),
- /* Use equiangular volume sampling */
- SD_VOLUME_EQUIANGULAR = (1 << 22),
- /* Use multiple importance volume sampling. */
- SD_VOLUME_MIS = (1 << 23),
- /* Use cubic interpolation for voxels. */
- SD_VOLUME_CUBIC = (1 << 24),
- /* Has data connected to the displacement input or uses bump map. */
- SD_HAS_BUMP = (1 << 25),
- /* Has true displacement. */
- SD_HAS_DISPLACEMENT = (1 << 26),
- /* Has constant emission (value stored in __shaders) */
- SD_HAS_CONSTANT_EMISSION = (1 << 27),
- /* Needs to access attributes for volume rendering */
- SD_NEED_VOLUME_ATTRIBUTES = (1 << 28),
- /* Shader has emission */
- SD_HAS_EMISSION = (1 << 29),
- /* Shader has raytracing */
- SD_HAS_RAYTRACE = (1 << 30),
-
- SD_SHADER_FLAGS = (SD_USE_MIS | SD_HAS_TRANSPARENT_SHADOW | SD_HAS_VOLUME | SD_HAS_ONLY_VOLUME |
- SD_HETEROGENEOUS_VOLUME | SD_HAS_BSSRDF_BUMP | SD_VOLUME_EQUIANGULAR |
- SD_VOLUME_MIS | SD_VOLUME_CUBIC | SD_HAS_BUMP | SD_HAS_DISPLACEMENT |
- SD_HAS_CONSTANT_EMISSION | SD_NEED_VOLUME_ATTRIBUTES | SD_HAS_EMISSION |
- SD_HAS_RAYTRACE)
-};
-
-/* Object flags. */
-enum ShaderDataObjectFlag {
- /* Holdout for camera rays. */
- SD_OBJECT_HOLDOUT_MASK = (1 << 0),
- /* Has object motion blur. */
- SD_OBJECT_MOTION = (1 << 1),
- /* Vertices have transform applied. */
- SD_OBJECT_TRANSFORM_APPLIED = (1 << 2),
- /* Vertices have negative scale applied. */
- SD_OBJECT_NEGATIVE_SCALE_APPLIED = (1 << 3),
- /* Object has a volume shader. */
- SD_OBJECT_HAS_VOLUME = (1 << 4),
- /* Object intersects AABB of an object with volume shader. */
- SD_OBJECT_INTERSECTS_VOLUME = (1 << 5),
- /* Has position for motion vertices. */
- SD_OBJECT_HAS_VERTEX_MOTION = (1 << 6),
- /* object is used to catch shadows */
- SD_OBJECT_SHADOW_CATCHER = (1 << 7),
- /* object has volume attributes */
- SD_OBJECT_HAS_VOLUME_ATTRIBUTES = (1 << 8),
-
- SD_OBJECT_FLAGS = (SD_OBJECT_HOLDOUT_MASK | SD_OBJECT_MOTION | SD_OBJECT_TRANSFORM_APPLIED |
- SD_OBJECT_NEGATIVE_SCALE_APPLIED | SD_OBJECT_HAS_VOLUME |
- SD_OBJECT_INTERSECTS_VOLUME | SD_OBJECT_SHADOW_CATCHER |
- SD_OBJECT_HAS_VOLUME_ATTRIBUTES)
-};
-
-typedef struct ccl_align(16) ShaderData
-{
- /* position */
- float3 P;
- /* smooth normal for shading */
- float3 N;
- /* true geometric normal */
- float3 Ng;
- /* view/incoming direction */
- float3 I;
- /* shader id */
- int shader;
- /* booleans describing shader, see ShaderDataFlag */
- int flag;
- /* booleans describing object of the shader, see ShaderDataObjectFlag */
- int object_flag;
-
- /* primitive id if there is one, ~0 otherwise */
- int prim;
-
- /* combined type and curve segment for hair */
- int type;
-
- /* parametric coordinates
- * - barycentric weights for triangles */
- float u;
- float v;
- /* object id if there is one, ~0 otherwise */
- int object;
- /* lamp id if there is one, ~0 otherwise */
- int lamp;
-
- /* motion blur sample time */
- float time;
-
- /* length of the ray being shaded */
- float ray_length;
-
-#ifdef __RAY_DIFFERENTIALS__
- /* differential of P. these are orthogonal to Ng, not N */
- differential3 dP;
- /* differential of I */
- differential3 dI;
- /* differential of u, v */
- differential du;
- differential dv;
-#endif
-#ifdef __DPDU__
- /* differential of P w.r.t. parametric coordinates. note that dPdu is
- * not readily suitable as a tangent for shading on triangles. */
- float3 dPdu;
- float3 dPdv;
-#endif
-
-#ifdef __OBJECT_MOTION__
- /* Object <-> world space transformations for motion blur, cached to avoid
- * re-interpolating them constantly for shading. */
- Transform ob_tfm_motion;
- Transform ob_itfm_motion;
-#endif
-
- /* ray start position, only set for backgrounds */
- float3 ray_P;
- float ray_dP;
-
-#ifdef __OSL__
- const struct KernelGlobalsCPU *osl_globals;
- const struct IntegratorStateCPU *osl_path_state;
- const struct IntegratorShadowStateCPU *osl_shadow_path_state;
-#endif
-
- /* LCG state for closures that require additional random numbers. */
- uint lcg_state;
-
- /* Closure data, we store a fixed array of closures */
- int num_closure;
- int num_closure_left;
- float3 svm_closure_weight;
-
- /* Closure weights summed directly, so we can evaluate
- * emission and shadow transparency with MAX_CLOSURE 0. */
- float3 closure_emission_background;
- float3 closure_transparent_extinction;
-
- /* At the end so we can adjust size in ShaderDataTinyStorage. */
- struct ShaderClosure closure[MAX_CLOSURE];
-}
-ShaderData;
-
-/* ShaderDataTinyStorage needs the same alignment as ShaderData, or else
- * the pointer cast in AS_SHADER_DATA invokes undefined behavior. */
-typedef struct ccl_align(16) ShaderDataTinyStorage
-{
- char pad[sizeof(ShaderData) - sizeof(ShaderClosure) * MAX_CLOSURE];
-}
-ShaderDataTinyStorage;
-#define AS_SHADER_DATA(shader_data_tiny_storage) \
- ((ccl_private ShaderData *)shader_data_tiny_storage)
-
-/* Compact volume closures storage.
- *
- * Used for decoupled direct/indirect light closure storage. */
-
-typedef struct ShaderVolumeClosure {
- float3 weight;
- float sample_weight;
- float g;
-} ShaderVolumeClosure;
-
-typedef struct ShaderVolumePhases {
- ShaderVolumeClosure closure[MAX_VOLUME_CLOSURE];
- int num_closure;
-} ShaderVolumePhases;
-
-/* Volume Stack */
-
-#ifdef __VOLUME__
-typedef struct VolumeStack {
- int object;
- int shader;
-} VolumeStack;
-#endif
-
-/* Struct to gather multiple nearby intersections. */
-typedef struct LocalIntersection {
- int num_hits;
- struct Intersection hits[LOCAL_MAX_HITS];
- float3 Ng[LOCAL_MAX_HITS];
-} LocalIntersection;
-
-/* Constant Kernel Data
- *
- * These structs are passed from CPU to various devices, and the struct layout
- * must match exactly. Structs are padded to ensure 16 byte alignment, and we
- * do not use float3 because its size may not be the same on all devices. */
-
-typedef struct KernelCamera {
- /* type */
- int type;
-
- /* panorama */
- int panorama_type;
- float fisheye_fov;
- float fisheye_lens;
- float4 equirectangular_range;
-
- /* stereo */
- float interocular_offset;
- float convergence_distance;
- float pole_merge_angle_from;
- float pole_merge_angle_to;
-
- /* matrices */
- Transform cameratoworld;
- ProjectionTransform rastertocamera;
-
- /* differentials */
- float4 dx;
- float4 dy;
-
- /* depth of field */
- float aperturesize;
- float blades;
- float bladesrotation;
- float focaldistance;
-
- /* motion blur */
- float shuttertime;
- int num_motion_steps, have_perspective_motion;
-
- /* clipping */
- float nearclip;
- float cliplength;
-
- /* sensor size */
- float sensorwidth;
- float sensorheight;
-
- /* render size */
- float width, height;
- int pad1;
-
- /* anamorphic lens bokeh */
- float inv_aperture_ratio;
-
- int is_inside_volume;
-
- /* more matrices */
- ProjectionTransform screentoworld;
- ProjectionTransform rastertoworld;
- ProjectionTransform ndctoworld;
- ProjectionTransform worldtoscreen;
- ProjectionTransform worldtoraster;
- ProjectionTransform worldtondc;
- Transform worldtocamera;
-
- /* Stores changes in the projection matrix. Use for camera zoom motion
- * blur and motion pass output for perspective camera. */
- ProjectionTransform perspective_pre;
- ProjectionTransform perspective_post;
-
- /* Transforms for motion pass. */
- Transform motion_pass_pre;
- Transform motion_pass_post;
-
- int shutter_table_offset;
-
- /* Rolling shutter */
- int rolling_shutter_type;
- float rolling_shutter_duration;
-
- int pad;
-} KernelCamera;
-static_assert_align(KernelCamera, 16);
-
-typedef struct KernelFilm {
- float exposure;
- int pass_flag;
-
- int light_pass_flag;
- int pass_stride;
-
- int pass_combined;
- int pass_depth;
- int pass_position;
- int pass_normal;
- int pass_roughness;
- int pass_motion;
-
- int pass_motion_weight;
- int pass_uv;
- int pass_object_id;
- int pass_material_id;
-
- int pass_diffuse_color;
- int pass_glossy_color;
- int pass_transmission_color;
-
- int pass_diffuse_indirect;
- int pass_glossy_indirect;
- int pass_transmission_indirect;
- int pass_volume_indirect;
-
- int pass_diffuse_direct;
- int pass_glossy_direct;
- int pass_transmission_direct;
- int pass_volume_direct;
-
- int pass_emission;
- int pass_background;
- int pass_ao;
- float pass_alpha_threshold;
-
- int pass_shadow;
- float pass_shadow_scale;
-
- int pass_shadow_catcher;
- int pass_shadow_catcher_sample_count;
- int pass_shadow_catcher_matte;
-
- int filter_table_offset;
-
- int cryptomatte_passes;
- int cryptomatte_depth;
- int pass_cryptomatte;
-
- int pass_adaptive_aux_buffer;
- int pass_sample_count;
-
- int pass_mist;
- float mist_start;
- float mist_inv_depth;
- float mist_falloff;
-
- int pass_denoising_normal;
- int pass_denoising_albedo;
-
- int pass_aov_color;
- int pass_aov_value;
-
- /* XYZ to rendering color space transform. float4 instead of float3 to
- * ensure consistent padding/alignment across devices. */
- float4 xyz_to_r;
- float4 xyz_to_g;
- float4 xyz_to_b;
- float4 rgb_to_y;
-
- int pass_bake_primitive;
- int pass_bake_differential;
-
- int use_approximate_shadow_catcher;
-
- int pad1, pad2, pad3;
-} KernelFilm;
-static_assert_align(KernelFilm, 16);
-
-typedef struct KernelFilmConvert {
- int pass_offset;
- int pass_stride;
-
- int pass_use_exposure;
- int pass_use_filter;
-
- int pass_divide;
- int pass_indirect;
-
- int pass_combined;
- int pass_sample_count;
- int pass_adaptive_aux_buffer;
- int pass_motion_weight;
- int pass_shadow_catcher;
- int pass_shadow_catcher_sample_count;
- int pass_shadow_catcher_matte;
- int pass_background;
-
- float scale;
- float exposure;
- float scale_exposure;
-
- int use_approximate_shadow_catcher;
- int use_approximate_shadow_catcher_background;
- int show_active_pixels;
-
- /* Number of components to write to. */
- int num_components;
-
- /* Number of floats per pixel. When zero is the same as `num_components`.
- * NOTE: Is ignored for half4 destination. */
- int pixel_stride;
-
- int is_denoised;
-
- /* Padding. */
- int pad1;
-} KernelFilmConvert;
-static_assert_align(KernelFilmConvert, 16);
-
-typedef struct KernelBackground {
- /* only shader index */
- int surface_shader;
- int volume_shader;
- float volume_step_size;
- int transparent;
- float transparent_roughness_squared_threshold;
-
- /* portal sampling */
- float portal_weight;
- int num_portals;
- int portal_offset;
-
- /* sun sampling */
- float sun_weight;
- /* xyz store direction, w the angle. float4 instead of float3 is used
- * to ensure consistent padding/alignment across devices. */
- float4 sun;
-
- /* map sampling */
- float map_weight;
- int map_res_x;
- int map_res_y;
-
- int use_mis;
-
- /* Padding */
- int pad1, pad2, pad3;
-} KernelBackground;
-static_assert_align(KernelBackground, 16);
-
-typedef struct KernelIntegrator {
- /* emission */
- int use_direct_light;
- int num_distribution;
- int num_all_lights;
- float pdf_triangles;
- float pdf_lights;
- float light_inv_rr_threshold;
-
- /* bounces */
- int min_bounce;
- int max_bounce;
-
- int max_diffuse_bounce;
- int max_glossy_bounce;
- int max_transmission_bounce;
- int max_volume_bounce;
-
- /* AO bounces */
- int ao_bounces;
- float ao_bounces_distance;
- float ao_bounces_factor;
-
- /* transparent */
- int transparent_min_bounce;
- int transparent_max_bounce;
- int transparent_shadows;
-
- /* caustics */
- int caustics_reflective;
- int caustics_refractive;
- float filter_glossy;
-
- /* seed */
- int seed;
-
- /* clamp */
- float sample_clamp_direct;
- float sample_clamp_indirect;
-
- /* mis */
- int use_lamp_mis;
-
- /* sampler */
- int sampling_pattern;
-
- /* volume render */
- int use_volumes;
- int volume_max_steps;
- float volume_step_rate;
-
- int has_shadow_catcher;
-
- /* padding */
- int pad1, pad2;
-} KernelIntegrator;
-static_assert_align(KernelIntegrator, 16);
-
-typedef enum KernelBVHLayout {
- BVH_LAYOUT_NONE = 0,
-
- BVH_LAYOUT_BVH2 = (1 << 0),
- BVH_LAYOUT_EMBREE = (1 << 1),
- BVH_LAYOUT_OPTIX = (1 << 2),
- BVH_LAYOUT_MULTI_OPTIX = (1 << 3),
- BVH_LAYOUT_MULTI_OPTIX_EMBREE = (1 << 4),
-
- /* Default BVH layout to use for CPU. */
- BVH_LAYOUT_AUTO = BVH_LAYOUT_EMBREE,
- BVH_LAYOUT_ALL = BVH_LAYOUT_BVH2 | BVH_LAYOUT_EMBREE | BVH_LAYOUT_OPTIX,
-} KernelBVHLayout;
-
-typedef struct KernelBVH {
- /* Own BVH */
- int root;
- int have_motion;
- int have_curves;
- int bvh_layout;
- int use_bvh_steps;
- int curve_subdivisions;
-
- /* Custom BVH */
-#ifdef __KERNEL_OPTIX__
- OptixTraversableHandle scene;
-#else
-# ifdef __EMBREE__
- RTCScene scene;
-# ifndef __KERNEL_64_BIT__
- int pad2;
-# endif
-# else
- int scene, pad2;
-# endif
-#endif
-} KernelBVH;
-static_assert_align(KernelBVH, 16);
-
-typedef struct KernelTables {
- int beckmann_offset;
- int pad1, pad2, pad3;
-} KernelTables;
-static_assert_align(KernelTables, 16);
-
-typedef struct KernelBake {
- int use;
- int object_index;
- int tri_offset;
- int pad1;
-} KernelBake;
-static_assert_align(KernelBake, 16);
-
-typedef struct KernelData {
- uint kernel_features;
- uint max_closures;
- uint max_shaders;
- uint volume_stack_size;
-
- KernelCamera cam;
- KernelFilm film;
- KernelBackground background;
- KernelIntegrator integrator;
- KernelBVH bvh;
- KernelTables tables;
- KernelBake bake;
-} KernelData;
-static_assert_align(KernelData, 16);
-
-/* Kernel data structures. */
-
-typedef struct KernelObject {
- Transform tfm;
- Transform itfm;
-
- float volume_density;
- float pass_id;
- float random_number;
- float color[3];
- int particle_index;
-
- float dupli_generated[3];
- float dupli_uv[2];
-
- int numkeys;
- int numsteps;
- int numverts;
-
- uint patch_map_offset;
- uint attribute_map_offset;
- uint motion_offset;
-
- float cryptomatte_object;
- float cryptomatte_asset;
-
- float shadow_terminator_shading_offset;
- float shadow_terminator_geometry_offset;
-
- float ao_distance;
-
- uint visibility;
- int primitive_type;
-} KernelObject;
-static_assert_align(KernelObject, 16);
-
-typedef struct KernelCurve {
- int shader_id;
- int first_key;
- int num_keys;
- int type;
-} KernelCurve;
-static_assert_align(KernelCurve, 16);
-
-typedef struct KernelCurveSegment {
- int prim;
- int type;
-} KernelCurveSegment;
-static_assert_align(KernelCurveSegment, 8);
-
-typedef struct KernelSpotLight {
- float radius;
- float invarea;
- float spot_angle;
- float spot_smooth;
- float dir[3];
- float pad;
-} KernelSpotLight;
-
-/* PointLight is SpotLight with only radius and invarea being used. */
-
-typedef struct KernelAreaLight {
- float axisu[3];
- float invarea;
- float axisv[3];
- float tan_spread;
- float dir[3];
- float normalize_spread;
-} KernelAreaLight;
-
-typedef struct KernelDistantLight {
- float radius;
- float cosangle;
- float invarea;
- float pad;
-} KernelDistantLight;
-
-typedef struct KernelLight {
- int type;
- float co[3];
- int shader_id;
- float max_bounces;
- float random;
- float strength[3];
- float pad1, pad2;
- Transform tfm;
- Transform itfm;
- union {
- KernelSpotLight spot;
- KernelAreaLight area;
- KernelDistantLight distant;
- };
-} KernelLight;
-static_assert_align(KernelLight, 16);
-
-typedef struct KernelLightDistribution {
- float totarea;
- int prim;
- union {
- struct {
- int shader_flag;
- int object_id;
- } mesh_light;
- struct {
- float pad;
- float size;
- } lamp;
- };
-} KernelLightDistribution;
-static_assert_align(KernelLightDistribution, 16);
-
-typedef struct KernelParticle {
- int index;
- float age;
- float lifetime;
- float size;
- float4 rotation;
- /* Only xyz are used of the following. float4 instead of float3 are used
- * to ensure consistent padding/alignment across devices. */
- float4 location;
- float4 velocity;
- float4 angular_velocity;
-} KernelParticle;
-static_assert_align(KernelParticle, 16);
-
-typedef struct KernelShader {
- float constant_emission[3];
- float cryptomatte_id;
- int flags;
- int pass_id;
- int pad2, pad3;
-} KernelShader;
-static_assert_align(KernelShader, 16);
-
-/* Patches */
-
-#define PATCH_MAX_CONTROL_VERTS 16
-
-/* Patch map node flags */
-
-#define PATCH_MAP_NODE_IS_SET (1 << 30)
-#define PATCH_MAP_NODE_IS_LEAF (1u << 31)
-#define PATCH_MAP_NODE_INDEX_MASK (~(PATCH_MAP_NODE_IS_SET | PATCH_MAP_NODE_IS_LEAF))
-
-/* Work Tiles */
-
-typedef struct KernelWorkTile {
- uint x, y, w, h;
-
- uint start_sample;
- uint num_samples;
-
- int offset;
- uint stride;
-
- /* Precalculated parameters used by init_from_camera kernel on GPU. */
- int path_index_offset;
- int work_size;
-} KernelWorkTile;
-
-/* Shader Evaluation.
- *
- * Position on a primitive on an object at which we want to evaluate the
- * shader for e.g. mesh displacement or light importance map. */
-
-typedef struct KernelShaderEvalInput {
- int object;
- int prim;
- float u, v;
-} KernelShaderEvalInput;
-static_assert_align(KernelShaderEvalInput, 16);
-
-/* Pre-computed sample table sizes for PMJ02 sampler. */
-#define NUM_PMJ_DIVISIONS 32
-#define NUM_PMJ_SAMPLES ((NUM_PMJ_DIVISIONS) * (NUM_PMJ_DIVISIONS))
-#define NUM_PMJ_PATTERNS 1
-
-/* Device kernels.
- *
- * Identifier for kernels that can be executed in device queues.
- *
- * Some implementation details.
- *
- * If the kernel uses shared CUDA memory, `CUDADeviceQueue::enqueue` is to be modified.
- * The path iteration kernels are handled in `PathTraceWorkGPU::enqueue_path_iteration`. */
-
-typedef enum DeviceKernel {
- DEVICE_KERNEL_INTEGRATOR_INIT_FROM_CAMERA = 0,
- DEVICE_KERNEL_INTEGRATOR_INIT_FROM_BAKE,
- DEVICE_KERNEL_INTEGRATOR_INTERSECT_CLOSEST,
- DEVICE_KERNEL_INTEGRATOR_INTERSECT_SHADOW,
- DEVICE_KERNEL_INTEGRATOR_INTERSECT_SUBSURFACE,
- DEVICE_KERNEL_INTEGRATOR_INTERSECT_VOLUME_STACK,
- DEVICE_KERNEL_INTEGRATOR_SHADE_BACKGROUND,
- DEVICE_KERNEL_INTEGRATOR_SHADE_LIGHT,
- DEVICE_KERNEL_INTEGRATOR_SHADE_SURFACE,
- DEVICE_KERNEL_INTEGRATOR_SHADE_SURFACE_RAYTRACE,
- DEVICE_KERNEL_INTEGRATOR_SHADE_VOLUME,
- DEVICE_KERNEL_INTEGRATOR_SHADE_SHADOW,
- DEVICE_KERNEL_INTEGRATOR_MEGAKERNEL,
-
- DEVICE_KERNEL_INTEGRATOR_QUEUED_PATHS_ARRAY,
- DEVICE_KERNEL_INTEGRATOR_QUEUED_SHADOW_PATHS_ARRAY,
- DEVICE_KERNEL_INTEGRATOR_ACTIVE_PATHS_ARRAY,
- DEVICE_KERNEL_INTEGRATOR_TERMINATED_PATHS_ARRAY,
- DEVICE_KERNEL_INTEGRATOR_SORTED_PATHS_ARRAY,
- DEVICE_KERNEL_INTEGRATOR_COMPACT_PATHS_ARRAY,
- DEVICE_KERNEL_INTEGRATOR_COMPACT_STATES,
- DEVICE_KERNEL_INTEGRATOR_TERMINATED_SHADOW_PATHS_ARRAY,
- DEVICE_KERNEL_INTEGRATOR_COMPACT_SHADOW_PATHS_ARRAY,
- DEVICE_KERNEL_INTEGRATOR_COMPACT_SHADOW_STATES,
- DEVICE_KERNEL_INTEGRATOR_RESET,
- DEVICE_KERNEL_INTEGRATOR_SHADOW_CATCHER_COUNT_POSSIBLE_SPLITS,
-
- DEVICE_KERNEL_SHADER_EVAL_DISPLACE,
- DEVICE_KERNEL_SHADER_EVAL_BACKGROUND,
- DEVICE_KERNEL_SHADER_EVAL_CURVE_SHADOW_TRANSPARENCY,
-
-#define DECLARE_FILM_CONVERT_KERNEL(variant) \
- DEVICE_KERNEL_FILM_CONVERT_##variant, DEVICE_KERNEL_FILM_CONVERT_##variant##_HALF_RGBA
-
- DECLARE_FILM_CONVERT_KERNEL(DEPTH),
- DECLARE_FILM_CONVERT_KERNEL(MIST),
- DECLARE_FILM_CONVERT_KERNEL(SAMPLE_COUNT),
- DECLARE_FILM_CONVERT_KERNEL(FLOAT),
- DECLARE_FILM_CONVERT_KERNEL(LIGHT_PATH),
- DECLARE_FILM_CONVERT_KERNEL(FLOAT3),
- DECLARE_FILM_CONVERT_KERNEL(MOTION),
- DECLARE_FILM_CONVERT_KERNEL(CRYPTOMATTE),
- DECLARE_FILM_CONVERT_KERNEL(SHADOW_CATCHER),
- DECLARE_FILM_CONVERT_KERNEL(SHADOW_CATCHER_MATTE_WITH_SHADOW),
- DECLARE_FILM_CONVERT_KERNEL(COMBINED),
- DECLARE_FILM_CONVERT_KERNEL(FLOAT4),
-
-#undef DECLARE_FILM_CONVERT_KERNEL
-
- DEVICE_KERNEL_ADAPTIVE_SAMPLING_CONVERGENCE_CHECK,
- DEVICE_KERNEL_ADAPTIVE_SAMPLING_CONVERGENCE_FILTER_X,
- DEVICE_KERNEL_ADAPTIVE_SAMPLING_CONVERGENCE_FILTER_Y,
-
- DEVICE_KERNEL_FILTER_GUIDING_PREPROCESS,
- DEVICE_KERNEL_FILTER_GUIDING_SET_FAKE_ALBEDO,
- DEVICE_KERNEL_FILTER_COLOR_PREPROCESS,
- DEVICE_KERNEL_FILTER_COLOR_POSTPROCESS,
-
- DEVICE_KERNEL_CRYPTOMATTE_POSTPROCESS,
-
- DEVICE_KERNEL_PREFIX_SUM,
-
- DEVICE_KERNEL_NUM,
-} DeviceKernel;
-
-enum {
- DEVICE_KERNEL_INTEGRATOR_NUM = DEVICE_KERNEL_INTEGRATOR_MEGAKERNEL + 1,
-};
-
-/* Kernel Features */
-
-enum KernelFeatureFlag : unsigned int {
- /* Shader nodes. */
- KERNEL_FEATURE_NODE_BSDF = (1U << 0U),
- KERNEL_FEATURE_NODE_EMISSION = (1U << 1U),
- KERNEL_FEATURE_NODE_VOLUME = (1U << 2U),
- KERNEL_FEATURE_NODE_HAIR = (1U << 3U),
- KERNEL_FEATURE_NODE_BUMP = (1U << 4U),
- KERNEL_FEATURE_NODE_BUMP_STATE = (1U << 5U),
- KERNEL_FEATURE_NODE_VORONOI_EXTRA = (1U << 6U),
- KERNEL_FEATURE_NODE_RAYTRACE = (1U << 7U),
- KERNEL_FEATURE_NODE_AOV = (1U << 8U),
- KERNEL_FEATURE_NODE_LIGHT_PATH = (1U << 9U),
-
- /* Use denoising kernels and output denoising passes. */
- KERNEL_FEATURE_DENOISING = (1U << 10U),
-
- /* Use path tracing kernels. */
- KERNEL_FEATURE_PATH_TRACING = (1U << 11U),
-
- /* BVH/sampling kernel features. */
- KERNEL_FEATURE_HAIR = (1U << 12U),
- KERNEL_FEATURE_HAIR_THICK = (1U << 13U),
- KERNEL_FEATURE_OBJECT_MOTION = (1U << 14U),
- KERNEL_FEATURE_CAMERA_MOTION = (1U << 15U),
-
- /* Denotes whether baking functionality is needed. */
- KERNEL_FEATURE_BAKING = (1U << 16U),
-
- /* Use subsurface scattering materials. */
- KERNEL_FEATURE_SUBSURFACE = (1U << 17U),
-
- /* Use volume materials. */
- KERNEL_FEATURE_VOLUME = (1U << 18U),
-
- /* Use OpenSubdiv patch evaluation */
- KERNEL_FEATURE_PATCH_EVALUATION = (1U << 19U),
-
- /* Use Transparent shadows */
- KERNEL_FEATURE_TRANSPARENT = (1U << 20U),
-
- /* Use shadow catcher. */
- KERNEL_FEATURE_SHADOW_CATCHER = (1U << 21U),
-
- /* Per-uber shader usage flags. */
- KERNEL_FEATURE_PRINCIPLED = (1U << 22U),
-
- /* Light render passes. */
- KERNEL_FEATURE_LIGHT_PASSES = (1U << 23U),
-
- /* Shadow render pass. */
- KERNEL_FEATURE_SHADOW_PASS = (1U << 24U),
-};
-
-/* Shader node feature mask, to specialize shader evaluation for kernels. */
-
-#define KERNEL_FEATURE_NODE_MASK_SURFACE_LIGHT \
- (KERNEL_FEATURE_NODE_EMISSION | KERNEL_FEATURE_NODE_VORONOI_EXTRA | \
- KERNEL_FEATURE_NODE_LIGHT_PATH)
-#define KERNEL_FEATURE_NODE_MASK_SURFACE_SHADOW \
- (KERNEL_FEATURE_NODE_BSDF | KERNEL_FEATURE_NODE_EMISSION | KERNEL_FEATURE_NODE_VOLUME | \
- KERNEL_FEATURE_NODE_HAIR | KERNEL_FEATURE_NODE_BUMP | KERNEL_FEATURE_NODE_BUMP_STATE | \
- KERNEL_FEATURE_NODE_VORONOI_EXTRA | KERNEL_FEATURE_NODE_LIGHT_PATH)
-#define KERNEL_FEATURE_NODE_MASK_SURFACE \
- (KERNEL_FEATURE_NODE_MASK_SURFACE_SHADOW | KERNEL_FEATURE_NODE_RAYTRACE | \
- KERNEL_FEATURE_NODE_AOV | KERNEL_FEATURE_NODE_LIGHT_PATH)
-#define KERNEL_FEATURE_NODE_MASK_VOLUME \
- (KERNEL_FEATURE_NODE_EMISSION | KERNEL_FEATURE_NODE_VOLUME | \
- KERNEL_FEATURE_NODE_VORONOI_EXTRA | KERNEL_FEATURE_NODE_LIGHT_PATH)
-#define KERNEL_FEATURE_NODE_MASK_DISPLACEMENT \
- (KERNEL_FEATURE_NODE_VORONOI_EXTRA | KERNEL_FEATURE_NODE_BUMP | KERNEL_FEATURE_NODE_BUMP_STATE)
-#define KERNEL_FEATURE_NODE_MASK_BUMP KERNEL_FEATURE_NODE_MASK_DISPLACEMENT
-
-/* Must be constexpr on the CPU to avoid compile errors because the state types
- * are different depending on the main, shadow or null path. For GPU we don't have
- * C++17 everywhere so can't use it. */
-#ifdef __KERNEL_CPU__
-# define IF_KERNEL_NODES_FEATURE(feature) \
- if constexpr ((node_feature_mask & (KERNEL_FEATURE_NODE_##feature)) != 0U)
-#else
-# define IF_KERNEL_NODES_FEATURE(feature) \
- if ((node_feature_mask & (KERNEL_FEATURE_NODE_##feature)) != 0U)
-#endif
-
-CCL_NAMESPACE_END