diff options
author | Brecht Van Lommel <brechtvanlommel@gmail.com> | 2019-02-19 19:44:58 +0300 |
---|---|---|
committer | Brecht Van Lommel <brechtvanlommel@gmail.com> | 2019-03-17 14:01:19 +0300 |
commit | 7778a1a0a12fc026dc5bcc2c195b9460d1c77b53 (patch) | |
tree | f680fdee39ac648faa17dd145e0c521c5bea72fa /intern/cycles/kernel/kernel_shader.h | |
parent | 9c7517fb636da9c5a8b4eead09957f29db1a6687 (diff) |
Cycles: optimization for constant background colors.
Skip shader evaluation then, as we already do for lights. Less than
1% faster in my tests, but might as well be consistent for both.
Diffstat (limited to 'intern/cycles/kernel/kernel_shader.h')
-rw-r--r-- | intern/cycles/kernel/kernel_shader.h | 91 |
1 files changed, 52 insertions, 39 deletions
diff --git a/intern/cycles/kernel/kernel_shader.h b/intern/cycles/kernel/kernel_shader.h index afb9ff11c10..eff792ec53d 100644 --- a/intern/cycles/kernel/kernel_shader.h +++ b/intern/cycles/kernel/kernel_shader.h @@ -984,9 +984,40 @@ ccl_device float3 shader_bssrdf_sum(ShaderData *sd, float3 *N_, float *texture_b } #endif /* __SUBSURFACE__ */ +/* Constant emission optimization */ + +ccl_device bool shader_constant_emission_eval(KernelGlobals *kg, int shader, float3 *eval) +{ + int shader_index = shader & SHADER_MASK; + int shader_flag = kernel_tex_fetch(__shaders, shader_index).flags; + + if (shader_flag & SD_HAS_CONSTANT_EMISSION) { + *eval = make_float3( + kernel_tex_fetch(__shaders, shader_index).constant_emission[0], + kernel_tex_fetch(__shaders, shader_index).constant_emission[1], + kernel_tex_fetch(__shaders, shader_index).constant_emission[2]); + + return true; + } + + return false; +} + +/* Background */ + +ccl_device float3 shader_background_eval(ShaderData *sd) +{ + if(sd->flag & SD_EMISSION) { + return sd->closure_emission_background; + } + else { + return make_float3(0.0f, 0.0f, 0.0f); + } +} + /* Emission */ -ccl_device float3 shader_emissive_eval(KernelGlobals *kg, ShaderData *sd) +ccl_device float3 shader_emissive_eval(ShaderData *sd) { if(sd->flag & SD_EMISSION) { return emissive_simple_eval(sd->Ng, sd->I) * sd->closure_emission_background; @@ -1034,20 +1065,32 @@ ccl_device void shader_eval_surface(KernelGlobals *kg, ShaderData *sd, sd->num_closure_left = max_closures; #ifdef __OSL__ - if(kg->osl) - OSLShader::eval_surface(kg, sd, state, path_flag); + if(kg->osl) { + if (sd->object == OBJECT_NONE) { + OSLShader::eval_background(kg, sd, state, path_flag); + } + else { + OSLShader::eval_surface(kg, sd, state, path_flag); + } + } else #endif { #ifdef __SVM__ svm_eval_nodes(kg, sd, state, SHADER_TYPE_SURFACE, path_flag); #else - DiffuseBsdf *bsdf = (DiffuseBsdf*)bsdf_alloc(sd, - sizeof(DiffuseBsdf), - make_float3(0.8f, 0.8f, 0.8f)); - if(bsdf != NULL) { - bsdf->N = sd->N; - sd->flag |= bsdf_diffuse_setup(bsdf); + if(sd->object == OBJECT_NONE) { + sd->closure_emission_background = make_float3(0.8f, 0.8f, 0.8f); + sd->flag |= SD_EMISSION; + } + else { + DiffuseBsdf *bsdf = (DiffuseBsdf*)bsdf_alloc(sd, + sizeof(DiffuseBsdf), + make_float3(0.8f, 0.8f, 0.8f)); + if(bsdf != NULL) { + bsdf->N = sd->N; + sd->flag |= bsdf_diffuse_setup(bsdf); + } } #endif } @@ -1057,36 +1100,6 @@ ccl_device void shader_eval_surface(KernelGlobals *kg, ShaderData *sd, } } -/* Background Evaluation */ - -ccl_device float3 shader_eval_background(KernelGlobals *kg, ShaderData *sd, - ccl_addr_space PathState *state, int path_flag) -{ - sd->num_closure = 0; - sd->num_closure_left = 0; - -#ifdef __SVM__ -# ifdef __OSL__ - if(kg->osl) { - OSLShader::eval_background(kg, sd, state, path_flag); - } - else -# endif /* __OSL__ */ - { - svm_eval_nodes(kg, sd, state, SHADER_TYPE_SURFACE, path_flag); - } - - if(sd->flag & SD_EMISSION) { - return sd->closure_emission_background; - } - else { - return make_float3(0.0f, 0.0f, 0.0f); - } -#else /* __SVM__ */ - return make_float3(0.8f, 0.8f, 0.8f); -#endif /* __SVM__ */ -} - /* Volume */ #ifdef __VOLUME__ |