diff options
author | Jeroen Bakker <jeroen@blender.org> | 2021-04-06 13:04:47 +0300 |
---|---|---|
committer | Jeroen Bakker <jeroen@blender.org> | 2021-04-06 13:06:47 +0300 |
commit | 19ff2479cf686f32c29120ea8be02eef5c2423a2 (patch) | |
tree | eb9684415289732c9550f2ca85e553d93de9c39c /source/blender/compositor | |
parent | 663a82b10d23a8fd8468fec314b2d5ba740542e4 (diff) |
Compositor: Add Streaming Operator for NodeOperationBuilder.
For debugging purposes to convert the internal state of the
NodeOperationBuilder to a graphviz.
Usage:
std::cout << *this << "\n";
Inside any method of the NodeOperationBuilder.
Diffstat (limited to 'source/blender/compositor')
4 files changed, 66 insertions, 3 deletions
diff --git a/source/blender/compositor/intern/COM_NodeOperation.cc b/source/blender/compositor/intern/COM_NodeOperation.cc index 6c60a858b6c..35e7f1adc7d 100644 --- a/source/blender/compositor/intern/COM_NodeOperation.cc +++ b/source/blender/compositor/intern/COM_NodeOperation.cc @@ -259,17 +259,18 @@ std::ostream &operator<<(std::ostream &os, const NodeOperation &node_operation) { NodeOperationFlags flags = node_operation.get_flags(); os << "NodeOperation("; + os << "id=" << node_operation.get_id(); if (!node_operation.get_name().empty()) { - os << "name=" << node_operation.get_name() << ","; + os << ",name=" << node_operation.get_name(); } - os << "flags={" << flags << "},"; + os << ",flags={" << flags << "}"; if (flags.is_read_buffer_operation) { const ReadBufferOperation *read_operation = (const ReadBufferOperation *)&node_operation; const MemoryProxy *proxy = read_operation->getMemoryProxy(); if (proxy) { const WriteBufferOperation *write_operation = proxy->getWriteBufferOperation(); if (write_operation) { - os << "write=" << (NodeOperation &)*write_operation << ","; + os << ",write=" << (NodeOperation &)*write_operation; } } } diff --git a/source/blender/compositor/intern/COM_NodeOperation.h b/source/blender/compositor/intern/COM_NodeOperation.h index 783c1fd63c8..d0bfe3c1311 100644 --- a/source/blender/compositor/intern/COM_NodeOperation.h +++ b/source/blender/compositor/intern/COM_NodeOperation.h @@ -251,6 +251,7 @@ struct NodeOperationFlags { */ class NodeOperation { private: + int m_id; std::string m_name; Vector<NodeOperationInput> m_inputs; Vector<NodeOperationOutput> m_outputs; @@ -307,6 +308,16 @@ class NodeOperation { return m_name; } + void set_id(const int id) + { + m_id = id; + } + + const int get_id() const + { + return m_id; + } + const NodeOperationFlags get_flags() const { return flags; diff --git a/source/blender/compositor/intern/COM_NodeOperationBuilder.cc b/source/blender/compositor/intern/COM_NodeOperationBuilder.cc index 59ce56a7cd5..889af4ea39a 100644 --- a/source/blender/compositor/intern/COM_NodeOperationBuilder.cc +++ b/source/blender/compositor/intern/COM_NodeOperationBuilder.cc @@ -124,6 +124,7 @@ void NodeOperationBuilder::convertToOperations(ExecutionSystem *system) void NodeOperationBuilder::addOperation(NodeOperation *operation) { + operation->set_id(m_operations.size()); m_operations.append(operation); if (m_current_node) { operation->set_name(m_current_node->getbNode()->name); @@ -691,4 +692,41 @@ void NodeOperationBuilder::group_operations() } } +/** Create a graphviz representation of the NodeOperationBuilder. */ +std::ostream &operator<<(std::ostream &os, const NodeOperationBuilder &builder) +{ + os << "# Builder start\n"; + os << "digraph G {\n"; + os << " rankdir=LR;\n"; + os << " node [shape=box];\n"; + for (const NodeOperation *operation : builder.get_operations()) { + os << " op" << operation->get_id() << " [label=\"" << *operation << "\"];\n"; + } + + os << "\n"; + for (const NodeOperationBuilder::Link &link : builder.get_links()) { + os << " op" << link.from()->getOperation().get_id() << " -> op" + << link.to()->getOperation().get_id() << ";\n"; + } + for (const NodeOperation *operation : builder.get_operations()) { + if (operation->get_flags().is_read_buffer_operation) { + const ReadBufferOperation &read_operation = static_cast<const ReadBufferOperation &>( + *operation); + const WriteBufferOperation &write_operation = + *read_operation.getMemoryProxy()->getWriteBufferOperation(); + os << " op" << write_operation.get_id() << " -> op" << read_operation.get_id() << ";\n"; + } + } + + os << "}\n"; + os << "# Builder end\n"; + return os; +} + +std::ostream &operator<<(std::ostream &os, const NodeOperationBuilder::Link &link) +{ + os << link.from()->getOperation().get_id() << " -> " << link.to()->getOperation().get_id(); + return os; +} + } // namespace blender::compositor diff --git a/source/blender/compositor/intern/COM_NodeOperationBuilder.h b/source/blender/compositor/intern/COM_NodeOperationBuilder.h index b6fb0ebcc9e..3b0ce57ed26 100644 --- a/source/blender/compositor/intern/COM_NodeOperationBuilder.h +++ b/source/blender/compositor/intern/COM_NodeOperationBuilder.h @@ -119,6 +119,16 @@ class NodeOperationBuilder { return m_active_viewer; } + const Vector<NodeOperation *> &get_operations() const + { + return m_operations; + } + + const Vector<Link> &get_links() const + { + return m_links; + } + protected: /** Add datatype conversion where needed */ void add_datatype_conversions(); @@ -160,4 +170,7 @@ class NodeOperationBuilder { #endif }; +std::ostream &operator<<(std::ostream &os, const NodeOperationBuilder &builder); +std::ostream &operator<<(std::ostream &os, const NodeOperationBuilder::Link &link); + } // namespace blender::compositor |