digraph { rankdir = "BT" subgraph clients { rank = same; browser [label = "Browser"] vnc_client [label = "VNC Client"] } host_renderer [label = < gfxstream / virglrenderer >] run_cvd wayland_socket [label = "internal/frames.sock", shape = "rectangle"] webrtc [label = < webrtc >, penwidth = 2] vmm [label = < crosvm / qemu >] subgraph cluster_android { label = "Cuttlefish VM" subgraph devices { rank = same; drm_card [label = "/dev/dri/card0", shape = "rectangle"] drm_render [label = "/dev/dri/renderD128", shape = "rectangle"] } subgraph hals { rank = same; angle egl [shape = "rectangle"] hwcomposer_drm [label = "hwcomposer.drm"] hwcomposer_ranchu [label = "hwcomposer.ranchu"] vulkan [shape = "rectangle"] } minigbm mesa swiftshader [label = "SwiftShader Pastel"] surfaceflinger vulkan_ranchu [color = "blue", label = "Gfxstream Vulkan"] } webrtc -> browser [dir = both] vmm -> vnc_client [dir = both, color = "red"] webrtc -> run_cvd [dir = back] wayland_socket -> webrtc [dir = both, color = "blue", label = < Wayland >] vmm -> wayland_socket [dir = both, color = "blue", label = < Wayland >] { rank = same; host_renderer -> vmm [dir = both] } drm_render -> vmm drm_card -> vmm minigbm -> drm_render mesa -> drm_render vulkan_ranchu -> drm_render hwcomposer_drm -> drm_card hwcomposer_ranchu -> drm_card minigbm -> hwcomposer_drm [dir = both, label = "HIDL (graphics.allocator)", style = "dashed"] hwcomposer_ranchu -> minigbm [dir = both, label = "AIDL (graphics.allocator)", style = "dashed"] angle -> egl [dir = "back", label = "Symlink", style = "dashed"] egl -> mesa [label = "Symlink", style = "dashed"] vulkan -> angle [dir = "back", label = "Shared library"] vulkan-> swiftshader [label = "Symlink", style = "dashed"] vulkan -> vulkan_ranchu [label = "Symlink", style = "dashed"] surfaceflinger -> egl [label = "Shared library"] surfaceflinger -> hwcomposer_ranchu [dir = both, label = "AIDL (graphics.composer3)", style = "dashed"] surfaceflinger -> hwcomposer_drm [dir = both, label = "HIDL (graphics.composer)", style = "dashed"] surfaceflinger -> vulkan [label = "Shared library"] surfaceflinger -> minigbm [dir = both, label = "HIDL (graphics.allocator)"] }