diff --git a/docs/architecture.md b/docs/architecture.md new file mode 100644 index 000000000..7ab9212bf --- /dev/null +++ b/docs/architecture.md @@ -0,0 +1,86 @@ +# Architecture + +This document describes the high-level design of wlroots. wlroots is modular: +each module can be used mostly independently from the rest of wlroots. For +instance, some wlroots-based compositors only use its backends, some only use +its protocol implementations. + +## Backends + +Backends are responsible for exposing input devices and output devices. +wlroots provides DRM and libinput backends to directly drive physical +devices, Wayland and X11 backends to run nested inside another compositor, +and a headless backend. A special "multi" backend is used to combine together +multiple backends, for instance DRM and libinput. Compositors can also +implement their own custom backends if they have special needs. + +Input devices such as pointers, keyboards, touch screens, tablets, switches +are supported. They emit input events (e.g. a keyboard key is pressed) which +compositors can handle and forward to Wayland clients. + +Output devices are tasked with presenting buffers to the user. They also +provide feedback, for instance presentation timestamps. Some backends support +more advanced functionality, such as displaying multiple buffers (e.g. for the +cursor image) or basic 2D transformations (e.g. rotation, clipping, scaling). + +## Renderers + +Renderers provide utilities to import buffers submitted by Wayland clients, +and a basic 2D drawing API suitable for simple compositors. wlroots provides +renderer implementations based on OpenGL ES 2, Vulkan and Pixman. Just like +backends, compositors can implement their own renderers, or use the graphics +APIs directly. + +To draw an image onto a buffer, compositors will first need to create a +texture, representing a source of pixels the renderer can sample from. This can +be done either by uploading pixels from CPU memory, or by importing already +existing GPU memory via DMA-BUFs. Compositors can then create a render pass +and submit drawing operations. Once they are done drawing, compositors can +submit the rendered buffer to an output. + +## Protocol implementations + +A number of Wayland interface implementations are provided. + +### Plumbing protocols + +wlroots ships unopinionated implementations of core plumbing interfaces, for +instance: + +- `wl_compositor` and `wl_surface` +- `wl_seat` and all input-related interfaces +- Buffer factories such as `wl_shm` and linux-dmabuf +- Additional protocols such as viewporter and presentation-time + +### Shells + +Shells give a meaning to surfaces. There are many kinds of surfaces: +application windows, tooltips, right-click menus, desktop panels, wallpapers, +lock screens, on-screen keyboards, and so on. Each of these use-cases is +fulfilled with a shell. wlroots supports xdg-shell for regular windows and +popups, Xwayland for interoperability with X11 applications, layer-shell for +desktop UI elements, and more. + +### Other protocols + +Many other protocol implementations are included, for instance: + +- xdg-activation for raising application windows +- idle-inhibit for preventing the screen from blanking when the user is + watching a video +- ext-idle-notify for notifying when the user is idle + +## Helpers + +wlroots provides additional helpers which can make it easier for compositors to +tie everything together: + +- `wlr_output_layout` organises output devices in the physical space +- `wlr_cursor` stores the current position and image of the cursor +- `wlr_scene` provides a declarative way to display surfaces + +## tinywl + +tinywl is a minimal wlroots compositor. It implements basic stacking window +management and only supports xdg-shell. It's extensively commented and is a +good learning resource for developers new to wlroots.