mirror of
https://github.com/blender/blender
synced 2026-09-29 04:37:17 +03:00
Refactor: Cycles: Separate shader flags and runtime flags
We are running out of bits. Split the original `ShaderDataFlag` into `ShaderRuntimeFlag`, which is determined by closures in the shader and set up during rendering, and `ShaderDataFlag`, which is the same for the whole shader graph and hence determined during shader compilation The size of `ShaderData` did not change due to padding Pull Request: https://projects.blender.org/blender/blender/pulls/161856
This commit is contained in:
parent
6a379f755f
commit
cc93b7f5a4
63 changed files with 305 additions and 295 deletions
|
|
@ -38,7 +38,7 @@ ccl_device void kernel_displace_evaluate(KernelGlobals kg,
|
|||
const float3 P = sd.P;
|
||||
displacement_shader_eval(kg, state, &sd);
|
||||
float3 D = sd.P - P;
|
||||
if (sd.flag & SD_CACHE_MISS) {
|
||||
if (sd.runtime_flag & SR_CACHE_MISS) {
|
||||
*cache_miss = true;
|
||||
}
|
||||
object_inverse_dir_transform(kg, &sd, &D);
|
||||
|
|
@ -90,7 +90,7 @@ ccl_device void kernel_background_evaluate(KernelGlobals kg,
|
|||
surface_shader_eval<KERNEL_FEATURE_NODE_MASK_SURFACE_LIGHT &
|
||||
~(KERNEL_FEATURE_NODE_RAYTRACE | KERNEL_FEATURE_NODE_LIGHT_PATH)>(
|
||||
kg, state, &sd, nullptr, PATH_RAY_VISIBILITY_NONE, path_flag);
|
||||
if (sd.flag & SD_CACHE_MISS) {
|
||||
if (sd.runtime_flag & SR_CACHE_MISS) {
|
||||
*cache_miss = true;
|
||||
}
|
||||
|
||||
|
|
@ -133,7 +133,7 @@ ccl_device void kernel_curve_shadow_transparency_evaluate(
|
|||
~(KERNEL_FEATURE_NODE_RAYTRACE | KERNEL_FEATURE_NODE_LIGHT_PATH)>(
|
||||
kg, state, &sd, nullptr, PATH_RAY_VISIBILITY_SHADOW, PATH_RAY_FLAG_NONE);
|
||||
|
||||
if (sd.flag & SD_CACHE_MISS) {
|
||||
if (sd.runtime_flag & SR_CACHE_MISS) {
|
||||
*cache_miss = true;
|
||||
}
|
||||
|
||||
|
|
@ -167,7 +167,8 @@ ccl_device void kernel_volume_density_evaluate(KernelGlobals kg,
|
|||
/* Setup shader data. */
|
||||
ShaderData sd;
|
||||
shader_setup_from_volume(&sd, &ray, in.object);
|
||||
sd.flag = SD_IS_VOLUME_SHADER_EVAL;
|
||||
sd.runtime_flag = SR_IS_VOLUME_SHADER_EVAL;
|
||||
sd.shader_flag = 0;
|
||||
/* For stochastic texture sampling. */
|
||||
sd.lcg_state = lcg_state_init(offset, 0, 0, 0x15b4f88d);
|
||||
|
||||
|
|
@ -217,7 +218,7 @@ ccl_device void kernel_volume_density_evaluate(KernelGlobals kg,
|
|||
KERNEL_FEATURE_NODE_MASK_VOLUME & ~KERNEL_FEATURE_NODE_LIGHT_PATH>(
|
||||
kg, state, &sd, entry, path_visibility, path_flag);
|
||||
|
||||
if (sd.flag & SD_CACHE_MISS) {
|
||||
if (sd.runtime_flag & SR_CACHE_MISS) {
|
||||
/* Note we keep rendering other samples so we find all cache misses in one go. */
|
||||
*cache_miss = true;
|
||||
}
|
||||
|
|
|
|||
|
|
@ -324,14 +324,15 @@ ccl_device_inline Spectrum camera_sample_custom(KernelGlobals kg,
|
|||
sd->prim = PRIM_NONE;
|
||||
sd->shader = SHADER_NONE;
|
||||
sd->type = PRIMITIVE_NONE;
|
||||
sd->flag = 0;
|
||||
sd->runtime_flag = 0;
|
||||
sd->shader_flag = 0;
|
||||
|
||||
/* Execute OSL shader to sample position, direction and transmission. */
|
||||
packed_float3 P, dPdx, dPdy, D, dDdx, dDdy, throughput;
|
||||
r_cache_miss = false;
|
||||
throughput = osl_eval_camera(
|
||||
kg, sd, sensor, dSdx, dSdy, rand_lens, P, dPdx, dPdy, D, dDdx, dDdy);
|
||||
if (sd->flag & SD_CACHE_MISS) {
|
||||
if (sd->runtime_flag & SR_CACHE_MISS) {
|
||||
r_cache_miss = true;
|
||||
return zero_spectrum();
|
||||
}
|
||||
|
|
|
|||
|
|
@ -52,7 +52,7 @@ ccl_device ccl_private void *closure_alloc_extra(ccl_private ShaderData *sd, con
|
|||
return (ccl_private void *)(sd->closure + sd->num_closure + sd->num_closure_left);
|
||||
}
|
||||
|
||||
ccl_device_inline float closure_sample_weight(const int flag, ccl_private Spectrum &weight)
|
||||
ccl_device_inline float closure_sample_weight(const int runtime_flag, ccl_private Spectrum &weight)
|
||||
{
|
||||
kernel_assert(isfinite_safe(weight));
|
||||
|
||||
|
|
@ -66,7 +66,7 @@ ccl_device_inline float closure_sample_weight(const int flag, ccl_private Spectr
|
|||
* the cutoff. */
|
||||
/* Use comparison this way to help dealing with non-finite weight: if the average is not finite
|
||||
* we will not allocate new closure. */
|
||||
if ((sample_weight >= CLOSURE_WEIGHT_CUTOFF) || (flag & SD_IS_VOLUME_SHADER_EVAL)) {
|
||||
if ((sample_weight >= CLOSURE_WEIGHT_CUTOFF) || (runtime_flag & SR_IS_VOLUME_SHADER_EVAL)) {
|
||||
return sample_weight;
|
||||
}
|
||||
|
||||
|
|
@ -77,7 +77,7 @@ ccl_device_inline ccl_private ShaderClosure *bsdf_alloc(ccl_private ShaderData *
|
|||
const int size,
|
||||
Spectrum weight)
|
||||
{
|
||||
const float sample_weight = closure_sample_weight(sd->flag, weight);
|
||||
const float sample_weight = closure_sample_weight(sd->runtime_flag, weight);
|
||||
if (!(sample_weight > 0.0f)) {
|
||||
return nullptr;
|
||||
}
|
||||
|
|
@ -102,7 +102,7 @@ ccl_device_inline ccl_private Bsdf *bsdf_alloc_maybe_emission(ccl_private Shader
|
|||
if (path_flag & PATH_RAY_EMISSION) {
|
||||
/* When evaluating emission we don't allocate closures, but we still need a valid closure to
|
||||
* compute the weight. */
|
||||
const float sample_weight = closure_sample_weight(sd->flag, weight);
|
||||
const float sample_weight = closure_sample_weight(sd->runtime_flag, weight);
|
||||
if (!(sample_weight > 0.0f)) {
|
||||
return nullptr;
|
||||
}
|
||||
|
|
|
|||
|
|
@ -123,7 +123,7 @@ ccl_device_inline float bump_shadowing_term(const ccl_private ShaderData *sd,
|
|||
}
|
||||
|
||||
/* When bump map correction is not used do skip the smoothing. */
|
||||
if ((sd->flag & SD_USE_BUMP_MAP_CORRECTION) == 0) {
|
||||
if ((sd->shader_flag & SD_USE_BUMP_MAP_CORRECTION) == 0) {
|
||||
return 1.0f;
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -29,7 +29,7 @@ ccl_device int bsdf_ashikhmin_shirley_setup(ccl_private MicrofacetBsdf *bsdf)
|
|||
|
||||
bsdf->fresnel_type = MicrofacetFresnel::NONE;
|
||||
bsdf->type = CLOSURE_BSDF_ASHIKHMIN_SHIRLEY_ID;
|
||||
return SD_BSDF | SD_BSDF_HAS_EVAL;
|
||||
return SR_BSDF | SR_BSDF_HAS_EVAL;
|
||||
}
|
||||
|
||||
ccl_device void bsdf_ashikhmin_shirley_blur(ccl_private ShaderClosure *sc, const float roughness)
|
||||
|
|
|
|||
|
|
@ -29,7 +29,7 @@ ccl_device int bsdf_ashikhmin_velvet_setup(ccl_private VelvetBsdf *bsdf)
|
|||
|
||||
bsdf->type = CLOSURE_BSDF_ASHIKHMIN_VELVET_ID;
|
||||
|
||||
return SD_BSDF | SD_BSDF_HAS_EVAL;
|
||||
return SR_BSDF | SR_BSDF_HAS_EVAL;
|
||||
}
|
||||
|
||||
ccl_device Spectrum bsdf_ashikhmin_velvet_eval(const ccl_private ShaderClosure *sc,
|
||||
|
|
|
|||
|
|
@ -40,7 +40,7 @@ ccl_device int bsdf_burley_setup(ccl_private BurleyBsdf *bsdf, const float rough
|
|||
{
|
||||
bsdf->type = CLOSURE_BSDF_BURLEY_ID;
|
||||
bsdf->roughness = saturatef(roughness);
|
||||
return SD_BSDF | SD_BSDF_HAS_EVAL;
|
||||
return SR_BSDF | SR_BSDF_HAS_EVAL;
|
||||
}
|
||||
|
||||
ccl_device Spectrum bsdf_burley_eval(ccl_private const ShaderClosure *sc,
|
||||
|
|
|
|||
|
|
@ -31,7 +31,7 @@ ccl_device void bsdf_diffuse_setup(ccl_private ShaderData *sd,
|
|||
if (bsdf) {
|
||||
bsdf->N = N;
|
||||
bsdf->type = CLOSURE_BSDF_DIFFUSE_ID;
|
||||
sd->flag |= (SD_BSDF | SD_BSDF_HAS_EVAL);
|
||||
sd->runtime_flag |= (SR_BSDF | SR_BSDF_HAS_EVAL);
|
||||
}
|
||||
}
|
||||
|
||||
|
|
@ -83,7 +83,7 @@ ccl_device void bsdf_translucent_setup(ccl_private ShaderData *sd,
|
|||
if (bsdf) {
|
||||
bsdf->N = N;
|
||||
bsdf->type = CLOSURE_BSDF_TRANSLUCENT_ID;
|
||||
sd->flag |= (SD_BSDF | SD_BSDF_HAS_EVAL | SD_BSDF_HAS_TRANSMISSION);
|
||||
sd->runtime_flag |= (SR_BSDF | SR_BSDF_HAS_EVAL | SR_BSDF_HAS_TRANSMISSION);
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -43,7 +43,7 @@ ccl_device float3 bsdf_diffuse_ramp_get_color(const float3 colors[8], float pos)
|
|||
ccl_device int bsdf_diffuse_ramp_setup(DiffuseRampBsdf *bsdf)
|
||||
{
|
||||
bsdf->type = CLOSURE_BSDF_DIFFUSE_RAMP_ID;
|
||||
return SD_BSDF | SD_BSDF_HAS_EVAL;
|
||||
return SR_BSDF | SR_BSDF_HAS_EVAL;
|
||||
}
|
||||
|
||||
ccl_device void bsdf_diffuse_ramp_blur(ccl_private ShaderClosure * /*sc*/,
|
||||
|
|
|
|||
|
|
@ -29,7 +29,7 @@ ccl_device int bsdf_hair_reflection_setup(ccl_private HairBsdf *bsdf)
|
|||
bsdf->type = CLOSURE_BSDF_HAIR_REFLECTION_ID;
|
||||
bsdf->roughness1 = clamp(bsdf->roughness1, 0.001f, 1.0f);
|
||||
bsdf->roughness2 = clamp(bsdf->roughness2, 0.001f, 1.0f);
|
||||
return SD_BSDF | SD_BSDF_HAS_EVAL;
|
||||
return SR_BSDF | SR_BSDF_HAS_EVAL;
|
||||
}
|
||||
|
||||
ccl_device int bsdf_hair_transmission_setup(ccl_private HairBsdf *bsdf)
|
||||
|
|
@ -37,7 +37,7 @@ ccl_device int bsdf_hair_transmission_setup(ccl_private HairBsdf *bsdf)
|
|||
bsdf->type = CLOSURE_BSDF_HAIR_TRANSMISSION_ID;
|
||||
bsdf->roughness1 = clamp(bsdf->roughness1, 0.001f, 1.0f);
|
||||
bsdf->roughness2 = clamp(bsdf->roughness2, 0.001f, 1.0f);
|
||||
return SD_BSDF | SD_BSDF_HAS_EVAL | SD_BSDF_HAS_TRANSMISSION;
|
||||
return SR_BSDF | SR_BSDF_HAS_EVAL | SR_BSDF_HAS_TRANSMISSION;
|
||||
}
|
||||
|
||||
ccl_device Spectrum bsdf_hair_reflection_eval(const ccl_private ShaderClosure *sc,
|
||||
|
|
|
|||
|
|
@ -681,7 +681,7 @@ ccl_device_forceinline bool roughness_is_almost_specular(const float alpha_x, co
|
|||
/* A specular BSDF has no eval. */
|
||||
ccl_device_forceinline int bsdf_microfacet_eval_flag(const ccl_private MicrofacetBsdf *bsdf)
|
||||
{
|
||||
return roughness_is_almost_specular(bsdf->alpha_x, bsdf->alpha_y) ? 0 : SD_BSDF_HAS_EVAL;
|
||||
return roughness_is_almost_specular(bsdf->alpha_x, bsdf->alpha_y) ? 0 : SR_BSDF_HAS_EVAL;
|
||||
}
|
||||
|
||||
template<MicrofacetType m_type>
|
||||
|
|
@ -1068,7 +1068,7 @@ ccl_device int bsdf_microfacet_ggx_setup(ccl_private MicrofacetBsdf *bsdf)
|
|||
bsdf->energy_scale = 1.0f;
|
||||
bsdf->type = CLOSURE_BSDF_MICROFACET_GGX_ID;
|
||||
|
||||
return SD_BSDF | bsdf_microfacet_eval_flag(bsdf);
|
||||
return SR_BSDF | bsdf_microfacet_eval_flag(bsdf);
|
||||
}
|
||||
|
||||
ccl_device int bsdf_microfacet_ggx_refraction_setup(ccl_private MicrofacetBsdf *bsdf)
|
||||
|
|
@ -1080,7 +1080,7 @@ ccl_device int bsdf_microfacet_ggx_refraction_setup(ccl_private MicrofacetBsdf *
|
|||
bsdf->energy_scale = 1.0f;
|
||||
bsdf->type = CLOSURE_BSDF_MICROFACET_GGX_REFRACTION_ID;
|
||||
|
||||
return SD_BSDF | SD_BSDF_HAS_TRANSMISSION | bsdf_microfacet_eval_flag(bsdf);
|
||||
return SR_BSDF | SR_BSDF_HAS_TRANSMISSION | bsdf_microfacet_eval_flag(bsdf);
|
||||
}
|
||||
|
||||
ccl_device int bsdf_microfacet_ggx_glass_setup(ccl_private MicrofacetBsdf *bsdf)
|
||||
|
|
@ -1092,7 +1092,7 @@ ccl_device int bsdf_microfacet_ggx_glass_setup(ccl_private MicrofacetBsdf *bsdf)
|
|||
bsdf->energy_scale = 1.0f;
|
||||
bsdf->type = CLOSURE_BSDF_MICROFACET_GGX_GLASS_ID;
|
||||
|
||||
return SD_BSDF | SD_BSDF_HAS_TRANSMISSION | bsdf_microfacet_eval_flag(bsdf);
|
||||
return SR_BSDF | SR_BSDF_HAS_TRANSMISSION | bsdf_microfacet_eval_flag(bsdf);
|
||||
}
|
||||
|
||||
ccl_device void bsdf_microfacet_blur(ccl_private ShaderClosure *sc, const float roughness)
|
||||
|
|
@ -1143,7 +1143,7 @@ ccl_device int bsdf_microfacet_beckmann_setup(ccl_private MicrofacetBsdf *bsdf)
|
|||
bsdf->fresnel_type = MicrofacetFresnel::NONE;
|
||||
bsdf->type = CLOSURE_BSDF_MICROFACET_BECKMANN_ID;
|
||||
|
||||
return SD_BSDF | bsdf_microfacet_eval_flag(bsdf);
|
||||
return SR_BSDF | bsdf_microfacet_eval_flag(bsdf);
|
||||
}
|
||||
|
||||
ccl_device int bsdf_microfacet_beckmann_refraction_setup(ccl_private MicrofacetBsdf *bsdf)
|
||||
|
|
@ -1154,7 +1154,7 @@ ccl_device int bsdf_microfacet_beckmann_refraction_setup(ccl_private MicrofacetB
|
|||
bsdf->fresnel_type = MicrofacetFresnel::NONE;
|
||||
bsdf->type = CLOSURE_BSDF_MICROFACET_BECKMANN_REFRACTION_ID;
|
||||
|
||||
return SD_BSDF | SD_BSDF_HAS_TRANSMISSION | bsdf_microfacet_eval_flag(bsdf);
|
||||
return SR_BSDF | SR_BSDF_HAS_TRANSMISSION | bsdf_microfacet_eval_flag(bsdf);
|
||||
}
|
||||
|
||||
ccl_device int bsdf_microfacet_beckmann_glass_setup(ccl_private MicrofacetBsdf *bsdf)
|
||||
|
|
@ -1165,7 +1165,7 @@ ccl_device int bsdf_microfacet_beckmann_glass_setup(ccl_private MicrofacetBsdf *
|
|||
bsdf->fresnel_type = MicrofacetFresnel::DIELECTRIC;
|
||||
bsdf->type = CLOSURE_BSDF_MICROFACET_BECKMANN_GLASS_ID;
|
||||
|
||||
return SD_BSDF | SD_BSDF_HAS_TRANSMISSION | bsdf_microfacet_eval_flag(bsdf);
|
||||
return SR_BSDF | SR_BSDF_HAS_TRANSMISSION | bsdf_microfacet_eval_flag(bsdf);
|
||||
}
|
||||
|
||||
ccl_device Spectrum bsdf_microfacet_beckmann_eval(KernelGlobals kg,
|
||||
|
|
@ -1269,7 +1269,7 @@ ccl_device_inline void bsdf_thin_glass_reflection_setup(KernelGlobals kg,
|
|||
bsdf->T = zero_float3();
|
||||
bsdf->alpha_x = bsdf->alpha_y = roughness;
|
||||
bsdf->ior = 1.0f;
|
||||
sd->flag |= bsdf_microfacet_ggx_setup(bsdf);
|
||||
sd->runtime_flag |= bsdf_microfacet_ggx_setup(bsdf);
|
||||
bsdf_microfacet_setup_fresnel_constant(kg, bsdf, sd->wi, color);
|
||||
}
|
||||
}
|
||||
|
|
@ -1314,7 +1314,7 @@ ccl_device_inline void bsdf_thin_glass_transmission_setup(KernelGlobals kg,
|
|||
bsdf->fresnel_type = MicrofacetFresnel::NONE;
|
||||
bsdf->energy_scale = 1.0f;
|
||||
bsdf->type = CLOSURE_BSDF_THIN_GLASS_TRANSMISSION_ID;
|
||||
sd->flag |= (SD_BSDF | SD_BSDF_HAS_TRANSMISSION | bsdf_microfacet_eval_flag(bsdf));
|
||||
sd->runtime_flag |= (SR_BSDF | SR_BSDF_HAS_TRANSMISSION | bsdf_microfacet_eval_flag(bsdf));
|
||||
bsdf_microfacet_setup_fresnel_constant(kg, bsdf, reflect(sd->wi, N), one_spectrum());
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -107,7 +107,7 @@ ccl_device void bsdf_oren_nayar_setup(ccl_private ShaderData *sd,
|
|||
bsdf->N = N;
|
||||
bsdf->type = CLOSURE_BSDF_OREN_NAYAR_ID;
|
||||
bsdf->param = bsdf_oren_nayar_param(color, dot(bsdf->N, sd->wi), roughness);
|
||||
sd->flag |= SD_BSDF | SD_BSDF_HAS_EVAL;
|
||||
sd->runtime_flag |= SR_BSDF | SR_BSDF_HAS_EVAL;
|
||||
}
|
||||
}
|
||||
|
||||
|
|
@ -199,7 +199,7 @@ ccl_device_inline void bsdf_thin_subsurface_setup(ccl_private ShaderData *sd,
|
|||
bsdf->type = CLOSURE_BSDF_OREN_NAYAR_ID;
|
||||
bsdf->N = N;
|
||||
bsdf->param = param;
|
||||
sd->flag |= SD_BSDF | SD_BSDF_HAS_EVAL;
|
||||
sd->runtime_flag |= SR_BSDF | SR_BSDF_HAS_EVAL;
|
||||
}
|
||||
}
|
||||
|
||||
|
|
@ -211,7 +211,7 @@ ccl_device_inline void bsdf_thin_subsurface_setup(ccl_private ShaderData *sd,
|
|||
bsdf->type = CLOSURE_BSDF_ROUGH_TRANSLUCENT_ID;
|
||||
bsdf->N = -N;
|
||||
bsdf->param = param;
|
||||
sd->flag |= SD_BSDF | SD_BSDF_HAS_EVAL | SD_BSDF_HAS_TRANSMISSION;
|
||||
sd->runtime_flag |= SR_BSDF | SR_BSDF_HAS_EVAL | SR_BSDF_HAS_TRANSMISSION;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -44,7 +44,7 @@ ccl_device int bsdf_phong_ramp_setup(ccl_private PhongRampBsdf *bsdf)
|
|||
{
|
||||
bsdf->type = CLOSURE_BSDF_PHONG_RAMP_ID;
|
||||
bsdf->exponent = max(bsdf->exponent, 0.0f);
|
||||
return SD_BSDF | SD_BSDF_HAS_EVAL;
|
||||
return SR_BSDF | SR_BSDF_HAS_EVAL;
|
||||
}
|
||||
|
||||
ccl_device Spectrum bsdf_phong_ramp_eval(const ccl_private ShaderClosure *sc,
|
||||
|
|
|
|||
|
|
@ -190,7 +190,7 @@ ccl_device int bsdf_hair_chiang_setup(ccl_private ShaderData *sd, ccl_private Ch
|
|||
|
||||
bsdf->N = Y;
|
||||
bsdf->alpha = -bsdf->alpha;
|
||||
return SD_BSDF | SD_BSDF_HAS_EVAL | SD_BSDF_HAS_TRANSMISSION;
|
||||
return SR_BSDF | SR_BSDF_HAS_EVAL | SR_BSDF_HAS_TRANSMISSION;
|
||||
}
|
||||
|
||||
#endif /* __HAIR__ */
|
||||
|
|
|
|||
|
|
@ -305,7 +305,7 @@ ccl_device int bsdf_hair_huang_setup(ccl_private ShaderData *sd,
|
|||
return 0;
|
||||
}
|
||||
|
||||
return SD_BSDF | SD_BSDF_HAS_EVAL | SD_BSDF_HAS_TRANSMISSION;
|
||||
return SR_BSDF | SR_BSDF_HAS_EVAL | SR_BSDF_HAS_TRANSMISSION;
|
||||
}
|
||||
|
||||
#endif /* __HAIR__ */
|
||||
|
|
|
|||
|
|
@ -36,7 +36,7 @@ ccl_device void bsdf_ray_portal_setup(ccl_private ShaderData *sd,
|
|||
sd, sizeof(RayPortalClosure), CLOSURE_BSDF_RAY_PORTAL_ID, weight);
|
||||
|
||||
if (pc) {
|
||||
sd->flag |= SD_BSDF | SD_RAY_PORTAL;
|
||||
sd->runtime_flag |= SR_BSDF | SR_RAY_PORTAL;
|
||||
if (is_zero(direction)) {
|
||||
direction = -sd->wi;
|
||||
}
|
||||
|
|
|
|||
|
|
@ -50,7 +50,7 @@ ccl_device int bsdf_sheen_setup(KernelGlobals kg,
|
|||
bsdf->weight *= albedo;
|
||||
bsdf->sample_weight *= albedo;
|
||||
|
||||
return SD_BSDF | SD_BSDF_HAS_EVAL;
|
||||
return SR_BSDF | SR_BSDF_HAS_EVAL;
|
||||
}
|
||||
|
||||
ccl_device Spectrum bsdf_sheen_eval(const ccl_private ShaderClosure *sc,
|
||||
|
|
|
|||
|
|
@ -27,7 +27,7 @@ ccl_device_inline int bsdf_toon_setup_common(ccl_private ToonBsdf *bsdf)
|
|||
bsdf->size = clamp(bsdf->size, 1e-5f, 1.0f) * M_PI_2_F;
|
||||
bsdf->smooth = saturatef(bsdf->smooth) * M_PI_2_F;
|
||||
|
||||
return SD_BSDF | SD_BSDF_HAS_EVAL;
|
||||
return SR_BSDF | SR_BSDF_HAS_EVAL;
|
||||
}
|
||||
|
||||
/* DIFFUSE TOON */
|
||||
|
|
|
|||
|
|
@ -25,7 +25,7 @@ ccl_device void bsdf_transparent_setup(ccl_private ShaderData *sd,
|
|||
|
||||
sd->closure_transparent_extinction += weight;
|
||||
|
||||
if (sd->flag & SD_TRANSPARENT) {
|
||||
if (sd->runtime_flag & SR_TRANSPARENT) {
|
||||
/* Add weight to existing transparent BSDF. */
|
||||
for (int i = 0; i < sd->num_closure; i++) {
|
||||
ccl_private ShaderClosure *sc = &sd->closure[i];
|
||||
|
|
@ -38,7 +38,7 @@ ccl_device void bsdf_transparent_setup(ccl_private ShaderData *sd,
|
|||
}
|
||||
}
|
||||
else {
|
||||
sd->flag |= SD_BSDF | SD_TRANSPARENT;
|
||||
sd->runtime_flag |= SR_BSDF | SR_TRANSPARENT;
|
||||
|
||||
if (path_flag & PATH_RAY_TERMINATE) {
|
||||
/* In this case the number of closures is set to zero to disable
|
||||
|
|
|
|||
|
|
@ -399,7 +399,7 @@ ccl_device float3 ensure_valid_specular_reflection(const float3 Ng, const float3
|
|||
ccl_device float3 maybe_ensure_valid_specular_reflection(ccl_private ShaderData *sd,
|
||||
const float3 N)
|
||||
{
|
||||
if ((sd->flag & SD_USE_BUMP_MAP_CORRECTION) == 0) {
|
||||
if ((sd->shader_flag & SD_USE_BUMP_MAP_CORRECTION) == 0) {
|
||||
return N;
|
||||
}
|
||||
if ((sd->type & PRIMITIVE_CURVE) || isequal(sd->Ng, N)) {
|
||||
|
|
|
|||
|
|
@ -342,7 +342,7 @@ ccl_device int bssrdf_setup(ccl_private ShaderData *sd,
|
|||
|
||||
bssrdf_setup_radius(bssrdf, type);
|
||||
|
||||
flag |= SD_BSSRDF;
|
||||
flag |= SR_BSSRDF;
|
||||
}
|
||||
else {
|
||||
bssrdf->type = CLOSURE_NONE_ID;
|
||||
|
|
|
|||
|
|
@ -15,11 +15,11 @@ CCL_NAMESPACE_BEGIN
|
|||
|
||||
ccl_device void background_setup(ccl_private ShaderData *sd, const Spectrum weight)
|
||||
{
|
||||
if (sd->flag & SD_EMISSION) {
|
||||
if (sd->runtime_flag & SR_EMISSION) {
|
||||
sd->closure_emission_background += weight;
|
||||
}
|
||||
else {
|
||||
sd->flag |= SD_EMISSION;
|
||||
sd->runtime_flag |= SR_EMISSION;
|
||||
sd->closure_emission_background = weight;
|
||||
}
|
||||
}
|
||||
|
|
@ -28,11 +28,11 @@ ccl_device void background_setup(ccl_private ShaderData *sd, const Spectrum weig
|
|||
|
||||
ccl_device void emission_setup(ccl_private ShaderData *sd, const Spectrum weight)
|
||||
{
|
||||
if (sd->flag & SD_EMISSION) {
|
||||
if (sd->runtime_flag & SR_EMISSION) {
|
||||
sd->closure_emission_background += weight;
|
||||
}
|
||||
else {
|
||||
sd->flag |= SD_EMISSION;
|
||||
sd->runtime_flag |= SR_EMISSION;
|
||||
sd->closure_emission_background = weight;
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -17,11 +17,11 @@ CCL_NAMESPACE_BEGIN
|
|||
|
||||
ccl_device void volume_extinction_setup(ccl_private ShaderData *sd, Spectrum weight)
|
||||
{
|
||||
if (sd->flag & SD_EXTINCTION) {
|
||||
if (sd->runtime_flag & SR_EXTINCTION) {
|
||||
sd->closure_transparent_extinction += weight;
|
||||
}
|
||||
else {
|
||||
sd->flag |= SD_EXTINCTION;
|
||||
sd->runtime_flag |= SR_EXTINCTION;
|
||||
sd->closure_transparent_extinction = weight;
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -26,7 +26,7 @@ ccl_device int volume_draine_setup(ccl_private DraineVolume *volume)
|
|||
/* clamp anisotropy */
|
||||
volume->g = signf(volume->g) * min(fabsf(volume->g), 1.0f - 1e-3f);
|
||||
|
||||
return SD_SCATTER;
|
||||
return SR_SCATTER;
|
||||
}
|
||||
|
||||
ccl_device Spectrum volume_draine_eval(const ccl_private ShaderData *sd,
|
||||
|
|
|
|||
|
|
@ -35,7 +35,7 @@ ccl_device int volume_fournier_forand_setup(ccl_private FournierForandVolume *vo
|
|||
volume->c2 = coeffs.y;
|
||||
volume->c3 = coeffs.z;
|
||||
|
||||
return SD_SCATTER;
|
||||
return SR_SCATTER;
|
||||
}
|
||||
|
||||
ccl_device Spectrum volume_fournier_forand_eval(const ccl_private ShaderData *sd,
|
||||
|
|
|
|||
|
|
@ -26,7 +26,7 @@ ccl_device int volume_henyey_greenstein_setup(ccl_private HenyeyGreensteinVolume
|
|||
/* clamp anisotropy to avoid delta function */
|
||||
volume->g = signf(volume->g) * min(fabsf(volume->g), 1.0f - 1e-3f);
|
||||
|
||||
return SD_SCATTER;
|
||||
return SR_SCATTER;
|
||||
}
|
||||
|
||||
ccl_device Spectrum volume_henyey_greenstein_eval(const ccl_private ShaderData *sd,
|
||||
|
|
|
|||
|
|
@ -21,7 +21,7 @@ static_assert(sizeof(ShaderVolumeClosure) >= sizeof(RayleighVolume),
|
|||
ccl_device int volume_rayleigh_setup(ccl_private RayleighVolume *volume)
|
||||
{
|
||||
volume->type = CLOSURE_VOLUME_RAYLEIGH_ID;
|
||||
return SD_SCATTER;
|
||||
return SR_SCATTER;
|
||||
}
|
||||
|
||||
ccl_device Spectrum volume_rayleigh_eval(const ccl_private ShaderData *sd,
|
||||
|
|
|
|||
|
|
@ -70,7 +70,7 @@ ccl_device_inline void film_write_data_passes(KernelGlobals kg,
|
|||
}
|
||||
}
|
||||
|
||||
if (!(sd->flag & (SD_TRANSPARENT | SD_RAY_PORTAL)) ||
|
||||
if (!(sd->runtime_flag & (SR_TRANSPARENT | SR_RAY_PORTAL)) ||
|
||||
kernel_data.film.pass_alpha_threshold == 0.0f ||
|
||||
average(surface_shader_alpha(sd)) >= kernel_data.film.pass_alpha_threshold)
|
||||
{
|
||||
|
|
|
|||
|
|
@ -78,7 +78,7 @@ ccl_device void primitive_normal_set_undisplaced(KernelGlobals kg,
|
|||
}
|
||||
|
||||
object_normal_transform(kg, sd, &N);
|
||||
sd->N = (sd->flag & SD_BACKFACING) ? -N : N;
|
||||
sd->N = (sd->runtime_flag & SR_BACKFACING) ? -N : N;
|
||||
}
|
||||
|
||||
#ifdef __VOLUME__
|
||||
|
|
|
|||
|
|
@ -61,7 +61,8 @@ ccl_device_inline
|
|||
sd->object = isect->object;
|
||||
sd->object_flag = kernel_data_fetch(object_flag, sd->object);
|
||||
sd->prim = isect->prim;
|
||||
sd->flag = 0;
|
||||
sd->runtime_flag = 0;
|
||||
sd->shader_flag = 0;
|
||||
|
||||
/* Read matrices and time. */
|
||||
sd->time = ray->time;
|
||||
|
|
@ -110,13 +111,13 @@ ccl_device_inline
|
|||
}
|
||||
}
|
||||
|
||||
sd->flag = kernel_data_fetch(shaders, (sd->shader & SHADER_MASK)).flags;
|
||||
sd->shader_flag = kernel_data_fetch(shaders, (sd->shader & SHADER_MASK)).flags;
|
||||
|
||||
/* backfacing test */
|
||||
const bool backfacing = (dot(sd->Ng, sd->wi) < 0.0f);
|
||||
|
||||
if (backfacing) {
|
||||
sd->flag |= SD_BACKFACING;
|
||||
sd->runtime_flag |= SR_BACKFACING;
|
||||
sd->Ng = -sd->Ng;
|
||||
sd->N = -sd->N;
|
||||
#ifdef __DPDU__
|
||||
|
|
@ -174,8 +175,8 @@ ccl_device_inline void shader_setup_from_sample(KernelGlobals kg,
|
|||
sd->v = v;
|
||||
sd->time = time;
|
||||
sd->ray_length = t;
|
||||
|
||||
sd->flag = kernel_data_fetch(shaders, (sd->shader & SHADER_MASK)).flags;
|
||||
sd->runtime_flag = 0;
|
||||
sd->shader_flag = kernel_data_fetch(shaders, (sd->shader & SHADER_MASK)).flags;
|
||||
sd->object_flag = 0;
|
||||
if (sd->object != OBJECT_NONE) {
|
||||
sd->object_flag |= kernel_data_fetch(object_flag, sd->object);
|
||||
|
|
@ -232,7 +233,7 @@ ccl_device_inline void shader_setup_from_sample(KernelGlobals kg,
|
|||
const bool backfacing = (dot(sd->Ng, sd->wi) < 0.0f);
|
||||
|
||||
if (backfacing) {
|
||||
sd->flag |= SD_BACKFACING;
|
||||
sd->runtime_flag |= SR_BACKFACING;
|
||||
sd->Ng = -sd->Ng;
|
||||
sd->N = -sd->N;
|
||||
#ifdef __DPDU__
|
||||
|
|
@ -321,7 +322,8 @@ ccl_device void shader_setup_from_curve(KernelGlobals kg,
|
|||
|
||||
/* Shader */
|
||||
sd->shader = kernel_data_fetch(curves, prim).shader_id;
|
||||
sd->flag = kernel_data_fetch(shaders, (sd->shader & SHADER_MASK)).flags;
|
||||
sd->runtime_flag = 0;
|
||||
sd->shader_flag = kernel_data_fetch(shaders, (sd->shader & SHADER_MASK)).flags;
|
||||
|
||||
/* Object */
|
||||
sd->object = object;
|
||||
|
|
@ -400,7 +402,8 @@ ccl_device_inline void shader_setup_from_background(KernelGlobals kg,
|
|||
sd->Ng = -ray_D;
|
||||
sd->wi = -ray_D;
|
||||
sd->shader = kernel_data.background.surface_shader;
|
||||
sd->flag = kernel_data_fetch(shaders, (sd->shader & SHADER_MASK)).flags;
|
||||
sd->runtime_flag = 0;
|
||||
sd->shader_flag = kernel_data_fetch(shaders, (sd->shader & SHADER_MASK)).flags;
|
||||
sd->object_flag = 0;
|
||||
sd->time = ray_time;
|
||||
sd->ray_length = FLT_MAX;
|
||||
|
|
@ -441,7 +444,8 @@ ccl_device_inline void shader_setup_from_volume(ccl_private ShaderData *ccl_rest
|
|||
sd->Ng = -ray->D;
|
||||
sd->wi = -ray->D;
|
||||
sd->shader = SHADER_NONE;
|
||||
sd->flag = 0;
|
||||
sd->runtime_flag = 0;
|
||||
sd->shader_flag = 0;
|
||||
sd->object_flag = 0;
|
||||
sd->time = ray->time;
|
||||
sd->ray_length = 0.0f; /* todo: can we set this to some useful value? */
|
||||
|
|
|
|||
|
|
@ -102,8 +102,8 @@ ccl_device float4 volume_attribute_float4(KernelGlobals kg,
|
|||
* common case where transform is translation/scale only. */
|
||||
float3 P = sd->P;
|
||||
object_inverse_position_transform(kg, sd, &P);
|
||||
const InterpolationType interp = (sd->flag & SD_VOLUME_CUBIC) ? INTERPOLATION_CUBIC :
|
||||
INTERPOLATION_NONE;
|
||||
const InterpolationType interp = (sd->shader_flag & SD_VOLUME_CUBIC) ? INTERPOLATION_CUBIC :
|
||||
INTERPOLATION_NONE;
|
||||
const float4 value = kernel_image_interp_3d(kg, sd, desc.offset, P, interp, stochastic);
|
||||
if (value.w > 1e-6f && value.w != 1.0f) {
|
||||
/* For RGBA colors, unpremultiply after interpolation. */
|
||||
|
|
|
|||
|
|
@ -173,11 +173,11 @@ ccl_device_forceinline void integrator_intersect_next_kernel_after_shadow_catche
|
|||
integrator_state_read_isect(state, &isect);
|
||||
|
||||
const int shader = intersection_get_shader(kg, &isect);
|
||||
const int flags = kernel_data_fetch(shaders, shader).flags;
|
||||
const int shader_flags = kernel_data_fetch(shaders, shader).flags;
|
||||
const uint object_flags = intersection_get_object_flags(kg, &isect);
|
||||
const bool use_caustics = kernel_data.integrator.use_caustics &&
|
||||
(object_flags & SD_OBJECT_CAUSTICS_RECEIVER);
|
||||
const bool use_raytrace_kernel = (flags & SD_HAS_RAYTRACE);
|
||||
const bool use_raytrace_kernel = (shader_flags & SD_HAS_RAYTRACE);
|
||||
|
||||
if (use_caustics) {
|
||||
integrator_path_next(state, current_kernel, DEVICE_KERNEL_INTEGRATOR_INTERSECT_MNEE);
|
||||
|
|
@ -315,11 +315,11 @@ ccl_device_forceinline void integrator_intersect_next_kernel_after_volume(
|
|||
|
||||
/* Hit a surface, continue with surface kernel unless terminated. */
|
||||
const int shader = intersection_get_shader(kg, isect);
|
||||
const int flags = kernel_data_fetch(shaders, shader).flags;
|
||||
const int shader_flags = kernel_data_fetch(shaders, shader).flags;
|
||||
const uint object_flags = intersection_get_object_flags(kg, isect);
|
||||
const bool use_caustics = kernel_data.integrator.use_caustics &&
|
||||
(object_flags & SD_OBJECT_CAUSTICS_RECEIVER);
|
||||
const bool use_raytrace_kernel = (flags & SD_HAS_RAYTRACE);
|
||||
const bool use_raytrace_kernel = (shader_flags & SD_HAS_RAYTRACE);
|
||||
|
||||
if (use_caustics) {
|
||||
integrator_path_next(state, current_kernel, DEVICE_KERNEL_INTEGRATOR_INTERSECT_MNEE);
|
||||
|
|
|
|||
|
|
@ -40,7 +40,7 @@ integrate_surface_mnee(KernelGlobals kg,
|
|||
sd->P,
|
||||
sd->N,
|
||||
light_link_receiver_nee(kg, sd),
|
||||
sd->flag,
|
||||
sd->runtime_flag,
|
||||
bounce,
|
||||
path_flag,
|
||||
&ls))
|
||||
|
|
|
|||
|
|
@ -133,7 +133,7 @@ ccl_device void integrator_volume_stack_init(KernelGlobals kg, IntegratorState s
|
|||
|
||||
for (uint hit = 0; hit < num_hits; ++hit, ++isect) {
|
||||
shader_setup_from_ray(kg, stack_sd, &volume_ray, isect);
|
||||
if (stack_sd->flag & SD_BACKFACING) {
|
||||
if (stack_sd->runtime_flag & SR_BACKFACING) {
|
||||
bool need_add = true;
|
||||
for (int i = 0; i < enclosed_index && need_add; ++i) {
|
||||
/* If ray exited the volume and never entered to that volume
|
||||
|
|
@ -179,7 +179,7 @@ ccl_device void integrator_volume_stack_init(KernelGlobals kg, IntegratorState s
|
|||
}
|
||||
|
||||
shader_setup_from_ray(kg, stack_sd, &volume_ray, &isect);
|
||||
if (stack_sd->flag & SD_BACKFACING) {
|
||||
if (stack_sd->runtime_flag & SR_BACKFACING) {
|
||||
/* If ray exited the volume and never entered to that volume
|
||||
* it means that camera is inside such a volume.
|
||||
*/
|
||||
|
|
|
|||
|
|
@ -130,7 +130,8 @@ ccl_device_inline void mnee_setup_manifold_vertex(KernelGlobals kg,
|
|||
isect->object;
|
||||
|
||||
sd_vtx->type = isect->type;
|
||||
sd_vtx->flag = 0;
|
||||
sd_vtx->runtime_flag = 0;
|
||||
sd_vtx->shader_flag = 0;
|
||||
sd_vtx->object_flag = kernel_data_fetch(object_flag, sd_vtx->object);
|
||||
|
||||
/* Matrices and time. */
|
||||
|
|
@ -825,7 +826,7 @@ ccl_device_inline ShaderEvalResult mnee_path_contribution(KernelGlobals kg,
|
|||
1;
|
||||
INTEGRATOR_STATE_WRITE(state, path, bounce) = bounce + vertex_count;
|
||||
|
||||
if (sd_mnee->flag & SD_CACHE_MISS) {
|
||||
if (sd_mnee->runtime_flag & SR_CACHE_MISS) {
|
||||
/* Restore original state path bounce info. */
|
||||
INTEGRATOR_STATE_WRITE(state, path, transmission_bounce) = transmission_bounce;
|
||||
INTEGRATOR_STATE_WRITE(state, path, diffuse_bounce) = diffuse_bounce;
|
||||
|
|
@ -915,7 +916,7 @@ ccl_device_inline ShaderEvalResult mnee_path_contribution(KernelGlobals kg,
|
|||
/* Evaluate shader nodes at solution vi. */
|
||||
surface_shader_eval<KERNEL_FEATURE_NODE_MASK_SURFACE_SHADOW>(
|
||||
kg, state, sd_mnee, nullptr, PATH_RAY_VISIBILITY_DIFFUSE, PATH_RAY_FLAG_NONE, true);
|
||||
if (sd_mnee->flag & SD_CACHE_MISS) {
|
||||
if (sd_mnee->runtime_flag & SR_CACHE_MISS) {
|
||||
/* Restore original state path bounce info. */
|
||||
INTEGRATOR_STATE_WRITE(state, path, transmission_bounce) = transmission_bounce;
|
||||
INTEGRATOR_STATE_WRITE(state, path, diffuse_bounce) = diffuse_bounce;
|
||||
|
|
@ -1021,7 +1022,7 @@ ccl_device_inline ShaderEvalResult kernel_path_mnee_sample(KernelGlobals kg,
|
|||
/* Last bool argument is the MNEE flag (for TINY_MAX_CLOSURE cap in kernel_shader.h). */
|
||||
surface_shader_eval<KERNEL_FEATURE_NODE_MASK_SURFACE_SHADOW>(
|
||||
kg, state, sd_mnee, nullptr, PATH_RAY_VISIBILITY_DIFFUSE, PATH_RAY_FLAG_NONE, true);
|
||||
if (sd_mnee->flag & SD_CACHE_MISS) {
|
||||
if (sd_mnee->runtime_flag & SR_CACHE_MISS) {
|
||||
return SHADER_EVAL_CACHE_MISS;
|
||||
}
|
||||
|
||||
|
|
@ -1036,8 +1037,8 @@ ccl_device_inline ShaderEvalResult kernel_path_mnee_sample(KernelGlobals kg,
|
|||
ccl_private MicrofacetBsdf *microfacet_bsdf = (ccl_private MicrofacetBsdf *)bsdf;
|
||||
|
||||
/* Figure out appropriate index of refraction ratio. */
|
||||
const float eta = (sd_mnee->flag & SD_BACKFACING) ? 1.0f / microfacet_bsdf->ior :
|
||||
microfacet_bsdf->ior;
|
||||
const float eta = (sd_mnee->runtime_flag & SR_BACKFACING) ? 1.0f / microfacet_bsdf->ior :
|
||||
microfacet_bsdf->ior;
|
||||
|
||||
float2 h = zero_float2();
|
||||
if (microfacet_bsdf->alpha_x > 0.f && microfacet_bsdf->alpha_y > 0.f) {
|
||||
|
|
|
|||
|
|
@ -110,7 +110,7 @@ ccl_device_inline void path_state_init_integrator(KernelGlobals kg,
|
|||
ccl_device_inline void path_state_next(KernelGlobals kg,
|
||||
IntegratorState state,
|
||||
const int label,
|
||||
const int shader_flag)
|
||||
const int runtime_flag)
|
||||
{
|
||||
PathRayVisibility visibility = INTEGRATOR_STATE(state, path, visibility);
|
||||
uint32_t flag = INTEGRATOR_STATE(state, path, flag);
|
||||
|
|
@ -127,7 +127,7 @@ ccl_device_inline void path_state_next(KernelGlobals kg,
|
|||
flag |= PATH_RAY_TERMINATE_ON_NEXT_SURFACE;
|
||||
}
|
||||
|
||||
if (shader_flag & SD_RAY_PORTAL) {
|
||||
if (runtime_flag & SR_RAY_PORTAL) {
|
||||
flag |= PATH_RAY_MIS_SKIP;
|
||||
INTEGRATOR_STATE_WRITE(
|
||||
state, path, portal_bounce) = INTEGRATOR_STATE(state, path, portal_bounce) + 1;
|
||||
|
|
@ -223,7 +223,7 @@ ccl_device_inline void path_state_next(KernelGlobals kg,
|
|||
}
|
||||
|
||||
/* Flag for consistent MIS weights with light tree. */
|
||||
if (shader_flag & SD_BSDF_HAS_TRANSMISSION) {
|
||||
if (runtime_flag & SR_BSDF_HAS_TRANSMISSION) {
|
||||
flag |= PATH_RAY_MIS_HAD_TRANSMISSION;
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -86,7 +86,7 @@ ccl_device Spectrum integrator_eval_background_shader(KernelGlobals kg,
|
|||
surface_shader_eval<KERNEL_FEATURE_NODE_MASK_SURFACE_BACKGROUND>(
|
||||
kg, state, emission_sd, render_buffer, path_visibility, path_flag | PATH_RAY_EMISSION);
|
||||
|
||||
result = (emission_sd->flag & SD_CACHE_MISS) ? SHADER_EVAL_CACHE_MISS : SHADER_EVAL_OK;
|
||||
result = (emission_sd->runtime_flag & SR_CACHE_MISS) ? SHADER_EVAL_CACHE_MISS : SHADER_EVAL_OK;
|
||||
return surface_shader_background(emission_sd);
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -126,7 +126,7 @@ ccl_device bool shadow_linking_shade_surface_emission(KernelGlobals kg,
|
|||
integrate_surface_shader_setup(kg, state, emission_sd);
|
||||
|
||||
# ifdef __VOLUME__
|
||||
if (emission_sd->flag & SD_HAS_ONLY_VOLUME) {
|
||||
if (emission_sd->shader_flag & SD_HAS_ONLY_VOLUME) {
|
||||
return SHADER_EVAL_EMPTY;
|
||||
}
|
||||
# endif
|
||||
|
|
|
|||
|
|
@ -194,7 +194,7 @@ ccl_device ShaderEvalResult integrate_light_nee(KernelGlobals kg, IntegratorShad
|
|||
surface_shader_eval<KERNEL_FEATURE_NODE_MASK_SURFACE_LIGHT>(
|
||||
kg, state, emission_sd, nullptr, PATH_RAY_VISIBILITY_NONE, PATH_RAY_EMISSION);
|
||||
|
||||
if (emission_sd->flag & SD_CACHE_MISS) {
|
||||
if (emission_sd->runtime_flag & SR_CACHE_MISS) {
|
||||
return SHADER_EVAL_CACHE_MISS;
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -111,10 +111,10 @@ integrate_transparent_surface_shadow(KernelGlobals kg,
|
|||
shader_setup_from_ray(kg, shadow_sd, &ray, &isect);
|
||||
|
||||
/* Evaluate shader. */
|
||||
if (!(shadow_sd->flag & SD_HAS_ONLY_VOLUME)) {
|
||||
if (!(shadow_sd->shader_flag & SD_HAS_ONLY_VOLUME)) {
|
||||
surface_shader_eval<KERNEL_FEATURE_NODE_MASK_SURFACE_SHADOW>(
|
||||
kg, state, shadow_sd, nullptr, PATH_RAY_VISIBILITY_SHADOW, PATH_RAY_FLAG_NONE);
|
||||
if (shadow_sd->flag & SD_CACHE_MISS) {
|
||||
if (shadow_sd->runtime_flag & SR_CACHE_MISS) {
|
||||
result = SHADER_EVAL_CACHE_MISS;
|
||||
return zero_spectrum();
|
||||
}
|
||||
|
|
@ -129,7 +129,7 @@ integrate_transparent_surface_shadow(KernelGlobals kg,
|
|||
# endif
|
||||
|
||||
/* Disable transparent shadows for ray portals */
|
||||
if (shadow_sd->flag & SD_RAY_PORTAL) {
|
||||
if (shadow_sd->runtime_flag & SR_RAY_PORTAL) {
|
||||
result = SHADER_EVAL_EMPTY;
|
||||
return zero_spectrum();
|
||||
}
|
||||
|
|
@ -176,7 +176,7 @@ ccl_device_inline bool integrate_transparent_volume_shadow(KernelGlobals kg,
|
|||
volume_shadow_null_scattering(kg, state, &ray, shadow_sd, throughput);
|
||||
}
|
||||
|
||||
return shadow_sd->flag & SD_CACHE_MISS;
|
||||
return shadow_sd->runtime_flag & SR_CACHE_MISS;
|
||||
}
|
||||
# endif
|
||||
|
||||
|
|
|
|||
|
|
@ -100,7 +100,7 @@ ccl_device_forceinline bool integrate_surface_holdout(KernelGlobals kg,
|
|||
/* Write holdout transparency to render buffer and stop if fully holdout. */
|
||||
const uint32_t path_flag = INTEGRATOR_STATE(state, path, flag);
|
||||
|
||||
if (((sd->flag & SD_HOLDOUT) || (sd->object_flag & SD_OBJECT_HOLDOUT_MASK)) &&
|
||||
if (((sd->runtime_flag & SR_HOLDOUT) || (sd->object_flag & SD_OBJECT_HOLDOUT_MASK)) &&
|
||||
(path_flag & PATH_RAY_TRANSPARENT_BACKGROUND))
|
||||
{
|
||||
const Spectrum holdout_weight = surface_shader_apply_holdout(sd);
|
||||
|
|
@ -194,7 +194,7 @@ ccl_device int integrate_surface_ray_portal(KernelGlobals kg,
|
|||
INTEGRATOR_STATE_WRITE(state, path, throughput) *= pc->weight / pick_pdf;
|
||||
|
||||
const int label = LABEL_TRANSMIT | LABEL_RAY_PORTAL;
|
||||
path_state_next(kg, state, label, sd->flag);
|
||||
path_state_next(kg, state, label, sd->runtime_flag);
|
||||
|
||||
return label;
|
||||
}
|
||||
|
|
@ -322,7 +322,7 @@ ccl_device
|
|||
const ccl_private RNGState *rng_state)
|
||||
{
|
||||
/* Test if there is a light or BSDF that needs direct light. */
|
||||
if (!(kernel_data.integrator.use_direct_light && (sd->flag & SD_BSDF_HAS_EVAL))) {
|
||||
if (!(kernel_data.integrator.use_direct_light && (sd->runtime_flag & SR_BSDF_HAS_EVAL))) {
|
||||
return SHADER_EVAL_EMPTY;
|
||||
}
|
||||
|
||||
|
|
@ -350,7 +350,7 @@ ccl_device
|
|||
sd->P,
|
||||
sd->N,
|
||||
light_link_receiver_nee(kg, sd),
|
||||
sd->flag,
|
||||
sd->runtime_flag,
|
||||
bounce,
|
||||
path_flag,
|
||||
&ls))
|
||||
|
|
@ -494,7 +494,7 @@ ccl_device_forceinline int integrate_surface_bsdf_bssrdf_bounce(
|
|||
const ccl_private RNGState *rng_state)
|
||||
{
|
||||
/* Sample BSDF or BSSRDF. */
|
||||
if (!(sd->flag & (SD_BSDF | SD_BSSRDF))) {
|
||||
if (!(sd->runtime_flag & (SR_BSDF | SR_BSSRDF))) {
|
||||
return LABEL_NONE;
|
||||
}
|
||||
|
||||
|
|
@ -618,7 +618,7 @@ ccl_device_forceinline int integrate_surface_bsdf_bssrdf_bounce(
|
|||
#endif
|
||||
}
|
||||
|
||||
path_state_next(kg, state, label, sd->flag);
|
||||
path_state_next(kg, state, label, sd->runtime_flag);
|
||||
|
||||
guiding_record_surface_bounce(kg,
|
||||
state,
|
||||
|
|
@ -775,11 +775,11 @@ ccl_device int integrate_surface(KernelGlobals kg,
|
|||
|
||||
/* Skip most work for volume bounding surface. */
|
||||
#ifdef __VOLUME__
|
||||
if (!(sd.flag & SD_HAS_ONLY_VOLUME)) {
|
||||
if (!(sd.shader_flag & SD_HAS_ONLY_VOLUME)) {
|
||||
#endif
|
||||
#ifdef __SUBSURFACE__
|
||||
/* Can skip shader evaluation for BSSRDF exit point without bump mapping. */
|
||||
if (!(path_flag & PATH_RAY_SUBSURFACE) || ((sd.flag & SD_HAS_BSSRDF_BUMP)))
|
||||
if (!(path_flag & PATH_RAY_SUBSURFACE) || ((sd.shader_flag & SD_HAS_BSSRDF_BUMP)))
|
||||
#endif
|
||||
{
|
||||
/* Evaluate shader. */
|
||||
|
|
@ -788,7 +788,7 @@ ccl_device int integrate_surface(KernelGlobals kg,
|
|||
kg, state, &sd, render_buffer, path_visibility, path_flag);
|
||||
}
|
||||
|
||||
if (sd.flag & SD_CACHE_MISS) {
|
||||
if (sd.runtime_flag & SR_CACHE_MISS) {
|
||||
return LABEL_CACHE_MISS;
|
||||
}
|
||||
|
||||
|
|
@ -814,7 +814,7 @@ ccl_device int integrate_surface(KernelGlobals kg,
|
|||
}
|
||||
|
||||
/* Write emission. */
|
||||
if (sd.flag & SD_EMISSION) {
|
||||
if (sd.runtime_flag & SR_EMISSION) {
|
||||
integrate_surface_emission(kg, state, &sd, render_buffer);
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -94,7 +94,7 @@ ccl_device_inline Spectrum volume_shader_eval_extinction(KernelGlobals kg,
|
|||
|
||||
volume_shader_eval<shadow>(kg, state, sd, path_visibility, path_flag);
|
||||
|
||||
return (sd->flag & SD_EXTINCTION) ? sd->closure_transparent_extinction : zero_spectrum();
|
||||
return (sd->runtime_flag & SR_EXTINCTION) ? sd->closure_transparent_extinction : zero_spectrum();
|
||||
}
|
||||
|
||||
/* Evaluate shader to get absorption, scattering and emission at P. */
|
||||
|
|
@ -107,16 +107,17 @@ ccl_device_inline bool volume_shader_sample(KernelGlobals kg,
|
|||
const uint32_t path_flag = INTEGRATOR_STATE(state, path, flag);
|
||||
volume_shader_eval<false>(kg, state, sd, path_visibility, path_flag);
|
||||
|
||||
if (!(sd->flag & (SD_EXTINCTION | SD_SCATTER | SD_EMISSION))) {
|
||||
if (!(sd->runtime_flag & (SR_EXTINCTION | SR_SCATTER | SR_EMISSION))) {
|
||||
return false;
|
||||
}
|
||||
|
||||
coeff->sigma_s = zero_spectrum();
|
||||
coeff->sigma_t = (sd->flag & SD_EXTINCTION) ? sd->closure_transparent_extinction :
|
||||
zero_spectrum();
|
||||
coeff->emission = (sd->flag & SD_EMISSION) ? sd->closure_emission_background : zero_spectrum();
|
||||
coeff->sigma_t = (sd->runtime_flag & SR_EXTINCTION) ? sd->closure_transparent_extinction :
|
||||
zero_spectrum();
|
||||
coeff->emission = (sd->runtime_flag & SR_EMISSION) ? sd->closure_emission_background :
|
||||
zero_spectrum();
|
||||
|
||||
if (sd->flag & SD_SCATTER) {
|
||||
if (sd->runtime_flag & SR_SCATTER) {
|
||||
for (int i = 0; i < sd->num_closure; i++) {
|
||||
const ccl_private ShaderClosure *sc = &sd->closure[i];
|
||||
|
||||
|
|
@ -805,14 +806,14 @@ ccl_device_inline bool volume_valid_direct_ray_segment(KernelGlobals kg,
|
|||
/* Emission */
|
||||
|
||||
ccl_device Spectrum volume_emission_integrate(ccl_private VolumeShaderCoefficients *coeff,
|
||||
const int closure_flag,
|
||||
const int runtime_flag,
|
||||
const float t)
|
||||
{
|
||||
/* integral E * exp(-sigma_t * t) from 0 to t = E * (1 - exp(-sigma_t * t))/sigma_t
|
||||
* this goes to E * t as sigma_t goes to zero. */
|
||||
Spectrum emission = coeff->emission;
|
||||
|
||||
if (closure_flag & SD_EXTINCTION) {
|
||||
if (runtime_flag & SR_EXTINCTION) {
|
||||
const Spectrum optical_depth = coeff->sigma_t * t;
|
||||
emission *= select(optical_depth > 1e-5f,
|
||||
(1.0f - exp(-optical_depth)) / coeff->sigma_t,
|
||||
|
|
@ -1215,7 +1216,7 @@ ccl_device_inline void volume_distance_sampling_finalize(
|
|||
return;
|
||||
}
|
||||
|
||||
kernel_assert(sd->flag & SD_SCATTER);
|
||||
kernel_assert(sd->runtime_flag & SR_SCATTER);
|
||||
if (sample_distance) {
|
||||
/* Direct scatter. */
|
||||
result.direct_scatter = true;
|
||||
|
|
@ -1460,7 +1461,7 @@ ccl_device void volume_integrate_step_scattering(
|
|||
}
|
||||
|
||||
/* Emission. */
|
||||
if (sd->flag & SD_EMISSION) {
|
||||
if (sd->runtime_flag & SR_EMISSION) {
|
||||
/* Emission = inv_sigma * (L_e + sigma_n * (inv_sigma * (L_e + sigma_n * ···))). */
|
||||
vstate.emission += result.indirect_throughput * coeff.emission;
|
||||
if (!result.indirect_scatter) {
|
||||
|
|
@ -1509,7 +1510,7 @@ ccl_device_inline void volume_equiangular_direct_scatter(
|
|||
|
||||
sd->P = ray->P + ray->D * result.direct_t;
|
||||
VolumeShaderCoefficients coeff ccl_optional_struct_init;
|
||||
if (volume_shader_sample(kg, state, sd, &coeff) && (sd->flag & SD_SCATTER)) {
|
||||
if (volume_shader_sample(kg, state, sd, &coeff) && (sd->runtime_flag & SR_SCATTER)) {
|
||||
volume_shader_copy_phases(&result.direct_phases, sd);
|
||||
|
||||
if (vstate.use_mis) {
|
||||
|
|
@ -1734,8 +1735,8 @@ ccl_device_forceinline void volume_integrate_homogeneous(KernelGlobals kg,
|
|||
|
||||
/* Emission. */
|
||||
const Spectrum throughput = INTEGRATOR_STATE(state, path, throughput);
|
||||
if (sd->flag & SD_EMISSION) {
|
||||
const Spectrum emission = volume_emission_integrate(&coeff, sd->flag, ray_length);
|
||||
if (sd->runtime_flag & SR_EMISSION) {
|
||||
const Spectrum emission = volume_emission_integrate(&coeff, sd->runtime_flag, ray_length);
|
||||
vstate.emission = throughput * emission;
|
||||
guiding_record_volume_emission(kg, state, emission);
|
||||
}
|
||||
|
|
@ -2355,29 +2356,29 @@ ccl_device_forceinline void volume_integrate_ray_marching(
|
|||
/* compute segment */
|
||||
VolumeShaderCoefficients coeff ccl_optional_struct_init;
|
||||
if (volume_shader_sample(kg, state, sd, &coeff)) {
|
||||
const int closure_flag = sd->flag;
|
||||
const int runtime_flag = sd->runtime_flag;
|
||||
|
||||
/* Evaluate transmittance over segment. */
|
||||
const float dt = vstep.t.length();
|
||||
const Spectrum transmittance = (closure_flag & SD_EXTINCTION) ?
|
||||
const Spectrum transmittance = (runtime_flag & SR_EXTINCTION) ?
|
||||
volume_color_transmittance(coeff.sigma_t, dt) :
|
||||
one_spectrum();
|
||||
|
||||
/* Emission. */
|
||||
if (closure_flag & SD_EMISSION) {
|
||||
if (runtime_flag & SR_EMISSION) {
|
||||
/* Only write emission before indirect light scatter position, since we terminate
|
||||
* stepping at that point if we have already found a direct light scatter position. */
|
||||
if (!result.indirect_scatter) {
|
||||
const Spectrum emission = volume_emission_integrate(&coeff, closure_flag, dt);
|
||||
const Spectrum emission = volume_emission_integrate(&coeff, runtime_flag, dt);
|
||||
accum_emission += result.indirect_throughput * emission;
|
||||
guiding_record_volume_emission(kg, state, emission);
|
||||
}
|
||||
}
|
||||
|
||||
if (closure_flag & SD_SCATTER) {
|
||||
if (runtime_flag & SR_SCATTER) {
|
||||
# ifdef __DENOISING_FEATURES__
|
||||
/* Accumulate albedo for denoising features. */
|
||||
if (write_denoising_features && (closure_flag & SD_SCATTER)) {
|
||||
if (write_denoising_features && (runtime_flag & SR_SCATTER)) {
|
||||
const Spectrum albedo = safe_divide_color(coeff.sigma_s, coeff.sigma_t);
|
||||
accum_albedo += result.indirect_throughput * albedo * (one_spectrum() - transmittance);
|
||||
}
|
||||
|
|
@ -2387,7 +2388,7 @@ ccl_device_forceinline void volume_integrate_ray_marching(
|
|||
volume_ray_marching_step_scattering(
|
||||
sd, ray, equiangular_coeffs, coeff, transmittance, vstep.t, vstate, result);
|
||||
}
|
||||
else if (closure_flag & SD_EXTINCTION) {
|
||||
else if (runtime_flag & SR_EXTINCTION) {
|
||||
/* Absorption only. */
|
||||
result.indirect_throughput *= transmittance;
|
||||
result.direct_throughput *= transmittance;
|
||||
|
|
@ -2446,10 +2447,18 @@ ccl_device_forceinline void integrate_volume_direct_light(
|
|||
const float3 rand_light = path_state_rng_3D(kg, rng_state, PRNG_LIGHT);
|
||||
const float3 N = zero_float3();
|
||||
const int object_receiver = light_link_receiver_nee(kg, sd);
|
||||
const int shader_flags = SD_BSDF_HAS_TRANSMISSION;
|
||||
const int runtime_flags = SR_BSDF_HAS_TRANSMISSION;
|
||||
|
||||
if (!light_sample<false>(
|
||||
kg, rand_light, sd->time, P, N, object_receiver, shader_flags, bounce, path_flag, &ls))
|
||||
if (!light_sample<false>(kg,
|
||||
rand_light,
|
||||
sd->time,
|
||||
P,
|
||||
N,
|
||||
object_receiver,
|
||||
runtime_flags,
|
||||
bounce,
|
||||
path_flag,
|
||||
&ls))
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
|
@ -2681,7 +2690,7 @@ ccl_device_forceinline bool integrate_volume_phase_scatter(
|
|||
}
|
||||
# endif
|
||||
|
||||
path_state_next(kg, state, label, sd->flag);
|
||||
path_state_next(kg, state, label, sd->runtime_flag);
|
||||
return true;
|
||||
}
|
||||
|
||||
|
|
@ -2862,7 +2871,7 @@ ccl_device VolumeIntegrateEvent volume_integrate(KernelGlobals kg,
|
|||
VolumeIntegrateResult result = {};
|
||||
volume_integrate_null_scattering(kg, state, ray, &sd, &rng_state, render_buffer, &ls, result);
|
||||
|
||||
if (sd.flag & SD_CACHE_MISS) {
|
||||
if (sd.runtime_flag & SR_CACHE_MISS) {
|
||||
return VOLUME_PATH_CACHE_MISS;
|
||||
}
|
||||
|
||||
|
|
@ -2903,7 +2912,7 @@ volume_integrate_ray_marching(KernelGlobals kg,
|
|||
volume_integrate_ray_marching(
|
||||
kg, state, ray, &sd, &rng_state, render_buffer, step_size, &ls, result);
|
||||
|
||||
if (sd.flag & SD_CACHE_MISS) {
|
||||
if (sd.runtime_flag & SR_CACHE_MISS) {
|
||||
return VOLUME_PATH_CACHE_MISS;
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -123,7 +123,7 @@ ccl_device int subsurface_bounce(KernelGlobals kg,
|
|||
INTEGRATOR_STATE_WRITE(state, subsurface, N) = sd->N;
|
||||
}
|
||||
|
||||
if (sd->flag & SD_BACKFACING) {
|
||||
if (sd->runtime_flag & SR_BACKFACING) {
|
||||
path_flag |= PATH_RAY_SUBSURFACE_BACKFACING;
|
||||
}
|
||||
|
||||
|
|
@ -156,12 +156,12 @@ ccl_device void subsurface_shader_data_setup(KernelGlobals kg, ccl_private Shade
|
|||
{
|
||||
/* Get bump mapped normal from shader evaluation at exit point. */
|
||||
float3 N = sd->N;
|
||||
if (sd->flag & SD_HAS_BSSRDF_BUMP) {
|
||||
if (sd->shader_flag & SD_HAS_BSSRDF_BUMP) {
|
||||
N = surface_shader_bssrdf_normal(sd);
|
||||
}
|
||||
|
||||
/* Setup diffuse BSDF at the exit point. This replaces shader_eval_surface. */
|
||||
sd->flag &= ~SD_CLOSURE_FLAGS;
|
||||
sd->runtime_flag = 0;
|
||||
sd->num_closure = 0;
|
||||
sd->num_closure_left = kernel_data.max_closures;
|
||||
|
||||
|
|
|
|||
|
|
@ -54,7 +54,7 @@ ccl_device_inline void surface_shader_prepare_guiding(KernelGlobals kg,
|
|||
const ccl_private RNGState *rng_state)
|
||||
{
|
||||
/* Have any BSDF to guide? */
|
||||
if (!(kernel_data.integrator.use_surface_guiding && (sd->flag & SD_BSDF_HAS_EVAL))) {
|
||||
if (!(kernel_data.integrator.use_surface_guiding && (sd->runtime_flag & SR_BSDF_HAS_EVAL))) {
|
||||
INTEGRATOR_STATE_WRITE(state, guiding, use_surface_guiding) = false;
|
||||
return;
|
||||
}
|
||||
|
|
@ -153,7 +153,7 @@ ccl_device_inline void surface_shader_prepare_closures(KernelGlobals kg,
|
|||
|
||||
if (path_visibility & PATH_RAY_VISIBILITY_CAMERA) {
|
||||
if (filter_closures & FILTER_CLOSURE_DIRECT_LIGHT) {
|
||||
sd->flag &= ~SD_BSDF_HAS_EVAL;
|
||||
sd->runtime_flag &= ~SR_BSDF_HAS_EVAL;
|
||||
}
|
||||
|
||||
for (int i = 0; i < sd->num_closure; i++) {
|
||||
|
|
@ -176,7 +176,7 @@ ccl_device_inline void surface_shader_prepare_closures(KernelGlobals kg,
|
|||
{
|
||||
sc->type = CLOSURE_HOLDOUT_ID;
|
||||
sc->sample_weight = 0.0f;
|
||||
sd->flag |= SD_HOLDOUT;
|
||||
sd->runtime_flag |= SR_HOLDOUT;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
@ -208,7 +208,7 @@ ccl_device_inline void surface_shader_prepare_closures(KernelGlobals kg,
|
|||
/* NOTE: this is a sufficient condition. If `blur_roughness < THRESH < original_roughness`
|
||||
* then the flag was already set. */
|
||||
if (!roughness_is_almost_specular(blur_roughness, blur_roughness)) {
|
||||
sd->flag |= SD_BSDF_HAS_EVAL;
|
||||
sd->runtime_flag |= SR_BSDF_HAS_EVAL;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
@ -1046,10 +1046,10 @@ ccl_device float surface_shader_average_roughness(const ccl_private ShaderData *
|
|||
|
||||
ccl_device Spectrum surface_shader_transparency(const ccl_private ShaderData *sd)
|
||||
{
|
||||
if (sd->flag & SD_HAS_ONLY_VOLUME) {
|
||||
if (sd->shader_flag & SD_HAS_ONLY_VOLUME) {
|
||||
return one_spectrum();
|
||||
}
|
||||
if (sd->flag & (SD_TRANSPARENT | SD_RAY_PORTAL)) {
|
||||
if (sd->runtime_flag & (SR_TRANSPARENT | SR_RAY_PORTAL)) {
|
||||
return sd->closure_transparent_extinction;
|
||||
}
|
||||
return zero_spectrum();
|
||||
|
|
@ -1190,7 +1190,7 @@ ccl_device bool surface_shader_constant_emission(KernelGlobals kg,
|
|||
|
||||
ccl_device Spectrum surface_shader_background(const ccl_private ShaderData *sd)
|
||||
{
|
||||
if (sd->flag & SD_EMISSION) {
|
||||
if (sd->runtime_flag & SR_EMISSION) {
|
||||
return sd->closure_emission_background;
|
||||
}
|
||||
return zero_spectrum();
|
||||
|
|
@ -1200,7 +1200,7 @@ ccl_device Spectrum surface_shader_background(const ccl_private ShaderData *sd)
|
|||
|
||||
ccl_device Spectrum surface_shader_emission(const ccl_private ShaderData *sd)
|
||||
{
|
||||
if (sd->flag & SD_EMISSION) {
|
||||
if (sd->runtime_flag & SR_EMISSION) {
|
||||
return emissive_simple_eval(sd->Ng, sd->wi) * sd->closure_emission_background;
|
||||
}
|
||||
return zero_spectrum();
|
||||
|
|
@ -1215,7 +1215,7 @@ ccl_device Spectrum surface_shader_apply_holdout(ccl_private ShaderData *sd)
|
|||
/* For objects marked as holdout, preserve transparency and remove all other
|
||||
* closures, replacing them with a holdout weight. */
|
||||
if (sd->object_flag & SD_OBJECT_HOLDOUT_MASK) {
|
||||
if ((sd->flag & SD_TRANSPARENT) && !(sd->flag & SD_HAS_ONLY_VOLUME)) {
|
||||
if ((sd->runtime_flag & SR_TRANSPARENT) && !(sd->shader_flag & SD_HAS_ONLY_VOLUME)) {
|
||||
weight = one_spectrum() - sd->closure_transparent_extinction;
|
||||
|
||||
for (int i = 0; i < sd->num_closure; i++) {
|
||||
|
|
@ -1225,7 +1225,7 @@ ccl_device Spectrum surface_shader_apply_holdout(ccl_private ShaderData *sd)
|
|||
}
|
||||
}
|
||||
|
||||
sd->flag &= ~(SD_CLOSURE_FLAGS - (SD_TRANSPARENT | SD_BSDF));
|
||||
sd->runtime_flag &= (SR_TRANSPARENT | SR_BSDF);
|
||||
}
|
||||
else {
|
||||
weight = one_spectrum();
|
||||
|
|
@ -1287,7 +1287,7 @@ ccl_device void surface_shader_eval(KernelGlobals kg,
|
|||
#else
|
||||
if (sd->object == OBJECT_NONE) {
|
||||
sd->closure_emission_background = make_spectrum(0.8f);
|
||||
sd->flag |= SD_EMISSION;
|
||||
sd->runtime_flag |= SR_EMISSION;
|
||||
}
|
||||
else {
|
||||
bsdf_diffuse_setup(sd, sd->N, make_spectrum(0.8f));
|
||||
|
|
|
|||
|
|
@ -410,8 +410,8 @@ ccl_device_inline void volume_shader_motion_blur(KernelGlobals kg,
|
|||
*/
|
||||
|
||||
/* Always use linear interpolation for velocity. */
|
||||
const int cubic_flag = sd->flag & SD_VOLUME_CUBIC;
|
||||
sd->flag &= ~SD_VOLUME_CUBIC;
|
||||
const int cubic_flag = sd->shader_flag & SD_VOLUME_CUBIC;
|
||||
sd->shader_flag &= ~SD_VOLUME_CUBIC;
|
||||
|
||||
/* Find velocity. */
|
||||
float3 velocity = primitive_volume_attribute<float3>(kg, sd, v_desc, false);
|
||||
|
|
@ -428,7 +428,7 @@ ccl_device_inline void volume_shader_motion_blur(KernelGlobals kg,
|
|||
sd->P = P - (time - time_offset) * velocity_scale * velocity;
|
||||
|
||||
/* Restore flag. */
|
||||
sd->flag |= cubic_flag;
|
||||
sd->shader_flag |= cubic_flag;
|
||||
}
|
||||
# endif
|
||||
|
||||
|
|
@ -451,8 +451,7 @@ ccl_device_inline bool volume_shader_eval_entry(KernelGlobals kg,
|
|||
sd->object = entry.object;
|
||||
sd->shader = entry.shader;
|
||||
|
||||
sd->flag &= ~SD_SHADER_FLAGS;
|
||||
sd->flag |= kernel_data_fetch(shaders, (sd->shader & SHADER_MASK)).flags;
|
||||
sd->shader_flag = kernel_data_fetch(shaders, (sd->shader & SHADER_MASK)).flags;
|
||||
sd->object_flag &= ~SD_OBJECT_FLAGS;
|
||||
|
||||
if (sd->object != OBJECT_NONE) {
|
||||
|
|
@ -516,7 +515,8 @@ ccl_device_inline void volume_shader_eval(KernelGlobals kg,
|
|||
* for all volumes in the stack into a single array of closures */
|
||||
sd->num_closure = 0;
|
||||
sd->num_closure_left = max_closures;
|
||||
sd->flag = SD_IS_VOLUME_SHADER_EVAL | (sd->flag & SD_CACHE_MISS);
|
||||
sd->shader_flag = 0;
|
||||
sd->runtime_flag = SR_IS_VOLUME_SHADER_EVAL | (sd->runtime_flag & SR_CACHE_MISS);
|
||||
sd->object_flag = 0;
|
||||
|
||||
for (int i = 0;; i++) {
|
||||
|
|
|
|||
|
|
@ -82,11 +82,11 @@ ccl_device void volume_stack_enter_exit(KernelGlobals kg,
|
|||
/* todo: we should have some way for objects to indicate if they want the
|
||||
* world shader to work inside them. excluding it by default is problematic
|
||||
* because non-volume objects can't be assumed to be closed manifolds */
|
||||
if (!(sd->flag & SD_HAS_VOLUME)) {
|
||||
if (!(sd->shader_flag & SD_HAS_VOLUME)) {
|
||||
return;
|
||||
}
|
||||
|
||||
if (sd->flag & SD_BACKFACING) {
|
||||
if (sd->runtime_flag & SR_BACKFACING) {
|
||||
/* Exit volume object: remove from stack. */
|
||||
for (int i = 0;; i++) {
|
||||
const VolumeStack entry = volume_stack_read<shadow>(state, i);
|
||||
|
|
|
|||
|
|
@ -85,7 +85,7 @@ ccl_device_inline bool light_sample(KernelGlobals kg,
|
|||
const float2 rand,
|
||||
const float3 P,
|
||||
const float3 N,
|
||||
const int shader_flags,
|
||||
const int runtime_flags,
|
||||
const uint32_t path_flag,
|
||||
ccl_private LightSample *ls)
|
||||
{
|
||||
|
|
@ -132,12 +132,12 @@ ccl_device_inline bool light_sample(KernelGlobals kg,
|
|||
ls->eval_fac = 1.0f;
|
||||
}
|
||||
else if (type == LIGHT_SPOT) {
|
||||
if (!spot_light_sample<in_volume_segment>(kg, klight, rand, P, N, shader_flags, ls)) {
|
||||
if (!spot_light_sample<in_volume_segment>(kg, klight, rand, P, N, runtime_flags, ls)) {
|
||||
return false;
|
||||
}
|
||||
}
|
||||
else if (type == LIGHT_POINT) {
|
||||
if (!point_light_sample(klight, rand, P, N, shader_flags, ls)) {
|
||||
if (!point_light_sample(klight, rand, P, N, runtime_flags, ls)) {
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
|
@ -160,7 +160,7 @@ ccl_device bool light_sample(KernelGlobals kg,
|
|||
const float3 P,
|
||||
const float3 N,
|
||||
const int object_receiver,
|
||||
const int shader_flags,
|
||||
const int runtime_flags,
|
||||
const int bounce,
|
||||
const uint32_t path_flag,
|
||||
ccl_private LightSample *ls)
|
||||
|
|
@ -216,7 +216,7 @@ ccl_device bool light_sample(KernelGlobals kg,
|
|||
return false;
|
||||
}
|
||||
|
||||
if (!light_sample<in_volume_segment>(kg, light, rand, P, N, shader_flags, path_flag, ls)) {
|
||||
if (!light_sample<in_volume_segment>(kg, light, rand, P, N, runtime_flags, path_flag, ls)) {
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -19,7 +19,7 @@ ccl_device_inline bool point_light_sample(const ccl_global KernelLight *klight,
|
|||
const float2 rand,
|
||||
const float3 P,
|
||||
const float3 N,
|
||||
const int shader_flags,
|
||||
const int runtime_flags,
|
||||
ccl_private LightSample *ls)
|
||||
{
|
||||
const float r_sq = sqr(klight->spot.radius);
|
||||
|
|
@ -41,7 +41,7 @@ ccl_device_inline bool point_light_sample(const ccl_global KernelLight *klight,
|
|||
}
|
||||
else {
|
||||
/* Inside sphere. */
|
||||
const bool has_transmission = (shader_flags & SD_BSDF_HAS_TRANSMISSION);
|
||||
const bool has_transmission = (runtime_flags & SR_BSDF_HAS_TRANSMISSION);
|
||||
if (has_transmission) {
|
||||
ls->D = sample_uniform_sphere(rand);
|
||||
ls->pdf = M_1_2PI_F * 0.5f;
|
||||
|
|
|
|||
|
|
@ -91,7 +91,7 @@ light_sample_shader_eval_forward(KernelGlobals kg,
|
|||
* weak but we'd have to do multiple evaluations otherwise. */
|
||||
surface_shader_eval<KERNEL_FEATURE_NODE_MASK_SURFACE_LIGHT>(
|
||||
kg, state, emission_sd, nullptr, PATH_RAY_VISIBILITY_NONE, PATH_RAY_EMISSION);
|
||||
if (emission_sd->flag & SD_CACHE_MISS) {
|
||||
if (emission_sd->runtime_flag & SR_CACHE_MISS) {
|
||||
return SHADER_EVAL_CACHE_MISS;
|
||||
}
|
||||
|
||||
|
|
@ -379,11 +379,11 @@ ccl_device_inline bool light_sample_from_volume_segment(KernelGlobals kg,
|
|||
const uint32_t path_flag,
|
||||
ccl_private LightSample *ls)
|
||||
{
|
||||
const int shader_flags = SD_BSDF_HAS_TRANSMISSION;
|
||||
const int runtime_flags = SR_BSDF_HAS_TRANSMISSION;
|
||||
|
||||
#ifdef __LIGHT_TREE__
|
||||
if (kernel_data.integrator.use_light_tree) {
|
||||
if (!light_tree_sample<true>(kg, rand.z, P, D, t, object_receiver, shader_flags, ls)) {
|
||||
if (!light_tree_sample<true>(kg, rand.z, P, D, t, object_receiver, runtime_flags, ls)) {
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
|
@ -397,7 +397,7 @@ ccl_device_inline bool light_sample_from_volume_segment(KernelGlobals kg,
|
|||
|
||||
/* Sample position on the selected light. */
|
||||
return light_sample<true>(
|
||||
kg, rand, time, P, D, object_receiver, shader_flags, bounce, path_flag, ls);
|
||||
kg, rand, time, P, D, object_receiver, runtime_flags, bounce, path_flag, ls);
|
||||
}
|
||||
|
||||
ccl_device bool light_sample_from_position(KernelGlobals kg,
|
||||
|
|
@ -406,7 +406,7 @@ ccl_device bool light_sample_from_position(KernelGlobals kg,
|
|||
const float3 P,
|
||||
const float3 N,
|
||||
const int object_receiver,
|
||||
const int shader_flags,
|
||||
const int runtime_flags,
|
||||
const int bounce,
|
||||
const uint32_t path_flag,
|
||||
ccl_private LightSample *ls)
|
||||
|
|
@ -414,7 +414,7 @@ ccl_device bool light_sample_from_position(KernelGlobals kg,
|
|||
/* Randomly select a light. */
|
||||
#ifdef __LIGHT_TREE__
|
||||
if (kernel_data.integrator.use_light_tree) {
|
||||
if (!light_tree_sample<false>(kg, rand.z, P, N, 0.0f, object_receiver, shader_flags, ls)) {
|
||||
if (!light_tree_sample<false>(kg, rand.z, P, N, 0.0f, object_receiver, runtime_flags, ls)) {
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
|
@ -428,7 +428,7 @@ ccl_device bool light_sample_from_position(KernelGlobals kg,
|
|||
|
||||
/* Sample position on the selected light. */
|
||||
return light_sample<false>(
|
||||
kg, rand, time, P, N, object_receiver, shader_flags, bounce, path_flag, ls);
|
||||
kg, rand, time, P, N, object_receiver, runtime_flags, bounce, path_flag, ls);
|
||||
}
|
||||
|
||||
/* Update light sample with new shading point position for MNEE. The position on the light is fixed
|
||||
|
|
@ -474,7 +474,8 @@ ccl_device_inline float light_sample_mis_weight_forward_surface(
|
|||
const ccl_private ShaderData *sd)
|
||||
{
|
||||
bool has_mis = !(path_flag & PATH_RAY_MIS_SKIP) &&
|
||||
(sd->flag & ((sd->flag & SD_BACKFACING) ? SD_MIS_BACK : SD_MIS_FRONT));
|
||||
(sd->shader_flag &
|
||||
((sd->runtime_flag & SR_BACKFACING) ? SD_MIS_BACK : SD_MIS_FRONT));
|
||||
|
||||
#ifdef __HAIR__
|
||||
has_mis &= (sd->type & PRIMITIVE_TRIANGLE);
|
||||
|
|
|
|||
|
|
@ -45,7 +45,7 @@ ccl_device_inline bool spot_light_sample(KernelGlobals kg,
|
|||
const float2 rand,
|
||||
const float3 P,
|
||||
const float3 N,
|
||||
const int shader_flags,
|
||||
const int runtime_flags,
|
||||
ccl_private LightSample *ls)
|
||||
{
|
||||
const float r_sq = sqr(klight->spot.radius);
|
||||
|
|
@ -85,7 +85,7 @@ ccl_device_inline bool spot_light_sample(KernelGlobals kg,
|
|||
}
|
||||
else {
|
||||
/* Inside sphere. */
|
||||
const bool has_transmission = (shader_flags & SD_BSDF_HAS_TRANSMISSION);
|
||||
const bool has_transmission = (runtime_flags & SR_BSDF_HAS_TRANSMISSION);
|
||||
if (has_transmission) {
|
||||
ls->D = sample_uniform_sphere(rand);
|
||||
ls->pdf = M_1_2PI_F * 0.5f;
|
||||
|
|
|
|||
|
|
@ -746,14 +746,14 @@ ccl_device bool light_tree_sample(KernelGlobals kg,
|
|||
float3 N_or_D,
|
||||
float t,
|
||||
const int object_receiver,
|
||||
const int shader_flags,
|
||||
const int runtime_flags,
|
||||
ccl_private LightSample *ls)
|
||||
{
|
||||
if (!kernel_data.integrator.use_direct_light) {
|
||||
return false;
|
||||
}
|
||||
|
||||
const bool has_transmission = (shader_flags & SD_BSDF_HAS_TRANSMISSION);
|
||||
const bool has_transmission = (runtime_flags & SR_BSDF_HAS_TRANSMISSION);
|
||||
float pdf_leaf = 1.0f;
|
||||
float pdf_selection = 1.0f;
|
||||
int selected_emitter = -1;
|
||||
|
|
|
|||
|
|
@ -135,7 +135,7 @@ void osl_eval_nodes_surface(const ThreadKernelGlobalsCPU *kg,
|
|||
const OSL::Vec3 dPdy = globals->dPdy;
|
||||
|
||||
/* set state as if undisplaced */
|
||||
if (sd->flag & SD_HAS_DISPLACEMENT) {
|
||||
if (sd->shader_flag & SD_HAS_DISPLACEMENT) {
|
||||
const AttributeDescriptor desc = find_attribute(kg, sd, ATTR_STD_POSITION_UNDISPLACED);
|
||||
kernel_assert(is_attribute_found(desc));
|
||||
|
||||
|
|
|
|||
|
|
@ -150,7 +150,7 @@ ccl_device void osl_closure_burley_diffuse_bsdf_setup(
|
|||
|
||||
bsdf->N = safe_normalize_fallback(closure->N, sd->N);
|
||||
|
||||
sd->flag |= bsdf_burley_setup(bsdf, closure->roughness);
|
||||
sd->runtime_flag |= bsdf_burley_setup(bsdf, closure->roughness);
|
||||
}
|
||||
|
||||
ccl_device void osl_closure_translucent_setup(KernelGlobals kg,
|
||||
|
|
@ -207,7 +207,7 @@ ccl_device void osl_closure_reflection_setup(KernelGlobals kg,
|
|||
bsdf->N = maybe_ensure_valid_specular_reflection(sd, safe_normalize_fallback(closure->N, sd->N));
|
||||
bsdf->alpha_x = bsdf->alpha_y = 0.0f;
|
||||
|
||||
sd->flag |= bsdf_microfacet_ggx_setup(bsdf);
|
||||
sd->runtime_flag |= bsdf_microfacet_ggx_setup(bsdf);
|
||||
}
|
||||
|
||||
ccl_device void osl_closure_refraction_setup(KernelGlobals kg,
|
||||
|
|
@ -232,7 +232,7 @@ ccl_device void osl_closure_refraction_setup(KernelGlobals kg,
|
|||
bsdf->ior = closure->ior;
|
||||
bsdf->alpha_x = bsdf->alpha_y = 0.0f;
|
||||
|
||||
sd->flag |= bsdf_microfacet_ggx_refraction_setup(bsdf);
|
||||
sd->runtime_flag |= bsdf_microfacet_ggx_refraction_setup(bsdf);
|
||||
}
|
||||
|
||||
ccl_device void osl_closure_transparent_setup(KernelGlobals /*kg*/,
|
||||
|
|
@ -319,25 +319,25 @@ ccl_device void osl_closure_dielectric_bsdf_setup(KernelGlobals kg,
|
|||
/* Beckmann */
|
||||
if (closure->distribution == make_string("beckmann", 14712237670914973463ull)) {
|
||||
if (has_reflection && has_transmission) {
|
||||
sd->flag |= bsdf_microfacet_beckmann_glass_setup(bsdf);
|
||||
sd->runtime_flag |= bsdf_microfacet_beckmann_glass_setup(bsdf);
|
||||
}
|
||||
else if (has_transmission) {
|
||||
sd->flag |= bsdf_microfacet_beckmann_refraction_setup(bsdf);
|
||||
sd->runtime_flag |= bsdf_microfacet_beckmann_refraction_setup(bsdf);
|
||||
}
|
||||
else {
|
||||
sd->flag |= bsdf_microfacet_beckmann_setup(bsdf);
|
||||
sd->runtime_flag |= bsdf_microfacet_beckmann_setup(bsdf);
|
||||
}
|
||||
}
|
||||
/* GGX (either single- or multi-scattering). */
|
||||
else {
|
||||
if (has_reflection && has_transmission) {
|
||||
sd->flag |= bsdf_microfacet_ggx_glass_setup(bsdf);
|
||||
sd->runtime_flag |= bsdf_microfacet_ggx_glass_setup(bsdf);
|
||||
}
|
||||
else if (has_transmission) {
|
||||
sd->flag |= bsdf_microfacet_ggx_refraction_setup(bsdf);
|
||||
sd->runtime_flag |= bsdf_microfacet_ggx_refraction_setup(bsdf);
|
||||
}
|
||||
else {
|
||||
sd->flag |= bsdf_microfacet_ggx_setup(bsdf);
|
||||
sd->runtime_flag |= bsdf_microfacet_ggx_setup(bsdf);
|
||||
}
|
||||
|
||||
preserve_energy = (closure->distribution == make_string("multi_ggx", 16842698693386468366ull));
|
||||
|
|
@ -393,11 +393,11 @@ ccl_device void osl_closure_conductor_bsdf_setup(KernelGlobals kg,
|
|||
|
||||
/* Beckmann */
|
||||
if (closure->distribution == make_string("beckmann", 14712237670914973463ull)) {
|
||||
sd->flag |= bsdf_microfacet_beckmann_setup(bsdf);
|
||||
sd->runtime_flag |= bsdf_microfacet_beckmann_setup(bsdf);
|
||||
}
|
||||
/* GGX (either single- or multi-scattering) */
|
||||
else {
|
||||
sd->flag |= bsdf_microfacet_ggx_setup(bsdf);
|
||||
sd->runtime_flag |= bsdf_microfacet_ggx_setup(bsdf);
|
||||
preserve_energy = (closure->distribution == make_string("multi_ggx", 16842698693386468366ull));
|
||||
}
|
||||
|
||||
|
|
@ -464,25 +464,25 @@ ccl_device void osl_closure_generalized_schlick_bsdf_setup(
|
|||
/* Beckmann */
|
||||
if (closure->distribution == make_string("beckmann", 14712237670914973463ull)) {
|
||||
if (has_reflection && has_transmission) {
|
||||
sd->flag |= bsdf_microfacet_beckmann_glass_setup(bsdf);
|
||||
sd->runtime_flag |= bsdf_microfacet_beckmann_glass_setup(bsdf);
|
||||
}
|
||||
else if (has_transmission) {
|
||||
sd->flag |= bsdf_microfacet_beckmann_refraction_setup(bsdf);
|
||||
sd->runtime_flag |= bsdf_microfacet_beckmann_refraction_setup(bsdf);
|
||||
}
|
||||
else {
|
||||
sd->flag |= bsdf_microfacet_beckmann_setup(bsdf);
|
||||
sd->runtime_flag |= bsdf_microfacet_beckmann_setup(bsdf);
|
||||
}
|
||||
}
|
||||
/* GGX (either single- or multi-scattering) */
|
||||
else {
|
||||
if (has_reflection && has_transmission) {
|
||||
sd->flag |= bsdf_microfacet_ggx_glass_setup(bsdf);
|
||||
sd->runtime_flag |= bsdf_microfacet_ggx_glass_setup(bsdf);
|
||||
}
|
||||
else if (has_transmission) {
|
||||
sd->flag |= bsdf_microfacet_ggx_refraction_setup(bsdf);
|
||||
sd->runtime_flag |= bsdf_microfacet_ggx_refraction_setup(bsdf);
|
||||
}
|
||||
else {
|
||||
sd->flag |= bsdf_microfacet_ggx_setup(bsdf);
|
||||
sd->runtime_flag |= bsdf_microfacet_ggx_setup(bsdf);
|
||||
}
|
||||
|
||||
preserve_energy = (closure->distribution == make_string("multi_ggx", 16842698693386468366ull));
|
||||
|
|
@ -623,29 +623,29 @@ ccl_device void osl_closure_microfacet_setup(KernelGlobals kg,
|
|||
/* Beckmann */
|
||||
if (closure->distribution == make_string("beckmann", 14712237670914973463ull)) {
|
||||
if (closure->refract == 1) {
|
||||
sd->flag |= bsdf_microfacet_beckmann_refraction_setup(bsdf);
|
||||
sd->runtime_flag |= bsdf_microfacet_beckmann_refraction_setup(bsdf);
|
||||
}
|
||||
else if (closure->refract == 2) {
|
||||
sd->flag |= bsdf_microfacet_beckmann_glass_setup(bsdf);
|
||||
sd->runtime_flag |= bsdf_microfacet_beckmann_glass_setup(bsdf);
|
||||
}
|
||||
else {
|
||||
sd->flag |= bsdf_microfacet_beckmann_setup(bsdf);
|
||||
sd->runtime_flag |= bsdf_microfacet_beckmann_setup(bsdf);
|
||||
}
|
||||
}
|
||||
/* Ashikhmin-Shirley */
|
||||
else if (closure->distribution == make_string("ashikhmin_shirley", 11318482998918370922ull)) {
|
||||
sd->flag |= bsdf_ashikhmin_shirley_setup(bsdf);
|
||||
sd->runtime_flag |= bsdf_ashikhmin_shirley_setup(bsdf);
|
||||
}
|
||||
/* GGX (either single- or multi-scattering) */
|
||||
else {
|
||||
if (closure->refract == 1) {
|
||||
sd->flag |= bsdf_microfacet_ggx_refraction_setup(bsdf);
|
||||
sd->runtime_flag |= bsdf_microfacet_ggx_refraction_setup(bsdf);
|
||||
}
|
||||
else if (closure->refract == 2) {
|
||||
sd->flag |= bsdf_microfacet_ggx_glass_setup(bsdf);
|
||||
sd->runtime_flag |= bsdf_microfacet_ggx_glass_setup(bsdf);
|
||||
}
|
||||
else {
|
||||
sd->flag |= bsdf_microfacet_ggx_setup(bsdf);
|
||||
sd->runtime_flag |= bsdf_microfacet_ggx_setup(bsdf);
|
||||
}
|
||||
|
||||
if (closure->distribution == make_string("multi_ggx", 16842698693386468366ull)) {
|
||||
|
|
@ -701,11 +701,11 @@ ccl_device void osl_closure_microfacet_f82_tint_setup(
|
|||
|
||||
/* Beckmann */
|
||||
if (closure->distribution == make_string("beckmann", 14712237670914973463ull)) {
|
||||
sd->flag |= bsdf_microfacet_beckmann_setup(bsdf);
|
||||
sd->runtime_flag |= bsdf_microfacet_beckmann_setup(bsdf);
|
||||
}
|
||||
/* GGX (either single- or multi-scattering) */
|
||||
else {
|
||||
sd->flag |= bsdf_microfacet_ggx_setup(bsdf);
|
||||
sd->runtime_flag |= bsdf_microfacet_ggx_setup(bsdf);
|
||||
preserve_energy = (closure->distribution == make_string("multi_ggx", 16842698693386468366ull));
|
||||
}
|
||||
|
||||
|
|
@ -746,7 +746,7 @@ ccl_device void osl_closure_microfacet_multi_ggx_glass_setup(
|
|||
|
||||
bsdf->T = zero_float3();
|
||||
|
||||
sd->flag |= bsdf_microfacet_ggx_glass_setup(bsdf);
|
||||
sd->runtime_flag |= bsdf_microfacet_ggx_glass_setup(bsdf);
|
||||
bsdf_microfacet_setup_fresnel_constant(kg, bsdf, sd->wi, rgb_to_spectrum(closure->color));
|
||||
}
|
||||
|
||||
|
|
@ -778,7 +778,7 @@ ccl_device void osl_closure_microfacet_multi_ggx_aniso_setup(
|
|||
|
||||
bsdf->T = closure->T;
|
||||
|
||||
sd->flag |= bsdf_microfacet_ggx_setup(bsdf);
|
||||
sd->runtime_flag |= bsdf_microfacet_ggx_setup(bsdf);
|
||||
bsdf_microfacet_setup_fresnel_constant(kg, bsdf, sd->wi, rgb_to_spectrum(closure->color));
|
||||
|
||||
if (layer_albedo != nullptr) {
|
||||
|
|
@ -810,7 +810,7 @@ ccl_device void osl_closure_ashikhmin_velvet_setup(
|
|||
bsdf->N = maybe_ensure_valid_specular_reflection(sd, safe_normalize_fallback(closure->N, sd->N));
|
||||
bsdf->sigma = closure->sigma;
|
||||
|
||||
sd->flag |= bsdf_ashikhmin_velvet_setup(bsdf);
|
||||
sd->runtime_flag |= bsdf_ashikhmin_velvet_setup(bsdf);
|
||||
}
|
||||
|
||||
/* Sheen */
|
||||
|
|
@ -842,7 +842,7 @@ ccl_device void osl_closure_sheen_setup(KernelGlobals kg,
|
|||
const int sheen_flag = bsdf_sheen_setup(kg, sd, bsdf);
|
||||
|
||||
if (sheen_flag) {
|
||||
sd->flag |= sheen_flag;
|
||||
sd->runtime_flag |= sheen_flag;
|
||||
|
||||
if (layer_albedo != nullptr) {
|
||||
*layer_albedo = bsdf->weight;
|
||||
|
|
@ -877,7 +877,7 @@ ccl_device void osl_closure_sheen_bsdf_setup(KernelGlobals kg,
|
|||
const int sheen_flag = bsdf_sheen_setup(kg, sd, bsdf);
|
||||
|
||||
if (sheen_flag) {
|
||||
sd->flag |= sheen_flag;
|
||||
sd->runtime_flag |= sheen_flag;
|
||||
|
||||
if (layer_albedo != nullptr) {
|
||||
*layer_albedo = bsdf->weight * closure->albedo;
|
||||
|
|
@ -907,7 +907,7 @@ ccl_device void osl_closure_diffuse_toon_setup(KernelGlobals kg,
|
|||
bsdf->size = closure->size;
|
||||
bsdf->smooth = closure->smooth;
|
||||
|
||||
sd->flag |= bsdf_diffuse_toon_setup(bsdf);
|
||||
sd->runtime_flag |= bsdf_diffuse_toon_setup(bsdf);
|
||||
}
|
||||
|
||||
ccl_device void osl_closure_glossy_toon_setup(KernelGlobals kg,
|
||||
|
|
@ -932,7 +932,7 @@ ccl_device void osl_closure_glossy_toon_setup(KernelGlobals kg,
|
|||
bsdf->size = closure->size;
|
||||
bsdf->smooth = closure->smooth;
|
||||
|
||||
sd->flag |= bsdf_glossy_toon_setup(bsdf);
|
||||
sd->runtime_flag |= bsdf_glossy_toon_setup(bsdf);
|
||||
}
|
||||
|
||||
/* Variable cone emissive closure
|
||||
|
|
@ -949,7 +949,7 @@ ccl_device void osl_closure_emission_setup(KernelGlobals kg,
|
|||
const ccl_private GenericEmissiveClosure * /*closure*/,
|
||||
float3 * /*layer_albedo*/)
|
||||
{
|
||||
if (sd->flag & SD_IS_VOLUME_SHADER_EVAL) {
|
||||
if (sd->runtime_flag & SR_IS_VOLUME_SHADER_EVAL) {
|
||||
if ((path_visibility & PATH_RAY_VISIBILITY_SHADOW) || (path_flag & PATH_RAY_EXTINCTION)) {
|
||||
/* Don't need emission for shadows and extinction. */
|
||||
return;
|
||||
|
|
@ -990,7 +990,7 @@ ccl_device void osl_closure_uniform_edf_setup(KernelGlobals kg,
|
|||
float3 * /*layer_albedo*/)
|
||||
{
|
||||
weight *= closure->emittance;
|
||||
if (sd->flag & SD_IS_VOLUME_SHADER_EVAL) {
|
||||
if (sd->runtime_flag & SR_IS_VOLUME_SHADER_EVAL) {
|
||||
if ((path_visibility & PATH_RAY_VISIBILITY_SHADOW) || (path_flag & PATH_RAY_EXTINCTION)) {
|
||||
/* Don't need emission for shadows and extinction. */
|
||||
return;
|
||||
|
|
@ -1014,7 +1014,7 @@ ccl_device void osl_closure_holdout_setup(KernelGlobals /*kg*/,
|
|||
float3 * /*layer_albedo*/)
|
||||
{
|
||||
closure_alloc(sd, sizeof(ShaderClosure), CLOSURE_HOLDOUT_ID, rgb_to_spectrum(weight));
|
||||
sd->flag |= SD_HOLDOUT;
|
||||
sd->runtime_flag |= SR_HOLDOUT;
|
||||
}
|
||||
|
||||
ccl_device void osl_closure_diffuse_ramp_setup(KernelGlobals /*kg*/,
|
||||
|
|
@ -1043,7 +1043,7 @@ ccl_device void osl_closure_diffuse_ramp_setup(KernelGlobals /*kg*/,
|
|||
bsdf->colors[i] = closure->colors[i];
|
||||
}
|
||||
|
||||
sd->flag |= bsdf_diffuse_ramp_setup(bsdf);
|
||||
sd->runtime_flag |= bsdf_diffuse_ramp_setup(bsdf);
|
||||
}
|
||||
|
||||
ccl_device void osl_closure_phong_ramp_setup(KernelGlobals /*kg*/,
|
||||
|
|
@ -1072,7 +1072,7 @@ ccl_device void osl_closure_phong_ramp_setup(KernelGlobals /*kg*/,
|
|||
bsdf->colors[i] = closure->colors[i];
|
||||
}
|
||||
|
||||
sd->flag |= bsdf_phong_ramp_setup(bsdf);
|
||||
sd->runtime_flag |= bsdf_phong_ramp_setup(bsdf);
|
||||
}
|
||||
|
||||
ccl_device void osl_closure_bssrdf_setup(KernelGlobals /*kg*/,
|
||||
|
|
@ -1114,7 +1114,7 @@ ccl_device void osl_closure_bssrdf_setup(KernelGlobals /*kg*/,
|
|||
bssrdf->ior = closure->ior;
|
||||
bssrdf->anisotropy = closure->anisotropy;
|
||||
|
||||
sd->flag |= bssrdf_setup(sd, bssrdf, path_flag, type);
|
||||
sd->runtime_flag |= bssrdf_setup(sd, bssrdf, path_flag, type);
|
||||
}
|
||||
|
||||
/* MaterialX-compatible subsurface_bssrdf */
|
||||
|
|
@ -1145,7 +1145,7 @@ ccl_device void osl_closure_subsurface_bssrdf_setup(
|
|||
bssrdf->ior = 1.4f;
|
||||
bssrdf->anisotropy = closure->anisotropy;
|
||||
|
||||
sd->flag |= bssrdf_setup(sd, bssrdf, path_flag, CLOSURE_BSSRDF_RANDOM_WALK_ID);
|
||||
sd->runtime_flag |= bssrdf_setup(sd, bssrdf, path_flag, CLOSURE_BSSRDF_RANDOM_WALK_ID);
|
||||
}
|
||||
|
||||
/* Hair */
|
||||
|
|
@ -1174,7 +1174,7 @@ ccl_device void osl_closure_hair_reflection_setup(KernelGlobals kg,
|
|||
bsdf->roughness2 = closure->roughness2;
|
||||
bsdf->offset = closure->offset;
|
||||
|
||||
sd->flag |= bsdf_hair_reflection_setup(bsdf);
|
||||
sd->runtime_flag |= bsdf_hair_reflection_setup(bsdf);
|
||||
}
|
||||
|
||||
ccl_device void osl_closure_hair_transmission_setup(
|
||||
|
|
@ -1202,7 +1202,7 @@ ccl_device void osl_closure_hair_transmission_setup(
|
|||
bsdf->roughness2 = closure->roughness2;
|
||||
bsdf->offset = closure->offset;
|
||||
|
||||
sd->flag |= bsdf_hair_transmission_setup(bsdf);
|
||||
sd->runtime_flag |= bsdf_hair_transmission_setup(bsdf);
|
||||
}
|
||||
|
||||
ccl_device void osl_closure_hair_chiang_setup(KernelGlobals kg,
|
||||
|
|
@ -1232,7 +1232,7 @@ ccl_device void osl_closure_hair_chiang_setup(KernelGlobals kg,
|
|||
bsdf->eta = closure->eta;
|
||||
bsdf->m0_roughness = closure->m0_roughness;
|
||||
|
||||
sd->flag |= bsdf_hair_chiang_setup(sd, bsdf);
|
||||
sd->runtime_flag |= bsdf_hair_chiang_setup(sd, bsdf);
|
||||
#endif
|
||||
}
|
||||
|
||||
|
|
@ -1294,7 +1294,7 @@ ccl_device void osl_closure_hair_huang_setup(KernelGlobals kg,
|
|||
bsdf->extra->pixel_coverage = 0.5f * sd->dP / radius;
|
||||
}
|
||||
|
||||
sd->flag |= bsdf_hair_huang_setup(sd, bsdf, path_flag);
|
||||
sd->runtime_flag |= bsdf_hair_huang_setup(sd, bsdf, path_flag);
|
||||
#endif
|
||||
}
|
||||
|
||||
|
|
@ -1332,7 +1332,7 @@ ccl_device void osl_closure_henyey_greenstein_setup(
|
|||
|
||||
volume->g = closure->g;
|
||||
|
||||
sd->flag |= volume_henyey_greenstein_setup(volume);
|
||||
sd->runtime_flag |= volume_henyey_greenstein_setup(volume);
|
||||
}
|
||||
|
||||
ccl_device void osl_closure_fournier_forand_setup(
|
||||
|
|
@ -1352,7 +1352,7 @@ ccl_device void osl_closure_fournier_forand_setup(
|
|||
return;
|
||||
}
|
||||
|
||||
sd->flag |= volume_fournier_forand_setup(volume, closure->B, closure->IOR);
|
||||
sd->runtime_flag |= volume_fournier_forand_setup(volume, closure->B, closure->IOR);
|
||||
}
|
||||
|
||||
ccl_device void osl_closure_draine_setup(KernelGlobals /*kg*/,
|
||||
|
|
@ -1374,7 +1374,7 @@ ccl_device void osl_closure_draine_setup(KernelGlobals /*kg*/,
|
|||
volume->g = closure->g;
|
||||
volume->alpha = closure->alpha;
|
||||
|
||||
sd->flag |= volume_draine_setup(volume);
|
||||
sd->runtime_flag |= volume_draine_setup(volume);
|
||||
}
|
||||
|
||||
ccl_device void osl_closure_rayleigh_setup(KernelGlobals /*kg*/,
|
||||
|
|
@ -1393,7 +1393,7 @@ ccl_device void osl_closure_rayleigh_setup(KernelGlobals /*kg*/,
|
|||
return;
|
||||
}
|
||||
|
||||
sd->flag |= volume_rayleigh_setup(volume);
|
||||
sd->runtime_flag |= volume_rayleigh_setup(volume);
|
||||
}
|
||||
|
||||
ccl_device void osl_closure_anisotropic_vdf_setup(KernelGlobals kg,
|
||||
|
|
@ -1404,7 +1404,7 @@ ccl_device void osl_closure_anisotropic_vdf_setup(KernelGlobals kg,
|
|||
const ccl_private AnisotropicVDFClosure *closure,
|
||||
float3 * /*layer_albedo*/)
|
||||
{
|
||||
if (!(sd->flag & SD_IS_VOLUME_SHADER_EVAL)) {
|
||||
if (!(sd->runtime_flag & SR_IS_VOLUME_SHADER_EVAL)) {
|
||||
return;
|
||||
}
|
||||
|
||||
|
|
@ -1419,7 +1419,7 @@ ccl_device void osl_closure_anisotropic_vdf_setup(KernelGlobals kg,
|
|||
|
||||
volume->g = closure->anisotropy;
|
||||
|
||||
sd->flag |= volume_henyey_greenstein_setup(volume);
|
||||
sd->runtime_flag |= volume_henyey_greenstein_setup(volume);
|
||||
}
|
||||
|
||||
CCL_NAMESPACE_END
|
||||
|
|
|
|||
|
|
@ -54,7 +54,7 @@ ccl_device_inline void shaderdata_to_shaderglobals(ccl_private ShaderData *sd,
|
|||
globals->surfacearea = 1.0f;
|
||||
globals->raytype = OSL_RAYTYPE_PACK(path_visibility, path_flag);
|
||||
globals->flipHandedness = 0;
|
||||
globals->backfacing = (sd->flag & SD_BACKFACING);
|
||||
globals->backfacing = (sd->runtime_flag & SR_BACKFACING);
|
||||
|
||||
/* shader data to be used in services callbacks */
|
||||
globals->sd = sd;
|
||||
|
|
@ -214,7 +214,7 @@ ccl_device_inline void osl_eval_nodes(KernelGlobals kg,
|
|||
/* For surface shaders, we might have an automatic bump shader that needs to be executed before
|
||||
* the main shader to update globals.N. */
|
||||
if constexpr (type == SHADER_TYPE_SURFACE) {
|
||||
if (sd->flag & SD_HAS_BUMP_FROM_DISPLACEMENT) {
|
||||
if (sd->shader_flag & SD_HAS_BUMP_FROM_DISPLACEMENT) {
|
||||
/* Save state. */
|
||||
const float3 P = sd->P;
|
||||
const float dP = sd->dP;
|
||||
|
|
@ -222,7 +222,7 @@ ccl_device_inline void osl_eval_nodes(KernelGlobals kg,
|
|||
const packed_float3 dPdy = globals.dPdy;
|
||||
|
||||
/* Set position state as if undisplaced. */
|
||||
if (sd->flag & SD_HAS_DISPLACEMENT) {
|
||||
if (sd->shader_flag & SD_HAS_DISPLACEMENT) {
|
||||
const AttributeDescriptor desc = find_attribute(kg, sd, ATTR_STD_POSITION_UNDISPLACED);
|
||||
kernel_assert(is_attribute_found(desc));
|
||||
|
||||
|
|
|
|||
|
|
@ -531,7 +531,7 @@ ccl_device bool attribute_bump_map_normal(KernelGlobals kg,
|
|||
return false;
|
||||
}
|
||||
|
||||
const bool backfacing = (sd->flag & SD_BACKFACING);
|
||||
const bool backfacing = (sd->runtime_flag & SR_BACKFACING);
|
||||
|
||||
/* Fallback when the smooth normal is zero. */
|
||||
float3 Ng = backfacing ? -sd->Ng : sd->Ng;
|
||||
|
|
|
|||
|
|
@ -31,7 +31,7 @@ ccl_device void svm_node_aov_color(KernelGlobals kg,
|
|||
IF_KERNEL_NODES_FEATURE(AOV)
|
||||
{
|
||||
/* Don't write AOV on texture cache miss, we'll try again when the texture exists. */
|
||||
if (sd->flag & SD_CACHE_MISS) {
|
||||
if (sd->runtime_flag & SR_CACHE_MISS) {
|
||||
return;
|
||||
}
|
||||
|
||||
|
|
@ -51,7 +51,7 @@ ccl_device void svm_node_aov_value(KernelGlobals kg,
|
|||
IF_KERNEL_NODES_FEATURE(AOV)
|
||||
{
|
||||
/* Don't write AOV on texture cache miss, we'll try again when the texture exists. */
|
||||
if (sd->flag & SD_CACHE_MISS) {
|
||||
if (sd->runtime_flag & SR_CACHE_MISS) {
|
||||
return;
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -287,7 +287,7 @@ ccl_device float3 svm_bevel(
|
|||
|
||||
/* Normalize. */
|
||||
const float3 N = safe_normalize(sum_N);
|
||||
return is_zero(N) ? sd->N : (sd->flag & SD_BACKFACING) ? -N : N;
|
||||
return is_zero(N) ? sd->N : (sd->runtime_flag & SR_BACKFACING) ? -N : N;
|
||||
}
|
||||
|
||||
template<uint node_feature_mask, typename ConstIntegratorGenericState>
|
||||
|
|
|
|||
|
|
@ -133,7 +133,7 @@ principled_bsdf_emission(KernelGlobals kg,
|
|||
const int sheen_flag = bsdf_sheen_setup(kg, sd, bsdf);
|
||||
|
||||
if (sheen_flag) {
|
||||
sd->flag |= sheen_flag;
|
||||
sd->runtime_flag |= sheen_flag;
|
||||
|
||||
/* Attenuate lower layers */
|
||||
const Spectrum albedo = bsdf_albedo(
|
||||
|
|
@ -165,7 +165,7 @@ principled_bsdf_emission(KernelGlobals kg,
|
|||
bsdf->alpha_x = bsdf->alpha_y = sqr(coat_roughness);
|
||||
|
||||
/* setup bsdf */
|
||||
sd->flag |= bsdf_microfacet_ggx_setup(bsdf);
|
||||
sd->runtime_flag |= bsdf_microfacet_ggx_setup(bsdf);
|
||||
bsdf_microfacet_setup_fresnel_dielectric(kg, bsdf, sd->wi);
|
||||
|
||||
/* Attenuate lower layers */
|
||||
|
|
@ -342,7 +342,7 @@ ccl_device
|
|||
fresnel->thin_film.ior = thinfilm_ior;
|
||||
|
||||
/* setup bsdf */
|
||||
sd->flag |= bsdf_microfacet_ggx_setup(bsdf);
|
||||
sd->runtime_flag |= bsdf_microfacet_ggx_setup(bsdf);
|
||||
const bool is_multiggx = (distribution == CLOSURE_BSDF_MICROFACET_MULTI_GGX_GLASS_ID);
|
||||
bsdf_microfacet_setup_fresnel_f82_tint(kg, bsdf, sd->wi, fresnel, f82, is_multiggx);
|
||||
}
|
||||
|
|
@ -392,7 +392,7 @@ ccl_device
|
|||
nullptr;
|
||||
|
||||
if (bsdf && fresnel) {
|
||||
const bool backfacing = (sd->flag & SD_BACKFACING);
|
||||
const bool backfacing = (sd->runtime_flag & SR_BACKFACING);
|
||||
bsdf->N = valid_reflection_N;
|
||||
bsdf->T = zero_float3();
|
||||
|
||||
|
|
@ -410,7 +410,7 @@ ccl_device
|
|||
thinfilm);
|
||||
|
||||
/* setup bsdf */
|
||||
sd->flag |= bsdf_microfacet_ggx_glass_setup(bsdf);
|
||||
sd->runtime_flag |= bsdf_microfacet_ggx_glass_setup(bsdf);
|
||||
const bool is_multiggx = (distribution ==
|
||||
CLOSURE_BSDF_MICROFACET_MULTI_GGX_GLASS_ID);
|
||||
bsdf_microfacet_setup_fresnel_generalized_schlick(
|
||||
|
|
@ -459,7 +459,7 @@ ccl_device
|
|||
fresnel->thin_film.ior = thinfilm_ior;
|
||||
|
||||
/* setup bsdf */
|
||||
sd->flag |= bsdf_microfacet_ggx_setup(bsdf);
|
||||
sd->runtime_flag |= bsdf_microfacet_ggx_setup(bsdf);
|
||||
const bool is_multiggx = (distribution == CLOSURE_BSDF_MICROFACET_MULTI_GGX_GLASS_ID);
|
||||
bsdf_microfacet_setup_fresnel_generalized_schlick(
|
||||
kg, bsdf, sd->wi, fresnel, is_multiggx);
|
||||
|
|
@ -503,7 +503,7 @@ ccl_device
|
|||
}
|
||||
|
||||
/* setup bsdf */
|
||||
sd->flag |= bssrdf_setup(sd, bssrdf, path_flag, subsurface_method);
|
||||
sd->runtime_flag |= bssrdf_setup(sd, bssrdf, path_flag, subsurface_method);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
@ -604,10 +604,10 @@ ccl_device
|
|||
const ClosureType distribution = cdata.distribution;
|
||||
/* Setup BSDF */
|
||||
if (distribution == CLOSURE_BSDF_MICROFACET_BECKMANN_ID) {
|
||||
sd->flag |= bsdf_microfacet_beckmann_setup(bsdf);
|
||||
sd->runtime_flag |= bsdf_microfacet_beckmann_setup(bsdf);
|
||||
}
|
||||
else {
|
||||
sd->flag |= bsdf_microfacet_ggx_setup(bsdf);
|
||||
sd->runtime_flag |= bsdf_microfacet_ggx_setup(bsdf);
|
||||
}
|
||||
|
||||
const bool is_multiggx = (distribution == CLOSURE_BSDF_MICROFACET_MULTI_GGX_ID);
|
||||
|
|
@ -718,13 +718,13 @@ ccl_device
|
|||
|
||||
/* setup bsdf */
|
||||
if (type == CLOSURE_BSDF_MICROFACET_BECKMANN_ID) {
|
||||
sd->flag |= bsdf_microfacet_beckmann_setup(bsdf);
|
||||
sd->runtime_flag |= bsdf_microfacet_beckmann_setup(bsdf);
|
||||
}
|
||||
else if (type == CLOSURE_BSDF_ASHIKHMIN_SHIRLEY_ID) {
|
||||
sd->flag |= bsdf_ashikhmin_shirley_setup(bsdf);
|
||||
sd->runtime_flag |= bsdf_ashikhmin_shirley_setup(bsdf);
|
||||
}
|
||||
else {
|
||||
sd->flag |= bsdf_microfacet_ggx_setup(bsdf);
|
||||
sd->runtime_flag |= bsdf_microfacet_ggx_setup(bsdf);
|
||||
if (type == CLOSURE_BSDF_MICROFACET_MULTI_GGX_ID) {
|
||||
const Spectrum color = max(rgb_to_spectrum(stack_load(stack, bsdf_data.color)),
|
||||
zero_spectrum());
|
||||
|
|
@ -758,7 +758,7 @@ ccl_device
|
|||
bsdf->T = zero_float3();
|
||||
|
||||
float eta = fmaxf(stack_load(stack, bsdf_data.ior), 1e-5f);
|
||||
eta = (sd->flag & SD_BACKFACING) ? 1.0f / eta : eta;
|
||||
eta = (sd->runtime_flag & SR_BACKFACING) ? 1.0f / eta : eta;
|
||||
|
||||
/* setup bsdf */
|
||||
const float roughness = sqr(stack_load(stack, bsdf_data.roughness));
|
||||
|
|
@ -767,10 +767,10 @@ ccl_device
|
|||
bsdf->ior = eta;
|
||||
|
||||
if (type == CLOSURE_BSDF_MICROFACET_BECKMANN_REFRACTION_ID) {
|
||||
sd->flag |= bsdf_microfacet_beckmann_refraction_setup(bsdf);
|
||||
sd->runtime_flag |= bsdf_microfacet_beckmann_refraction_setup(bsdf);
|
||||
}
|
||||
else {
|
||||
sd->flag |= bsdf_microfacet_ggx_refraction_setup(bsdf);
|
||||
sd->runtime_flag |= bsdf_microfacet_ggx_refraction_setup(bsdf);
|
||||
}
|
||||
}
|
||||
|
||||
|
|
@ -813,7 +813,7 @@ ccl_device
|
|||
bsdf->T = zero_float3();
|
||||
|
||||
const float ior = fmaxf(stack_load(stack, bsdf_data.ior), 1e-5f);
|
||||
bsdf->ior = (sd->flag & SD_BACKFACING) ? 1.0f / ior : ior;
|
||||
bsdf->ior = (sd->runtime_flag & SR_BACKFACING) ? 1.0f / ior : ior;
|
||||
bsdf->alpha_x = bsdf->alpha_y = sqr(saturatef(stack_load(stack, bsdf_data.roughness)));
|
||||
|
||||
fresnel->f0 = make_float3(F0_from_ior(ior));
|
||||
|
|
@ -824,13 +824,14 @@ ccl_device
|
|||
fresnel->transmission_tint = refractive_caustics ? rgb_to_spectrum(color) :
|
||||
zero_spectrum();
|
||||
fresnel->thin_film.thickness = thinfilm_thickness;
|
||||
fresnel->thin_film.ior = (sd->flag & SD_BACKFACING) ? thinfilm_ior / ior : thinfilm_ior;
|
||||
fresnel->thin_film.ior = (sd->runtime_flag & SR_BACKFACING) ? thinfilm_ior / ior :
|
||||
thinfilm_ior;
|
||||
/* setup bsdf */
|
||||
if (type == CLOSURE_BSDF_MICROFACET_BECKMANN_GLASS_ID) {
|
||||
sd->flag |= bsdf_microfacet_beckmann_glass_setup(bsdf);
|
||||
sd->runtime_flag |= bsdf_microfacet_beckmann_glass_setup(bsdf);
|
||||
}
|
||||
else {
|
||||
sd->flag |= bsdf_microfacet_ggx_glass_setup(bsdf);
|
||||
sd->runtime_flag |= bsdf_microfacet_ggx_glass_setup(bsdf);
|
||||
}
|
||||
const bool is_multiggx = (type == CLOSURE_BSDF_MICROFACET_MULTI_GGX_GLASS_ID);
|
||||
bsdf_microfacet_setup_fresnel_generalized_schlick(kg, bsdf, sd->wi, fresnel, is_multiggx);
|
||||
|
|
@ -851,7 +852,7 @@ ccl_device
|
|||
bsdf->N = N;
|
||||
|
||||
bsdf->sigma = saturatef(stack_load(stack, bsdf_data.param1));
|
||||
sd->flag |= bsdf_ashikhmin_velvet_setup(bsdf);
|
||||
sd->runtime_flag |= bsdf_ashikhmin_velvet_setup(bsdf);
|
||||
}
|
||||
break;
|
||||
}
|
||||
|
|
@ -869,7 +870,7 @@ ccl_device
|
|||
bsdf->N = N;
|
||||
bsdf->roughness = saturatef(stack_load(stack, bsdf_data.param1));
|
||||
|
||||
sd->flag |= bsdf_sheen_setup(kg, sd, bsdf);
|
||||
sd->runtime_flag |= bsdf_sheen_setup(kg, sd, bsdf);
|
||||
}
|
||||
break;
|
||||
}
|
||||
|
|
@ -898,10 +899,10 @@ ccl_device
|
|||
bsdf->smooth = stack_load(stack, bsdf_data.smooth);
|
||||
|
||||
if (type == CLOSURE_BSDF_DIFFUSE_TOON_ID) {
|
||||
sd->flag |= bsdf_diffuse_toon_setup(bsdf);
|
||||
sd->runtime_flag |= bsdf_diffuse_toon_setup(bsdf);
|
||||
}
|
||||
else {
|
||||
sd->flag |= bsdf_glossy_toon_setup(bsdf);
|
||||
sd->runtime_flag |= bsdf_glossy_toon_setup(bsdf);
|
||||
}
|
||||
}
|
||||
break;
|
||||
|
|
@ -999,7 +1000,7 @@ ccl_device
|
|||
bsdf->eta = ior;
|
||||
bsdf->sigma = sigma;
|
||||
|
||||
sd->flag |= bsdf_hair_chiang_setup(sd, bsdf);
|
||||
sd->runtime_flag |= bsdf_hair_chiang_setup(sd, bsdf);
|
||||
}
|
||||
}
|
||||
else {
|
||||
|
|
@ -1056,7 +1057,7 @@ ccl_device
|
|||
bsdf->eta = ior;
|
||||
bsdf->sigma = sigma;
|
||||
|
||||
sd->flag |= bsdf_hair_huang_setup(sd, bsdf, path_flag);
|
||||
sd->runtime_flag |= bsdf_hair_huang_setup(sd, bsdf, path_flag);
|
||||
}
|
||||
}
|
||||
break;
|
||||
|
|
@ -1090,10 +1091,10 @@ ccl_device
|
|||
}
|
||||
|
||||
if (type == CLOSURE_BSDF_HAIR_REFLECTION_ID) {
|
||||
sd->flag |= bsdf_hair_reflection_setup(bsdf);
|
||||
sd->runtime_flag |= bsdf_hair_reflection_setup(bsdf);
|
||||
}
|
||||
else {
|
||||
sd->flag |= bsdf_hair_transmission_setup(bsdf);
|
||||
sd->runtime_flag |= bsdf_hair_transmission_setup(bsdf);
|
||||
}
|
||||
}
|
||||
|
||||
|
|
@ -1123,7 +1124,7 @@ ccl_device
|
|||
bssrdf->alpha = saturatef(stack_load(stack, bsdf_data.roughness));
|
||||
bssrdf->anisotropy = stack_load(stack, bsdf_data.anisotropy);
|
||||
|
||||
sd->flag |= bssrdf_setup(sd, bssrdf, path_flag, type);
|
||||
sd->runtime_flag |= bssrdf_setup(sd, bssrdf, path_flag, type);
|
||||
}
|
||||
|
||||
break;
|
||||
|
|
@ -1151,7 +1152,7 @@ ccl_device_inline void svm_alloc_closure_volume_scatter(ccl_private ShaderData *
|
|||
bsdf_alloc(sd, sizeof(HenyeyGreensteinVolume), weight);
|
||||
if (volume) {
|
||||
volume->g = stack_load(stack, param1);
|
||||
sd->flag |= volume_henyey_greenstein_setup(volume);
|
||||
sd->runtime_flag |= volume_henyey_greenstein_setup(volume);
|
||||
}
|
||||
} break;
|
||||
case CLOSURE_VOLUME_FOURNIER_FORAND_ID: {
|
||||
|
|
@ -1160,14 +1161,14 @@ ccl_device_inline void svm_alloc_closure_volume_scatter(ccl_private ShaderData *
|
|||
if (volume) {
|
||||
const float IOR = stack_load(stack, param1);
|
||||
const float B = stack_load(stack, param_extra);
|
||||
sd->flag |= volume_fournier_forand_setup(volume, B, IOR);
|
||||
sd->runtime_flag |= volume_fournier_forand_setup(volume, B, IOR);
|
||||
}
|
||||
} break;
|
||||
case CLOSURE_VOLUME_RAYLEIGH_ID: {
|
||||
ccl_private RayleighVolume *volume = (ccl_private RayleighVolume *)bsdf_alloc(
|
||||
sd, sizeof(RayleighVolume), weight);
|
||||
if (volume) {
|
||||
sd->flag |= volume_rayleigh_setup(volume);
|
||||
sd->runtime_flag |= volume_rayleigh_setup(volume);
|
||||
}
|
||||
break;
|
||||
}
|
||||
|
|
@ -1177,7 +1178,7 @@ ccl_device_inline void svm_alloc_closure_volume_scatter(ccl_private ShaderData *
|
|||
if (volume) {
|
||||
volume->g = stack_load(stack, param1);
|
||||
volume->alpha = stack_load(stack, param_extra);
|
||||
sd->flag |= volume_draine_setup(volume);
|
||||
sd->runtime_flag |= volume_draine_setup(volume);
|
||||
}
|
||||
} break;
|
||||
case CLOSURE_VOLUME_MIE_ID: {
|
||||
|
|
@ -1191,14 +1192,14 @@ ccl_device_inline void svm_alloc_closure_volume_scatter(ccl_private ShaderData *
|
|||
sd, sizeof(HenyeyGreensteinVolume), weight * (1.0f - mixture));
|
||||
if (hg) {
|
||||
hg->g = g_HG;
|
||||
sd->flag |= volume_henyey_greenstein_setup(hg);
|
||||
sd->runtime_flag |= volume_henyey_greenstein_setup(hg);
|
||||
}
|
||||
ccl_private DraineVolume *draine = (ccl_private DraineVolume *)bsdf_alloc(
|
||||
sd, sizeof(DraineVolume), weight * mixture);
|
||||
if (draine) {
|
||||
draine->g = g_D;
|
||||
draine->alpha = alpha;
|
||||
sd->flag |= volume_draine_setup(draine);
|
||||
sd->runtime_flag |= volume_draine_setup(draine);
|
||||
}
|
||||
} break;
|
||||
default: {
|
||||
|
|
@ -1350,7 +1351,7 @@ ccl_device_noinline void svm_node_principled_volume(
|
|||
if (volume) {
|
||||
const float anisotropy = stack_load(stack, node.anisotropy);
|
||||
volume->g = anisotropy;
|
||||
sd->flag |= volume_henyey_greenstein_setup(volume);
|
||||
sd->runtime_flag |= volume_henyey_greenstein_setup(volume);
|
||||
}
|
||||
|
||||
/* Add extinction weight. */
|
||||
|
|
@ -1426,7 +1427,7 @@ ccl_device_noinline void svm_node_closure_emission(
|
|||
weight *= mix_weight;
|
||||
}
|
||||
|
||||
if (sd->flag & SD_IS_VOLUME_SHADER_EVAL) {
|
||||
if (sd->runtime_flag & SR_IS_VOLUME_SHADER_EVAL) {
|
||||
if ((path_visibility & PATH_RAY_VISIBILITY_SHADOW) || (path_flag & PATH_RAY_EXTINCTION)) {
|
||||
/* Don't need emission for shadows and extinction. */
|
||||
return;
|
||||
|
|
@ -1477,7 +1478,7 @@ ccl_device_noinline void svm_node_closure_holdout(
|
|||
closure_alloc(sd, sizeof(ShaderClosure), CLOSURE_HOLDOUT_ID, closure_weight);
|
||||
}
|
||||
|
||||
sd->flag |= SD_HOLDOUT;
|
||||
sd->runtime_flag |= SR_HOLDOUT;
|
||||
}
|
||||
|
||||
/* Closure Nodes */
|
||||
|
|
|
|||
|
|
@ -21,7 +21,7 @@ ccl_device_noinline void svm_node_fresnel(ccl_private ShaderData *sd,
|
|||
const float3 normal_in = stack_load_float3_default(stack, node.normal_offset, sd->N);
|
||||
|
||||
eta = fmaxf(eta, 1e-5f);
|
||||
eta = (sd->flag & SD_BACKFACING) ? 1.0f / eta : eta;
|
||||
eta = (sd->runtime_flag & SR_BACKFACING) ? 1.0f / eta : eta;
|
||||
|
||||
const float f = fresnel_dielectric_cos(dot(sd->wi, normal_in), eta);
|
||||
|
||||
|
|
@ -42,7 +42,7 @@ ccl_device_noinline void svm_node_layer_weight(ccl_private ShaderData *sd,
|
|||
|
||||
if (node.weight_type == NODE_LAYER_WEIGHT_FRESNEL) {
|
||||
float eta = fmaxf(1.0f - blend, 1e-5f);
|
||||
eta = (sd->flag & SD_BACKFACING) ? eta : 1.0f / eta;
|
||||
eta = (sd->runtime_flag & SR_BACKFACING) ? eta : 1.0f / eta;
|
||||
|
||||
f = fresnel_dielectric_cos(dot(sd->wi, normal_in), eta);
|
||||
}
|
||||
|
|
|
|||
|
|
@ -48,7 +48,7 @@ ccl_device_noinline void svm_node_light_path(KernelGlobals kg,
|
|||
info = (path_visibility & PATH_RAY_VISIBILITY_VOLUME_SCATTER) ? 1.0f : 0.0f;
|
||||
break;
|
||||
case NODE_LP_backfacing:
|
||||
info = (sd->flag & SD_BACKFACING) ? 1.0f : 0.0f;
|
||||
info = (sd->runtime_flag & SR_BACKFACING) ? 1.0f : 0.0f;
|
||||
break;
|
||||
case NODE_LP_ray_length:
|
||||
info = sd->ray_length;
|
||||
|
|
|
|||
|
|
@ -43,7 +43,7 @@ ccl_device_inline dual3 svm_texco_smooth_normal(KernelGlobals kg, const ccl_priv
|
|||
N = motion_triangle_smooth_normal(
|
||||
kg, sd->Ng, sd->object, sd->prim, sd->time, sd->u, sd->v, sd->du, sd->dv, N_x, N_y);
|
||||
}
|
||||
if (sd->flag & SD_BACKFACING) {
|
||||
if (sd->runtime_flag & SR_BACKFACING) {
|
||||
N = -N;
|
||||
N_x = -N_x;
|
||||
N_y = -N_y;
|
||||
|
|
@ -229,7 +229,7 @@ ccl_device_noinline void svm_node_normal_map(KernelGlobals kg,
|
|||
color.y = -color.y;
|
||||
}
|
||||
|
||||
const bool is_backfacing = (sd->flag & SD_BACKFACING) != 0;
|
||||
const bool is_backfacing = (sd->runtime_flag & SR_BACKFACING) != 0;
|
||||
float3 N;
|
||||
float strength = stack_load(stack, node.strength);
|
||||
bool linear_interpolate_strength = false;
|
||||
|
|
|
|||
|
|
@ -900,42 +900,38 @@ struct ccl_align(16) ShaderClosure {
|
|||
* are in world space.
|
||||
*/
|
||||
|
||||
enum ShaderDataFlag {
|
||||
/* Runtime flags. */
|
||||
|
||||
/* Shader runtime flags, determined during rendering. */
|
||||
enum ShaderRuntimeFlag {
|
||||
/* Set when ray hits backside of surface. */
|
||||
SD_BACKFACING = (1 << 0),
|
||||
SR_BACKFACING = (1 << 0),
|
||||
/* Shader has non-zero emission. */
|
||||
SD_EMISSION = (1 << 1),
|
||||
SR_EMISSION = (1 << 1),
|
||||
/* Shader has BSDF closure. */
|
||||
SD_BSDF = (1 << 2),
|
||||
SR_BSDF = (1 << 2),
|
||||
/* Shader has non-singular BSDF closure. */
|
||||
SD_BSDF_HAS_EVAL = (1 << 3),
|
||||
SR_BSDF_HAS_EVAL = (1 << 3),
|
||||
/* Shader has BSSRDF closure. */
|
||||
SD_BSSRDF = (1 << 4),
|
||||
SR_BSSRDF = (1 << 4),
|
||||
/* Shader has holdout closure. */
|
||||
SD_HOLDOUT = (1 << 5),
|
||||
SR_HOLDOUT = (1 << 5),
|
||||
/* Shader has non-zero volume extinction. */
|
||||
SD_EXTINCTION = (1 << 6),
|
||||
SR_EXTINCTION = (1 << 6),
|
||||
/* Shader has a volume phase (scatter) closure. */
|
||||
SD_SCATTER = (1 << 7),
|
||||
SR_SCATTER = (1 << 7),
|
||||
/* Shader is being evaluated in a volume. */
|
||||
SD_IS_VOLUME_SHADER_EVAL = (1 << 8),
|
||||
SR_IS_VOLUME_SHADER_EVAL = (1 << 8),
|
||||
/* Shader has transparent closure. */
|
||||
SD_TRANSPARENT = (1 << 9),
|
||||
SR_TRANSPARENT = (1 << 9),
|
||||
/* BSDF has a transmissive component. */
|
||||
SD_BSDF_HAS_TRANSMISSION = (1 << 10),
|
||||
SR_BSDF_HAS_TRANSMISSION = (1 << 10),
|
||||
/* Shader has ray portal closure. */
|
||||
SD_RAY_PORTAL = (1 << 11),
|
||||
SR_RAY_PORTAL = (1 << 11),
|
||||
/* Shader evaluation needs to be redone, because of texture cache miss */
|
||||
SD_CACHE_MISS = (1 << 12),
|
||||
|
||||
SD_CLOSURE_FLAGS = (SD_EMISSION | SD_BSDF | SD_BSDF_HAS_EVAL | SD_BSSRDF | SD_HOLDOUT |
|
||||
SD_EXTINCTION | SD_SCATTER | SD_IS_VOLUME_SHADER_EVAL |
|
||||
SD_BSDF_HAS_TRANSMISSION | SD_RAY_PORTAL | SD_CACHE_MISS),
|
||||
|
||||
/* Shader flags. */
|
||||
SR_CACHE_MISS = (1 << 12),
|
||||
};
|
||||
|
||||
/* Shader flags that are set after compiling the shaders. */
|
||||
enum ShaderDataFlag {
|
||||
/* If Light Path Node is present in the shader graph. */
|
||||
SD_HAS_LIGHT_PATH_NODE = (1 << 13),
|
||||
/* Has bump mapping from BSDF connected to surface socket. */
|
||||
|
|
@ -975,12 +971,6 @@ enum ShaderDataFlag {
|
|||
SD_HAS_RAYTRACE = (1 << 30),
|
||||
/* Use back side for direct light sampling. */
|
||||
SD_MIS_BACK = (1 << 31),
|
||||
|
||||
SD_SHADER_FLAGS = (SD_MIS_FRONT | 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 | SD_MIS_BACK)
|
||||
};
|
||||
|
||||
/* Object flags. */
|
||||
|
|
@ -1037,8 +1027,10 @@ struct ccl_align(16) ShaderData {
|
|||
|
||||
/* shader id */
|
||||
int shader;
|
||||
/* booleans describing shader, see ShaderRuntimeFlag */
|
||||
int runtime_flag;
|
||||
/* booleans describing shader, see ShaderDataFlag */
|
||||
int flag;
|
||||
int shader_flag;
|
||||
/* booleans describing object of the shader, see ShaderDataObjectFlag */
|
||||
uint object_flag;
|
||||
|
||||
|
|
|
|||
|
|
@ -152,7 +152,7 @@ kernel_image_tile_map(KernelGlobals kg,
|
|||
image_texture_tile_access_state)[access_index] = KERNEL_TILE_ACCESS_REQUESTED;
|
||||
}
|
||||
if (tile_descriptor == KERNEL_TILE_LOAD_REQUEST) {
|
||||
sd->flag |= SD_CACHE_MISS;
|
||||
sd->runtime_flag |= SR_CACHE_MISS;
|
||||
}
|
||||
return tile_descriptor;
|
||||
#else
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue