digraph G { rankdir=LR; subgraph cluster_0 { style=filled; color=lightgrey; node [style=filled,color=white]; controller_driver [label="controller\ndriver"]; label = "game"; } subgraph cluster_2 { style=filled; color=lightgrey; node [style=filled,color=white]; vblank; input; label = "OS"; } subgraph cluster_1 { style=filled; color=lightgrey; node [style=filled,color=white]; input_thread [label="input"]; internet_thread [label="internet"]; state; input_thread -> state [label="apply\nlerp"]; internet_thread -> state; label = "bridge"; } controller_driver -> vblank [label="on each\nframe"]; input -> controller_driver [label="when input\nis available"]; vblank -> input_thread [label="when game signals\nvblank"]; state -> input_thread [label="querying state"]; input_thread -> input [label="send input to game"]; }