diff options
Diffstat (limited to 'intern')
-rw-r--r-- | intern/cycles/kernel/kernel_emission.h | 3 | ||||
-rw-r--r-- | intern/cycles/kernel/kernel_path.h | 5 | ||||
-rw-r--r-- | intern/cycles/kernel/kernel_shader.h | 10 | ||||
-rw-r--r-- | intern/cycles/kernel/osl/osl_globals.h | 1 | ||||
-rw-r--r-- | intern/cycles/kernel/osl/osl_shader.cpp | 17 | ||||
-rw-r--r-- | intern/cycles/kernel/osl/osl_shader.h | 3 |
6 files changed, 32 insertions, 7 deletions
diff --git a/intern/cycles/kernel/kernel_emission.h b/intern/cycles/kernel/kernel_emission.h index 9032d7d4a41..53d53b4bedd 100644 --- a/intern/cycles/kernel/kernel_emission.h +++ b/intern/cycles/kernel/kernel_emission.h @@ -54,6 +54,8 @@ __device float3 direct_emissive_eval(KernelGlobals *kg, float rando, eval = make_float3(0.0f, 0.0f, 0.0f); } + shader_release(kg, &sd); + return eval; } @@ -162,6 +164,7 @@ __device float3 indirect_background(KernelGlobals *kg, Ray *ray, int path_flag, ShaderData sd; shader_setup_from_background(kg, &sd, ray); float3 L = shader_eval_background(kg, &sd, path_flag); + shader_release(kg, &sd); #ifdef __BACKGROUND_MIS__ /* check if background light exists or if we should skip pdf */ diff --git a/intern/cycles/kernel/kernel_path.h b/intern/cycles/kernel/kernel_path.h index 8e3a0c6e628..6c81fa4cfca 100644 --- a/intern/cycles/kernel/kernel_path.h +++ b/intern/cycles/kernel/kernel_path.h @@ -395,6 +395,8 @@ __device float4 kernel_path_progressive(KernelGlobals *kg, RNG *rng, int sample, label = shader_bsdf_sample(kg, &sd, bsdf_u, bsdf_v, &bsdf_eval, &bsdf_omega_in, &bsdf_domega_in, &bsdf_pdf); + shader_release(kg, &sd); + if(bsdf_pdf == 0.0f || bsdf_eval_is_zero(&bsdf_eval)) break; @@ -567,6 +569,8 @@ __device void kernel_path_indirect(KernelGlobals *kg, RNG *rng, int sample, Ray label = shader_bsdf_sample(kg, &sd, bsdf_u, bsdf_v, &bsdf_eval, &bsdf_omega_in, &bsdf_domega_in, &bsdf_pdf); + shader_release(kg, &sd); + if(bsdf_pdf == 0.0f || bsdf_eval_is_zero(&bsdf_eval)) break; @@ -858,6 +862,7 @@ __device float4 kernel_path_non_progressive(KernelGlobals *kg, RNG *rng, int sam /* continue in case of transparency */ throughput *= shader_bsdf_transparency(kg, &sd); + shader_release(kg, &sd); if(is_zero(throughput)) break; diff --git a/intern/cycles/kernel/kernel_shader.h b/intern/cycles/kernel/kernel_shader.h index e3e45e62451..5ab3c2c2545 100644 --- a/intern/cycles/kernel/kernel_shader.h +++ b/intern/cycles/kernel/kernel_shader.h @@ -773,5 +773,15 @@ __device void shader_merge_closures(KernelGlobals *kg, ShaderData *sd) } #endif +/* Free ShaderData */ + +__device void shader_release(KernelGlobals *kg, ShaderData *sd) +{ +#ifdef __OSL__ + if (kernel_osl_use(kg)) + OSLShader::release(kg, sd); +#endif +} + CCL_NAMESPACE_END diff --git a/intern/cycles/kernel/osl/osl_globals.h b/intern/cycles/kernel/osl/osl_globals.h index 17cee675177..075c68824e6 100644 --- a/intern/cycles/kernel/osl/osl_globals.h +++ b/intern/cycles/kernel/osl/osl_globals.h @@ -64,7 +64,6 @@ struct OSLGlobals { struct ThreadData { OSL::ShaderGlobals globals; OSL::PerThreadInfo *thread_info; - OSL::ShadingContext *ctx; }; static tls_ptr(ThreadData, thread_data); diff --git a/intern/cycles/kernel/osl/osl_shader.cpp b/intern/cycles/kernel/osl/osl_shader.cpp index 7d6732b9e56..a7c21e7b595 100644 --- a/intern/cycles/kernel/osl/osl_shader.cpp +++ b/intern/cycles/kernel/osl/osl_shader.cpp @@ -42,7 +42,6 @@ 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); @@ -55,7 +54,6 @@ 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; @@ -206,7 +204,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 = tdata->ctx; + OSL::ShadingContext *ctx = ss->get_context(tdata->thread_info); /* setup shader globals from shader data */ sd->osl_ctx = ctx; @@ -264,7 +262,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 = tdata->ctx; + OSL::ShadingContext *ctx = ss->get_context(tdata->thread_info); /* setup shader globals from shader data */ sd->osl_ctx = ctx; @@ -341,7 +339,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 = tdata->ctx; + OSL::ShadingContext *ctx = ss->get_context(tdata->thread_info); /* setup shader globals from shader data */ sd->osl_ctx = ctx; @@ -365,7 +363,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 = tdata->ctx; + OSL::ShadingContext *ctx = ss->get_context(tdata->thread_info); /* setup shader globals from shader data */ sd->osl_ctx = ctx; @@ -381,6 +379,13 @@ 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) diff --git a/intern/cycles/kernel/osl/osl_shader.h b/intern/cycles/kernel/osl/osl_shader.h index a888335aad6..815557ed203 100644 --- a/intern/cycles/kernel/osl/osl_shader.h +++ b/intern/cycles/kernel/osl/osl_shader.h @@ -77,6 +77,9 @@ public: static float3 volume_eval_phase(const ShaderData *sd, const ShaderClosure *sc, const float3 omega_in, const float3 omega_out); + + /* release */ + static void release(KernelGlobals *kg, const ShaderData *sd); }; CCL_NAMESPACE_END |