Welcome to mirror list, hosted at ThFree Co, Russian Federation.

git.blender.org/blender.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
path: root/intern
diff options
context:
space:
mode:
Diffstat (limited to 'intern')
-rw-r--r--intern/cycles/kernel/kernel_emission.h3
-rw-r--r--intern/cycles/kernel/kernel_path.h5
-rw-r--r--intern/cycles/kernel/kernel_shader.h10
-rw-r--r--intern/cycles/kernel/osl/osl_globals.h1
-rw-r--r--intern/cycles/kernel/osl/osl_shader.cpp17
-rw-r--r--intern/cycles/kernel/osl/osl_shader.h3
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