[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [50410] trunk/blender/intern/cycles/kernel : Fix for OSL memory leak.
Lukas Toenne
lukas.toenne at googlemail.com
Wed Sep 5 10:12:23 CEST 2012
Revision: 50410
http://projects.blender.org/scm/viewvc.php?view=rev&root=bf-blender&revision=50410
Author: lukastoenne
Date: 2012-09-05 08:12:22 +0000 (Wed, 05 Sep 2012)
Log Message:
-----------
Fix for OSL memory leak. The context creation for OSL is now done in the shader_setup_* functions, since it should specific to the sample being worked on. The the context release then happens in the kernel_shader functions after shader evaluation is done. Care has to be taken to ensure the shader_release function is also called in cases where the path integration is cancelled early, this was the main cause for unreleased contexts and subsequent new allocations.
Modified Paths:
--------------
trunk/blender/intern/cycles/kernel/kernel_displace.h
trunk/blender/intern/cycles/kernel/kernel_path.h
trunk/blender/intern/cycles/kernel/kernel_shader.h
trunk/blender/intern/cycles/kernel/osl/osl_shader.cpp
trunk/blender/intern/cycles/kernel/osl/osl_shader.h
Modified: trunk/blender/intern/cycles/kernel/kernel_displace.h
===================================================================
--- trunk/blender/intern/cycles/kernel/kernel_displace.h 2012-09-05 04:16:09 UTC (rev 50409)
+++ trunk/blender/intern/cycles/kernel/kernel_displace.h 2012-09-05 08:12:22 UTC (rev 50410)
@@ -63,6 +63,8 @@
out = shader_eval_background(kg, &sd, flag);
}
+ shader_release(kg, &sd);
+
/* write output */
output[i] = make_float4(out.x, out.y, out.z, 0.0f);
}
Modified: trunk/blender/intern/cycles/kernel/kernel_path.h
===================================================================
--- trunk/blender/intern/cycles/kernel/kernel_path.h 2012-09-05 04:16:09 UTC (rev 50409)
+++ trunk/blender/intern/cycles/kernel/kernel_path.h 2012-09-05 08:12:22 UTC (rev 50410)
@@ -209,6 +209,8 @@
if(ray->t != FLT_MAX)
ray->D = normalize_len(Pend - ray->P, &ray->t);
+ shader_release(kg, &sd);
+
bounce++;
}
}
@@ -294,8 +296,10 @@
L_transparent += average(holdout_weight*throughput);
}
- if(sd.flag & SD_HOLDOUT_MASK)
+ if(sd.flag & SD_HOLDOUT_MASK) {
+ shader_release(kg, &sd);
break;
+ }
}
#endif
@@ -313,8 +317,10 @@
float probability = path_state_terminate_probability(kg, &state, throughput);
float terminate = path_rng(kg, rng, sample, rng_offset + PRNG_TERMINATE);
- if(terminate >= probability)
+ if(terminate >= probability) {
+ shader_release(kg, &sd);
break;
+ }
throughput /= probability;
@@ -380,8 +386,10 @@
#endif
/* no BSDF? we can stop here */
- if(!(sd.flag & SD_BSDF))
+ if(!(sd.flag & SD_BSDF)) {
+ shader_release(kg, &sd);
break;
+ }
/* sample BSDF */
float bsdf_pdf;
@@ -486,8 +494,10 @@
float probability = path_state_terminate_probability(kg, &state, throughput);
float terminate = path_rng(kg, rng, sample, rng_offset + PRNG_TERMINATE);
- if(terminate >= probability)
+ if(terminate >= probability) {
+ shader_release(kg, &sd);
break;
+ }
throughput /= probability;
@@ -554,8 +564,10 @@
#endif
/* no BSDF? we can stop here */
- if(!(sd.flag & SD_BSDF))
+ if(!(sd.flag & SD_BSDF)) {
+ shader_release(kg, &sd);
break;
+ }
/* sample BSDF */
float bsdf_pdf;
@@ -661,8 +673,10 @@
L_transparent += average(holdout_weight*throughput);
}
- if(sd.flag & SD_HOLDOUT_MASK)
+ if(sd.flag & SD_HOLDOUT_MASK) {
+ shader_release(kg, &sd);
break;
+ }
}
#endif
@@ -682,8 +696,10 @@
float probability = path_state_terminate_probability(kg, &state, throughput);
float terminate = path_rng(kg, rng, sample, rng_offset + PRNG_TERMINATE);
- if(terminate >= probability)
+ if(terminate >= probability) {
+ shader_release(kg, &sd);
break;
+ }
throughput /= probability;
}
Modified: trunk/blender/intern/cycles/kernel/kernel_shader.h
===================================================================
--- trunk/blender/intern/cycles/kernel/kernel_shader.h 2012-09-05 04:16:09 UTC (rev 50409)
+++ trunk/blender/intern/cycles/kernel/kernel_shader.h 2012-09-05 08:12:22 UTC (rev 50410)
@@ -46,6 +46,11 @@
__device_inline void shader_setup_from_ray(KernelGlobals *kg, ShaderData *sd,
const Intersection *isect, const Ray *ray)
{
+#ifdef __OSL__
+ if (kernel_osl_use(kg))
+ OSLShader::init(kg, sd);
+#endif
+
/* fetch triangle data */
int prim = kernel_tex_fetch(__prim_index, isect->prim);
float4 Ns = kernel_tex_fetch(__tri_normal, prim);
@@ -129,6 +134,11 @@
const float3 P, const float3 Ng, const float3 I,
int shader, int object, int prim, float u, float v, float t, float time)
{
+#ifdef __OSL__
+ if (kernel_osl_use(kg))
+ OSLShader::init(kg, sd);
+#endif
+
/* vectors */
sd->P = P;
sd->N = Ng;
@@ -233,6 +243,8 @@
__device void shader_setup_from_displace(KernelGlobals *kg, ShaderData *sd,
int object, int prim, float u, float v)
{
+ /* Note: no OSLShader::init call here, this is done in shader_setup_from_sample! */
+
float3 P, Ng, I = make_float3(0.0f, 0.0f, 0.0f);
int shader;
@@ -251,6 +263,11 @@
__device_inline void shader_setup_from_background(KernelGlobals *kg, ShaderData *sd, const Ray *ray)
{
+#ifdef __OSL__
+ if (kernel_osl_use(kg))
+ OSLShader::init(kg, sd);
+#endif
+
/* vectors */
sd->P = ray->D;
sd->N = -sd->P;
Modified: trunk/blender/intern/cycles/kernel/osl/osl_shader.cpp
===================================================================
--- trunk/blender/intern/cycles/kernel/osl/osl_shader.cpp 2012-09-05 04:16:09 UTC (rev 50409)
+++ trunk/blender/intern/cycles/kernel/osl/osl_shader.cpp 2012-09-05 08:12:22 UTC (rev 50410)
@@ -204,10 +204,9 @@
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 = (OSL::ShadingContext *)sd->osl_ctx;
/* setup shader globals from shader data */
- sd->osl_ctx = ctx;
shaderdata_to_shaderglobals(kg, sd, path_flag, globals);
/* execute shader for this point */
@@ -262,10 +261,9 @@
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 = (OSL::ShadingContext *)sd->osl_ctx;
/* setup shader globals from shader data */
- sd->osl_ctx = ctx;
shaderdata_to_shaderglobals(kg, sd, path_flag, globals);
/* execute shader for this point */
@@ -339,10 +337,9 @@
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 = (OSL::ShadingContext *)sd->osl_ctx;
/* setup shader globals from shader data */
- sd->osl_ctx = ctx;
shaderdata_to_shaderglobals(kg, sd, path_flag, globals);
/* execute shader */
@@ -363,10 +360,9 @@
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 = (OSL::ShadingContext *)sd->osl_ctx;
/* setup shader globals from shader data */
- sd->osl_ctx = ctx;
shaderdata_to_shaderglobals(kg, sd, 0, globals);
/* execute shader */
@@ -379,10 +375,18 @@
sd->P = TO_FLOAT3(globals->P);
}
-void OSLShader::release(KernelGlobals *kg, const 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);
+ sd->osl_ctx = ss->get_context(tdata->thread_info);
+}
+
+void OSLShader::release(KernelGlobals *kg, ShaderData *sd)
+{
+ OSL::ShadingSystem *ss = kg->osl.ss;
+
ss->release_context((OSL::ShadingContext *)sd->osl_ctx);
}
Modified: trunk/blender/intern/cycles/kernel/osl/osl_shader.h
===================================================================
--- trunk/blender/intern/cycles/kernel/osl/osl_shader.h 2012-09-05 04:16:09 UTC (rev 50409)
+++ trunk/blender/intern/cycles/kernel/osl/osl_shader.h 2012-09-05 08:12:22 UTC (rev 50410)
@@ -79,7 +79,8 @@
const float3 omega_in, const float3 omega_out);
/* release */
- static void release(KernelGlobals *kg, const ShaderData *sd);
+ static void init(KernelGlobals *kg, ShaderData *sd);
+ static void release(KernelGlobals *kg, ShaderData *sd);
};
CCL_NAMESPACE_END
More information about the Bf-blender-cvs
mailing list