Commit: 9f1c42392e4ae8dfaa91ef8cc32119199ca7d723
Author: Mai Lavelle
Date:   Tue Aug 16 19:42:08 2016 -0400
Branches: master
https://developer.blender.org/rB9f1c42392e4ae8dfaa91ef8cc32119199ca7d723

Cycles: remove duplicate shader storage

Storing multiple copies of a shader was needed when the displacement method was
a mesh option and could be different for each mesh. Now that its a shader option
this is unnecessary.

Reviewed By: brecht

Differential Revision: https://developer.blender.org/D2156

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

M       intern/cycles/render/mesh.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/mesh.cpp b/intern/cycles/render/mesh.cpp
index 00987f3..f99454e 100644
--- a/intern/cycles/render/mesh.cpp
+++ b/intern/cycles/render/mesh.cpp
@@ -610,7 +610,7 @@ void Mesh::pack_normals(Scene *scene, uint *tri_shader, 
float4 *vnormal)
                        last_smooth = smooth[i];
                        Shader *shader = (last_shader < used_shaders.size()) ?
                                used_shaders[last_shader] : 
scene->default_surface;
-                       shader_id = 
scene->shader_manager->get_shader_id(shader, this, last_smooth);
+                       shader_id = 
scene->shader_manager->get_shader_id(shader, last_smooth);
                }
 
                tri_shader[i] = shader_id;
@@ -679,7 +679,7 @@ void Mesh::pack_curves(Scene *scene, float4 *curve_key_co, 
float4 *curve_data, s
                int shader_id = curve_shader[i];
                Shader *shader = (shader_id < used_shaders.size()) ?
                        used_shaders[shader_id] : scene->default_surface;
-               shader_id = scene->shader_manager->get_shader_id(shader, this, 
false);
+               shader_id = scene->shader_manager->get_shader_id(shader, false);
 
                curve_data[i] = make_float4(
                        __int_as_float(curve.first_key + curvekey_offset),
diff --git a/intern/cycles/render/osl.cpp b/intern/cycles/render/osl.cpp
index 1a6ae5f..8d5e295 100644
--- a/intern/cycles/render/osl.cpp
+++ b/intern/cycles/render/osl.cpp
@@ -1146,13 +1146,14 @@ void OSLCompiler::compile(Scene *scene, OSLGlobals *og, 
Shader *shader)
        }
 
        /* push state to array for lookup */
-       og->surface_state.push_back(shader->osl_surface_ref);
-       og->surface_state.push_back(shader->osl_surface_bump_ref);
+       if(shader->displacement_method == DISPLACE_TRUE || !shader->graph_bump) 
{
+               og->surface_state.push_back(shader->osl_surface_ref);
+       }
+       else {
+               og->surface_state.push_back(shader->osl_surface_bump_ref);
+       }
 
        og->volume_state.push_back(shader->osl_volume_ref);
-       og->volume_state.push_back(shader->osl_volume_ref);
-
-       og->displacement_state.push_back(shader->osl_displacement_ref);
        og->displacement_state.push_back(shader->osl_displacement_ref);
 }
 
diff --git a/intern/cycles/render/shader.cpp b/intern/cycles/render/shader.cpp
index d000cca..4a3233a 100644
--- a/intern/cycles/render/shader.cpp
+++ b/intern/cycles/render/shader.cpp
@@ -312,14 +312,11 @@ uint ShaderManager::get_attribute_id(AttributeStandard 
std)
        return (uint)std;
 }
 
-int ShaderManager::get_shader_id(Shader *shader, Mesh *mesh, bool smooth)
+int ShaderManager::get_shader_id(Shader *shader, bool smooth)
 {
        /* get a shader id to pass to the kernel */
-       int id = shader->id*2;
-       
-       /* index depends bump since this setting is not in the shader */
-       if(mesh && shader->displacement_method != DISPLACE_TRUE)
-               id += 1;
+       int id = shader->id;
+
        /* smooth flag */
        if(smooth)
                id |= SHADER_SMOOTH_NORMAL;
@@ -368,7 +365,7 @@ void ShaderManager::device_update_common(Device *device,
        if(scene->shaders.size() == 0)
                return;
 
-       uint shader_flag_size = scene->shaders.size()*4;
+       uint shader_flag_size = scene->shaders.size()*2;
        uint *shader_flag = dscene->shader_flag.resize(shader_flag_size);
        uint i = 0;
        bool has_volumes = false;
@@ -407,14 +404,11 @@ void ShaderManager::device_update_common(Device *device,
                if(shader->graph_bump)
                        flag |= SD_HAS_BUMP;
 
-               /* regular shader */
-               shader_flag[i++] = flag;
-               shader_flag[i++] = shader->pass_id;
-
                /* shader with bump mapping */
-               if(shader->graph_bump)
+               if(shader->displacement_method != DISPLACE_TRUE && 
shader->graph_bump)
                        flag |= SD_HAS_BSSRDF_BUMP;
 
+               /* regular shader */
                shader_flag[i++] = flag;
                shader_flag[i++] = shader->pass_id;
 
diff --git a/intern/cycles/render/shader.h b/intern/cycles/render/shader.h
index 060ad70..696e22b 100644
--- a/intern/cycles/render/shader.h
+++ b/intern/cycles/render/shader.h
@@ -173,7 +173,7 @@ public:
        uint get_attribute_id(AttributeStandard std);
 
        /* get shader id for mesh faces */
-       int get_shader_id(Shader *shader, Mesh *mesh = NULL, bool smooth = 
false);
+       int get_shader_id(Shader *shader, bool smooth = false);
 
        /* add default shaders to scene, to use as default for things that don't
         * have any shader assigned explicitly */
diff --git a/intern/cycles/render/svm.cpp b/intern/cycles/render/svm.cpp
index 1a16688..be87b35 100644
--- a/intern/cycles/render/svm.cpp
+++ b/intern/cycles/render/svm.cpp
@@ -63,7 +63,6 @@ void SVMShaderManager::device_update(Device *device, 
DeviceScene *dscene, Scene
 
        for(i = 0; i < scene->shaders.size(); i++) {
                svm_nodes.push_back(make_int4(NODE_SHADER_JUMP, 0, 0, 0));
-               svm_nodes.push_back(make_int4(NODE_SHADER_JUMP, 0, 0, 0));
        }
 
        foreach(Shader *shader, scene->shaders) {
@@ -754,18 +753,16 @@ void SVMCompiler::compile(Scene *scene,
        shader->has_integrator_dependency = false;
 
        /* generate surface shader */
-       {
+       if(shader->displacement_method == DISPLACE_TRUE || !shader->graph_bump) 
{
                scoped_timer timer((summary != NULL)? 
&summary->time_generate_surface: NULL);
                compile_type(shader, shader->graph, SHADER_TYPE_SURFACE);
-               global_svm_nodes[index*2 + 0].y = global_svm_nodes.size();
-               global_svm_nodes[index*2 + 1].y = global_svm_nodes.size();
+               global_svm_nodes[index].y = global_svm_nodes.size();
                global_svm_nodes.insert(global_svm_nodes.end(), 
svm_nodes.begin(), svm_nodes.end());
        }
-
-       if(shader->graph_bump) {
+       else {
                scoped_timer timer((summary != NULL)? 
&summary->time_generate_bump: NULL);
                compile_type(shader, shader->graph_bump, SHADER_TYPE_SURFACE);
-               global_svm_nodes[index*2 + 1].y = global_svm_nodes.size();
+               global_svm_nodes[index].y = global_svm_nodes.size();
                global_svm_nodes.insert(global_svm_nodes.end(), 
svm_nodes.begin(), svm_nodes.end());
        }
 
@@ -773,8 +770,7 @@ void SVMCompiler::compile(Scene *scene,
        {
                scoped_timer timer((summary != NULL)? 
&summary->time_generate_volume: NULL);
                compile_type(shader, shader->graph, SHADER_TYPE_VOLUME);
-               global_svm_nodes[index*2 + 0].z = global_svm_nodes.size();
-               global_svm_nodes[index*2 + 1].z = global_svm_nodes.size();
+               global_svm_nodes[index].z = global_svm_nodes.size();
                global_svm_nodes.insert(global_svm_nodes.end(), 
svm_nodes.begin(), svm_nodes.end());
        }
 
@@ -782,8 +778,7 @@ void SVMCompiler::compile(Scene *scene,
        {
                scoped_timer timer((summary != NULL)? 
&summary->time_generate_displacement: NULL);
                compile_type(shader, shader->graph, SHADER_TYPE_DISPLACEMENT);
-               global_svm_nodes[index*2 + 0].w = global_svm_nodes.size();
-               global_svm_nodes[index*2 + 1].w = global_svm_nodes.size();
+               global_svm_nodes[index].w = global_svm_nodes.size();
                global_svm_nodes.insert(global_svm_nodes.end(), 
svm_nodes.begin(), svm_nodes.end());
        }

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

Reply via email to