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
diff options
context:
space:
mode:
authorSergey Sharybin <sergey.vfx@gmail.com>2016-01-20 00:51:43 +0300
committerSergey Sharybin <sergey.vfx@gmail.com>2016-01-20 00:53:19 +0300
commit19adfd3176966cbe72f55f68bf28b04e41e96e09 (patch)
tree6ecbfae4dc6aa3261c77acc3166ca86f3279cc0d /intern/cycles/kernel/kernel_bake.h
parent52e34ffe333e1de83540555b6fcf2ff2b4532bc8 (diff)
Cycles: Fix OpenCL kernel compilation after the bake commit
There is no function pointers in OpenCL specification. For as long as we want to support this platform we should follow the specifications. While the code is not totally optimal now, it should not be that huge of performance issue on CPU since it does jump tables just nicely, so it's not that much extra computation here.
Diffstat (limited to 'intern/cycles/kernel/kernel_bake.h')
-rw-r--r--intern/cycles/kernel/kernel_bake.h67
1 files changed, 58 insertions, 9 deletions
diff --git a/intern/cycles/kernel/kernel_bake.h b/intern/cycles/kernel/kernel_bake.h
index 31e58de0b48..4e4b63a2e1d 100644
--- a/intern/cycles/kernel/kernel_bake.h
+++ b/intern/cycles/kernel/kernel_bake.h
@@ -214,9 +214,34 @@ ccl_device_inline float bake_clamp_mirror_repeat(float u)
return (((int)fu) & 1)? 1.0f - u: u;
}
-ccl_device float3 kernel_bake_evaluate_direct_indirect(KernelGlobals *kg, ShaderData *sd, PathState *state,
- float3 (*shader_bsdf)(KernelGlobals *kg, ShaderData *sd),
- float3 direct, float3 indirect, const int pass_filter)
+ccl_device_inline float3 kernel_bake_shader_bsdf(KernelGlobals *kg,
+ ShaderData *sd,
+ const ShaderEvalType type)
+{
+ switch(type) {
+ case SHADER_EVAL_DIFFUSE:
+ return shader_bsdf_diffuse(kg, sd);
+ case SHADER_EVAL_GLOSSY:
+ return shader_bsdf_glossy(kg, sd);
+ case SHADER_EVAL_TRANSMISSION:
+ return shader_bsdf_transmission(kg, sd);
+#ifdef __SUBSURFACE__
+ case SHADER_EVAL_SUBSURFACE:
+ return shader_bsdf_subsurface(kg, sd);
+#endif
+ default:
+ kernel_assert(!"Unknown bake type passed to BSDF evaluate");
+ return make_float3(0.0f, 0.0f, 0.0f);
+ }
+}
+
+ccl_device float3 kernel_bake_evaluate_direct_indirect(KernelGlobals *kg,
+ ShaderData *sd,
+ PathState *state,
+ float3 direct,
+ float3 indirect,
+ const ShaderEvalType type,
+ const int pass_filter)
{
float3 color;
const bool is_color = (pass_filter & BAKE_FILTER_COLOR) != 0;
@@ -232,12 +257,12 @@ ccl_device float3 kernel_bake_evaluate_direct_indirect(KernelGlobals *kg, Shader
else {
/* surface color of the pass only */
shader_eval_surface(kg, sd, state, 0.0f, 0, SHADER_CONTEXT_MAIN);
- return shader_bsdf(kg, sd);
+ return kernel_bake_shader_bsdf(kg, sd, type);
}
}
else {
shader_eval_surface(kg, sd, state, 0.0f, 0, SHADER_CONTEXT_MAIN);
- color = shader_bsdf(kg, sd);
+ color = kernel_bake_shader_bsdf(kg, sd, type);
}
if(is_direct) {
@@ -411,23 +436,47 @@ ccl_device void kernel_bake_evaluate(KernelGlobals *kg, ccl_global uint4 *input,
}
case SHADER_EVAL_DIFFUSE:
{
- out = kernel_bake_evaluate_direct_indirect(kg, &sd, &state, &shader_bsdf_diffuse, L.direct_diffuse, L.indirect_diffuse, pass_filter);
+ out = kernel_bake_evaluate_direct_indirect(kg,
+ &sd,
+ &state,
+ L.direct_diffuse,
+ L.indirect_diffuse,
+ type,
+ pass_filter);
break;
}
case SHADER_EVAL_GLOSSY:
{
- out = kernel_bake_evaluate_direct_indirect(kg, &sd, &state, &shader_bsdf_glossy, L.direct_glossy, L.indirect_glossy, pass_filter);
+ out = kernel_bake_evaluate_direct_indirect(kg,
+ &sd,
+ &state,
+ L.direct_glossy,
+ L.indirect_glossy,
+ type,
+ pass_filter);
break;
}
case SHADER_EVAL_TRANSMISSION:
{
- out = kernel_bake_evaluate_direct_indirect(kg, &sd, &state, &shader_bsdf_transmission, L.direct_transmission, L.indirect_transmission, pass_filter);
+ out = kernel_bake_evaluate_direct_indirect(kg,
+ &sd,
+ &state,
+ L.direct_transmission,
+ L.indirect_transmission,
+ type,
+ pass_filter);
break;
}
case SHADER_EVAL_SUBSURFACE:
{
#ifdef __SUBSURFACE__
- out = kernel_bake_evaluate_direct_indirect(kg, &sd, &state, &shader_bsdf_subsurface, L.direct_subsurface, L.indirect_subsurface, pass_filter);
+ out = kernel_bake_evaluate_direct_indirect(kg,
+ &sd,
+ &state,
+ L.direct_subsurface,
+ L.indirect_subsurface,
+ type,
+ pass_filter);
#endif
break;
}