Commit: 469447f7077e42ec73d71e51f8f6bebc918fdfa6
Author: Thomas Dinges
Date:   Fri Feb 5 22:13:51 2016 +0100
Branches: master
https://developer.blender.org/rB469447f7077e42ec73d71e51f8f6bebc918fdfa6

Cycles: Auto disable World MIS, if we only use a simple color.

When World MIS is enabled by the user, we now check if we actually need it.
In case of a simple node setup (no procedurals, no HDRs..) we auto disable MIS 
internally to save render time.

This change is important for upcoming default changes.

===================================================================

M       intern/cycles/render/light.cpp
M       intern/cycles/render/osl.cpp
M       intern/cycles/render/shader.cpp
M       intern/cycles/render/shader.h
M       intern/cycles/render/svm.cpp

===================================================================

diff --git a/intern/cycles/render/light.cpp b/intern/cycles/render/light.cpp
index 4e96261..4212cc5 100644
--- a/intern/cycles/render/light.cpp
+++ b/intern/cycles/render/light.cpp
@@ -556,13 +556,28 @@ void LightManager::device_update_points(Device *device, 
DeviceScene *dscene, Sce
        if(scene->lights.size() == 0)
                return;
 
-       /* remove background light? */
-       if(!(device->info.advanced_shading)) {
-               foreach(Light *light, scene->lights) {
-                       if(light->type == LIGHT_BACKGROUND) {
+       /* Do we have a portal? */
+       bool has_portal = false;
+       foreach(Light *light, scene->lights) {
+               if(light->is_portal) {
+                       has_portal = true;
+                       break;
+               }
+       }
+
+       /* Remove background light:
+        * - If unsupported on a device
+        * - If we don't need it (no HDRs etc.)
+        */
+       foreach(Light *light, scene->lights) {
+               if(light->type == LIGHT_BACKGROUND) {
+                       Shader *shader = 
scene->shaders[scene->background->shader];
+                       bool auto_disable_mis = (!has_portal && 
!shader->has_surface_spatial_varying);
+                       if(!(device->info.advanced_shading) || 
auto_disable_mis) {
+                               VLOG(1) << "Background MIS has been disabled. 
\n";
                                
scene->lights.erase(std::remove(scene->lights.begin(), scene->lights.end(), 
light), scene->lights.end());
-                               break;
                        }
+                       break;
                }
        }
 
@@ -740,7 +755,7 @@ void LightManager::device_update_points(Device *device, 
DeviceScene *dscene, Sce
 
 void LightManager::device_update(Device *device, DeviceScene *dscene, Scene 
*scene, Progress& progress)
 {
-       VLOG(1) << "Total " << scene->lights.size() << " lights.";
+       int lights_size = scene->lights.size();
 
        if(!need_update)
                return;
@@ -764,6 +779,11 @@ void LightManager::device_update(Device *device, 
DeviceScene *dscene, Scene *sce
        }
 
        need_update = false;
+
+       if(lights_size != scene->lights.size())
+               VLOG(1) << "Total " << scene->lights.size() << " lights (" << 
lights_size << " before optimization).";
+       else
+               VLOG(1) << "Total " << scene->lights.size() << " lights.";
 }
 
 void LightManager::device_free(Device *device, DeviceScene *dscene)
diff --git a/intern/cycles/render/osl.cpp b/intern/cycles/render/osl.cpp
index 81c706c..67b07f1 100644
--- a/intern/cycles/render/osl.cpp
+++ b/intern/cycles/render/osl.cpp
@@ -570,14 +570,20 @@ void OSLCompiler::add(ShaderNode *node, const char *name, 
bool isfilepath)
        /* test if we shader contains specific closures */
        OSLShaderInfo *info = 
((OSLShaderManager*)manager)->shader_loaded_info(name);
 
-       if(info && current_type == SHADER_TYPE_SURFACE) {
-               if(info->has_surface_emission)
-                       current_shader->has_surface_emission = true;
-               if(info->has_surface_transparent)
-                       current_shader->has_surface_transparent = true;
-               if(info->has_surface_bssrdf) {
-                       current_shader->has_surface_bssrdf = true;
-                       current_shader->has_bssrdf_bump = true; /* can't detect 
yet */
+       if(current_type == SHADER_TYPE_SURFACE) {
+               if(info) {
+                       if(info->has_surface_emission)
+                               current_shader->has_surface_emission = true;
+                       if(info->has_surface_transparent)
+                               current_shader->has_surface_transparent = true;
+                       if(info->has_surface_bssrdf) {
+                               current_shader->has_surface_bssrdf = true;
+                               current_shader->has_bssrdf_bump = true; /* 
can't detect yet */
+                       }
+               }
+
+               if(node->has_spatial_varying()) {
+                       current_shader->has_surface_spatial_varying = true;
                }
        }
        else if(current_type == SHADER_TYPE_VOLUME) {
@@ -752,6 +758,8 @@ void OSLCompiler::generate_nodes(const ShaderNodeSet& nodes)
                                                        
current_shader->has_surface_emission = true;
                                                
if(node->has_surface_transparent())
                                                        
current_shader->has_surface_transparent = true;
+                                               if(node->has_spatial_varying())
+                                                       
current_shader->has_surface_spatial_varying = true;
                                                if(node->has_surface_bssrdf()) {
                                                        
current_shader->has_surface_bssrdf = true;
                                                        
if(node->has_bssrdf_bump())
@@ -839,6 +847,7 @@ void OSLCompiler::compile(Scene *scene, OSLGlobals *og, 
Shader *shader)
                shader->has_bssrdf_bump = false;
                shader->has_volume = false;
                shader->has_displacement = false;
+               shader->has_surface_spatial_varying = false;
                shader->has_volume_spatial_varying = false;
                shader->has_object_dependency = false;
                shader->has_integrator_dependency = false;
diff --git a/intern/cycles/render/shader.cpp b/intern/cycles/render/shader.cpp
index 6852d3f..0b3509f 100644
--- a/intern/cycles/render/shader.cpp
+++ b/intern/cycles/render/shader.cpp
@@ -152,6 +152,7 @@ Shader::Shader()
        has_volume = false;
        has_displacement = false;
        has_bssrdf_bump = false;
+       has_surface_spatial_varying = false;
        has_volume_spatial_varying = false;
        has_object_dependency = false;
        has_integrator_dependency = false;
diff --git a/intern/cycles/render/shader.h b/intern/cycles/render/shader.h
index 5b8c531..cc83ad0 100644
--- a/intern/cycles/render/shader.h
+++ b/intern/cycles/render/shader.h
@@ -106,6 +106,7 @@ public:
        bool has_displacement;
        bool has_surface_bssrdf;
        bool has_bssrdf_bump;
+       bool has_surface_spatial_varying;
        bool has_volume_spatial_varying;
        bool has_object_dependency;
        bool has_integrator_dependency;
diff --git a/intern/cycles/render/svm.cpp b/intern/cycles/render/svm.cpp
index d715419..f3d39c1 100644
--- a/intern/cycles/render/svm.cpp
+++ b/intern/cycles/render/svm.cpp
@@ -397,7 +397,11 @@ void SVMCompiler::generate_node(ShaderNode *node, 
ShaderNodeSet& done)
        stack_clear_users(node, done);
        stack_clear_temporary(node);
 
-       if(current_type == SHADER_TYPE_VOLUME) {
+       if(current_type == SHADER_TYPE_SURFACE) {
+               if(node->has_spatial_varying())
+                       current_shader->has_surface_spatial_varying = true;
+       }
+       else if(current_type == SHADER_TYPE_VOLUME) {
                if(node->has_spatial_varying())
                        current_shader->has_volume_spatial_varying = true;
        }
@@ -761,6 +765,7 @@ void SVMCompiler::compile(Scene *scene,
        shader->has_bssrdf_bump = false;
        shader->has_volume = false;
        shader->has_displacement = false;
+       shader->has_surface_spatial_varying = false;
        shader->has_volume_spatial_varying = false;
        shader->has_object_dependency = false;
        shader->has_integrator_dependency = false;

_______________________________________________
Bf-blender-cvs mailing list
[email protected]
http://lists.blender.org/mailman/listinfo/bf-blender-cvs

Reply via email to