245 lines
7.7 KiB
C
245 lines
7.7 KiB
C
/* SPDX-FileCopyrightText: 2011-2022 Blender Foundation
|
|
*
|
|
* SPDX-License-Identifier: Apache-2.0 */
|
|
|
|
#pragma once
|
|
|
|
#include "util/types.h"
|
|
|
|
CCL_NAMESPACE_BEGIN
|
|
|
|
/* Kernel Feature Flags
|
|
*
|
|
* These are set from the host side depending on which features are used by the scene,
|
|
* either for runtime checks or specialization.
|
|
*
|
|
* NOTE: Keep kernel features as defines as they are used by the preprocessor to do
|
|
* compile time optimization while using adaptive kernel compilation. */
|
|
|
|
/* Shader nodes. */
|
|
#define KERNEL_FEATURE_NODE_BSDF (1U << 0U)
|
|
#define KERNEL_FEATURE_NODE_EMISSION (1U << 1U)
|
|
#define KERNEL_FEATURE_NODE_VOLUME (1U << 2U)
|
|
#define KERNEL_FEATURE_NODE_BUMP (1U << 3U)
|
|
#define KERNEL_FEATURE_NODE_BUMP_STATE (1U << 4U)
|
|
#define KERNEL_FEATURE_NODE_VORONOI_EXTRA (1U << 5U)
|
|
#define KERNEL_FEATURE_NODE_RAYTRACE (1U << 6U)
|
|
#define KERNEL_FEATURE_NODE_AOV (1U << 7U)
|
|
#define KERNEL_FEATURE_NODE_LIGHT_PATH (1U << 8U)
|
|
#define KERNEL_FEATURE_NODE_PRINCIPLED_HAIR (1U << 9U)
|
|
#define KERNEL_FEATURE_NODE_PORTAL (1U << 10U)
|
|
|
|
/* Use path tracing kernels. */
|
|
#define KERNEL_FEATURE_PATH_TRACING (1U << 11U)
|
|
|
|
/* BVH/sampling kernel features. */
|
|
#define KERNEL_FEATURE_POINTCLOUD (1U << 12U)
|
|
#define KERNEL_FEATURE_HAIR_RIBBON (1U << 13U)
|
|
#define KERNEL_FEATURE_HAIR_THICK (1U << 14U)
|
|
#define KERNEL_FEATURE_HAIR (KERNEL_FEATURE_HAIR_RIBBON | KERNEL_FEATURE_HAIR_THICK)
|
|
#define KERNEL_FEATURE_OBJECT_MOTION (1U << 15U)
|
|
|
|
/* Denotes whether baking functionality is needed. */
|
|
#define KERNEL_FEATURE_BAKING (1U << 16U)
|
|
|
|
/* Use subsurface scattering materials. */
|
|
#define KERNEL_FEATURE_SUBSURFACE (1U << 17U)
|
|
|
|
/* Use volume materials. */
|
|
#define KERNEL_FEATURE_VOLUME (1U << 18U)
|
|
|
|
/* Use Transparent shadows */
|
|
#define KERNEL_FEATURE_TRANSPARENT (1U << 19U)
|
|
|
|
/* Use shadow catcher. */
|
|
#define KERNEL_FEATURE_SHADOW_CATCHER (1U << 20U)
|
|
|
|
/* Light render passes. */
|
|
#define KERNEL_FEATURE_LIGHT_PASSES (1U << 21U)
|
|
|
|
/* AO. */
|
|
#define KERNEL_FEATURE_AO_PASS (1U << 22U)
|
|
#define KERNEL_FEATURE_AO_ADDITIVE (1U << 23U)
|
|
#define KERNEL_FEATURE_AO (KERNEL_FEATURE_AO_PASS | KERNEL_FEATURE_AO_ADDITIVE)
|
|
|
|
/* MNEE. */
|
|
#define KERNEL_FEATURE_MNEE (1U << 24U)
|
|
|
|
/* Path guiding. */
|
|
#define KERNEL_FEATURE_PATH_GUIDING (1U << 25U)
|
|
|
|
/* OSL. */
|
|
#define KERNEL_FEATURE_OSL_SHADING (1U << 26U)
|
|
#define KERNEL_FEATURE_OSL_CAMERA (1U << 27U)
|
|
|
|
/* Light and shadow linking. */
|
|
#define KERNEL_FEATURE_LIGHT_LINKING (1U << 28U)
|
|
#define KERNEL_FEATURE_SHADOW_LINKING (1U << 29U)
|
|
|
|
/* Use denoising kernels and output denoising passes. */
|
|
#define KERNEL_FEATURE_DENOISING (1U << 30U)
|
|
|
|
/* Light tree. */
|
|
#define KERNEL_FEATURE_LIGHT_TREE (1U << 31U)
|
|
|
|
/* 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 | KERNEL_FEATURE_NODE_PORTAL)
|
|
#define KERNEL_FEATURE_NODE_MASK_SURFACE_BACKGROUND \
|
|
(KERNEL_FEATURE_NODE_MASK_SURFACE_LIGHT | KERNEL_FEATURE_NODE_AOV)
|
|
#define KERNEL_FEATURE_NODE_MASK_SURFACE_SHADOW \
|
|
(KERNEL_FEATURE_NODE_BSDF | KERNEL_FEATURE_NODE_EMISSION | KERNEL_FEATURE_NODE_BUMP | \
|
|
KERNEL_FEATURE_NODE_BUMP_STATE | KERNEL_FEATURE_NODE_VORONOI_EXTRA | \
|
|
KERNEL_FEATURE_NODE_LIGHT_PATH | KERNEL_FEATURE_NODE_PRINCIPLED_HAIR | \
|
|
KERNEL_FEATURE_NODE_PORTAL)
|
|
#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 | \
|
|
KERNEL_FEATURE_NODE_PORTAL)
|
|
#define KERNEL_FEATURE_NODE_MASK_DISPLACEMENT \
|
|
(KERNEL_FEATURE_NODE_VORONOI_EXTRA | KERNEL_FEATURE_NODE_BUMP | \
|
|
KERNEL_FEATURE_NODE_BUMP_STATE | KERNEL_FEATURE_NODE_PORTAL)
|
|
#define KERNEL_FEATURE_NODE_MASK_BUMP KERNEL_FEATURE_NODE_MASK_DISPLACEMENT
|
|
|
|
#define IF_KERNEL_FEATURE(feature) \
|
|
if constexpr ((node_feature_mask & (KERNEL_FEATURE_##feature)) != 0U)
|
|
#define IF_KERNEL_NODES_FEATURE(feature) \
|
|
if constexpr ((node_feature_mask & (KERNEL_FEATURE_NODE_##feature)) != 0U)
|
|
#define IF_NOT_KERNEL_NODES_FEATURE(feature) \
|
|
if constexpr ((node_feature_mask & (KERNEL_FEATURE_NODE_##feature)) == 0U)
|
|
|
|
/* Kernel Feature Guards
|
|
*
|
|
* These are used throughout the code to disable code for certain features entirely.
|
|
* They can be commented out for faster builds, or to measure the performance impact
|
|
* of the existence of the extra code in the kernel.
|
|
*
|
|
* Commenting out the first set of feature guards should work well to reduce kernel
|
|
* compile time while still working for many scenes. */
|
|
|
|
#define __AO__
|
|
#define __LIGHT_LINKING__
|
|
#define __MNEE__
|
|
#define __OBJECT_MOTION__
|
|
#define __POINTCLOUD__
|
|
#define __PRINCIPLED_HAIR__
|
|
#define __SHADER_RAYTRACE__
|
|
#define __SHADOW_CATCHER__
|
|
#define __SHADOW_LINKING__
|
|
#define __SUBSURFACE__
|
|
#define __TRANSPARENT_SHADOWS__
|
|
#define __VOLUME__
|
|
|
|
#define __CAUSTICS_TRICKS__
|
|
#define __CLAMP_SAMPLE__
|
|
#define __DENOISING_FEATURES__
|
|
#define __DPDU__
|
|
#define __HAIR__
|
|
#define __LIGHT_TREE__
|
|
#define __PASSES__
|
|
#define __RAY_DIFFERENTIALS__
|
|
#define __VISIBILITY_FLAG__
|
|
#define __SVM__
|
|
|
|
/* Device specific features */
|
|
|
|
#ifdef WITH_OSL
|
|
# define __OSL__
|
|
# ifdef __KERNEL_OPTIX__
|
|
/* Kernels with OSL support are built separately in OptiX and don't need SVM. */
|
|
# undef __SVM__
|
|
# endif
|
|
#endif
|
|
#ifndef __KERNEL_GPU__
|
|
# if defined(WITH_PATH_GUIDING)
|
|
# define __PATH_GUIDING__
|
|
# endif
|
|
# define __VOLUME_RECORD_ALL__
|
|
#endif /* !__KERNEL_GPU__ */
|
|
|
|
/* MNEE caused "Compute function exceeds available temporary registers" in macOS < 13 due to a bug
|
|
* in spill buffer allocation sizing. */
|
|
#if defined(__KERNEL_METAL__) && (__KERNEL_METAL_MACOS__ < 13)
|
|
# undef __MNEE__
|
|
#endif
|
|
|
|
/* Scene-based selective features compilation. */
|
|
|
|
#ifdef __KERNEL_FEATURES__
|
|
# 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_POINTCLOUD)
|
|
# undef __POINTCLOUD__
|
|
# endif
|
|
# if !(__KERNEL_FEATURES__ & KERNEL_FEATURE_VOLUME)
|
|
# undef __VOLUME__
|
|
# if !(__KERNEL_FEATURES__ & KERNEL_FEATURE_TRANSPARENT)
|
|
# undef __TRANSPARENT_SHADOWS__
|
|
# endif
|
|
# endif
|
|
# if !(__KERNEL_FEATURES__ & KERNEL_FEATURE_SUBSURFACE)
|
|
# undef __SUBSURFACE__
|
|
# endif
|
|
# if !(__KERNEL_FEATURES__ & KERNEL_FEATURE_SHADOW_CATCHER)
|
|
# undef __SHADOW_CATCHER__
|
|
# endif
|
|
# if !(__KERNEL_FEATURES__ & KERNEL_FEATURE_DENOISING)
|
|
# undef __DENOISING_FEATURES__
|
|
# endif
|
|
# if !(__KERNEL_FEATURES__ & KERNEL_FEATURE_AO)
|
|
# undef __AO__
|
|
# endif
|
|
# if !(__KERNEL_FEATURES__ & KERNEL_FEATURE_MNEE)
|
|
# undef __MNEE__
|
|
# endif
|
|
# if !(__KERNEL_FEATURES__ & KERNEL_FEATURE_PATH_GUIDING)
|
|
# undef __PATH_GUIDING__
|
|
# endif
|
|
# if !(__KERNEL_FEATURES__ & KERNEL_FEATURE_NODE_PRINCIPLED_HAIR)
|
|
# undef __PRINCIPLED_HAIR__
|
|
# endif
|
|
# if !(__KERNEL_FEATURES__ & KERNEL_FEATURE_LIGHT_LINKING)
|
|
# undef __LIGHT_LINKING__
|
|
# endif
|
|
# if !(__KERNEL_FEATURES__ & KERNEL_FEATURE_SHADOW_LINKING)
|
|
# undef __SHADOW_LINKING__
|
|
# 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
|
|
|
|
/* Feature mask for integrator states, to allocate state memory only when
|
|
* certain features are on or off. */
|
|
|
|
struct KernelFeatureRequest {
|
|
uint32_t on;
|
|
uint32_t off;
|
|
|
|
explicit KernelFeatureRequest(uint32_t on) : on(on), off(0) {}
|
|
KernelFeatureRequest(uint32_t on, uint32_t off) : on(on), off(off) {}
|
|
|
|
bool test(uint32_t features) const
|
|
{
|
|
return (features & on) && !(features & off);
|
|
}
|
|
};
|
|
|
|
CCL_NAMESPACE_END
|