Code cleanup: remove copy of shader graph for bump, no longer needed.

This commit is contained in:
Brecht Van Lommel
2017-08-20 14:02:16 +02:00
parent e27a59d411
commit 0b07c2c8a2
7 changed files with 24 additions and 84 deletions

View File

@@ -221,28 +221,6 @@ OutputNode *ShaderGraph::output()
return (OutputNode*)nodes.front(); return (OutputNode*)nodes.front();
} }
ShaderGraph *ShaderGraph::copy()
{
ShaderGraph *newgraph = new ShaderGraph();
/* copy nodes */
ShaderNodeSet nodes_all;
foreach(ShaderNode *node, nodes)
nodes_all.insert(node);
ShaderNodeMap nodes_copy;
copy_nodes(nodes_all, nodes_copy);
/* add nodes (in same order, so output is still first) */
newgraph->clear_nodes();
foreach(ShaderNode *node, nodes)
newgraph->add(nodes_copy[node]);
newgraph->simplified = simplified;
return newgraph;
}
void ShaderGraph::connect(ShaderOutput *from, ShaderInput *to) void ShaderGraph::connect(ShaderOutput *from, ShaderInput *to)
{ {
assert(!finalized); assert(!finalized);

View File

@@ -245,8 +245,6 @@ public:
ShaderGraph(); ShaderGraph();
~ShaderGraph(); ~ShaderGraph();
ShaderGraph *copy();
ShaderNode *add(ShaderNode *node); ShaderNode *add(ShaderNode *node);
OutputNode *output(); OutputNode *output();

View File

@@ -1091,21 +1091,14 @@ void OSLCompiler::compile(Scene *scene, OSLGlobals *og, Shader *shader)
ShaderGraph *graph = shader->graph; ShaderGraph *graph = shader->graph;
ShaderNode *output = (graph)? graph->output(): NULL; ShaderNode *output = (graph)? graph->output(): NULL;
/* copy graph for shader with bump mapping */ bool has_bump = (shader->displacement_method != DISPLACE_TRUE) &&
if(output->input("Surface")->link && output->input("Displacement")->link) output->input("Surface")->link && output->input("Displacement")->link;
if(!shader->graph_bump)
shader->graph_bump = shader->graph->copy();
/* finalize */ /* finalize */
shader->graph->finalize(scene, shader->graph->finalize(scene,
false, has_bump,
shader->has_integrator_dependency); shader->has_integrator_dependency,
if(shader->graph_bump) { shader->displacement_method == DISPLACE_BOTH);
shader->graph_bump->finalize(scene,
true,
shader->has_integrator_dependency,
shader->displacement_method == DISPLACE_BOTH);
}
current_shader = shader; current_shader = shader;
@@ -1113,7 +1106,8 @@ void OSLCompiler::compile(Scene *scene, OSLGlobals *og, Shader *shader)
shader->has_surface_emission = false; shader->has_surface_emission = false;
shader->has_surface_transparent = false; shader->has_surface_transparent = false;
shader->has_surface_bssrdf = false; shader->has_surface_bssrdf = false;
shader->has_bssrdf_bump = false; shader->has_bump = has_bump;
shader->has_bssrdf_bump = has_bump;
shader->has_volume = false; shader->has_volume = false;
shader->has_displacement = false; shader->has_displacement = false;
shader->has_surface_spatial_varying = false; shader->has_surface_spatial_varying = false;
@@ -1125,8 +1119,8 @@ void OSLCompiler::compile(Scene *scene, OSLGlobals *og, Shader *shader)
if(shader->used && graph && output->input("Surface")->link) { if(shader->used && graph && output->input("Surface")->link) {
shader->osl_surface_ref = compile_type(shader, shader->graph, SHADER_TYPE_SURFACE); shader->osl_surface_ref = compile_type(shader, shader->graph, SHADER_TYPE_SURFACE);
if(shader->graph_bump && shader->displacement_method != DISPLACE_TRUE) if(has_bump)
shader->osl_surface_bump_ref = compile_type(shader, shader->graph_bump, SHADER_TYPE_BUMP); shader->osl_surface_bump_ref = compile_type(shader, shader->graph, SHADER_TYPE_BUMP);
else else
shader->osl_surface_bump_ref = OSL::ShaderGroupRef(); shader->osl_surface_bump_ref = OSL::ShaderGroupRef();

View File

@@ -177,7 +177,6 @@ Shader::Shader()
pass_id = 0; pass_id = 0;
graph = NULL; graph = NULL;
graph_bump = NULL;
has_surface = false; has_surface = false;
has_surface_transparent = false; has_surface_transparent = false;
@@ -185,6 +184,7 @@ Shader::Shader()
has_surface_bssrdf = false; has_surface_bssrdf = false;
has_volume = false; has_volume = false;
has_displacement = false; has_displacement = false;
has_bump = false;
has_bssrdf_bump = false; has_bssrdf_bump = false;
has_surface_spatial_varying = false; has_surface_spatial_varying = false;
has_volume_spatial_varying = false; has_volume_spatial_varying = false;
@@ -204,7 +204,6 @@ Shader::Shader()
Shader::~Shader() Shader::~Shader()
{ {
delete graph; delete graph;
delete graph_bump;
} }
bool Shader::is_constant_emission(float3 *emission) bool Shader::is_constant_emission(float3 *emission)
@@ -239,9 +238,7 @@ void Shader::set_graph(ShaderGraph *graph_)
/* assign graph */ /* assign graph */
delete graph; delete graph;
delete graph_bump;
graph = graph_; graph = graph_;
graph_bump = NULL;
/* Store info here before graph optimization to make sure that /* Store info here before graph optimization to make sure that
* nodes that get optimized away still count. */ * nodes that get optimized away still count. */
@@ -458,15 +455,11 @@ void ShaderManager::device_update_common(Device *device,
flag |= SD_VOLUME_MIS; flag |= SD_VOLUME_MIS;
if(shader->volume_interpolation_method == VOLUME_INTERPOLATION_CUBIC) if(shader->volume_interpolation_method == VOLUME_INTERPOLATION_CUBIC)
flag |= SD_VOLUME_CUBIC; flag |= SD_VOLUME_CUBIC;
if(shader->graph_bump) if(shader->has_bump)
flag |= SD_HAS_BUMP; flag |= SD_HAS_BUMP;
if(shader->displacement_method != DISPLACE_BUMP) if(shader->displacement_method != DISPLACE_BUMP)
flag |= SD_HAS_DISPLACEMENT; flag |= SD_HAS_DISPLACEMENT;
/* shader with bump mapping */
if(shader->displacement_method != DISPLACE_TRUE && shader->graph_bump)
flag |= SD_HAS_BSSRDF_BUMP;
/* constant emission check */ /* constant emission check */
float3 constant_emission = make_float3(0.0f, 0.0f, 0.0f); float3 constant_emission = make_float3(0.0f, 0.0f, 0.0f);
if(shader->is_constant_emission(&constant_emission)) if(shader->is_constant_emission(&constant_emission))
@@ -608,11 +601,6 @@ void ShaderManager::get_requested_features(Scene *scene,
Shader *shader = scene->shaders[i]; Shader *shader = scene->shaders[i];
/* Gather requested features from all the nodes from the graph nodes. */ /* Gather requested features from all the nodes from the graph nodes. */
get_requested_graph_features(shader->graph, requested_features); get_requested_graph_features(shader->graph, requested_features);
/* Gather requested features from the graph itself. */
if(shader->graph_bump) {
get_requested_graph_features(shader->graph_bump,
requested_features);
}
ShaderNode *output_node = shader->graph->output(); ShaderNode *output_node = shader->graph->output();
if(output_node->input("Displacement")->link != NULL) { if(output_node->input("Displacement")->link != NULL) {
requested_features->nodes_features |= NODE_FEATURE_BUMP; requested_features->nodes_features |= NODE_FEATURE_BUMP;

View File

@@ -89,11 +89,6 @@ public:
/* shader graph */ /* shader graph */
ShaderGraph *graph; ShaderGraph *graph;
/* shader graph with auto bump mapping included, we compile two shaders,
* with and without bump, because the displacement method is a mesh
* level setting, so we need to handle both */
ShaderGraph *graph_bump;
/* sampling */ /* sampling */
bool use_mis; bool use_mis;
bool use_transparent_shadow; bool use_transparent_shadow;
@@ -121,6 +116,7 @@ public:
bool has_volume; bool has_volume;
bool has_displacement; bool has_displacement;
bool has_surface_bssrdf; bool has_surface_bssrdf;
bool has_bump;
bool has_bssrdf_bump; bool has_bssrdf_bump;
bool has_surface_spatial_varying; bool has_surface_spatial_varying;
bool has_volume_spatial_varying; bool has_volume_spatial_varying;

View File

@@ -799,29 +799,21 @@ void SVMCompiler::compile(Scene *scene,
Summary *summary) Summary *summary)
{ {
/* copy graph for shader with bump mapping */ /* copy graph for shader with bump mapping */
ShaderNode *node = shader->graph->output(); ShaderNode *output = shader->graph->output();
int start_num_svm_nodes = svm_nodes.size(); int start_num_svm_nodes = svm_nodes.size();
const double time_start = time_dt(); const double time_start = time_dt();
if(node->input("Surface")->link && node->input("Displacement")->link) bool has_bump = (shader->displacement_method != DISPLACE_TRUE) &&
if(!shader->graph_bump) output->input("Surface")->link && output->input("Displacement")->link;
shader->graph_bump = shader->graph->copy();
/* finalize */ /* finalize */
{ {
scoped_timer timer((summary != NULL)? &summary->time_finalize: NULL); scoped_timer timer((summary != NULL)? &summary->time_finalize: NULL);
shader->graph->finalize(scene, shader->graph->finalize(scene,
false, has_bump,
shader->has_integrator_dependency); shader->has_integrator_dependency,
} shader->displacement_method == DISPLACE_BOTH);
if(shader->graph_bump) {
scoped_timer timer((summary != NULL)? &summary->time_finalize_bump: NULL);
shader->graph_bump->finalize(scene,
true,
shader->has_integrator_dependency,
shader->displacement_method == DISPLACE_BOTH);
} }
current_shader = shader; current_shader = shader;
@@ -830,7 +822,8 @@ void SVMCompiler::compile(Scene *scene,
shader->has_surface_emission = false; shader->has_surface_emission = false;
shader->has_surface_transparent = false; shader->has_surface_transparent = false;
shader->has_surface_bssrdf = false; shader->has_surface_bssrdf = false;
shader->has_bssrdf_bump = false; shader->has_bump = has_bump;
shader->has_bssrdf_bump = has_bump;
shader->has_volume = false; shader->has_volume = false;
shader->has_displacement = false; shader->has_displacement = false;
shader->has_surface_spatial_varying = false; shader->has_surface_spatial_varying = false;
@@ -839,9 +832,9 @@ void SVMCompiler::compile(Scene *scene,
shader->has_integrator_dependency = false; shader->has_integrator_dependency = false;
/* generate bump shader */ /* generate bump shader */
if(shader->displacement_method != DISPLACE_TRUE && shader->graph_bump) { if(has_bump) {
scoped_timer timer((summary != NULL)? &summary->time_generate_bump: NULL); scoped_timer timer((summary != NULL)? &summary->time_generate_bump: NULL);
compile_type(shader, shader->graph_bump, SHADER_TYPE_BUMP); compile_type(shader, shader->graph, SHADER_TYPE_BUMP);
svm_nodes[index].y = svm_nodes.size(); svm_nodes[index].y = svm_nodes.size();
svm_nodes.insert(svm_nodes.end(), svm_nodes.insert(svm_nodes.end(),
current_svm_nodes.begin(), current_svm_nodes.begin(),
@@ -853,7 +846,7 @@ void SVMCompiler::compile(Scene *scene,
scoped_timer timer((summary != NULL)? &summary->time_generate_surface: NULL); scoped_timer timer((summary != NULL)? &summary->time_generate_surface: NULL);
compile_type(shader, shader->graph, SHADER_TYPE_SURFACE); compile_type(shader, shader->graph, SHADER_TYPE_SURFACE);
/* only set jump offset if there's no bump shader, as the bump shader will fall thru to this one if it exists */ /* only set jump offset if there's no bump shader, as the bump shader will fall thru to this one if it exists */
if(shader->displacement_method == DISPLACE_TRUE || !shader->graph_bump) { if(!has_bump) {
svm_nodes[index].y = svm_nodes.size(); svm_nodes[index].y = svm_nodes.size();
} }
svm_nodes.insert(svm_nodes.end(), svm_nodes.insert(svm_nodes.end(),
@@ -895,7 +888,6 @@ SVMCompiler::Summary::Summary()
: num_svm_nodes(0), : num_svm_nodes(0),
peak_stack_usage(0), peak_stack_usage(0),
time_finalize(0.0), time_finalize(0.0),
time_finalize_bump(0.0),
time_generate_surface(0.0), time_generate_surface(0.0),
time_generate_bump(0.0), time_generate_bump(0.0),
time_generate_volume(0.0), time_generate_volume(0.0),
@@ -911,10 +903,7 @@ string SVMCompiler::Summary::full_report() const
report += string_printf("Peak stack usage: %d\n", peak_stack_usage); report += string_printf("Peak stack usage: %d\n", peak_stack_usage);
report += string_printf("Time (in seconds):\n"); report += string_printf("Time (in seconds):\n");
report += string_printf(" Finalize: %f\n", time_finalize); report += string_printf("Finalize: %f\n", time_finalize);
report += string_printf(" Bump finalize: %f\n", time_finalize_bump);
report += string_printf("Finalize: %f\n", time_finalize +
time_finalize_bump);
report += string_printf(" Surface: %f\n", time_generate_surface); report += string_printf(" Surface: %f\n", time_generate_surface);
report += string_printf(" Bump: %f\n", time_generate_bump); report += string_printf(" Bump: %f\n", time_generate_bump);
report += string_printf(" Volume: %f\n", time_generate_volume); report += string_printf(" Volume: %f\n", time_generate_volume);

View File

@@ -74,9 +74,6 @@ public:
/* Time spent on surface graph finalization. */ /* Time spent on surface graph finalization. */
double time_finalize; double time_finalize;
/* Time spent on bump graph finalization. */
double time_finalize_bump;
/* Time spent on generating SVM nodes for surface shader. */ /* Time spent on generating SVM nodes for surface shader. */
double time_generate_surface; double time_generate_surface;