8#include <OSL/genclosure.h>
9#include <OSL/oslclosure.h>
29#define TO_VEC3(v) OSL::Vec3(v.x, v.y, v.z)
30#define TO_FLOAT3(v) make_float3(v[0], v[1], v[2])
34static_assert(
sizeof(
OSLClosure) ==
sizeof(OSL::ClosureColor) &&
35 sizeof(OSLClosureAdd) ==
sizeof(OSL::ClosureAdd) &&
36 sizeof(OSLClosureMul) ==
sizeof(OSL::ClosureMul) &&
37 sizeof(OSLClosureComponent) ==
sizeof(OSL::ClosureComponent));
38static_assert(
sizeof(
ShaderGlobals) >=
sizeof(OSL::ShaderGlobals) &&
43#define OSL_CLOSURE_STRUCT_BEGIN(Upper, lower) \
44 static OSL::ClosureParam *osl_closure_##lower##_params() \
46 static OSL::ClosureParam params[] = {
47#define OSL_CLOSURE_STRUCT_END(Upper, lower) \
48 CLOSURE_STRING_KEYPARAM(Upper##Closure, label, "label"), CLOSURE_FINISH_PARAM(Upper##Closure) \
53#define OSL_CLOSURE_STRUCT_MEMBER(Upper, TYPE, type, name, key) \
54 CLOSURE_##TYPE##_KEYPARAM(Upper##Closure, name, key),
55#define OSL_CLOSURE_STRUCT_ARRAY_MEMBER(Upper, TYPE, type, name, key, size) \
56 CLOSURE_##TYPE##_ARRAY_PARAM(Upper##Closure, name, size),
62 static OSL::ClosureParam
params[] = {CLOSURE_CLOSURE_PARAM(LayerClosure,
top),
63 CLOSURE_CLOSURE_PARAM(LayerClosure, base),
64 CLOSURE_FINISH_PARAM(LayerClosure)};
70#define OSL_CLOSURE_STRUCT_BEGIN(Upper, lower) \
71 ss->register_closure( \
72 #lower, OSL_CLOSURE_##Upper##_ID, osl_closure_##lower##_params(), nullptr, nullptr);
85 const uint32_t path_flag)
91 kg->osl.tracedata.init =
false;
94 kg->osl.shader_globals.kg = kg;
96 kg->osl.shader_globals.path_state =
nullptr;
101 kg->osl.shader_globals.shadow_path_state =
nullptr;
105 OSL::ShadingSystem *ss = (OSL::ShadingSystem *)kg->osl.ss;
106 OSL::ShaderGlobals *globals =
reinterpret_cast<OSL::ShaderGlobals *
>(&kg->osl.shader_globals);
107 OSL::ShadingContext *octx = kg->osl.context;
112 if (kg->osl.globals->background_state) {
114 *(kg->osl.globals->background_state),
115 kg->osl.thread_index,
124 if (kg->osl.globals->bump_state[shader]) {
127 const float dP = sd->dP;
128 const OSL::Vec3
dPdx = globals->dPdx;
129 const OSL::Vec3
dPdy = globals->dPdy;
159 *(kg->osl.globals->bump_state[shader]),
160 kg->osl.thread_index,
179 if (kg->osl.globals->surface_state[shader]) {
181 *(kg->osl.globals->surface_state[shader]),
182 kg->osl.thread_index,
191 if (kg->osl.shader_globals.Ci) {
202 const uint32_t path_flag)
208 kg->osl.tracedata.init =
false;
211 kg->osl.shader_globals.kg = kg;
213 kg->osl.shader_globals.path_state =
nullptr;
218 kg->osl.shader_globals.shadow_path_state =
nullptr;
222 OSL::ShadingSystem *ss = (OSL::ShadingSystem *)kg->osl.ss;
223 OSL::ShaderGlobals *globals =
reinterpret_cast<OSL::ShaderGlobals *
>(&kg->osl.shader_globals);
224 OSL::ShadingContext *octx = kg->osl.context;
227 if (kg->osl.globals->volume_state[shader]) {
229 *(kg->osl.globals->volume_state[shader]),
230 kg->osl.thread_index,
238 if (kg->osl.shader_globals.Ci) {
249 const uint32_t path_flag)
255 kg->osl.tracedata.init =
false;
258 kg->osl.shader_globals.kg = kg;
260 kg->osl.shader_globals.shadow_path_state =
nullptr;
263 OSL::ShadingSystem *ss = (OSL::ShadingSystem *)kg->osl.ss;
264 OSL::ShaderGlobals *globals =
reinterpret_cast<OSL::ShaderGlobals *
>(&kg->osl.shader_globals);
265 OSL::ShadingContext *octx = kg->osl.context;
268 if (kg->osl.globals->displacement_state[shader]) {
270 *(kg->osl.globals->displacement_state[shader]),
271 kg->osl.thread_index,
296 if (!kg->osl.globals->camera_state) {
304 kg->osl.tracedata.init =
false;
307 kg->osl.shader_globals.kg = kg;
310 OSL::ShadingSystem *ss = (OSL::ShadingSystem *)kg->osl.ss;
311 OSL::ShaderGlobals *globals =
reinterpret_cast<OSL::ShaderGlobals *
>(&kg->osl.shader_globals);
312 OSL::ShadingContext *octx = kg->osl.context;
314 float output[21] = {0.0f};
317 *octx, *kg->osl.globals->camera_state, kg->osl.thread_index, 0, *globals,
nullptr,
output);
static void register_closures(OSL::ShadingSystem *ss)
packed_float3 osl_eval_camera(const ThreadKernelGlobalsCPU *kg, const packed_float3 sensor, const packed_float3 dSdx, const packed_float3 dSdy, const float2 rand_lens, packed_float3 &P, packed_float3 &dPdx, packed_float3 &dPdy, packed_float3 &D, packed_float3 &dDdx, packed_float3 &dDdy)
void osl_eval_nodes< SHADER_TYPE_DISPLACEMENT >(const ThreadKernelGlobalsCPU *kg, const void *state, ShaderData *sd, const uint32_t path_flag)
void osl_eval_nodes< SHADER_TYPE_VOLUME >(const ThreadKernelGlobalsCPU *kg, const void *state, ShaderData *sd, const uint32_t path_flag)
void osl_eval_nodes< SHADER_TYPE_SURFACE >(const ThreadKernelGlobalsCPU *kg, const void *state, ShaderData *sd, const uint32_t path_flag)
static OSL::ClosureParam * osl_closure_layer_params()
ccl_device_forceinline float3 dPdx(const ccl_private ShaderData *sd)
ccl_device_forceinline float3 dPdy(const ccl_private ShaderData *sd)
#define kernel_assert(cond)
#define CCL_NAMESPACE_END
ccl_device_forceinline float differential_make_compact(const float dD)
ccl_device_inline void object_normal_transform(KernelGlobals kg, const ccl_private ShaderData *sd, ccl_private float3 *N)
ccl_device_inline void object_position_transform(KernelGlobals kg, const ccl_private ShaderData *sd, ccl_private T *P)
CCL_NAMESPACE_BEGIN ccl_device_inline void cameradata_to_shaderglobals(const packed_float3 sensor, const packed_float3 dSdx, const packed_float3 dSdy, const float2 rand_lens, ccl_private ShaderGlobals *globals)
ccl_device void flatten_closure_tree(KernelGlobals kg, ccl_private ShaderData *sd, const uint32_t path_flag, const ccl_private OSLClosure *closure)
CCL_NAMESPACE_BEGIN ccl_device_inline void shaderdata_to_shaderglobals(ccl_private ShaderData *sd, const uint32_t path_flag, ccl_private ShaderGlobals *globals)
@ ATTR_STD_POSITION_UNDISPLACED
@ ATTR_STD_NORMAL_UNDISPLACED
ccl_device_inline float2 safe_normalize(const float2 a)
CCL_NAMESPACE_BEGIN ccl_device_forceinline dual< T > primitive_surface_attribute(KernelGlobals kg, const ccl_private ShaderData *sd, const AttributeDescriptor desc, const bool dx=false, const bool dy=false)
static bool find_attribute(const std::string &attributes, const char *search_attribute)