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 }