Blender  V3.3
Execution model

In order to get to an efficient model for execution, several steps are being done. these steps are explained below.

Step 1: translating blender node system to the new compositor system

Blenders node structure is based on C structs (DNA). These structs are not efficient in the new architecture. We want to use classes in order to simplify the system. during this step the blender node_tree is evaluated and converted to a CPP node system.

See also
ExecutionSystem
Converter.convert
Node

Step2: translating nodes to operations

Ungrouping the GroupNodes. Group nodes are node_tree's in node_tree's. The new system only supports a single level of node_tree. We will 'flatten' the system in a single level.

See also
GroupNode
ExecutionSystemHelper.ungroup

Every node has the ability to convert itself to operations. The node itself is responsible to create a correct NodeOperation setup based on its internal settings. Most Node only need to convert it to its NodeOperation. Like a ColorToBWNode doesn't check anything, but replaces itself with a ConvertColorToBWOperation. More complex nodes can use different NodeOperation based on settings; like MixNode. based on the selected Mixtype a different operation will be used. for more information see the page about creating new Nodes. [newnode]

See also
ExecutionSystem.convert_to_operations
Node.convert_to_operations
NodeOperation base class for all operations in the system

Step3: add additional conversions to the operation system

  • Data type conversions: the system has 3 data types DataType::Value, DataType::Vector, DataType::Color. The user can connect a Value socket to a color socket. As values are ordered differently than colors a conversion happens.
  • Image size conversions: the system can automatically convert when resolutions do not match. An NodeInput has a resize mode. This can be any of the following settings.
    • [InputSocketResizeMode.ResizeMode::Center]: The center of both images are aligned
    • [InputSocketResizeMode.ResizeMode::FitWidth]: The width of both images are aligned
    • [InputSocketResizeMode.ResizeMode::FitHeight]: The height of both images are aligned
    • [InputSocketResizeMode.ResizeMode::FitAny]: The width, or the height of both images are aligned to make sure that it fits.
    • [InputSocketResizeMode.ResizeMode::Stretch]: The width and the height of both images are aligned.
    • [InputSocketResizeMode.ResizeMode::None]: Bottom left of the images are aligned.
See also
COM_convert_data_type Datatype conversions
Converter.convert_resolution Image size conversions

Step4: group operations in executions groups

ExecutionGroup are groups of operations that are calculated as being one bigger operation. All operations will be part of an ExecutionGroup. Complex nodes will be added to separate groups. Between ExecutionGroup's the data will be stored in MemoryBuffers. ReadBufferOperations and WriteBufferOperations are added where needed.


       +------------------------------+      +----------------+
       | ExecutionGroup A             |      |ExecutionGroup B|   ExecutionGroup
       | +----------+     +----------+|      |+----------+    |
  /----->| Operation|---->| Operation|-\ /--->| Operation|-\  |   NodeOperation
  |    | | A        |     | B        ||| |   || C        | |  |
  |    | | cFFA     |  /->| cFFA     ||| |   || cFFA     | |  |
  |    | +----------+  |  +----------+|| |   |+----------+ |  |
  |    +---------------|--------------+v |   +-------------v--+
+-*----+           +---*--+         +--*-*--+           +--*----+
|inputA|           |inputB|         |outputA|           |outputB| MemoryBuffer
|cFAA  |           |cFAA  |         |cFAA   |           |cFAA   |
+------+           +------+         +-------+           +-------+
See also
ExecutionSystem.group_operations method doing this step
ExecutionSystem.add_read_write_buffer_operations
NodeOperation.is_complex
ExecutionGroup class representing the ExecutionGroup