Files
workinf_Blender_Wasm/blender-5.2.0/intern/cycles/kernel/features.h
2026-08-12 04:47:48 -04:00

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