Fix #33375: OSL geom:trianglevertices gave wrong coordinates for static BVH.
Also some simple OSL optimization, passing thread data pointer directly instead of via thread local storage, and creating ustrings for attribute lookup.
This commit is contained in:
@@ -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()
|
||||
void OSLShader::thread_init(KernelGlobals *kg, KernelGlobals *kernel_globals, OSLGlobals *osl_globals)
|
||||
{
|
||||
thread_scoped_lock thread_data_lock(thread_data_mutex);
|
||||
/* no osl used? */
|
||||
if(!osl_globals->use) {
|
||||
kg->osl = NULL;
|
||||
return;
|
||||
}
|
||||
|
||||
if(thread_data_users == 0)
|
||||
tls_create(OSLGlobals::ThreadData, thread_data);
|
||||
/* per thread kernel data init*/
|
||||
kg->osl = osl_globals;
|
||||
kg->osl->services->thread_init(kernel_globals);
|
||||
|
||||
thread_data_users++;
|
||||
}
|
||||
|
||||
void OSLGlobals::thread_data_free()
|
||||
{
|
||||
/* thread local storage delete */
|
||||
thread_scoped_lock thread_data_lock(thread_data_mutex);
|
||||
|
||||
thread_data_users--;
|
||||
|
||||
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
|
||||
|
||||
|
Reference in New Issue
Block a user