diff options
Diffstat (limited to 'intern/cycles/kernel/osl')
-rw-r--r-- | intern/cycles/kernel/osl/osl_closures.cpp | 3 | ||||
-rw-r--r-- | intern/cycles/kernel/osl/osl_globals.h | 26 | ||||
-rw-r--r-- | intern/cycles/kernel/osl/osl_services.cpp | 121 | ||||
-rw-r--r-- | intern/cycles/kernel/osl/osl_services.h | 33 | ||||
-rw-r--r-- | intern/cycles/kernel/osl/osl_shader.cpp | 111 | ||||
-rw-r--r-- | intern/cycles/kernel/osl/osl_shader.h | 21 |
6 files changed, 195 insertions, 120 deletions
diff --git a/intern/cycles/kernel/osl/osl_closures.cpp b/intern/cycles/kernel/osl/osl_closures.cpp index d42d65608c8..f95859d237d 100644 --- a/intern/cycles/kernel/osl/osl_closures.cpp +++ b/intern/cycles/kernel/osl/osl_closures.cpp @@ -153,8 +153,9 @@ static void register_closure(OSL::ShadingSystem *ss, const char *name, int id, O ss->register_closure(name, id, params, prepare, generic_closure_setup, generic_closure_compare); } -void OSLShader::register_closures(OSL::ShadingSystem *ss) +void OSLShader::register_closures(OSLShadingSystem *ss_) { + OSL::ShadingSystem *ss = (OSL::ShadingSystem*)ss_; int id = 0; register_closure(ss, "diffuse", id++, diff --git a/intern/cycles/kernel/osl/osl_globals.h b/intern/cycles/kernel/osl/osl_globals.h index ce283023c5c..1a2a210de88 100644 --- a/intern/cycles/kernel/osl/osl_globals.h +++ b/intern/cycles/kernel/osl/osl_globals.h @@ -38,7 +38,14 @@ CCL_NAMESPACE_BEGIN class OSLRenderServices; struct OSLGlobals { - /* use */ + OSLGlobals() + { + ss = NULL; + ts = NULL; + services = NULL; + use = false; + } + bool use; /* shading system */ @@ -66,19 +73,12 @@ struct OSLGlobals { vector<AttributeMap> attribute_map; ObjectNameMap object_name_map; vector<ustring> object_names; +}; - /* thread key for thread specific data lookup */ - struct ThreadData { - OSL::ShaderGlobals globals; - OSL::PerThreadInfo *thread_info; - }; - - static tls_ptr(ThreadData, thread_data); - static thread_mutex thread_data_mutex; - static volatile int thread_data_users; - - void thread_data_init(); - void thread_data_free(); +/* thread key for thread specific data lookup */ +struct OSLThreadData { + OSL::ShaderGlobals globals; + OSL::PerThreadInfo *thread_info; }; CCL_NAMESPACE_END diff --git a/intern/cycles/kernel/osl/osl_services.cpp b/intern/cycles/kernel/osl/osl_services.cpp index e593387093c..b584a54b1b7 100644 --- a/intern/cycles/kernel/osl/osl_services.cpp +++ b/intern/cycles/kernel/osl/osl_services.cpp @@ -23,6 +23,7 @@ #include "scene.h" #include "osl_closures.h" +#include "osl_globals.h" #include "osl_services.h" #include "osl_shader.h" @@ -36,6 +37,8 @@ #include "kernel_differential.h" #include "kernel_object.h" #include "kernel_bvh.h" +#include "kernel_attribute.h" +#include "kernel_projection.h" #include "kernel_triangle.h" #include "kernel_accumulate.h" #include "kernel_shader.h" @@ -53,6 +56,34 @@ ustring OSLRenderServices::u_camera("camera"); ustring OSLRenderServices::u_screen("screen"); ustring OSLRenderServices::u_raster("raster"); ustring OSLRenderServices::u_ndc("NDC"); +ustring OSLRenderServices::u_object_location("object:location"); +ustring OSLRenderServices::u_object_index("object:index"); +ustring OSLRenderServices::u_geom_dupli_generated("geom:dupli_generated"); +ustring OSLRenderServices::u_geom_dupli_uv("geom:dupli_uv"); +ustring OSLRenderServices::u_material_index("material:index"); +ustring OSLRenderServices::u_object_random("object:random"); +ustring OSLRenderServices::u_particle_index("particle:index"); +ustring OSLRenderServices::u_particle_age("particle:age"); +ustring OSLRenderServices::u_particle_lifetime("particle:lifetime"); +ustring OSLRenderServices::u_particle_location("particle:location"); +ustring OSLRenderServices::u_particle_rotation("particle:rotation"); +ustring OSLRenderServices::u_particle_size("particle:size"); +ustring OSLRenderServices::u_particle_velocity("particle:velocity"); +ustring OSLRenderServices::u_particle_angular_velocity("particle:angular_velocity"); +ustring OSLRenderServices::u_geom_numpolyvertices("geom:numpolyvertices"); +ustring OSLRenderServices::u_geom_trianglevertices("geom:trianglevertices"); +ustring OSLRenderServices::u_geom_polyvertices("geom:polyvertices"); +ustring OSLRenderServices::u_geom_name("geom:name"); +ustring OSLRenderServices::u_path_ray_length("path:ray_length"); +ustring OSLRenderServices::u_trace("trace"); +ustring OSLRenderServices::u_hit("hit"); +ustring OSLRenderServices::u_hitdist("hitdist"); +ustring OSLRenderServices::u_N("N"); +ustring OSLRenderServices::u_Ng("Ng"); +ustring OSLRenderServices::u_P("P"); +ustring OSLRenderServices::u_I("I"); +ustring OSLRenderServices::u_u("u"); +ustring OSLRenderServices::u_v("v"); ustring OSLRenderServices::u_empty; OSLRenderServices::OSLRenderServices() @@ -488,104 +519,108 @@ static void get_object_attribute(const OSLGlobals::Attribute& attr, bool derivat memset((char *)val + datasize, 0, datasize * 2); } -static bool get_object_standard_attribute(KernelGlobals *kg, ShaderData *sd, ustring name, - TypeDesc type, bool derivatives, void *val) +bool OSLRenderServices::get_object_standard_attribute(KernelGlobals *kg, ShaderData *sd, ustring name, + TypeDesc type, bool derivatives, void *val) { - /* todo: turn this into hash table returning int, which can be used in switch */ + /* todo: turn this into hash table? */ /* Object Attributes */ - if (name == "object:location") { + if (name == u_object_location) { float3 f = object_location(kg, sd); return set_attribute_float3(f, type, derivatives, val); } - else if (name == "object:index") { + else if (name == u_object_index) { float f = object_pass_id(kg, sd->object); return set_attribute_float(f, type, derivatives, val); } - else if (name == "geom:dupli_generated") { + else if (name == u_geom_dupli_generated) { float3 f = object_dupli_generated(kg, sd->object); return set_attribute_float3(f, type, derivatives, val); } - else if (name == "geom:dupli_uv") { + else if (name == u_geom_dupli_uv) { float3 f = object_dupli_uv(kg, sd->object); return set_attribute_float3(f, type, derivatives, val); } - else if (name == "material:index") { + else if (name == u_material_index) { float f = shader_pass_id(kg, sd); return set_attribute_float(f, type, derivatives, val); } - else if (name == "object:random") { + else if (name == u_object_random) { float f = object_random_number(kg, sd->object); return set_attribute_float(f, type, derivatives, val); } /* Particle Attributes */ - else if (name == "particle:index") { + else if (name == u_particle_index) { uint particle_id = object_particle_id(kg, sd->object); float f = particle_index(kg, particle_id); return set_attribute_float(f, type, derivatives, val); } - else if (name == "particle:age") { + else if (name == u_particle_age) { uint particle_id = object_particle_id(kg, sd->object); float f = particle_age(kg, particle_id); return set_attribute_float(f, type, derivatives, val); } - else if (name == "particle:lifetime") { + else if (name == u_particle_lifetime) { uint particle_id = object_particle_id(kg, sd->object); float f= particle_lifetime(kg, particle_id); return set_attribute_float(f, type, derivatives, val); } - else if (name == "particle:location") { + else if (name == u_particle_location) { uint particle_id = object_particle_id(kg, sd->object); float3 f = particle_location(kg, particle_id); return set_attribute_float3(f, type, derivatives, val); } #if 0 /* unsupported */ - else if (name == "particle:rotation") { + else if (name == u_particle_rotation) { uint particle_id = object_particle_id(kg, sd->object); float4 f = particle_rotation(kg, particle_id); return set_attribute_float4(f, type, derivatives, val); } #endif - else if (name == "particle:size") { + else if (name == u_particle_size) { uint particle_id = object_particle_id(kg, sd->object); float f = particle_size(kg, particle_id); return set_attribute_float(f, type, derivatives, val); } - else if (name == "particle:velocity") { + else if (name == u_particle_velocity) { uint particle_id = object_particle_id(kg, sd->object); float3 f = particle_velocity(kg, particle_id); return set_attribute_float3(f, type, derivatives, val); } - else if (name == "particle:angular_velocity") { + else if (name == u_particle_angular_velocity) { uint particle_id = object_particle_id(kg, sd->object); float3 f = particle_angular_velocity(kg, particle_id); return set_attribute_float3(f, type, derivatives, val); } - else if (name == "geom:numpolyvertices") { + else if (name == u_geom_numpolyvertices) { return set_attribute_int(3, type, derivatives, val); } - else if (name == "geom:trianglevertices" || name == "geom:polyvertices") { + else if (name == u_geom_trianglevertices || name == u_geom_polyvertices) { float3 P[3]; triangle_vertices(kg, sd->prim, P); - object_position_transform(kg, sd, &P[0]); - object_position_transform(kg, sd, &P[1]); - object_position_transform(kg, sd, &P[2]); + + if(!(sd->flag & SD_TRANSFORM_APPLIED)) { + object_position_transform(kg, sd, &P[0]); + object_position_transform(kg, sd, &P[1]); + object_position_transform(kg, sd, &P[2]); + } + return set_attribute_float3_3(P, type, derivatives, val); } - else if(name == "geom:name") { - ustring object_name = kg->osl.object_names[sd->object]; + else if(name == u_geom_name) { + ustring object_name = kg->osl->object_names[sd->object]; return set_attribute_string(object_name, type, derivatives, val); } else return false; } -static bool get_background_attribute(KernelGlobals *kg, ShaderData *sd, ustring name, - TypeDesc type, bool derivatives, void *val) +bool OSLRenderServices::get_background_attribute(KernelGlobals *kg, ShaderData *sd, ustring name, + TypeDesc type, bool derivatives, void *val) { /* Ray Length */ - if (name == "path:ray_length") { + if (name == u_path_ray_length) { float f = sd->ray_length; return set_attribute_float(f, type, derivatives, val); } @@ -604,9 +639,9 @@ bool OSLRenderServices::get_attribute(void *renderstate, bool derivatives, ustri /* lookup of attribute on another object */ if (object_name != u_empty) { - OSLGlobals::ObjectNameMap::iterator it = kg->osl.object_name_map.find(object_name); + OSLGlobals::ObjectNameMap::iterator it = kg->osl->object_name_map.find(object_name); - if (it == kg->osl.object_name_map.end()) + if (it == kg->osl->object_name_map.end()) return false; object = it->second; @@ -617,7 +652,7 @@ bool OSLRenderServices::get_attribute(void *renderstate, bool derivatives, ustri } /* find attribute on object */ - OSLGlobals::AttributeMap& attribute_map = kg->osl.attribute_map[object]; + OSLGlobals::AttributeMap& attribute_map = kg->osl->attribute_map[object]; OSLGlobals::AttributeMap::iterator it = attribute_map.find(name); if (it != attribute_map.end()) { @@ -663,7 +698,7 @@ bool OSLRenderServices::texture(ustring filename, TextureOpt &options, float s, float t, float dsdx, float dtdx, float dsdy, float dtdy, float *result) { - OSL::TextureSystem *ts = kernel_globals->osl.ts; + OSL::TextureSystem *ts = kernel_globals->osl->ts; bool status = ts->texture(filename, options, s, t, dsdx, dtdx, dsdy, dtdy, result); if(!status) { @@ -685,7 +720,7 @@ bool OSLRenderServices::texture3d(ustring filename, TextureOpt &options, const OSL::Vec3 &dPdx, const OSL::Vec3 &dPdy, const OSL::Vec3 &dPdz, float *result) { - OSL::TextureSystem *ts = kernel_globals->osl.ts; + OSL::TextureSystem *ts = kernel_globals->osl->ts; bool status = ts->texture3d(filename, options, P, dPdx, dPdy, dPdz, result); if(!status) { @@ -707,7 +742,7 @@ bool OSLRenderServices::environment(ustring filename, TextureOpt &options, OSL::ShaderGlobals *sg, const OSL::Vec3 &R, const OSL::Vec3 &dRdx, const OSL::Vec3 &dRdy, float *result) { - OSL::TextureSystem *ts = kernel_globals->osl.ts; + OSL::TextureSystem *ts = kernel_globals->osl->ts; bool status = ts->environment(filename, options, R, dRdx, dRdy, result); if(!status) { @@ -728,7 +763,7 @@ bool OSLRenderServices::get_texture_info(ustring filename, int subimage, ustring dataname, TypeDesc datatype, void *data) { - OSL::TextureSystem *ts = kernel_globals->osl.ts; + OSL::TextureSystem *ts = kernel_globals->osl->ts; return ts->get_texture_info(filename, subimage, dataname, datatype, data); } @@ -798,12 +833,12 @@ bool OSLRenderServices::getmessage(OSL::ShaderGlobals *sg, ustring source, ustri { TraceData *tracedata = (TraceData*)sg->tracedata; - if(source == "trace" && tracedata) { - if(name == "hit") { + if(source == u_trace && tracedata) { + if(name == u_hit) { return set_attribute_int((tracedata->isect.prim != ~0), type, derivatives, val); } else if(tracedata->isect.prim != ~0) { - if(name == "hitdist") { + if(name == u_hitdist) { float f[3] = {tracedata->isect.t, 0.0f, 0.0f}; return set_attribute_float(f, type, derivatives, val); } @@ -817,25 +852,25 @@ bool OSLRenderServices::getmessage(OSL::ShaderGlobals *sg, ustring source, ustri tracedata->setup = true; } - if(name == "N") { + if(name == u_N) { return set_attribute_float3(sd->N, type, derivatives, val); } - else if(name == "Ng") { + else if(name == u_Ng) { return set_attribute_float3(sd->Ng, type, derivatives, val); } - else if(name == "P") { + else if(name == u_P) { float3 f[3] = {sd->P, sd->dP.dx, sd->dP.dy}; return set_attribute_float3(f, type, derivatives, val); } - else if(name == "I") { + else if(name == u_I) { float3 f[3] = {sd->I, sd->dI.dx, sd->dI.dy}; return set_attribute_float3(f, type, derivatives, val); } - else if(name == "u") { + else if(name == u_u) { float f[3] = {sd->u, sd->du.dx, sd->du.dy}; return set_attribute_float(f, type, derivatives, val); } - else if(name == "v") { + else if(name == u_v) { float f[3] = {sd->v, sd->dv.dx, sd->dv.dy}; return set_attribute_float(f, type, derivatives, val); } diff --git a/intern/cycles/kernel/osl/osl_services.h b/intern/cycles/kernel/osl/osl_services.h index b5a7bbae7e5..e687700b383 100644 --- a/intern/cycles/kernel/osl/osl_services.h +++ b/intern/cycles/kernel/osl/osl_services.h @@ -101,6 +101,11 @@ public: bool get_texture_info(ustring filename, int subimage, ustring dataname, TypeDesc datatype, void *data); + static bool get_background_attribute(KernelGlobals *kg, ShaderData *sd, ustring name, + TypeDesc type, bool derivatives, void *val); + static bool get_object_standard_attribute(KernelGlobals *kg, ShaderData *sd, ustring name, + TypeDesc type, bool derivatives, void *val); + struct TraceData { Ray ray; Intersection isect; @@ -114,6 +119,34 @@ public: static ustring u_screen; static ustring u_raster; static ustring u_ndc; + static ustring u_object_location; + static ustring u_object_index; + static ustring u_geom_dupli_generated; + static ustring u_geom_dupli_uv; + static ustring u_material_index; + static ustring u_object_random; + static ustring u_particle_index; + static ustring u_particle_age; + static ustring u_particle_lifetime; + static ustring u_particle_location; + static ustring u_particle_rotation; + static ustring u_particle_size; + static ustring u_particle_velocity; + static ustring u_particle_angular_velocity; + static ustring u_geom_numpolyvertices; + static ustring u_geom_trianglevertices; + static ustring u_geom_polyvertices; + static ustring u_geom_name; + static ustring u_path_ray_length; + static ustring u_trace; + static ustring u_hit; + static ustring u_hitdist; + static ustring u_N; + static ustring u_Ng; + static ustring u_P; + static ustring u_I; + static ustring u_u; + static ustring u_v; static ustring u_empty; private: diff --git a/intern/cycles/kernel/osl/osl_shader.cpp b/intern/cycles/kernel/osl/osl_shader.cpp index 2d025f12055..67a0e16419c 100644 --- a/intern/cycles/kernel/osl/osl_shader.cpp +++ b/intern/cycles/kernel/osl/osl_shader.cpp @@ -22,65 +22,56 @@ #include "kernel_object.h" #include "osl_closures.h" +#include "osl_globals.h" #include "osl_services.h" #include "osl_shader.h" +#include "util_attribute.h" #include "util_foreach.h" #include <OSL/oslexec.h> CCL_NAMESPACE_BEGIN -tls_ptr(OSLGlobals::ThreadData, OSLGlobals::thread_data); -volatile int OSLGlobals::thread_data_users = 0; -thread_mutex OSLGlobals::thread_data_mutex; - /* Threads */ -void OSLGlobals::thread_data_init() -{ - thread_scoped_lock thread_data_lock(thread_data_mutex); - - if(thread_data_users == 0) - tls_create(OSLGlobals::ThreadData, thread_data); - - thread_data_users++; -} - -void OSLGlobals::thread_data_free() +void OSLShader::thread_init(KernelGlobals *kg, KernelGlobals *kernel_globals, OSLGlobals *osl_globals) { - /* thread local storage delete */ - thread_scoped_lock thread_data_lock(thread_data_mutex); + /* no osl used? */ + if(!osl_globals->use) { + kg->osl = NULL; + return; + } - thread_data_users--; + /* per thread kernel data init*/ + kg->osl = osl_globals; + kg->osl->services->thread_init(kernel_globals); - if(thread_data_users == 0) - tls_delete(OSLGlobals::ThreadData, thread_data); -} - -void OSLShader::thread_init(KernelGlobals *kg) -{ - OSL::ShadingSystem *ss = kg->osl.ss; - - OSLGlobals::ThreadData *tdata = new OSLGlobals::ThreadData(); + OSL::ShadingSystem *ss = kg->osl->ss; + OSLThreadData *tdata = new OSLThreadData(); memset(&tdata->globals, 0, sizeof(OSL::ShaderGlobals)); tdata->thread_info = ss->create_thread_info(); - tls_set(kg->osl.thread_data, tdata); - - kg->osl.services->thread_init(kg); + kg->osl_ss = (OSLShadingSystem*)ss; + kg->osl_tdata = tdata; } void OSLShader::thread_free(KernelGlobals *kg) { - OSL::ShadingSystem *ss = kg->osl.ss; + if(!kg->osl) + return; - OSLGlobals::ThreadData *tdata = tls_get(OSLGlobals::ThreadData, kg->osl.thread_data); + OSL::ShadingSystem *ss = (OSL::ShadingSystem*)kg->osl_ss; + OSLThreadData *tdata = kg->osl_tdata; ss->destroy_thread_info(tdata->thread_info); delete tdata; + + kg->osl = NULL; + kg->osl_ss = NULL; + kg->osl_tdata = NULL; } /* Globals */ @@ -230,8 +221,8 @@ static void flatten_surface_closure_tree(ShaderData *sd, bool no_glossy, void OSLShader::eval_surface(KernelGlobals *kg, ShaderData *sd, float randb, int path_flag) { /* gather pointers */ - OSL::ShadingSystem *ss = kg->osl.ss; - OSLGlobals::ThreadData *tdata = tls_get(OSLGlobals::ThreadData, kg->osl.thread_data); + OSL::ShadingSystem *ss = (OSL::ShadingSystem*)kg->osl_ss; + OSLThreadData *tdata = kg->osl_tdata; OSL::ShaderGlobals *globals = &tdata->globals; OSL::ShadingContext *ctx = (OSL::ShadingContext *)sd->osl_ctx; @@ -241,8 +232,8 @@ void OSLShader::eval_surface(KernelGlobals *kg, ShaderData *sd, float randb, int /* execute shader for this point */ int shader = sd->shader & SHADER_MASK; - if (kg->osl.surface_state[shader]) - ss->execute(*ctx, *(kg->osl.surface_state[shader]), *globals); + if (kg->osl->surface_state[shader]) + ss->execute(*ctx, *(kg->osl->surface_state[shader]), *globals); /* free trace data */ if(globals->tracedata) @@ -291,8 +282,8 @@ static float3 flatten_background_closure_tree(const OSL::ClosureColor *closure) float3 OSLShader::eval_background(KernelGlobals *kg, ShaderData *sd, int path_flag) { /* gather pointers */ - OSL::ShadingSystem *ss = kg->osl.ss; - OSLGlobals::ThreadData *tdata = tls_get(OSLGlobals::ThreadData, kg->osl.thread_data); + OSL::ShadingSystem *ss = (OSL::ShadingSystem*)kg->osl_ss; + OSLThreadData *tdata = kg->osl_tdata; OSL::ShaderGlobals *globals = &tdata->globals; OSL::ShadingContext *ctx = (OSL::ShadingContext *)sd->osl_ctx; @@ -300,8 +291,8 @@ float3 OSLShader::eval_background(KernelGlobals *kg, ShaderData *sd, int path_fl shaderdata_to_shaderglobals(kg, sd, path_flag, globals); /* execute shader for this point */ - if (kg->osl.background_state) - ss->execute(*ctx, *(kg->osl.background_state), *globals); + if (kg->osl->background_state) + ss->execute(*ctx, *(kg->osl->background_state), *globals); /* free trace data */ if(globals->tracedata) @@ -371,8 +362,8 @@ static void flatten_volume_closure_tree(ShaderData *sd, void OSLShader::eval_volume(KernelGlobals *kg, ShaderData *sd, float randb, int path_flag) { /* gather pointers */ - OSL::ShadingSystem *ss = kg->osl.ss; - OSLGlobals::ThreadData *tdata = tls_get(OSLGlobals::ThreadData, kg->osl.thread_data); + OSL::ShadingSystem *ss = (OSL::ShadingSystem*)kg->osl_ss; + OSLThreadData *tdata = kg->osl_tdata; OSL::ShaderGlobals *globals = &tdata->globals; OSL::ShadingContext *ctx = (OSL::ShadingContext *)sd->osl_ctx; @@ -382,8 +373,8 @@ void OSLShader::eval_volume(KernelGlobals *kg, ShaderData *sd, float randb, int /* execute shader */ int shader = sd->shader & SHADER_MASK; - if (kg->osl.volume_state[shader]) - ss->execute(*ctx, *(kg->osl.volume_state[shader]), *globals); + if (kg->osl->volume_state[shader]) + ss->execute(*ctx, *(kg->osl->volume_state[shader]), *globals); /* free trace data */ if(globals->tracedata) @@ -398,8 +389,8 @@ void OSLShader::eval_volume(KernelGlobals *kg, ShaderData *sd, float randb, int void OSLShader::eval_displacement(KernelGlobals *kg, ShaderData *sd) { /* gather pointers */ - OSL::ShadingSystem *ss = kg->osl.ss; - OSLGlobals::ThreadData *tdata = tls_get(OSLGlobals::ThreadData, kg->osl.thread_data); + OSL::ShadingSystem *ss = (OSL::ShadingSystem*)kg->osl_ss; + OSLThreadData *tdata = kg->osl_tdata; OSL::ShaderGlobals *globals = &tdata->globals; OSL::ShadingContext *ctx = (OSL::ShadingContext *)sd->osl_ctx; @@ -409,8 +400,8 @@ void OSLShader::eval_displacement(KernelGlobals *kg, ShaderData *sd) /* execute shader */ int shader = sd->shader & SHADER_MASK; - if (kg->osl.displacement_state[shader]) - ss->execute(*ctx, *(kg->osl.displacement_state[shader]), *globals); + if (kg->osl->displacement_state[shader]) + ss->execute(*ctx, *(kg->osl->displacement_state[shader]), *globals); /* free trace data */ if(globals->tracedata) @@ -422,15 +413,15 @@ void OSLShader::eval_displacement(KernelGlobals *kg, ShaderData *sd) void OSLShader::init(KernelGlobals *kg, ShaderData *sd) { - OSL::ShadingSystem *ss = kg->osl.ss; - OSLGlobals::ThreadData *tdata = tls_get(OSLGlobals::ThreadData, kg->osl.thread_data); + OSL::ShadingSystem *ss = (OSL::ShadingSystem*)kg->osl_ss; + OSLThreadData *tdata = kg->osl_tdata; sd->osl_ctx = ss->get_context(tdata->thread_info); } void OSLShader::release(KernelGlobals *kg, ShaderData *sd) { - OSL::ShadingSystem *ss = kg->osl.ss; + OSL::ShadingSystem *ss = (OSL::ShadingSystem*)kg->osl_ss; ss->release_context((OSL::ShadingContext *)sd->osl_ctx); } @@ -488,5 +479,23 @@ float3 OSLShader::volume_eval_phase(const ShaderClosure *sc, const float3 omega_ return TO_FLOAT3(volume_eval) * sc->weight; } +/* Attributes */ + +int OSLShader::find_attribute(KernelGlobals *kg, const ShaderData *sd, uint id) +{ + /* for OSL, a hash map is used to lookup the attribute by name. */ + OSLGlobals::AttributeMap &attr_map = kg->osl->attribute_map[sd->object]; + ustring stdname(std::string("std::") + std::string(attribute_standard_name((AttributeStandard)id))); + OSLGlobals::AttributeMap::const_iterator it = attr_map.find(stdname); + + if (it != attr_map.end()) { + const OSLGlobals::Attribute &osl_attr = it->second; + /* return result */ + return (osl_attr.elem == ATTR_ELEMENT_NONE) ? (int)ATTR_STD_NOT_FOUND : osl_attr.offset; + } + else + return (int)ATTR_STD_NOT_FOUND; +} + CCL_NAMESPACE_END diff --git a/intern/cycles/kernel/osl/osl_shader.h b/intern/cycles/kernel/osl/osl_shader.h index 9ff31e9160b..e614f240dc1 100644 --- a/intern/cycles/kernel/osl/osl_shader.h +++ b/intern/cycles/kernel/osl/osl_shader.h @@ -31,33 +31,27 @@ * This means no thread state must be passed along in the kernel itself. */ -#include <OSL/oslexec.h> -#include <OSL/oslclosure.h> - #include "kernel_types.h" -#include "util_map.h" -#include "util_param.h" -#include "util_vector.h" - CCL_NAMESPACE_BEGIN -namespace OSL = ::OSL; - -class OSLRenderServices; class Scene; + struct ShaderClosure; struct ShaderData; struct differential3; struct KernelGlobals; +struct OSLGlobals; +struct OSLShadingSystem; + class OSLShader { public: /* init */ - static void register_closures(OSL::ShadingSystem *ss); + static void register_closures(OSLShadingSystem *ss); /* per thread data */ - static void thread_init(KernelGlobals *kg); + static void thread_init(KernelGlobals *kg, KernelGlobals *kernel_globals, OSLGlobals *osl_globals); static void thread_free(KernelGlobals *kg); /* eval */ @@ -82,6 +76,9 @@ public: /* release */ static void init(KernelGlobals *kg, ShaderData *sd); static void release(KernelGlobals *kg, ShaderData *sd); + + /* attributes */ + static int find_attribute(KernelGlobals *kg, const ShaderData *sd, uint id); }; CCL_NAMESPACE_END |