1_agl-compositor.md: Document how to start client shell
[AGL/documentation.git] / docs / 5_Component_Documentation / 1_agl-compositor.md
1 ---
2 title: agl-compositor
3 ---
4
5 # Wayland compositor
6
7 When the AGL project was started, weston was chosen as the compositor, which is
8 the reference implementation of a Wayland compositor, while for window management
9 functionality it relied on *ivi-shell* (In-Vehicle Infotainment) together
10 with an extension, called [wayland-ivi-exension](https://github.com/GENIVI/wayland-ivi-extension).
11
12 A demo platform image of AGL comes with a handful of demo applications, done
13 with the Qt, which abstracts the protocol communication between the client and
14 the compositor. Additional functionality was in place under the form of
15 library, to control and signal back to the compositor when applications were
16 started, among other things.
17
18 Management of applications, starting, running and stopping them is done in AGL
19 with AppFW [Application Framework Management](../3_Developer_Guides/1_Application_Framework/1_Introduction.md),
20 which is an umbrella name to denote the suite of tools and daemons that handle
21 all of that. It is integrated with systemd and with the current security model.
22 Applications can use AppFW to hang off data, and to pass it down to
23 other services. Together with AppFW, applications could tell the compositor
24 which application to activate or to switch to.
25
26
27 ## Simplifying the graphical stack
28
29 Trimming down these abstractions, simplifying the way clients interact with the
30 compositor, and avoid using modules that aren't really maintained upstream were
31 the reasons behind looking at alternatives to ivi-shell. On the desktop,
32 [xdg-shell](https://gitlab.freedesktop.org/wayland/wayland-protocols/-/raw/master/stable/xdg-shell/xdg-shell.xml)
33 is currently de-facto protocol for handling all window management related
34 functionality.
35
36 Wayland protocol has a window-like interface embedded into its protocol (called
37 wl_shell), but *xdg-shell* has long time ago deprecated it and instead
38 of adding it in the wayland protocol namespace, it was integrated
39 together with some other useful protocols, into
40 [wayland-protocols](https://gitlab.freedesktop.org/wayland/wayland-protocols)
41 project.  The whole purpose of wayland-protocols is to enhance the Wayland
42 protocol with new functionality and bring new extensions entirely.  Compositors
43 are free to implement, modify, enhance, and add new extensions to
44 wayland-protocols but they need to do so in consensus.
45
46 Besides the core wayland protocol and extended functionality from
47 wayland-protocols, a compositor can provide and implement additional protocol
48 extensions (custom to that compositor). By using such private extensions we
49 align with the AGL project and its requirements, without compromising specific
50 functionality and allows to add or improve the current ones. With that in mind,
51 the approach was to create a new compositor, called
52 [agl-compositor](https://gerrit.automotivelinux.org/gerrit/admin/repos/src/agl-compositor)
53 and implement dedicated private extensions, rather than trying to modify weston
54 itself, which AGL project would have been required to keep and maintain for
55 itself, as a fork.
56
57 ## A compositor based on libweston
58
59 The compositor used currently in AGL, just like weston, is built on top of
60 *libweston* and *libweston-desktop*. The latter, among other things, is required
61 as it provides the server side implementation of the xdg-shell protocol which
62 underlying toolkits (like Qt/Chromium project) makes use of to deliver
63 desktop-like functionality. The former is used to provide back-ends and
64 rendering support, effectively managing the HW, besides implementing the
65 wayland protocol.
66
67 The high-level goal of [libweston](https://wayland.pages.freedesktop.org/weston/toc/libweston.html) is
68 to decouple the compositor from the shell implementation.
69
70 Traditionally, clients were entirely separated from the window manager, the
71 desktop environment and the display server. In wayland all these are
72 conceptually under the same entity though they are implemented as different
73 (UNIX) processes, or as a different namespaces with front and back-end APIs,
74 exposed by libraries. The compositor and the shell driving the UI should be
75 seen as one and the same, and in practice, this happens on desktop
76 environments. For AGL, the shell client can be represented under different
77 forms, as well as the fact that the process management has another layer
78 baked-in to handle MAC (Mandatory Access Control) labels and use the
79 above-mentioned Application Framework. These are all tightly
80 integrated and therefore, the AGL compositor will not automatically start the
81 shell client, although there's code to handle that.
82
83 ## Specifying a shell client to be started by the compositor
84
85 Nevertheless, one can modify the configuration file, add the shell client path, and the
86 compositor will attempt to start it.
87
88 ```
89 [shell-client]
90 command=/path/to/your/client/shell
91 ```
92
93
94
95 ## Private extensions
96
97 Compositors can define and implement custom extensions to further control
98 application behaviour. For AGL, we have two private extensions defined.
99 One targeted at defining surface roles commonly found in desktop environments
100 (like panels, and backgrounds), which a shell client would bind to, and one
101 targeted at regular application(s) that might require additional functionality:
102 being able to display/activate its own surface or other's application surface,
103 implement some kind of split screen management of windows, or
104 dialog/pop-ups that exhibit always-on-top property even if the active
105 surface has been changed.
106
107 ![Layers_And_Extensions](images/agl-compositor/drawing_shell.png)
108
109 Clients can make use of these private extensions to define other kind of roles
110 for instance dialog/pop-ups or full-screen roles, and split windows vertically or
111 horizontally. It includes the ability to activate other applications, assuming
112 that the surfaces have been created, and the capability of delaying
113 presentation for the client shell. Doing so, all the information is displayed
114 at once, rather than waiting for the toolkit to map/show the surface.
115
116 An application identification mechanism was required to be able to activate
117 other clients windows/surfaces. A string-based identifier name was chosen
118 which can be used by the client to set an application-based identifier using
119 the xdg-shell protocol. While there's nothing stopping the client to avoid
120 doing that, specifically, to avoid assigning an application identifier,
121 the compositor won't be able to find which surfaces matches to a particular
122 client, if one would want to activate/display it at some time in the future.
123
124 ### agl-shell
125
126 Client shellls can make use of this protocol to define panels and background
127 roles for different surfaces. It includes to ability to activate other
128 applications, assuming that those are already running. Activation happens by
129 using using the app_id, respectively using set_app_id request as defined by the
130 xdg-shell protocol. Established client-side implementation of the xdg-shelll
131 protocol will have a function exposed which can be used to set an application
132 identifier.  Further more, the compositor will not present/display anything to
133 the user as long the `ready()` is not requested. So, after creating the surfaces
134 assigning them panel and/or background roles, and they're fully loaded,
135 the client can then issue `ready()` request and the compositor will start
136 presenting.
137
138 Please consult the [protocol file](https://gerrit.automotivelinux.org/gerrit/gitweb?p=src/agl-compositor.git;a=blob_plain;f=protocol/agl-shell.xml;hb=refs/heads/master)
139 as that is the authoritative way of getting the latest version.
140
141 ### agl-shell-desktop
142
143 This extension is targeted at keeping some of the functionally already
144 established in AGL as to a) allow applications display/activate other
145 surfaces/application window, and b) set further roles, specially dialog/window
146 pop-ups and split-type of surfaces.
147
148 Clients can make use of this protocol to set further roles, like independently
149 positioned pop-up dialog windows, split type of surfaces or fullscreen ones.
150 Additional roles, and implicitly functionality can be added by extending the
151 protocol. These roles serve as hints for the compositor and should be used
152 before the actual surface creation takes place, such that the compositor can
153 take the necessary steps to satisfy those requirements.
154
155 Please consult the [protocol file](https://gerrit.automotivelinux.org/gerrit/gitweb?p=src/agl-compositor.git;a=blob_plain;f=protocol/agl-shell-desktop.xml;hb=refs/heads/master)
156 as that is the authoritative way of getting the latest version.
157
158 #### Additional surface roles in agl-shell-desktop
159
160 Like mentioned earlier, the compositor is already making use of some (internal)
161 roles, and with this extension we add some further ones. These are:
162
163 * split (there's vertical and a horizontal one)
164 * fullscreen
165 * dialog/pop-up
166
167 Internally these are encoded with different values such that there's a
168 translation needed, between the protocol values and the internal ones.  Besides
169 the roles, additional data can to be passed on, but only depending on the role.
170 It is highly recommend **to avoid** using the protocol to pass down information
171 between different applications using this communication channel. It is only
172 intended to help out with demo applications. Other sharing mechanism are
173 available in the AGL project that can satisfy those requirements.
174
175 #### Receiving application state events from (other) applications
176
177 agl-shell-desktop exposes two events which client can install handlers for, one
178 that signals when regular xdg application have been created, and one that
179 signals state changes (active/hidden) as well as destroyed/no longer present
180 surfaces. These events can be useful to add additional functionality if
181 needed.
182
183 #### Activating (other) applications
184
185 Both agl-shell and agl-shell-desktop have requests to activate other
186 application based on their xdg-shell app_id. In case the application is
187 present/running, it will attempt to make the surface backing that application
188 the current activate one, with each output having independently active
189 surfaces.
190
191 ## Explicit output
192
193 The activation and setting surface roles requires passing a Wayland output
194 (wl_output).  The output is the wayland interface representation of an output
195 and is **mandatory** to pass it down to the compositor when activating a surface.
196 Clients can retrieve it (the output) if they wish to place the surface on other
197 outputs by using the toolkits that expose the Wayland objects.  A human-like
198 representation is provided by either the toolkit, or by using other extensions
199 implemented by the client, for instance [xdg-output](https://gitlab.freedesktop.org/wayland/wayland-protocols/-/raw/master/unstable/xdg-output/xdg-output-unstable-v1.xml)
200 is the one recommended way and provides a mapping between a human
201 representation of the output and the wayland one.
202
203 One can also choose the output where the application can start, by configuring
204 directly the AGL compositor. Under the `[output]` section one can use
205 `agl-shell-app-id=appid` restart the AGL compositor unitd systemd service and
206 start the application. Currently this *only* applies to regular applications, the
207 client shell having to handle it in the code.
208
209 ## Available toolkits, application conversions and available eco-systems
210
211 Users and OEM vendors alike have the possibility, depending on their use-cases,
212 to either use some kind of a toolkit (Qt/GTK) for writing  application,
213 or use plain C and the wayland library to communicate with the compositor
214 directly, without any toolkit abstraction.
215
216 Currently, the demo applications in AGL use the Qt platform with Chromium being
217 at this phase, a second-class citizen, being currently in the works of
218 achieving the same level of integration as QtWayland (the underlying library that
219 abstracts the Wayland interaction) has at this moment. The Qt platform has
220 long been favoured in embedded systems so it feels natural why AGL project
221 chose it over other alternatives.  In the same time, as web applications are
222 for quite some time now permeating the application development scene, it also
223 felt natural to add support for a runtime that gives that option, which in AGL
224 was achieved with the help of the Chromium project.
225
226 For normal applications, not needing the ability to activate or displaying
227 other's application surface, would basically mean that it would use what the
228 toolkit has to offer, simplifying the application handling even more.  Under
229 Qt, the client shell can use QPA (Qt Platform Abstraction) to gain access to
230 Wayland primitives, and implicitly is being able use the private extensions.
231
232 ![Architecture Diagram](images/agl-compositor/arch_diagram.png)
233
234 On the Chromium side of things, that happens indirectly, as Chromium doesn't
235 expose the Wayland primitives. Not only that, but on the Chromium platform,
236 there's another mid-layer component, called [WAM](https://github.com/webosose/wam)
237 (WebApplicationManager) with the purpose of handling web applications life-cycle.
238
239 So, controlling and passing information from a web application, that resembles
240 that of a shell client, has to travel more than a few levels in the software
241 stack, until it reaches the lower layers in Chromium where the Wayland
242 communication and interaction takes place. Support for the private extension
243 was done at the Ozone interface abstraction, which Chromium projects uses now
244 to handle the display/graphical interaction with the lower stack levels.
245
246 ## Streaming buffers and receiving events to and from remote outputs
247
248 Quite a common feature, in the infotainment market, is the ability to stream
249 out buffers/data to remote outputs. For instance, super-imposing the navigation
250 application, between the speedometer and tachometer, in the IC (Instrument
251 Cluster) of a car is such a scenario. Just like weston, the AGL compositor is
252 capable of loading up libweston modules and make use of them. And just like
253 weston, the AGL compositor loads up the remoting-plugin to achieve the same
254 thing.
255
256 The remoting-plugin uses the DRM virtual output API from libweston together
257 with gstreamer pipeline to capture, using DMA buffers, the DRM output and to
258 stream it, remotely to another machine. They can be over the network, or
259 locally.
260
261 Further more, to cope with situations where the output is just a
262 panel/display, without some kind of compositor driving it, the necessity of
263 handling input events is an important feature to have, giving the user to
264 possibility to manipulate the application/environment as he or she seems fit.
265 The compositor loads a plug-in that streams out the buffers to an output
266 remotely, with [another plug-in](2_waltham-receiver_waltham-transmitter.md)
267 handling the input events. The events, which are sent back from the display to
268 the compositor, are generated with the help of wayland-eque protocol that works
269 over the network, called [Waltham](https://github.com/waltham/waltham).
270
271 Together, they provide proper means to achieve a seamless integration with
272 other display devices in the car cabin.
273
274 ## Policies and Role Base Arbitration
275
276 The compositor contains an API useful for implementing user-defined policies.
277 It contains a policy engine, and installs by default an allow-all kind of
278 policy. The policy engine controls if the client using the private extensions
279 is permitted to perform those calls. Not only that, but with some policies, it
280 won't allow the client to bind to the interfaces in the first place. That
281 happens with the deny-all policy, which is able to retrieve the client's
282 SMACK label and compares it with the ones statically defined.
283
284 In the works, there's a new policy model, called [Role Based
285 Arbitration](https://gerrit.automotivelinux.org/gerrit/admin/repos/staging/rba).
286 Internally, how it works, should be found at [RBA](3_rba.md).
287 While the other two policies are embedded into the compositor, the RBA policy
288 model is an off the-shell policy.  Obviously, vendors and users can hook up
289 their own policies, just like RBA did.  These all work towards satisfying
290 the driver distraction mitigation requirement for the AGL project, as to avoid
291 overwhelming the driver with too much information.
292
293 Users wanting  to create their own policy should create a specialized version
294 of the callbacks defined in `struct ivi_policy_api`.
295
296 As there's no dynamic loading of policies you'll need to recompile the compositor
297 with that policy in mind, specifically like the following:
298
299         $ meson -Dprefix=/path/to/install-compositor/ -Dpolicy-default=my_policy build_directory
300
301 The default policy found in src/policy-default.c should more than sufficient to
302 get started on creating new ones. Users can either re-purpose the default
303 policy or create a new one entirely different, based on their needs.
304
305 These are hooks in place by the policy engine control the creation, committing
306 and activation of surfaces (`ivi_policy_api::surface_create()`,
307 `ivi_policy_api::surface_commited()`, `ivi_policy_api::surface_activate()`),
308 among other situations.
309
310 Users can customize the hooks by using some sort of database to retrieve the
311 application name to compare against, or incorporate some kind of policy rule
312 engine.  Alternatively, one can use the deny-all policy engine which allows the
313 top panel applications to be used/displayed as permitted applications.
314
315 ### Reactive rules
316
317 The policy engine is stateful,  and allows the ability to inject back events,
318 such that it allows the user to add custom rules into a policy and, depending
319 on the event received by the policy engine, to execute a rule match for that
320 event. Further more, the framework allows adding new states and events and the
321 default implementation has code for handling events like showing or hiding the
322 application specified in the policy rule.  The most common example to exemplify
323 this feature is the ability to show a custom application, like displaying the
324 rear view camera application, when the automobile has been put in reverse.
325
326 For deadling with these kind of rules, `ivi_policy_api::policy_rule_allow_to_add()`
327 can be used to control if policy rules could be added or not. Finally, we have
328 `ivi_policy_api::policy_rule_try_event()` which is executed for each policy
329 rule added, by using the policy API `ivi_policy_add()` function.
330
331 By default the policy framework it will add the 'show', and 'hide' events and
332 the 'start', 'stop' and 'reverse' states. An special type, assigned by default
333 is 'invalid'.  A **state change** has to be propagated to the compositor, which can
334 happen by using `ivi_policy_state_change()` function, and which signals the
335 compositor the state change took place, in order to apply the policy rules, and
336 implicitly to call the event handler `ivi_policy_api::policy_rule_try_event()`.
337
338 ## Back-ends and specific options for agl-compositor
339
340 The compositor has support for the following back-ends:
341
342 * **DRM/KMS** - runs a stand-alone back-end, uses Direct Rendering Manager/Kernel
343   Modesetting and evdev, that is utilizes and runs on real or virtualized HW
344   (qemu/Vbox/etc).
345 * **Wayland** - runs as a Wayland application, nested in another Wayland compositor
346   instance
347 * **X11** - run as a x11 application, nested in a X11 display server instance
348
349 ### Building and running the compositor on different platforms
350
351 The compositor can run on desktop machines as easily as it does on AGL
352 platform. It should infer, depending on the environment, if it is being
353 compiled with the AGL SDK, or with the host build system.  Running would also
354 be inferred from the environment.
355
356 The compositor has some additional configuration options like:
357
358 * `--debug` - enables the screenshooter interface, useful if one would want to
359   take a screenshot using `agl-screenshooter` client. This might be seen as a
360   security risk to it only be enabled in the AGL platform if built with agl-devel
361   DISTRO FEATURES.
362
363 Additional configuration ini options have been added to help with the CI
364 integration. Worth mentioning are:
365
366 * `activate-by-default=[true]` - if the surface of the client should be
367   displayed when the application started. Present in the `[core]` section.
368   By default set to `true`. Setting it to `false` will not activate,
369   by default, the client's surface when started.
370 * `hide-cursor=[false]` - do not advertise pointer/cursor to clients. Present
371   in the `[core]` section.
372
373 ## Running with software rendering
374
375 By default the compositor will attempt to use the GL-renderer, and implicitly
376 the GPU. One could instead use the CPU, by making use of the Pixman library. To
377 use it in the compositor append `--use-pixman` to the command line. This purely
378 software approach has the benefit that would not rely at all on any GL
379 implementatation or library. In constrast, even if the GL-renderer is used,
380 in some situations it won't be able to use the GPU supported implementation
381 and fallback to sofware based one, and for instance that might happen when
382 running in virtualized environments.
383
384 Both approaches could end up not actually using the GPU, but the latter does
385 actually use the GL library and perform the operations in software, while the
386 former does not use any GL whatsover. All back-ends support disabling the
387 GL-render to make sure it does not interfere with the composing process.
388
389 ## Multiple output set-up and touch input devices
390
391 There's no deterministic way in which the compositor enables the outputs and
392 depending on the input devices, specifically touch input devices, and the way
393 the connectors are wired, a touch input device might be associated with a
394 different output than the one intended.
395
396 A consistent way, that survives a reboot, is to use
397 [udev rules](https://man7.org/linux/man-pages/man7/udev.7.html), which
398 libweston would be able to use such that a particular output is tied/associated
399 to a particular touch input device.
400
401 For instance, assuming that you have a set-up consisting of 4 outputs, a 4
402 touch input devices, when the outputs are being enabled the compositor
403 front-end will associate all 4 touch input device -- if they haven't been
404 previously being associated to a particular output, to the first enabled
405 output.
406
407 In order to avoid that, and associate each touch input device to
408 their respective output an udev rule can be installed, for the default
409 seat (named `seat0`).
410
411 Example of a udev rule:
412
413 ```
414 SUBSYSTEM=="input", ATTRS{idVendor}=="222a", ATTRS{idProduct}=="004a", OWNER="display", ENV{ID_SEAT}="seat0", ENV{WL_OUTPUT}="HDMI-A-1"
415 SUBSYSTEM=="input", ATTRS{idVendor}=="222a", ATTRS{idProduct}=="004b", OWNER="display", ENV{ID_SEAT}="seat0", ENV{WL_OUTPUT}="HDMI-A-2"
416 SUBSYSTEM=="input", ATTRS{idVendor}=="222a", ATTRS{idProduct}=="004c", OWNER="display", ENV{ID_SEAT}="seat0", ENV{WL_OUTPUT}="HDMI-A-3"
417 SUBSYSTEM=="input", ATTRS{idVendor}=="222a", ATTRS{idProduct}=="004d", OWNER="display", ENV{ID_SEAT}="seat0", ENV{WL_OUTPUT}="HDMI-A-4"
418 ```
419
420 Add the following under `/etc/udev/rules.d/91-output.rules` and reload udev
421 rules for these changes to take effect:
422
423         $ udevadm control --reload-rules && udevadm trigger
424
425 Note that in the above example, we use physical seat, named `seat0` which is
426 the default physical seat. You can verify that these changes have been applied by
427 checking the compositor logs (under `/run/platform/display/compositor.log` file)
428 You should be seeing `CONNECTOR-NO by udev` message like the following:
429
430 ```
431 associating input device event0 with output HDMI-A-1 (HDMI-A-1 by udev)
432 ```
433
434 vs
435
436 ```
437 associating input device event0 with output HDMI-A-2 (none by udev)
438 ```
439
440 where the rules are either incorrect or badly written.
441
442 Retrieving device attributes could be done archaically using `lsusb` or `lspci`
443 or using `udevadm info -a /dev/input/event*` which can provide with a multitude
444 of attributes to use. In our above example we only relied `idVendor` and
445 `idProduct` but potentially other attributes might be used.