[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