Repository navigation
Architecture
William Theesfeld edited this page Apr 15, 2026
·
1 revision
┌─────────────────────────────────────────────┐
│ VGP Server (vgp) │
│ │
│ ┌─────────┐ ┌──────────┐ ┌─────────────┐ │
│ │ DRM/KMS │ │ NanoVG │ │ Compositor │ │
│ │ + GBM │ │ GLES 3.0 │ │ + Tiling │ │
│ └────┬────┘ └────┬─────┘ └──────┬──────┘ │
│ │ │ │ │
│ ┌────┴───┐ ┌────┴──────┐ ┌───┴──────┐ │
│ │libinput│ │ Shader Mgr│ │ IPC │ │
│ │+ xkb │ │ + Themes │ │ Server │ │
│ └────────┘ └───────────┘ └──────────┘ │
│ │
│ ┌─────────┐ ┌────────┐ ┌──────────────┐ │
│ │libseat │ │ D-Bus │ │ Lock Screen │ │
│ │Session │ │Notify │ │ + Animations │ │
│ └─────────┘ └────────┘ └──────────────┘ │
└──────────────────┬──────────────────────────┘
│ Unix domain socket
┌──────────────┼──────────────┐
│ │ │
vgp-term vgp-settings vgp-files
- DRM/KMS: Opens GPU via libseat, creates GBM surfaces per output
- EGL: Creates OpenGL ES 3.0 context on GBM surfaces
- NanoVG: Tessellates vector paths into GPU triangles
- Shaders: Custom GLSL fragment shaders for backgrounds, rendered before NanoVG frame
- Compositing: NanoVG draws decorations, text, UI elements as vector paths
-
Scanout:
eglSwapBuffers→ GBM BO →drmModeSetCrtc/PageFlip
Terminals don't render pixels. They send a cell grid:
typedef struct vgp_cell {
uint32_t codepoint; // Unicode character
uint8_t fg_r, fg_g, fg_b;
uint8_t bg_r, bg_g, bg_b;
uint8_t attrs; // bold, italic, underline, etc.
uint8_t width; // cell width (1 or 2 for wide chars)
} vgp_cell_t; // 12 bytes per cellAn 80x24 terminal sends 23,040 bytes per frame (vs 1,600,000 bytes for pixel data). The server renders each character with NanoVG at native output resolution.
| File | Purpose |
|---|---|
src/server/main.c |
Entry point, signal handling |
src/server/server.c |
Server state, init, event dispatch |
src/server/drm.c |
DRM/KMS, output enumeration, page flips |
src/server/backend_gpu.c |
NanoVG/EGL/GBM GPU backend |
src/server/renderer.c |
Frame rendering, decoration, cell grid |
src/server/compositor.c |
Window management, z-order, focus |
src/server/tiling.c |
Tiling layout algorithms |
src/server/ipc.c |
Unix socket IPC server |
src/server/config.c |
TOML config parser |
src/server/shader_loader.c |
GLSL shader compilation |
src/server/lockscreen.c |
Lock screen |
src/libvgp/vgp.c |
Client library |
src/libvgp-ui/vgp-ui.c |
Cell grid UI toolkit |
src/vgp-term/term.c |
Terminal emulator |