diff options
author | Kenta <murakami.kenta002@jp.panasonic.com> | 2024-10-03 10:44:19 +0900 |
---|---|---|
committer | Jan-Simon Moeller <jsmoeller@linuxfoundation.org> | 2024-10-16 11:48:48 +0000 |
commit | 8d4dc8e6ef2cb04e9015a32e0329a3a58685fc62 (patch) | |
tree | aa38bb0e45b70f18d72335c88c95d63ca2d5af33 /meta-uhmi/meta-distributed-display-fw | |
parent | f86532f8ac81d1c7dae63ed242f54473aa1b1dda (diff) |
Unified HMI: Add distributed display framework
Add the distributed display framework to control the layouts of the
apps remotely rendered with remote-virtio-gpu (RVGPU).
As meta-distributed-display-fw is added to meta-uhmi, change feature
name from agl-rvgpu to agl-uhmi.
Details of the contents of meta-distributed-display-fw
- ucl-tools: unified clustering tools, launch applications for multiple
platforms and manage execution order and survival.
- ula-tools: unified layout tools, application layout for virtual
displays on virtual screen (mapped from physical displays).
Bug-AGL: SPEC-5254
Change-Id: I9dbe693534cf513ebf9f4b5b43728c67243f3d8b
Signed-off-by: Kenta <murakami.kenta002@jp.panasonic.com>
Diffstat (limited to 'meta-uhmi/meta-distributed-display-fw')
8 files changed, 428 insertions, 0 deletions
diff --git a/meta-uhmi/meta-distributed-display-fw/README.md b/meta-uhmi/meta-distributed-display-fw/README.md new file mode 100644 index 00000000..907d6275 --- /dev/null +++ b/meta-uhmi/meta-distributed-display-fw/README.md @@ -0,0 +1,236 @@ +## How to set up Distributed Display Framework + +To utilize the Distributed Display Framework, you need to set up each image with a distinct hostname and static IP address, and ensure that ivi-shell is running using the wayland-ivi-extension. Please note that the following configurations are examples and should be adapted to fit your specific network environment. + +### Run weston with ivi-shell + +Before setting unique hostnames and configuring static IP addresses, it is essential to start Weston with ivi-shell since the Distributed Display Framework controls the layout of applications using ivi-shell. To initialize ivi-shell, follow these steps: + +``` +ln -sf /etc/xdg/weston/weston_ivi-shell.ini /etc/xdg/weston/weston.ini +systemctl restart weston +``` + +Now that ivi-shell is properly initialized, you can proceed to set unique hostnames for your images. + +### Set Unique Hostnames + +Edit the `/etc/hostname` file on each image to set a unique hostname. Here are the suggested hostnames for the first two images: + +- **For the first image:** +``` +echo "agl-host0" | tee /etc/hostname +``` +- **For the second image:** +``` +echo "agl-host1" | tee /etc/hostname +``` + +### Assign Static IP Addresses + +Configure a static IP address for each image by editing the `/etc/systemd/network/wired.network` file. If this file does not exist, please create a new one. Use the following template and replace `<IP_address>` and `<Netmask>` with your network's specific settings: + +```ini +[Match] +KernelCommandLine=!root=/dev/nfs +Name=eth* en* + +[Network] +Address=<IP_address>/<Netmask> +``` + +Here is how you might configure the static IP addresses for the first two images: + +- **For the first image:** +``` +[Match] +KernelCommandLine=!root=/dev/nfs +Name=eth* en* + +[Network] +Address=192.168.0.100/24 +``` +- **For the second image:** +``` +[Match] +KernelCommandLine=!root=/dev/nfs +Name=eth* en* + +[Network] +Address=192.168.0.101/24 +``` + +Once the hostname and IP addresses settings are complete, please reboot to reflect these settings. + +### Customizing Virtual Screen Definitions + +Adjust the `/etc/uhmi-framework/virtual-screen-def.json` file to match your environment. In the folowing example, we assume an environment where two images, agl-host0 and agl-host1, each have a display output with a resolusion of 1920x1080(FullHD), arranged in order from left to right as agl-host0 and then agl-host1: + +``` +{ + "virtual_screen_2d": { + "size": {"virtual_w": 3840, "virtual_h": 1080}, + "virtual_displays": [ + {"vdisplay_id": 0, "disp_name": "AGL_SCREEN0", "virtual_x": 0, "virtual_y": 0, "virtual_w": 1920, "virtual_h": 1080}, + {"vdisplay_id": 1, "disp_name": "AGL_SCREEN1", "virtual_x": 1920, "virtual_y": 0, "virtual_w": 1920, "virtual_h": 1080} + ] + }, + "virtual_screen_3d": {}, + "real_displays": [ + {"node_id": 0, "vdisplay_id": 0, "pixel_w": 1920, "pixel_h": 1080, "rdisplay_id": 0}, + {"node_id": 1, "vdisplay_id": 1, "pixel_w": 1920, "pixel_h": 1080, "rdisplay_id": 1} + ], + "node": [ + {"node_id": 0, "hostname": "agl-host0", "ip": "192.168.0.100"}, + {"node_id": 1, "hostname": "agl-host1", "ip": "192.168.0.101"} + ], + "distributed_window_system": { + "window_manager": {}, + "framework_node": [ + {"node_id": 0, "ula": {"debug": false, "debug_port": 8080, "port": 10100}, "ucl": {"port": 7654}}, + {"node_id": 1, "ula": {"debug": false, "debug_port": 8080, "port": 10100}, "ucl": {"port": 7654}} + ] + } +} +``` + +Be sure to update the virtual_w, virtual_h, virtual_x, virtual_y, pixel_w, pixel_h, hostname, and ip fields to accurately reflect your specific network configuration. + +### Restarting Services +Once you have prepared the virtual-screen-def.json file and configured the system, you need to restart the system or the following services for the changes to take effect: +``` +systemctl restart uhmi-ivi-wm +systemctl restart ula-node +systemctl restart ucl-launcher +``` + +After restarting these services, your system should be ready to use the Distributed Display Framework with the new configuration. + +## How to use UCL (Unified Clustering) Framework + +The Unified Clustering (UCL) Framework provides a distributed launch feature for applications using remote virtio GPU (rvgpu). By preparing a JSON configuration, you can enable the launch of applications across multiple devices in a distributed environment. + +### Setting Up for Application Launch using UCL + +To facilitate the distributed launch of an application with UCL, you need to create a JSON configuration file that specifies the details of the application and how it should be executed on the sender and receiver nodes. Here's an example of such a JSON configuration named `app.json`: +``` +{ + "format_v1": { + "command_type" : "remote_virtio_gpu", + "appli_name" : "glmark2-es2-wayland", + "sender" : { + "launcher" : "agl-host0", + "command" : "/usr/bin/ucl-virtio-gpu-wl-send", + "frontend_params" : { + "scanout_x" : 0, + "scanout_y" : 0, + "scanout_w" : 1920, + "scanout_h" : 1080, + "server_port" : 33445 + }, + "appli" : "/usr/bin/glmark2-es2-wayland -s 1920x1080", + "env" : "LD_LIBRARY_PATH=/usr/lib/mesa-virtio" + }, + "receivers" : [ + { + "launcher" : "agl-host0", + "command" : "/usr/bin/ucl-virtio-gpu-wl-recv", + "backend_params" : { + "ivi_surface_id" : 101000, + "scanout_x" : 0, + "scanout_y" : 0, + "scanout_w" : 1920, + "scanout_h" : 1080, + "listen_port" : 33445, + "initial_screen_color" : "0x33333333" + }, + "env" : "XDG_RUNTIME_DIR=/run/user/200 WAYLAND_DISPLAY=wayland-1" + }, + { + "launcher" : "agl-host1", + "command" : "/usr/bin/ucl-virtio-gpu-wl-recv", + "backend_params" : { + "ivi_surface_id" : 101000, + "scanout_x" : 0, + "scanout_y" : 0, + "scanout_w" : 1920, + "scanout_h" : 1080, + "listen_port" : 33445, + "initial_screen_color" : "0x33333333" + }, + "env" : "XDG_RUNTIME_DIR=/run/user/200 WAYLAND_DISPLAY=wayland-1" + } + ] + } +} +``` + +In this example, the application glmark2-es2-wayland is configured to launch on the sender node `agl-host0` and display its output on the receiver nodes `agl-host0` and `agl-host1`. The `scanout_x`, `scanout_y`, `scanout_w`, `scanout_h` parameters define the size of the window, while `server_port` and `listen_port` ensure the communication between sender and receivers. + +### Launching the Application + +Once the JSON configuration file is ready, you can execute the application across the distributed system by piping the JSON content to the `ucl-distrib-com` command along with the path to the `virtual-screen-def.json` file: + +``` +cat app.json | ucl-distrib-com /etc/uhmi-framework/virtual-screen-def.json +``` + +This command will read the configuration and initiate the application launch process, distributing the workload as defined in the JSON file. + + +Please ensure that the JSON configuration file you create (`app.json` in the example) is correctly formatted and contains the appropriate parameters for your specific use case. + +**Note**: Please be aware that when using ivi-shell, applications will not be displayed unless layout configuration is specified as described later in this document. If you wish to display applications without specific layout configuration, you should run weston with desktop-shell. This distinction is crucial to ensure that your applications are visible in your chosen environment. + +## How to use ULA (Unified Layout) Framework + +The Unified Layout (ULA) Framework allows for the definition of physical displays on a virtual screen and provides the ability to apply layout settings such as position and size to applications launched using the UCL Framework. + +### Creating a Layout Configuration File + +To define the layout for your applications, you need to create a JSON file, such as `initial_vscreen.json`, with the necessary configuration details. This file will contain the layout settings that specify how applications should be positioned and sized within the virtual screen. Here is an example of what the contents of `initial_vscreen.json` file might look like: + +``` +{ + "command": "initial_vscreen", + "vlayer": [ + { + "VID": 1010000, + "coord": "global", + "virtual_w": 1920, "virtual_h": 1080, + "vsrc_x": 0, "vsrc_y": 0, "vsrc_w": 1920, "vsrc_h": 1080, + "vdst_x": 960, "vdst_y": 0, "vdst_w": 1920, "vdst_h": 1080, + "vsurface": [ + { + "VID": 101000, + "pixel_w": 1920, "pixel_h": 1080, + "psrc_x": 0, "psrc_y": 0, "psrc_w": 1920, "psrc_h": 1080, + "vdst_x": 0, "vdst_y": 0, "vdst_w": 1920, "vdst_h": 1080 + } + ] + } + ] +} +``` + +In this example, the application is renderd across the right half of the agl-host0 and the left half of agl-host1 display. + +In this configuration: + +- **vlayer** defines a virtual layer that represents a group of surfaces within the virtual screen. Each layer has a unique Virtual ID (VID) and can contain multiple surfaces. The layer's source (`vsrc_x`, `vsrc_y`, `vsrc_w`, `vsrc_h`) and destination (`vdst_x`, `vdst_y`, `vdst_w`, `vdst_h`) coordinates determine where and how large the layer appears on the virtual screen. + +- **vsurface** defines individual surfaces within the virtual layer. Each surface also has a VID, and its pixel dimensions (`pixel_w`, `pixel_h`) represent the actual size of the content. The source (`psrc_x`, `psrc_y`, `psrc_w`, `psrc_h`) and destination (`vdst_x`, `vdst_y`, `vdst_w`, `vdst_h`) coordinates determine the portion of the content to display and its location within the layer. + +### Applying the Layout Configuration + +Once you have created the `initial_vscreen.json` file with your layout configuration, you can apply it to your system using the following command: + +``` +cat initial_vscreen.json | ula-distrib-com +``` + +Executing this command will process the configuration from the JSON file and apply the layout settings to the virtual screen. As a result, the applications will appear in the specified positions and sizes according to the layout defined in the file. + +Ensure that `initial_vscreen.json` file you create accurately reflects the desired layout for your applications and display setup. + +**Note**: Due to the specifications of ivi_shell, when an application is stopped after being displayed, the image that was shown just before stopping remains on the screen. To avoid this, please eigther restart weston or display another image on ivi_shell to update the displayed content.
\ No newline at end of file diff --git a/meta-uhmi/meta-distributed-display-fw/conf/layer.conf b/meta-uhmi/meta-distributed-display-fw/conf/layer.conf new file mode 100644 index 00000000..ba8984fa --- /dev/null +++ b/meta-uhmi/meta-distributed-display-fw/conf/layer.conf @@ -0,0 +1,12 @@ +# We have a conf and classes directory, add to BBPATH +BBPATH .= ":${LAYERDIR}" + +# We have recipes-* directories, add to BBFILES +BBFILES += "${LAYERDIR}/recipes-*/*/*.bb \ + ${LAYERDIR}/recipes-*/*/*.bbappend" + +BBFILE_COLLECTIONS += "meta-distributed-display-fw" +BBFILE_PATTERN_meta-distributed-display-fw = "^${LAYERDIR}/" +BBFILE_PRIORITY_meta-distributed-display-fw = "8" + +LAYERSERIES_COMPAT_meta-distributed-display-fw= "scarthgap" diff --git a/meta-uhmi/meta-distributed-display-fw/recipes-core/ucl-tools/files/ucl-launcher.service b/meta-uhmi/meta-distributed-display-fw/recipes-core/ucl-tools/files/ucl-launcher.service new file mode 100644 index 00000000..37f289e6 --- /dev/null +++ b/meta-uhmi/meta-distributed-display-fw/recipes-core/ucl-tools/files/ucl-launcher.service @@ -0,0 +1,13 @@ +[Unit] +Description=ucl-launcher + +[Service] +Type=idle +ExecStart=/usr/bin/ucl-launcher +KillSignal=SIGTERM +TimeoutStopSec=10 +Restart=always +RestartSec=2 + +[Install] +WantedBy=multi-user.target diff --git a/meta-uhmi/meta-distributed-display-fw/recipes-core/ucl-tools/ucl-tools_git.bb b/meta-uhmi/meta-distributed-display-fw/recipes-core/ucl-tools/ucl-tools_git.bb new file mode 100644 index 00000000..cc26678b --- /dev/null +++ b/meta-uhmi/meta-distributed-display-fw/recipes-core/ucl-tools/ucl-tools_git.bb @@ -0,0 +1,46 @@ +SUMMARY = "Unified HMI Clustering Tools" +SECTION = "graphics" + +LICENSE = "Apache-2.0" +LIC_FILES_CHKSUM = "file://src/ucl-tools/LICENSE.md;md5=e789951aab02a3028d2e58b90fc933ba" + +FILESEXTRAPATHS:prepend := "${THISDIR}/files:" + +PN="ucl-tools" +PROVIDES += "ucl-tools" + +SRCREV = "80e83132834b5ab62875bc294332bd00cd559d5d" +BRANCH ?= "main" +SRC_URI = " \ + git://github.com/unified-hmi/ucl-tools.git;protocol=https;branch=${BRANCH} \ +" +PV = "0.0+git${SRCPV}" + +S = "${WORKDIR}/git" + +export GO111MODULE="auto" + +GO_IMPORT = "ucl-tools" +GO_INSTALL = " ${GO_IMPORT}/cmd/ucl-launcher ${GO_IMPORT}/cmd/ucl-distrib-com ${GO_IMPORT}/cmd/ucl-consistency-keeper ${GO_IMPORT}/cmd/ucl-ncount-master ${GO_IMPORT}/cmd/ucl-ncount-worker ${GO_IMPORT}/cmd/ucl-nkeep-master ${GO_IMPORT}/cmd/ucl-nkeep-worker ${GO_IMPORT}/cmd/ucl-timing-wrapper ${GO_IMPORT}/cmd/ucl-virtio-gpu-wl-send ${GO_IMPORT}/cmd/ucl-virtio-gpu-wl-recv" + +inherit go + +RDEPENDS:${PN} = "bash" +RDEPENDS:${PN}-dev = "bash" + +inherit systemd +SRC_URI += " file://ucl-launcher.service" + +REQUIRED_DISTRO_FEATURES = "systemd" +SYSTEMD_PACKAGES = "${PN}" +SYSTEMD_SERVICE:${PN} = "ucl-launcher.service" +SYSTEMD_AUTO_ENABLE:${PN} = "enable" +FILES:${PN} += " \ + ${@bb.utils.contains('DISTRO_FEATURES', 'systemd', '${systemd_system_unitdir}/${SYSTEMD_SERVICE}', '', d)} \ + " +do_install:append() { + if ${@bb.utils.contains('DISTRO_FEATURES','systemd','true','false',d)}; then + install -d ${D}${systemd_system_unitdir} + install -m 644 ${WORKDIR}/*.service ${D}/${systemd_system_unitdir} + fi +} diff --git a/meta-uhmi/meta-distributed-display-fw/recipes-core/ula-tools/files/ula-node.service b/meta-uhmi/meta-distributed-display-fw/recipes-core/ula-tools/files/ula-node.service new file mode 100644 index 00000000..edf69f3d --- /dev/null +++ b/meta-uhmi/meta-distributed-display-fw/recipes-core/ula-tools/files/ula-node.service @@ -0,0 +1,15 @@ +[Unit] +Description=ula-node +Requires=uhmi-ivi-wm.service +After=uhmi-ivi-wm.service + +[Service] +Type=idle +ExecStart=/usr/bin/ula-node +KillSignal=SIGTERM +TimeoutStopSec=10 +Restart=always +RestartSec=2 + +[Install] +WantedBy=multi-user.target diff --git a/meta-uhmi/meta-distributed-display-fw/recipes-core/ula-tools/files/virtual-screen-def.json b/meta-uhmi/meta-distributed-display-fw/recipes-core/ula-tools/files/virtual-screen-def.json new file mode 100644 index 00000000..2917ca87 --- /dev/null +++ b/meta-uhmi/meta-distributed-display-fw/recipes-core/ula-tools/files/virtual-screen-def.json @@ -0,0 +1,25 @@ +{ + "virtual_screen_2d" : { + "size" : {"virtual_w" : 3840, "virtual_h": 1080}, + "virtual_displays" : [ + {"vdisplay_id":0, "disp_name": "AGL_SCREEN0", "virtual_x":0, "virtual_y":0, "virtual_w":1920, "virtual_h":1080}, + {"vdisplay_id":1, "disp_name": "AGL_SCREEN1", "virtual_x":1920, "virtual_y":0, "virtual_w":1920, "virtual_h":1080} + ] + }, + "virtual_screen_3d" : {}, + "real_displays" : [ + {"node_id":0, "vdisplay_id":0, "pixel_w":1920, "pixel_h":1080, "rdisplay_id" : 0}, + {"node_id":1, "vdisplay_id":1, "pixel_w":1920, "pixel_h":1080, "rdisplay_id" : 0} + ], + "node" : [ + {"node_id":0, "hostname":"agl-host0", "ip":"192.168.0.100"}, + {"node_id":1, "hostname":"agl-host1", "ip":"192.168.0.101"} + ], + "distributed_window_system" : { + "window_manager":{}, + "framework_node":[ + {"node_id":0, "ula": {"debug":false, "debug_port":8080, "port":10100}, "ucl": {"port":7654}}, + {"node_id":1, "ula": {"debug":false, "debug_port":8080, "port":10100}, "ucl": {"port":7654}} + ] + } +} diff --git a/meta-uhmi/meta-distributed-display-fw/recipes-core/ula-tools/ula-tools_git.bb b/meta-uhmi/meta-distributed-display-fw/recipes-core/ula-tools/ula-tools_git.bb new file mode 100644 index 00000000..9b945a3f --- /dev/null +++ b/meta-uhmi/meta-distributed-display-fw/recipes-core/ula-tools/ula-tools_git.bb @@ -0,0 +1,72 @@ +SUMMARY = "Unified HMI Layout Tools" +SECTION = "graphics" + +LICENSE = "Apache-2.0" +LIC_FILES_CHKSUM = "file://src/ula-tools/LICENSE.md;md5=e789951aab02a3028d2e58b90fc933ba" + +FILESEXTRAPATHS:prepend := "${THISDIR}/files:" + +PN="ula-tools" +PROVIDES += "ula-tools" + +SRCREV = "4403efd88fd4e79b092787ac727afe996dd7ca12" +BRANCH ?= "main" +SRC_URI = " \ + git://github.com/unified-hmi/ula-tools.git;protocol=https;branch=${BRANCH} \ +" +PV = "0.0+git${SRCPV}" + +S = "${WORKDIR}/git" + + +export GO111MODULE="auto" + +GO_IMPORT = "ula-tools" +GO_INSTALL = " ${GO_IMPORT}/cmd/ula-distrib-com ${GO_IMPORT}/cmd/ula-node" + + +inherit go +RDEPENDS:${PN} = "jq bash" +RDEPENDS:${PN}-dev = "bash" + +inherit systemd + +SRC_URI += " \ + file://ula-node.service \ + file://virtual-screen-def.json \ + " + +REQUIRED_DISTRO_FEATURES = "systemd" +SYSTEMD_PACKAGES = "${PN}" +SYSTEMD_SERVICE:${PN} = "ula-node.service" +SYSTEMD_AUTO_ENABLE:${PN} = "enable" +FILES:${PN} += " \ + ${@bb.utils.contains('DISTRO_FEATURES', 'systemd', '${systemd_system_unitdir}/${SYSTEMD_SERVICE}', '', d)} \ + /etc/uhmi-framework/virtual-screen-def.json \ + " + +do_compile:append() { + export CGO_ENABLED="1" + ${GO} build -buildmode=c-shared -o ${GOPATH}/pkg/libulaclient.so -v -ldflags '-extldflags "-Wl,-soname=libulaclient.so"' ${GO_IMPORT}/pkg/ula-client-lib +} + + +do_install:append() { + if ${@bb.utils.contains('DISTRO_FEATURES','systemd','true','false',d)}; then + install -d ${D}${systemd_system_unitdir} + install -m 644 ${WORKDIR}/*.service ${D}/${systemd_system_unitdir} + fi + + install -d ${D}/etc/uhmi-framework + install -m 644 ${WORKDIR}/virtual-screen-def.json ${D}/etc/uhmi-framework + + install -d ${D}${libdir} + install -m 0755 ${GOPATH}/pkg/libulaclient.so ${D}${libdir} + + install -d ${D}${includedir} + install -m 644 ${GOPATH}/pkg/libulaclient.h ${D}${includedir} + +} + +FILES:${PN} += "${libdir}" +FILES:${PN} += "${includedir}" diff --git a/meta-uhmi/meta-distributed-display-fw/recipes-platform/packagegroups/packagegroup-distributed-display-fw.bb b/meta-uhmi/meta-distributed-display-fw/recipes-platform/packagegroups/packagegroup-distributed-display-fw.bb new file mode 100644 index 00000000..527184dc --- /dev/null +++ b/meta-uhmi/meta-distributed-display-fw/recipes-platform/packagegroups/packagegroup-distributed-display-fw.bb @@ -0,0 +1,9 @@ +SUMMARY = "Unified HMI Package Groups" +LICENSE = "Apache-2.0" + +inherit packagegroup + +RDEPENDS:${PN} += " \ + ucl-tools \ + ula-tools \ +" |