From 9f1c42392e4ae8dfaa91ef8cc32119199ca7d723 Mon Sep 17 00:00:00 2001 From: Mai Lavelle Date: Tue, 16 Aug 2016 19:42:08 -0400 Subject: [PATCH] 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 --- intern/cycles/render/mesh.cpp | 4 ++-- intern/cycles/render/osl.cpp | 11 ++++++----- intern/cycles/render/shader.cpp | 18 ++++++------------ intern/cycles/render/shader.h | 2 +- intern/cycles/render/svm.cpp | 17 ++++++----------- 5 files changed, 21 insertions(+), 31 deletions(-) diff --git a/intern/cycles/render/mesh.cpp b/intern/cycles/render/mesh.cpp index 00987f32e05..f99454ee1bb 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 1a6ae5f9277..8d5e29579c2 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 d000cca5a45..4a3233ac764 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 060ad7056bc..696e22bc3c9 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 1a166885e2b..be87b35dbbc 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()); }