1*bb4ee6a4SAndroid Build Coastguard Worker# Wayland 2*bb4ee6a4SAndroid Build Coastguard Worker 3*bb4ee6a4SAndroid Build Coastguard WorkerIf you have a Wayland compositor running on your host, it is possible to display and control guest 4*bb4ee6a4SAndroid Build Coastguard Workerapplications from it. This requires: 5*bb4ee6a4SAndroid Build Coastguard Worker 6*bb4ee6a4SAndroid Build Coastguard Worker- A guest kernel version 5.16 or above with `CONFIG_DRM_VIRTIO_GPU` enabled, 7*bb4ee6a4SAndroid Build Coastguard Worker- The `sommelier` Wayland proxy in your guest image. 8*bb4ee6a4SAndroid Build Coastguard Worker 9*bb4ee6a4SAndroid Build Coastguard WorkerThis section will walk you through the steps needed to get this to work. 10*bb4ee6a4SAndroid Build Coastguard Worker 11*bb4ee6a4SAndroid Build Coastguard Worker## Guest kernel requirements 12*bb4ee6a4SAndroid Build Coastguard Worker 13*bb4ee6a4SAndroid Build Coastguard WorkerWayland support on crosvm relies on virtio-gpu contexts, which have been introduced in Linux 5.16. 14*bb4ee6a4SAndroid Build Coastguard WorkerMake sure your guest kernel is either this version or a more recent one, and that 15*bb4ee6a4SAndroid Build Coastguard Worker`CONFIG_DRM_VIRTIO_GPU` is enabled in your kernel configuration. 16*bb4ee6a4SAndroid Build Coastguard Worker 17*bb4ee6a4SAndroid Build Coastguard Worker## Crosvm requirements 18*bb4ee6a4SAndroid Build Coastguard Worker 19*bb4ee6a4SAndroid Build Coastguard WorkerWayland forwarding requires the GPU feature and the virtio-gpu cross domain mode to be enabled. 20*bb4ee6a4SAndroid Build Coastguard Worker 21*bb4ee6a4SAndroid Build Coastguard Worker``` 22*bb4ee6a4SAndroid Build Coastguard Workercargo build --features "gpu" 23*bb4ee6a4SAndroid Build Coastguard Worker``` 24*bb4ee6a4SAndroid Build Coastguard Worker 25*bb4ee6a4SAndroid Build Coastguard Worker## Building sommelier 26*bb4ee6a4SAndroid Build Coastguard Worker 27*bb4ee6a4SAndroid Build Coastguard Worker[Sommelier] is a proxy Wayland compositor that forwards the Wayland protocol from a guest to a 28*bb4ee6a4SAndroid Build Coastguard Workercompositor running on the host through the guest GPU device. As it is not a standard tool, we will 29*bb4ee6a4SAndroid Build Coastguard Workerhave to build it by ourselves. It is recommended to do this from the guest 30*bb4ee6a4SAndroid Build Coastguard Worker[with networking enabled](../running_crosvm/example_usage.md#add-networking-support). 31*bb4ee6a4SAndroid Build Coastguard Worker 32*bb4ee6a4SAndroid Build Coastguard WorkerClone ChromeOS' `platform2` repository, which contains the source for sommelier: 33*bb4ee6a4SAndroid Build Coastguard Worker 34*bb4ee6a4SAndroid Build Coastguard Worker```sh 35*bb4ee6a4SAndroid Build Coastguard Workergit clone https://chromium.googlesource.com/chromiumos/platform2 36*bb4ee6a4SAndroid Build Coastguard Worker``` 37*bb4ee6a4SAndroid Build Coastguard Worker 38*bb4ee6a4SAndroid Build Coastguard WorkerGo into the sommelier directory and prepare for building: 39*bb4ee6a4SAndroid Build Coastguard Worker 40*bb4ee6a4SAndroid Build Coastguard Worker```sh 41*bb4ee6a4SAndroid Build Coastguard Workercd platform2/vm_tools/sommelier/ 42*bb4ee6a4SAndroid Build Coastguard Workermeson setup build -Dwith_tests=false 43*bb4ee6a4SAndroid Build Coastguard Worker``` 44*bb4ee6a4SAndroid Build Coastguard Worker 45*bb4ee6a4SAndroid Build Coastguard WorkerThis setup step will check for all libraries required to build sommelier. If some are missing, 46*bb4ee6a4SAndroid Build Coastguard Workerinstall them using your guest's distro package manager and re-run `meson setup` until it passes. 47*bb4ee6a4SAndroid Build Coastguard Worker 48*bb4ee6a4SAndroid Build Coastguard WorkerFinally, build sommelier and install it: 49*bb4ee6a4SAndroid Build Coastguard Worker 50*bb4ee6a4SAndroid Build Coastguard Worker```sh 51*bb4ee6a4SAndroid Build Coastguard Workermeson compile -C build 52*bb4ee6a4SAndroid Build Coastguard Workersudo meson install -C build 53*bb4ee6a4SAndroid Build Coastguard Worker``` 54*bb4ee6a4SAndroid Build Coastguard Worker 55*bb4ee6a4SAndroid Build Coastguard WorkerThis last step will put the `sommelier` binary into `/usr/local/bin`. 56*bb4ee6a4SAndroid Build Coastguard Worker 57*bb4ee6a4SAndroid Build Coastguard Worker## Running guest Wayland apps 58*bb4ee6a4SAndroid Build Coastguard Worker 59*bb4ee6a4SAndroid Build Coastguard WorkerCrosvm can connect to a running Wayland server (e.g. [weston]) on the host and forward the protocol 60*bb4ee6a4SAndroid Build Coastguard Workerfrom all Wayland guest applications to it. To enable this you need to know the socket of the Wayland 61*bb4ee6a4SAndroid Build Coastguard Workerserver running on your host - typically it would be `$XDG_RUNTIME_DIR/wayland-0`. 62*bb4ee6a4SAndroid Build Coastguard Worker 63*bb4ee6a4SAndroid Build Coastguard WorkerOnce you have confirmed the socket, create a GPU device and enable forwarding by adding the 64*bb4ee6a4SAndroid Build Coastguard Worker`--gpu=context-types=cross-domain --wayland-sock $XDG_RUNTIME_DIR/wayland-0` arguments to your 65*bb4ee6a4SAndroid Build Coastguard Workercrosvm command-line. Other context types may be also enabled for those interested in 3D 66*bb4ee6a4SAndroid Build Coastguard Workeracceleration. 67*bb4ee6a4SAndroid Build Coastguard Worker 68*bb4ee6a4SAndroid Build Coastguard WorkerYou can now run Wayland clients through sommelier, e.g: 69*bb4ee6a4SAndroid Build Coastguard Worker 70*bb4ee6a4SAndroid Build Coastguard Worker```sh 71*bb4ee6a4SAndroid Build Coastguard Workersommelier --virtgpu-channel weston-terminal 72*bb4ee6a4SAndroid Build Coastguard Worker``` 73*bb4ee6a4SAndroid Build Coastguard Worker 74*bb4ee6a4SAndroid Build Coastguard WorkerOr 75*bb4ee6a4SAndroid Build Coastguard Worker 76*bb4ee6a4SAndroid Build Coastguard Worker```sh 77*bb4ee6a4SAndroid Build Coastguard Workersommelier --virtgpu-channel gedit 78*bb4ee6a4SAndroid Build Coastguard Worker``` 79*bb4ee6a4SAndroid Build Coastguard Worker 80*bb4ee6a4SAndroid Build Coastguard WorkerApplications started that way should appear on and be controllable from the Wayland server running 81*bb4ee6a4SAndroid Build Coastguard Workeron your host. 82*bb4ee6a4SAndroid Build Coastguard Worker 83*bb4ee6a4SAndroid Build Coastguard WorkerThe `--virtgpu-channel` option is currently necessary for sommelier to work with the setup of this 84*bb4ee6a4SAndroid Build Coastguard Workerdocument, but will likely not be required in the future. 85*bb4ee6a4SAndroid Build Coastguard Worker 86*bb4ee6a4SAndroid Build Coastguard WorkerIf you have `Xwayland` installed in the guest you can also run X applications: 87*bb4ee6a4SAndroid Build Coastguard Worker 88*bb4ee6a4SAndroid Build Coastguard Worker```sh 89*bb4ee6a4SAndroid Build Coastguard Workersommelier -X --xwayland-path=/usr/bin/Xwayland xeyes 90*bb4ee6a4SAndroid Build Coastguard Worker``` 91*bb4ee6a4SAndroid Build Coastguard Worker 92*bb4ee6a4SAndroid Build Coastguard Worker[sommelier]: https://chromium.googlesource.com/chromiumos/platform2/+/master/vm_tools/sommelier 93*bb4ee6a4SAndroid Build Coastguard Worker[weston]: https://github.com/wayland-project/weston 94