Use one context per OSL thread. Not sure if this actually works, but the simple renderer example in OSL does it this way.

This commit is contained in:
Lukas Toenne
2012-09-04 08:53:47 +00:00
parent 71871463a4
commit 6805db676d
6 changed files with 7 additions and 32 deletions

View File

@@ -42,6 +42,7 @@ void OSLShader::thread_init(KernelGlobals *kg)
memset(&tdata->globals, 0, sizeof(OSL::ShaderGlobals));
tdata->thread_info = ss->create_thread_info();
tdata->ctx = ss->get_context(tdata->thread_info);
tls_set(kg->osl.thread_data, tdata);
@@ -54,6 +55,7 @@ void OSLShader::thread_free(KernelGlobals *kg)
OSLGlobals::ThreadData *tdata = tls_get(OSLGlobals::ThreadData, kg->osl.thread_data);
ss->release_context(tdata->ctx);
ss->destroy_thread_info(tdata->thread_info);
delete tdata;
@@ -204,7 +206,7 @@ void OSLShader::eval_surface(KernelGlobals *kg, ShaderData *sd, float randb, int
OSL::ShadingSystem *ss = kg->osl.ss;
OSLGlobals::ThreadData *tdata = tls_get(OSLGlobals::ThreadData, kg->osl.thread_data);
OSL::ShaderGlobals *globals = &tdata->globals;
OSL::ShadingContext *ctx = ss->get_context(tdata->thread_info);
OSL::ShadingContext *ctx = tdata->ctx;
/* setup shader globals from shader data */
sd->osl_ctx = ctx;
@@ -262,7 +264,7 @@ float3 OSLShader::eval_background(KernelGlobals *kg, ShaderData *sd, int path_fl
OSL::ShadingSystem *ss = kg->osl.ss;
OSLGlobals::ThreadData *tdata = tls_get(OSLGlobals::ThreadData, kg->osl.thread_data);
OSL::ShaderGlobals *globals = &tdata->globals;
OSL::ShadingContext *ctx = ss->get_context(tdata->thread_info);
OSL::ShadingContext *ctx = tdata->ctx;
/* setup shader globals from shader data */
sd->osl_ctx = ctx;
@@ -339,7 +341,7 @@ void OSLShader::eval_volume(KernelGlobals *kg, ShaderData *sd, float randb, int
OSL::ShadingSystem *ss = kg->osl.ss;
OSLGlobals::ThreadData *tdata = tls_get(OSLGlobals::ThreadData, kg->osl.thread_data);
OSL::ShaderGlobals *globals = &tdata->globals;
OSL::ShadingContext *ctx = ss->get_context(tdata->thread_info);
OSL::ShadingContext *ctx = tdata->ctx;
/* setup shader globals from shader data */
sd->osl_ctx = ctx;
@@ -363,7 +365,7 @@ void OSLShader::eval_displacement(KernelGlobals *kg, ShaderData *sd)
OSL::ShadingSystem *ss = kg->osl.ss;
OSLGlobals::ThreadData *tdata = tls_get(OSLGlobals::ThreadData, kg->osl.thread_data);
OSL::ShaderGlobals *globals = &tdata->globals;
OSL::ShadingContext *ctx = ss->get_context(tdata->thread_info);
OSL::ShadingContext *ctx = tdata->ctx;
/* setup shader globals from shader data */
sd->osl_ctx = ctx;
@@ -379,13 +381,6 @@ void OSLShader::eval_displacement(KernelGlobals *kg, ShaderData *sd)
sd->P = TO_FLOAT3(globals->P);
}
void OSLShader::release(KernelGlobals *kg, const ShaderData *sd)
{
OSL::ShadingSystem *ss = kg->osl.ss;
ss->release_context((OSL::ShadingContext *)sd->osl_ctx);
}
/* BSDF Closure */
int OSLShader::bsdf_sample(const ShaderData *sd, const ShaderClosure *sc, float randu, float randv, float3& eval, float3& omega_in, differential3& domega_in, float& pdf)