Cycles: log how many nodes were deduplicated for use in tests.

To make the number more meaningful, also skip deduplicating
obviously unused nodes with no outgoing links.
This commit is contained in:
Alexander Gavrilov 2016-08-02 19:26:57 +03:00
parent e54320c488
commit f2d5295abf
2 changed files with 14 additions and 0 deletions

View File

@ -24,6 +24,7 @@
#include "util_debug.h"
#include "util_foreach.h"
#include "util_queue.h"
#include "util_logging.h"
CCL_NAMESPACE_BEGIN
@ -543,6 +544,7 @@ void ShaderGraph::deduplicate_nodes()
ShaderNodeSet scheduled, done;
map<ustring, ShaderNodeSet> candidates;
queue<ShaderNode*> traverse_queue;
int num_deduplicated = 0;
/* Schedule nodes which doesn't have any dependencies. */
foreach(ShaderNode *node, nodes) {
@ -557,8 +559,10 @@ void ShaderGraph::deduplicate_nodes()
traverse_queue.pop();
done.insert(node);
/* Schedule the nodes which were depending on the current node. */
bool has_output_links = false;
foreach(ShaderOutput *output, node->outputs) {
foreach(ShaderInput *input, output->links) {
has_output_links = true;
if(scheduled.find(input->parent) != scheduled.end()) {
/* Node might not be optimized yet but scheduled already
* by other dependencies. No need to re-schedule it.
@ -572,6 +576,10 @@ void ShaderGraph::deduplicate_nodes()
}
}
}
/* Only need to care about nodes that are actually used */
if(!has_output_links) {
continue;
}
/* Try to merge this node with another one. */
ShaderNode *merge_with = NULL;
foreach(ShaderNode *other_node, candidates[node->type->name]) {
@ -585,11 +593,16 @@ void ShaderGraph::deduplicate_nodes()
for(int i = 0; i < node->outputs.size(); ++i) {
relink(node, node->outputs[i], merge_with->outputs[i]);
}
num_deduplicated++;
}
else {
candidates[node->type->name].insert(node);
}
}
if(num_deduplicated > 0) {
VLOG(1) << "Deduplicated " << num_deduplicated << " nodes.";
}
}
void ShaderGraph::break_cycles(ShaderNode *node, vector<bool>& visited, vector<bool>& on_stack)

View File

@ -184,6 +184,7 @@ TEST(render_graph, deduplicate_deep)
EXPECT_ANY_MESSAGE(log);
CORRECT_INFO_MESSAGE(log, "Folding Value1::Value to constant (0.8).");
CORRECT_INFO_MESSAGE(log, "Folding Value2::Value to constant (0.8).");
CORRECT_INFO_MESSAGE(log, "Deduplicated 2 nodes.");
builder
.add_node(ShaderNodeBuilder<GeometryNode>("Geometry1"))