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:
parent
e54320c488
commit
f2d5295abf
|
@ -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)
|
||||
|
|
|
@ -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"))
|
||||
|
|
Loading…
Reference in New Issue