[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