[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [50352] trunk/blender/intern/cycles/kernel : Enable compilation of the SVM backend for Cycles even when OSL is enabled .

Lukas Toenne lukas.toenne at googlemail.com
Mon Sep 3 15:56:41 CEST 2012


Revision: 50352
          http://projects.blender.org/scm/viewvc.php?view=rev&root=bf-blender&revision=50352
Author:   lukastoenne
Date:     2012-09-03 13:56:40 +0000 (Mon, 03 Sep 2012)
Log Message:
-----------
Enable compilation of the SVM backend for Cycles even when OSL is enabled. The switch between SVM/OSL is decided at runtime, so the SVM code cannot simply be ignored when OSL is enabled.

Currently all shader functions check the OSL/SVM flag to dispatch to the appropriate backend. If this turns out to be a significant overhead (unlikely) this test should be moved out of the inner loop.

Modified Paths:
--------------
    trunk/blender/intern/cycles/kernel/kernel_shader.h
    trunk/blender/intern/cycles/kernel/kernel_types.h

Modified: trunk/blender/intern/cycles/kernel/kernel_shader.h
===================================================================
--- trunk/blender/intern/cycles/kernel/kernel_shader.h	2012-09-03 13:18:23 UTC (rev 50351)
+++ trunk/blender/intern/cycles/kernel/kernel_shader.h	2012-09-03 13:56:40 UTC (rev 50352)
@@ -30,7 +30,7 @@
 
 #include "osl_shader.h"
 
-#else
+#endif
 
 #include "svm/bsdf.h"
 #include "svm/emissive.h"
@@ -38,7 +38,6 @@
 #include "svm/svm_bsdf.h"
 #include "svm/svm.h"
 
-#endif
 
 CCL_NAMESPACE_BEGIN
 
@@ -294,7 +293,8 @@
 
 #ifdef __MULTI_CLOSURE__
 
-__device_inline void _shader_bsdf_multi_eval(const ShaderData *sd, const float3 omega_in, float *pdf,
+#ifdef __OSL__
+__device_inline void _shader_bsdf_multi_eval_osl(const ShaderData *sd, const float3 omega_in, float *pdf,
 	int skip_bsdf, BsdfEval *bsdf_eval, float sum_pdf, float sum_sample_weight)
 {
 	for(int i = 0; i< sd->num_closure; i++) {
@@ -305,12 +305,36 @@
 
 		if(CLOSURE_IS_BSDF(sc->type)) {
 			float bsdf_pdf = 0.0f;
-#ifdef __OSL__
+
 			float3 eval = OSLShader::bsdf_eval(sd, sc, omega_in, bsdf_pdf);
-#else
-			float3 eval = svm_bsdf_eval(sd, sc, omega_in, &bsdf_pdf);
+
+			if(bsdf_pdf != 0.0f) {
+				bsdf_eval_accum(bsdf_eval, sc->type, eval*sc->weight);
+				sum_pdf += bsdf_pdf*sc->sample_weight;
+			}
+
+			sum_sample_weight += sc->sample_weight;
+		}
+	}
+
+	*pdf = (sum_sample_weight > 0.0f)? sum_pdf/sum_sample_weight: 0.0f;
+}
 #endif
 
+__device_inline void _shader_bsdf_multi_eval_svm(const ShaderData *sd, const float3 omega_in, float *pdf,
+	int skip_bsdf, BsdfEval *bsdf_eval, float sum_pdf, float sum_sample_weight)
+{
+	for(int i = 0; i< sd->num_closure; i++) {
+		if(i == skip_bsdf)
+			continue;
+
+		const ShaderClosure *sc = &sd->closure[i];
+
+		if(CLOSURE_IS_BSDF(sc->type)) {
+			float bsdf_pdf = 0.0f;
+
+			float3 eval = svm_bsdf_eval(sd, sc, omega_in, &bsdf_pdf);
+
 			if(bsdf_pdf != 0.0f) {
 				bsdf_eval_accum(bsdf_eval, sc->type, eval*sc->weight);
 				sum_pdf += bsdf_pdf*sc->sample_weight;
@@ -331,7 +355,12 @@
 #ifdef __MULTI_CLOSURE__
 	bsdf_eval_init(eval, NBUILTIN_CLOSURES, make_float3(0.0f, 0.0f, 0.0f), kernel_data.film.use_light_pass);
 
-	return _shader_bsdf_multi_eval(sd, omega_in, pdf, -1, eval, 0.0f, 0.0f);
+#ifdef __OSL__
+	if (kernel_osl_use(kg))
+		return _shader_bsdf_multi_eval_osl(sd, omega_in, pdf, -1, eval, 0.0f, 0.0f);
+	else
+#endif
+		return _shader_bsdf_multi_eval_svm(sd, omega_in, pdf, -1, eval, 0.0f, 0.0f);
 #else
 	const ShaderClosure *sc = &sd->closure;
 
@@ -384,16 +413,23 @@
 
 	*pdf = 0.0f;
 #ifdef __OSL__
-	label = OSLShader::bsdf_sample(sd, sc, randu, randv, eval, *omega_in, *domega_in, *pdf);
-#else
-	label = svm_bsdf_sample(sd, sc, randu, randv, &eval, omega_in, domega_in, pdf);
+	if (kernel_osl_use(kg))
+		label = OSLShader::bsdf_sample(sd, sc, randu, randv, eval, *omega_in, *domega_in, *pdf);
+	else
 #endif
+		label = svm_bsdf_sample(sd, sc, randu, randv, &eval, omega_in, domega_in, pdf);
+
 	if(*pdf != 0.0f) {
 		bsdf_eval_init(bsdf_eval, sc->type, eval*sc->weight, kernel_data.film.use_light_pass);
 
 		if(sd->num_closure > 1) {
 			float sweight = sc->sample_weight;
-			_shader_bsdf_multi_eval(sd, *omega_in, pdf, sampled, bsdf_eval, *pdf*sweight, sweight);
+#ifdef __OSL__
+			if (kernel_osl_use(kg))
+				_shader_bsdf_multi_eval_osl(sd, *omega_in, pdf, sampled, bsdf_eval, *pdf*sweight, sweight);
+			else
+#endif
+				_shader_bsdf_multi_eval_svm(sd, *omega_in, pdf, sampled, bsdf_eval, *pdf*sweight, sweight);
 		}
 	}
 
@@ -416,10 +452,12 @@
 
 	*pdf = 0.0f;
 #ifdef __OSL__
-	label = OSLShader::bsdf_sample(sd, sc, randu, randv, eval, *omega_in, *domega_in, *pdf);
-#else
-	label = svm_bsdf_sample(sd, sc, randu, randv, &eval, omega_in, domega_in, pdf);
+	if (kernel_osl_use(kg))
+		label = OSLShader::bsdf_sample(sd, sc, randu, randv, eval, *omega_in, *domega_in, *pdf);
+	else
 #endif
+		label = svm_bsdf_sample(sd, sc, randu, randv, &eval, omega_in, domega_in, pdf);
+
 	if(*pdf != 0.0f)
 		bsdf_eval_init(bsdf_eval, sc->type, eval*sc->weight, kernel_data.film.use_light_pass);
 
@@ -539,10 +577,12 @@
 
 		if(CLOSURE_IS_EMISSION(sc->type)) {
 #ifdef __OSL__
-			eval += OSLShader::emissive_eval(sd, sc)*sc->weight;
-#else
-			eval += svm_emissive_eval(sd, sc)*sc->weight;
+			if (kernel_osl_use(kg))
+				eval += OSLShader::emissive_eval(sd, sc)*sc->weight;
+			else
 #endif
+				eval += svm_emissive_eval(sd, sc)*sc->weight;
+
 		}
 	}
 #else
@@ -581,17 +621,18 @@
 	float randb, int path_flag)
 {
 #ifdef __OSL__
-	OSLShader::eval_surface(kg, sd, randb, path_flag);
-#else
-
+	if (kernel_osl_use(kg))
+		OSLShader::eval_surface(kg, sd, randb, path_flag);
+	else
+#endif
+	{
 #ifdef __SVM__
-	svm_eval_nodes(kg, sd, SHADER_TYPE_SURFACE, randb, path_flag);
+		svm_eval_nodes(kg, sd, SHADER_TYPE_SURFACE, randb, path_flag);
 #else
-	bsdf_diffuse_setup(sd, &sd->closure);
-	sd->closure.weight = make_float3(0.8f, 0.8f, 0.8f);
+		bsdf_diffuse_setup(sd, &sd->closure);
+		sd->closure.weight = make_float3(0.8f, 0.8f, 0.8f);
 #endif
-
-#endif
+	}
 }
 
 /* Background Evaluation */
@@ -599,35 +640,37 @@
 __device float3 shader_eval_background(KernelGlobals *kg, ShaderData *sd, int path_flag)
 {
 #ifdef __OSL__
-	return OSLShader::eval_background(kg, sd, path_flag);
-#else
+	if (kernel_osl_use(kg))
+		return OSLShader::eval_background(kg, sd, path_flag);
+	else
+#endif
 
+	{
 #ifdef __SVM__
-	svm_eval_nodes(kg, sd, SHADER_TYPE_SURFACE, 0.0f, path_flag);
+		svm_eval_nodes(kg, sd, SHADER_TYPE_SURFACE, 0.0f, path_flag);
 
 #ifdef __MULTI_CLOSURE__
-	float3 eval = make_float3(0.0f, 0.0f, 0.0f);
+		float3 eval = make_float3(0.0f, 0.0f, 0.0f);
 
-	for(int i = 0; i< sd->num_closure; i++) {
-		const ShaderClosure *sc = &sd->closure[i];
+		for(int i = 0; i< sd->num_closure; i++) {
+			const ShaderClosure *sc = &sd->closure[i];
 
-		if(CLOSURE_IS_BACKGROUND(sc->type))
-			eval += sc->weight;
-	}
+			if(CLOSURE_IS_BACKGROUND(sc->type))
+				eval += sc->weight;
+		}
 
-	return eval;
+		return eval;
 #else
-	if(sd->closure.type == CLOSURE_BACKGROUND_ID)
-		return sd->closure.weight;
-	else
-		return make_float3(0.0f, 0.0f, 0.0f);
+		if(sd->closure.type == CLOSURE_BACKGROUND_ID)
+			return sd->closure.weight;
+		else
+			return make_float3(0.0f, 0.0f, 0.0f);
 #endif
 
 #else
-	return make_float3(0.8f, 0.8f, 0.8f);
+		return make_float3(0.8f, 0.8f, 0.8f);
 #endif
-
-#endif
+	}
 }
 
 /* Volume */
@@ -643,10 +686,11 @@
 
 		if(CLOSURE_IS_VOLUME(sc->type)) {
 #ifdef __OSL__
-			eval += OSLShader::volume_eval_phase(sd, sc, omega_in, omega_out);
-#else
-			eval += volume_eval_phase(sd, sc, omega_in, omega_out);
+			if (kernel_osl_use(kg))
+				eval += OSLShader::volume_eval_phase(sd, sc, omega_in, omega_out);
+			else
 #endif
+				eval += volume_eval_phase(sd, sc, omega_in, omega_out);
 		}
 	}
 
@@ -663,10 +707,11 @@
 {
 #ifdef __SVM__
 #ifdef __OSL__
-	OSLShader::eval_volume(kg, sd, randb, path_flag);
-#else
-	svm_eval_nodes(kg, sd, SHADER_TYPE_VOLUME, randb, path_flag);
+	if (kernel_osl_use(kg))
+		OSLShader::eval_volume(kg, sd, randb, path_flag);
+	else
 #endif
+		svm_eval_nodes(kg, sd, SHADER_TYPE_VOLUME, randb, path_flag);
 #endif
 }
 
@@ -677,10 +722,11 @@
 	/* this will modify sd->P */
 #ifdef __SVM__
 #ifdef __OSL__
-	OSLShader::eval_displacement(kg, sd);
-#else
-	svm_eval_nodes(kg, sd, SHADER_TYPE_DISPLACEMENT, 0.0f, 0);
+	if (kernel_osl_use(kg))
+		OSLShader::eval_displacement(kg, sd);
+	else
 #endif
+		svm_eval_nodes(kg, sd, SHADER_TYPE_DISPLACEMENT, 0.0f, 0);
 #endif
 }
 
@@ -732,7 +778,8 @@
 __device void shader_release(KernelGlobals *kg, ShaderData *sd)
 {
 #ifdef __OSL__
-	OSLShader::release(kg, sd);
+	if (kernel_osl_use(kg))
+		OSLShader::release(kg, sd);
 #endif
 }
 

Modified: trunk/blender/intern/cycles/kernel/kernel_types.h
===================================================================
--- trunk/blender/intern/cycles/kernel/kernel_types.h	2012-09-03 13:18:23 UTC (rev 50351)
+++ trunk/blender/intern/cycles/kernel/kernel_types.h	2012-09-03 13:56:40 UTC (rev 50352)
@@ -382,10 +382,9 @@
 
 #ifdef __OSL__
 	void *prim;
-#else
+#endif
 	float data0;
 	float data1;
-#endif
 
 } ShaderClosure;
 




More information about the Bf-blender-cvs mailing list