Cycles: Add method to dump current shader graph to the graphiz file

This is rather useful to see how good optimization went and so.

Currently uses quite simple notation: shader nodes are nodes on the
graph, connects between graph nodes are named by the sockets names,
so i.e. connection between BSDF and Mix would be named bsdf:closure1.

Could be improved in the feature to draw fancier graph, but it's good
enough already.

Use in the following way:
- To create graphix file call graph->dump_graph("graph.dot")
- To visualize the grapf call: dot -Tpng graph.dot -o graph.png
This commit is contained in:
Sergey Sharybin 2014-09-19 15:21:32 +06:00
parent b3d414cc21
commit d165b1b266
2 changed files with 44 additions and 0 deletions

View File

@ -835,5 +835,47 @@ void ShaderGraph::transform_multi_closure(ShaderNode *node, ShaderOutput *weight
}
}
void ShaderGraph::dump_graph(const char *filename)
{
FILE *fd = fopen(filename, "w");
if(fd == NULL) {
printf("Error opening file for dumping the graph: %s\n", filename);
return;
}
fprintf(fd, "digraph dependencygraph {\n");
fprintf(fd, "ranksep=1.5\n");
fprintf(fd, "splines=false\n");
foreach(ShaderNode *node, nodes) {
fprintf(fd, "// NODE: %p\n", node);
fprintf(fd,
"\"%p\" [shape=record,label=\"%s\"]\n",
node,
node->name.c_str());
}
foreach(ShaderNode *node, nodes) {
foreach(ShaderOutput *output, node->outputs) {
foreach(ShaderInput *input, output->links) {
fprintf(fd,
"// CONNECTION: %p->%p (%s:%s)\n",
output,
input,
output->name, input->name);
fprintf(fd,
"\"%p\":s -> \"%p\":n [label=\"%s:%s\"]\n",
output->parent,
input->parent,
output->name, input->name);
}
}
}
fprintf(fd, "}\n");
fclose(fd);
}
CCL_NAMESPACE_END

View File

@ -250,6 +250,8 @@ public:
void remove_unneeded_nodes();
void finalize(bool do_bump = false, bool do_osl = false);
void dump_graph(const char *filename);
protected:
typedef pair<ShaderNode* const, ShaderNode*> NodePair;