| |
| KEYWORDS: |
| |
| Wayland is a nano display server, relying on drm modesetting, gem |
| batchbuffer submission and hw initialization generally in the kernel. |
| Wayland puts the compositing manager and display server in the same |
| process. Window management is largely pushed to the clients, they |
| draw their own decorations and move and resize themselves, typically |
| implemented in a toolkit library. More of the core desktop could be |
| pushed into wayland, for example, stock desktop components such as the |
| panel or the desktop background. |
| |
| The actual compositor will define a fair bit of desktop policy and it |
| is expected that different use cases (desktop environments, devices, |
| appliances) will provide their own custom compositor. |
| |
| It is still designed with a windowed type of desktop in mind, as |
| opposed to fullscreen-all-the-time type of interface, but should be |
| useful wherever several processes contribute content to be composited. |
| |
| Current trends goes towards less and less rendering in X server, more |
| hardware setup and management in kernel and shared libraries allow |
| code sharing without putting it all in a server. freetype, |
| fontconfig, cairo all point in this direction, as does direct |
| rendering mesa. |
| |
| Client allocates DRM buffers, draws decorations, and full window |
| contents and posts entire thing to server along with dimensions. |
| |
| Everything is direct rendered and composited. No cliprects, no |
| drawing api/protocl between server and client. No |
| pixmaps/windows/drawables, only surfaces (essentially pixmaps). No |
| gcs/fonts, no nested windows. OpenGL is already direct rendered, |
| pixman may be direct rendered which adds the cairo API, or cairo |
| may gain a GL backend. |
| |
| Could be a "shell" for launching gdm X server, user session servers, |
| safe mode xservers, graphics text console. From gdm, we could also |
| launch a rdp session, solid ice sessions. |
| |
| All surface commands (copy, attach, map=set quads) are buffered until |
| the client sends a commit command, which executes everything |
| atomically. The commit command includes a cookie, which will be |
| returned in an event generated by the server once the commit has been |
| executed. This allows clients to throttle themselves against the |
| server and implement smooth animations. |
| |
| Throttling/scheduling - there is currently no mechanism for scheduling |
| clients to prevent greedy clients from spamming the server and |
| starving other clients. On the other hand, now that recompositing is |
| done in the idle handler (and eventually at vertical retrace time), |
| there's nothing a client can do to hog the server. Unless we include |
| a copyregion type request, to let a client update it's surface |
| contents by asking the server to atomically copy a region from some |
| other buffer to the surface buffer. |
| |
| Atomicity - we have the map and the attach requests which sometimes |
| will have to be executed atomically. Moving the window is done using |
| the map request and will not involve an attach requet. Updating the |
| window contents will use an attach request but no map. Resizing, |
| however, will use both and in that case must be executed atomically. |
| One way to do this is to have the server always batch up requests and |
| then introduce a kind of "commit" request, which will push the batched |
| changes into effect. This is easier than it sounds, since we only |
| have to remember the most recent map and most recent attach. The |
| commit request will generate an corresponding commit event once the |
| committed changes become visible on screen. The client can provide a |
| bread-crumb id in the commit request, which will be sent back in the |
| commit event. |
| |
| - is batching+commit per client or per surface? Much more convenient |
| if per-client, since a client can batch up a bunch of stuff and get |
| atomic updates to multiple windows. Also nice to only get one |
| commit event for changes to a bunch of windows. Is a little more |
| tricky server-side, since we now have to keep a list of windows |
| with pending changes in the wl_client struct. |
| |
| - batching+commit also lets a client reuse parts of the surface |
| buffer without allocating a new full-size back buffer. For |
| scrolling, for example, the client can render just the newly |
| exposed part of the page to a smaller temporary buffer, then issue |
| a copy request to copy the preserved part of the page up, and the |
| new part of the page into the exposed area. |
| |
| - This does let a client batch up an uncontrolled amount of copy |
| requests that the server has to execute when it gets the commit |
| request. This could potentially lock up the server for a while, |
| leading to lost frames. Should never cause tearing though, we're |
| changing the surface contents, not the server back buffer which is |
| what is scheduled for blitting at vsync time. |
| |
| |
| RMI |
| |
| The wayland protocol is a async object oriented protocol. All |
| requests are method invocations on some object. The request include |
| an object id that uniquely identifies an object on the server. Each |
| object implements an interface and the requests include an opcode that |
| 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 repsonse to a request |
| (in which case the request and the event constitutes a round trip) or |
| spontanously when the server state changes. |
| |
| the get_interface method is called on an object to get an object |
| handle that implements the specified interface. |
| |
| |
| EMBEDDING OTHER WINDOWS |
| |
| X11 lets clients embed windows from other clients other copy pixmap |
| contents rendered by another client into their window. This is often |
| used for applets in a panel, browser plugins and similar. Wayland |
| doesn't directly allow this, but clients can communicate GEM buffer |
| names out-of-band, for example, using d-bus or as command line |
| arguments when the panel launches the applet. Another option is to |
| use a nested wayland instance. For this, the wayland server will have |
| to be a library that the host application links to. The host |
| application will then pass the wayland server socket name to the |
| embedded application, and will need to implement the wayland |
| compositor interface. The host application composites the client |
| surfaces as part of it's window, that is, in the web page or in the |
| panel. The benefit of nesting the wayland server is that it provides |
| the requests the embedded client needs to inform the host about buffer |
| updates and a mechanism for forwarding input events from the host |
| application. |