spec: update high level description, add diagrams
Add diagrams from the Wayland architecture page and add some more high level text describing X limitations and Wayland architecture.
This commit is contained in:
parent
f66aa1d08f
commit
fb84662f61
114
spec/main.tex
114
spec/main.tex
|
@ -1,11 +1,12 @@
|
|||
\documentclass{article}
|
||||
\usepackage{palatino}
|
||||
\usepackage{graphicx}
|
||||
|
||||
\author{Kristian Høgsberg\\
|
||||
\texttt{krh@bitplanet.net}
|
||||
}
|
||||
|
||||
\title{The Wayland Display Server}
|
||||
\title{The Wayland Compositing System}
|
||||
|
||||
\begin{document}
|
||||
|
||||
|
@ -14,40 +15,97 @@
|
|||
\section{Wayland Overview}
|
||||
|
||||
\begin{itemize}
|
||||
\item wayland is a protocol for a new display server.
|
||||
\item wayland is an implementation
|
||||
\item wayland is a protocol for a new display server.
|
||||
\item weston is the open source project implementing a wayland based compositor
|
||||
\end{itemize}
|
||||
|
||||
\subsection{Replacing X11}
|
||||
|
||||
Over time, a lot of functionality have slowly moved out of the X
|
||||
server and into client-side libraries or kernel drivers. One of the
|
||||
first components to move out was font rendering, with freetype and
|
||||
fontconfig providing an alternative to the core X fonts. Direct
|
||||
rendering OpenGL as a graphics driver in a client side library. Then
|
||||
cairo came along and provided a modern 2D rendering library
|
||||
independent of X and compositing managers took over control of the
|
||||
rendering of the desktop. Recently with GEM and KMS in the Linux
|
||||
kernel, we can do modesetting outside X and schedule several direct
|
||||
rendering clients. The end result is a highly modular graphics stack.
|
||||
In Linux and other Unix-like systems, the X stack has grown to
|
||||
encompass funcationality arguably belonging in client libraries,
|
||||
helper libraries, or the host operating system kernel. Support for
|
||||
things like PCI resource management, display configuration management,
|
||||
direct rendering, and memory management has been integrated into the X
|
||||
stack, imposing limitations like limited support for standalone
|
||||
applications, duplication in other projects (e.g. the Linux fb layer
|
||||
or the DirectFB project), and high levels of complexity for systems
|
||||
combining multiple elements (for example radeon memory map handling
|
||||
between the fb driver and X driver, or VT switching).
|
||||
|
||||
Moreover, X has grown to incorporate modern features like offscreen
|
||||
rendering and scene composition, but subject to the limitations of the
|
||||
X architecture. For example, the X implementation of composition adds
|
||||
additional context switches and makes things like input redirection
|
||||
difficult.
|
||||
|
||||
\begin{figure}
|
||||
\begin{center}
|
||||
\includegraphics[width=70mm]{x-architecture.png}
|
||||
\caption{\small \sl X with a compositing manager.\label{fig:X architecture}}
|
||||
\end{center}
|
||||
\end{figure}
|
||||
|
||||
The diagram above illustrates the central role of the X server and
|
||||
compositor in operations, and the steps required to get contents on to
|
||||
the screen.
|
||||
|
||||
Over time, X developers came to understand the shortcomings of this
|
||||
approach and worked to split things up. Over the past several years,
|
||||
a lot of functionality has moved out of the X server and into
|
||||
client-side libraries or kernel drivers. One of the first components
|
||||
to move out was font rendering, with freetype and fontconfig providing
|
||||
an alternative to the core X fonts. Direct rendering OpenGL as a
|
||||
graphics driver in a client side library went through some iterations,
|
||||
ending up as DRI2, which abstracted most of the direct rendering
|
||||
buffer management from client code. Then cairo came along and provided
|
||||
a modern 2D rendering library independent of X, and compositing
|
||||
managers took over control of the rendering of the desktop as toolkits
|
||||
like GTK+ and Qt moved away from using X APIs for rendering. Recently,
|
||||
memory and display management have moved to the Linux kernel, further
|
||||
reducing the scope of X and its driver stack. The end result is a
|
||||
highly modular graphics stack.
|
||||
|
||||
\subsection{Make the compositing manager the display server}
|
||||
|
||||
Wayland is a new display server building on top of all those
|
||||
components. We are trying to distill out the functionality in the X
|
||||
server that is still used by the modern Linux desktop. This turns out
|
||||
to be not a whole lot. Applications can allocate their own off-screen
|
||||
buffers and render their window contents by themselves. In the end,
|
||||
what’s needed is a way to present the resulting window surface to a
|
||||
compositor and a way to receive input. This is what Wayland provides,
|
||||
by piecing together the components already in the eco-system in a
|
||||
slightly different way.
|
||||
Wayland is a new display server and compositing protocol, and Weston
|
||||
is the implementation of this protocol which builds on top of all the
|
||||
components above. We are trying to distill out the functionality in
|
||||
the X server that is still used by the modern Linux desktop. This
|
||||
turns out to be not a whole lot. Applications can allocate their own
|
||||
off-screen buffers and render their window contents directly, using
|
||||
hardware accelerated libraries like libGL, or high quality software
|
||||
implementations like those found in Cairo. In the end, what’s needed
|
||||
is a way to present the resulting window surface for display, and a
|
||||
way to receive and arbitrate input among multiple clients. This is
|
||||
what Wayland provides, by piecing together the components already in
|
||||
the eco-system in a slightly different way.
|
||||
|
||||
X will always be relevant, in the same way Fortran compilers and VRML
|
||||
browsers are, but it’s time that we think about moving it out of the
|
||||
critical path and provide it as an optional component for legacy
|
||||
applications.
|
||||
|
||||
Overall, the philosophy of Wayland is to provide clients with a way to
|
||||
manage windows and how their contents is displayed. Rendering is left
|
||||
to clients, and system wide memory management interfaces are used to
|
||||
pass buffer handles between clients and the compositing manager.
|
||||
|
||||
\begin{figure}
|
||||
\begin{center}
|
||||
\includegraphics[width=50mm]{wayland-architecture.png}
|
||||
\caption{\small \sl The Wayland system\label{fig:Wayland architecture}}
|
||||
\end{center}
|
||||
\end{figure}
|
||||
|
||||
The figure above illustrates how Wayland clients interact with a
|
||||
Wayland server. Note that window management and composition are
|
||||
handled entirely in the server, significantly reducing complexity
|
||||
while marginally improving performance through reduced context
|
||||
switching. The resulting system is easier to build and extend than a
|
||||
similar X system, because often changes need only be made in one
|
||||
place. Or in the case of protocol extensions, two (rather than 3 or 4
|
||||
in the X case where window management and/or composition handling may
|
||||
also need to be updated).
|
||||
|
||||
\section{Wayland protocol}
|
||||
|
||||
|
@ -62,16 +120,16 @@ identifies which method in the interface to invoke.
|
|||
The server sends back events to the client, each event is emitted from
|
||||
an object. Events can be error conditions. The event includes the
|
||||
object id and the event opcode, from which the client can determine
|
||||
the type of event. Events are generated both in response to a request
|
||||
the type of event. Events are generated both in response to requests
|
||||
(in which case the request and the event constitutes a round trip) or
|
||||
spontaneously when the server state changes.
|
||||
|
||||
\begin{itemize}
|
||||
\item state is broadcast on connect, events sent out when state
|
||||
change. client must listen for these changes and cache the state.
|
||||
no need (or mechanism) to query server state.
|
||||
\item state is broadcast on connect, events are sent out when state
|
||||
changes. clients must listen for these changes and cache the state.
|
||||
there is no need (or mechanism) to query server state.
|
||||
|
||||
\item server will broadcast presence of a number of global objects,
|
||||
\item the server will broadcast the presence of a number of global objects,
|
||||
which in turn will broadcast their current state.
|
||||
\end{itemize}
|
||||
|
||||
|
@ -82,7 +140,7 @@ This xml is used to generate the function prototypes that can be used by
|
|||
clients and compositors.
|
||||
|
||||
The protocol entry points are generated as inline functions which just
|
||||
wraps the \verb:wl_proxy_*: functions. The inline functions aren't
|
||||
wrap the \verb:wl_proxy_*: functions. The inline functions aren't
|
||||
part of the library ABI and language bindings should generate their
|
||||
own stubs for the protocol entry points from the xml.
|
||||
|
||||
|
|
BIN
spec/wayland-architecture.png
Normal file
BIN
spec/wayland-architecture.png
Normal file
Binary file not shown.
After Width: | Height: | Size: 28 KiB |
BIN
spec/x-architecture.png
Normal file
BIN
spec/x-architecture.png
Normal file
Binary file not shown.
After Width: | Height: | Size: 36 KiB |
Loading…
Reference in New Issue
Block a user