digraph G {

  vertex_shader [label="(from the vertex shader)"]

  subgraph cluster_clipping {
    label = "clipping"
    DX_CLIP_SPACE_DEF [label="DX_CLIP_SPACE_DEF
possibly clip the polygon"]
  }

  subgraph cluster_perspective {
    label = "perspective division"

    VTX_Z_FMT [nojustify=true label="VTX_Z_FMT
(if enabled) divide Z by W"]
  }

  subgraph cluster_viewport_transformation {
    label = "viewport transformation"

    VPORT_Z_SCALE
    VPORT_Z_OFFSET
  }

  subgraph cluster_geometry_assembly {
  }

  subgraph cluster_setup_unit {
    label = "setup unit"

    SU_DEPTH_SCALE
    SU_DEPTH_OFFSET
  }

  subgraph cluster_zfunc {
    label = "ZFUNC"
    { rank=same
    depth_test [shape=box label="depth test"]
    depth_pass [shape=box label="depth pass"]
    }
    depth_test -> depth_pass
  }

  Z_BUFFER [shape=invhouse label="(write the new Z
value to the Z-buffer)"]

  fragment_shader [label="(to the fragment shader)"]

  vertex_shader -> DX_CLIP_SPACE_DEF
  DX_CLIP_SPACE_DEF -> VTX_Z_FMT
  VTX_Z_FMT -> VPORT_Z_SCALE
  VPORT_Z_SCALE -> VPORT_Z_OFFSET
  VPORT_Z_OFFSET -> SU_DEPTH_SCALE
  SU_DEPTH_SCALE -> SU_DEPTH_OFFSET
  SU_DEPTH_OFFSET -> depth_test
  depth_test -> Z_BUFFER

  VPORT_Z_OFFSET -> depth_pass
  depth_pass -> fragment_shader
}