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"];
}