17 #include <OSL/oslexec.h>
42 void OSLShader::thread_init(KernelGlobals *
kg,
43 KernelGlobals *kernel_globals,
44 OSLGlobals *osl_globals)
47 if (!osl_globals->use) {
53 kg->osl = osl_globals;
56 OSLThreadData *tdata =
new OSLThreadData();
58 memset((
void *)&tdata->globals, 0,
sizeof(OSL::ShaderGlobals));
59 tdata->globals.tracedata = &tdata->tracedata;
60 tdata->globals.flipHandedness =
false;
61 tdata->osl_thread_info = ss->create_thread_info();
62 tdata->context = ss->get_context(tdata->osl_thread_info);
64 tdata->oiio_thread_info = osl_globals->ts->get_perthread_info();
66 kg->osl_ss = (OSLShadingSystem *)ss;
67 kg->osl_tdata = tdata;
70 void OSLShader::thread_free(KernelGlobals *
kg)
76 OSLThreadData *tdata =
kg->osl_tdata;
77 ss->release_context(tdata->context);
79 ss->destroy_thread_info(tdata->osl_thread_info);
93 OSL::ShaderGlobals *globals = &tdata->globals;
97 globals->dPdx =
TO_VEC3(sd->dP.dx);
98 globals->dPdy =
TO_VEC3(sd->dP.dy);
100 globals->dIdx =
TO_VEC3(sd->dI.dx);
101 globals->dIdy =
TO_VEC3(sd->dI.dy);
105 globals->dudx = sd->du.dx;
106 globals->dudy = sd->du.dy;
108 globals->dvdx = sd->dv.dx;
109 globals->dvdy = sd->dv.dy;
110 globals->dPdu =
TO_VEC3(sd->dPdu);
111 globals->dPdv =
TO_VEC3(sd->dPdv);
112 globals->surfacearea = 1.0f;
113 globals->time = sd->time;
116 globals->raytype = path_flag;
120 globals->renderstate = sd;
123 globals->shader2common = sd;
124 globals->object2common = sd;
130 tdata->tracedata.init =
false;
133 sd->osl_globals =
kg;
134 sd->osl_path_state =
state;
141 const OSL::ClosureColor *closure,
147 switch (closure->id) {
149 OSL::ClosureMul *
mul = (OSL::ClosureMul *)closure;
153 case OSL::ClosureColor::ADD: {
154 OSL::ClosureAdd *
add = (OSL::ClosureAdd *)closure;
160 OSL::ClosureComponent *comp = (OSL::ClosureComponent *)closure;
164 #ifdef OSL_SUPPORTS_WEIGHTED_CLOSURE_COMPONENTS
167 prim->
setup(sd, path_flag, weight);
177 OSLThreadData *tdata =
kg->osl_tdata;
182 OSL::ShaderGlobals *globals = &tdata->globals;
183 OSL::ShadingContext *octx = tdata->context;
196 bool found =
kg->osl->services->get_attribute(sd,
199 TypeDesc::TypeVector,
205 memcpy(&sd->P,
data,
sizeof(
float) * 3);
206 memcpy(&sd->dP.dx,
data + 3,
sizeof(
float) * 3);
207 memcpy(&sd->dP.dy,
data + 6,
sizeof(
float) * 3);
214 globals->dPdx =
TO_VEC3(sd->dP.dx);
215 globals->dPdy =
TO_VEC3(sd->dP.dy);
219 ss->execute(octx, *(
kg->osl->bump_state[
shader]), *globals);
232 if (
kg->osl->surface_state[
shader]) {
233 ss->execute(octx, *(
kg->osl->surface_state[
shader]), *globals);
244 const OSL::ClosureColor *closure,
251 switch (closure->id) {
253 OSL::ClosureMul *
mul = (OSL::ClosureMul *)closure;
257 case OSL::ClosureColor::ADD: {
258 OSL::ClosureAdd *
add = (OSL::ClosureAdd *)closure;
265 OSL::ClosureComponent *comp = (OSL::ClosureComponent *)closure;
269 #ifdef OSL_SUPPORTS_WEIGHTED_CLOSURE_COMPONENTS
272 prim->
setup(sd, 0, weight);
282 OSLThreadData *tdata =
kg->osl_tdata;
287 OSL::ShaderGlobals *globals = &tdata->globals;
288 OSL::ShadingContext *octx = tdata->context;
290 if (
kg->osl->background_state) {
291 ss->execute(octx, *(
kg->osl->background_state), *globals);
302 const OSL::ClosureColor *closure,
308 switch (closure->id) {
310 OSL::ClosureMul *
mul = (OSL::ClosureMul *)closure;
314 case OSL::ClosureColor::ADD: {
315 OSL::ClosureAdd *
add = (OSL::ClosureAdd *)closure;
321 OSL::ClosureComponent *comp = (OSL::ClosureComponent *)closure;
325 #ifdef OSL_SUPPORTS_WEIGHTED_CLOSURE_COMPONENTS
328 prim->
setup(sd, 0, weight);
337 OSLThreadData *tdata =
kg->osl_tdata;
342 OSL::ShaderGlobals *globals = &tdata->globals;
343 OSL::ShadingContext *octx = tdata->context;
347 ss->execute(octx, *(
kg->osl->volume_state[
shader]), *globals);
360 OSLThreadData *tdata =
kg->osl_tdata;
366 OSL::ShaderGlobals *globals = &tdata->globals;
367 OSL::ShadingContext *octx = tdata->context;
371 ss->execute(octx, *(
kg->osl->displacement_state[
shader]), *globals);
388 OSLGlobals::AttributeMap &attr_map =
kg->osl->attribute_map[object];
389 ustring stdname(std::string(
"geom:") +
391 OSLGlobals::AttributeMap::const_iterator it = attr_map.find(stdname);
393 if (it != attr_map.end()) {
394 const OSLGlobals::Attribute &osl_attr = it->second;
395 *desc = osl_attr.desc;
static void mul(btAlignedObjectArray< T > &items, const Q &value)
static const char * standard_name(AttributeStandard std)
virtual void setup(ShaderData *sd, int path_flag, float3 weight)=0
static ustring u_geom_undisplaced
ccl_device_inline AttributeDescriptor find_attribute(KernelGlobals *kg, const ShaderData *sd, uint id)
ccl_device_inline void object_position_transform(KernelGlobals *kg, const ShaderData *sd, float3 *P)
ccl_device_inline void object_dir_transform(KernelGlobals *kg, const ShaderData *sd, float3 *D)
#define CCL_NAMESPACE_END
#define make_float3(x, y, z)
void KERNEL_FUNCTION_FULL_NAME() shader(KernelGlobals *kg, uint4 *input, float4 *output, int type, int filter, int i, int offset, int sample)
static void add(GHash *messages, MemArena *memarena, const Message *msg)
static void flatten_surface_closure_tree(ShaderData *sd, int path_flag, const OSL::ClosureColor *closure, float3 weight=make_float3(1.0f, 1.0f, 1.0f))
static void flatten_background_closure_tree(ShaderData *sd, const OSL::ClosureColor *closure, float3 weight=make_float3(1.0f, 1.0f, 1.0f))
static void flatten_volume_closure_tree(ShaderData *sd, const OSL::ClosureColor *closure, float3 weight=make_float3(1.0f, 1.0f, 1.0f))
static void shaderdata_to_shaderglobals(KernelGlobals *kg, ShaderData *sd, PathState *state, int path_flag, OSLThreadData *tdata)
static void eval_displacement(SubdivDisplacement *displacement, const int ptex_face_index, const float u, const float v, const float dPdu[3], const float dPdv[3], float r_D[3])