8#include <OSL/genclosure.h>
9#include <OSL/oslclosure.h>
27#define TO_VEC3(v) OSL::Vec3(v.x, v.y, v.z)
28#define TO_FLOAT3(v) make_float3(v[0], v[1], v[2])
32static_assert(
sizeof(
OSLClosure) ==
sizeof(OSL::ClosureColor) &&
33 sizeof(OSLClosureAdd) ==
sizeof(OSL::ClosureAdd) &&
34 sizeof(OSLClosureMul) ==
sizeof(OSL::ClosureMul) &&
35 sizeof(OSLClosureComponent) ==
sizeof(OSL::ClosureComponent));
36static_assert(
sizeof(
ShaderGlobals) ==
sizeof(OSL::ShaderGlobals) &&
41#define OSL_CLOSURE_STRUCT_BEGIN(Upper, lower) \
42 static OSL::ClosureParam *osl_closure_##lower##_params() \
44 static OSL::ClosureParam params[] = {
45#define OSL_CLOSURE_STRUCT_END(Upper, lower) \
46 CLOSURE_STRING_KEYPARAM(Upper##Closure, label, "label"), CLOSURE_FINISH_PARAM(Upper##Closure) \
51#define OSL_CLOSURE_STRUCT_MEMBER(Upper, TYPE, type, name, key) \
52 CLOSURE_##TYPE##_KEYPARAM(Upper##Closure, name, key),
53#define OSL_CLOSURE_STRUCT_ARRAY_MEMBER(Upper, TYPE, type, name, key, size) \
54 CLOSURE_##TYPE##_ARRAY_PARAM(Upper##Closure, name, size),
60 static OSL::ClosureParam
params[] = {CLOSURE_CLOSURE_PARAM(LayerClosure, top),
61 CLOSURE_CLOSURE_PARAM(LayerClosure, base),
62 CLOSURE_FINISH_PARAM(LayerClosure)};
68#define OSL_CLOSURE_STRUCT_BEGIN(Upper, lower) \
69 ss->register_closure( \
70 #lower, OSL_CLOSURE_##Upper##_ID, osl_closure_##lower##_params(), nullptr, nullptr);
86 OSLThreadData *tdata = kg->osl_tdata;
88 kg, sd, path_flag,
reinterpret_cast<ShaderGlobals *
>(&tdata->globals));
91 tdata->tracedata.init =
false;
96 sd->osl_path_state =
nullptr;
101 sd->osl_shadow_path_state =
nullptr;
105 OSL::ShadingSystem *ss = (OSL::ShadingSystem *)kg->osl_ss;
106 OSL::ShaderGlobals *globals = &tdata->globals;
107 OSL::ShadingContext *octx = tdata->context;
112 if (kg->osl->background_state) {
113#if OSL_LIBRARY_VERSION_CODE >= 11304
115 *(kg->osl->background_state),
116 kg->osl_thread_index,
122 ss->execute(octx, *(kg->osl->background_state), *globals);
128 if (kg->osl->bump_state[shader]) {
131 const float dP = sd->dP;
132 const OSL::Vec3 dPdx = globals->dPdx;
133 const OSL::Vec3 dPdy = globals->dPdy;
138 bool found = kg->osl->services->get_attribute(sd,
141 TypeDesc::TypeVector,
148 memcpy(&sd->P, data,
sizeof(
float) * 3);
149 memcpy(&tmp_dP.
dx, data + 3,
sizeof(
float) * 3);
150 memcpy(&tmp_dP.
dy, data + 6,
sizeof(
float) * 3);
164#if OSL_LIBRARY_VERSION_CODE >= 11304
166 *(kg->osl->bump_state[shader]),
167 kg->osl_thread_index,
173 ss->execute(octx, *(kg->osl->bump_state[shader]), *globals);
186 if (kg->osl->surface_state[shader]) {
187#if OSL_LIBRARY_VERSION_CODE >= 11304
189 *(kg->osl->surface_state[shader]),
190 kg->osl_thread_index,
196 ss->execute(octx, *(kg->osl->surface_state[shader]), *globals);
216 OSLThreadData *tdata = kg->osl_tdata;
218 kg, sd, path_flag,
reinterpret_cast<ShaderGlobals *
>(&tdata->globals));
221 tdata->tracedata.init =
false;
224 sd->osl_globals = kg;
226 sd->osl_path_state =
nullptr;
231 sd->osl_shadow_path_state =
nullptr;
235 OSL::ShadingSystem *ss = (OSL::ShadingSystem *)kg->osl_ss;
236 OSL::ShaderGlobals *globals = &tdata->globals;
237 OSL::ShadingContext *octx = tdata->context;
240 if (kg->osl->volume_state[shader]) {
241#if OSL_LIBRARY_VERSION_CODE >= 11304
243 *(kg->osl->volume_state[shader]),
244 kg->osl_thread_index,
250 ss->execute(octx, *(kg->osl->volume_state[shader]), *globals);
269 OSLThreadData *tdata = kg->osl_tdata;
271 kg, sd, path_flag,
reinterpret_cast<ShaderGlobals *
>(&tdata->globals));
274 tdata->tracedata.init =
false;
277 sd->osl_globals = kg;
279 sd->osl_shadow_path_state =
nullptr;
282 OSL::ShadingSystem *ss = (OSL::ShadingSystem *)kg->osl_ss;
283 OSL::ShaderGlobals *globals = &tdata->globals;
284 OSL::ShadingContext *octx = tdata->context;
287 if (kg->osl->displacement_state[shader]) {
288#if OSL_LIBRARY_VERSION_CODE >= 11304
290 *(kg->osl->displacement_state[shader]),
291 kg->osl_thread_index,
297 ss->execute(octx, *(kg->osl->displacement_state[shader]), *globals);
static ustring u_geom_undisplaced
static void register_closures(OSL::ShadingSystem *ss)
void osl_eval_nodes< SHADER_TYPE_SURFACE >(const KernelGlobalsCPU *kg, const void *state, ShaderData *sd, uint32_t path_flag)
void osl_eval_nodes< SHADER_TYPE_VOLUME >(const KernelGlobalsCPU *kg, const void *state, ShaderData *sd, uint32_t path_flag)
void osl_eval_nodes< SHADER_TYPE_DISPLACEMENT >(const KernelGlobalsCPU *kg, const void *state, ShaderData *sd, uint32_t path_flag)
static OSL::ClosureParam * osl_closure_layer_params()
#define CCL_NAMESPACE_END
ccl_device_forceinline float differential_make_compact(const float dD)
ccl_device_inline void object_position_transform(KernelGlobals kg, ccl_private const ShaderData *sd, ccl_private float3 *P)
ccl_device_inline void object_dir_transform(KernelGlobals kg, ccl_private const ShaderData *sd, ccl_private float3 *D)
ccl_device void flatten_closure_tree(KernelGlobals kg, ccl_private ShaderData *sd, uint32_t path_flag, ccl_private const OSLClosure *closure)
CCL_NAMESPACE_BEGIN ccl_device_inline void shaderdata_to_shaderglobals(KernelGlobals kg, ccl_private ShaderData *sd, uint32_t path_flag, ccl_private ShaderGlobals *globals)