From bdb42db0f16796403c1b122d54fe399210e18ef7 Mon Sep 17 00:00:00 2001 From: Arturo Buzarra Date: Thu, 30 Jun 2022 13:24:39 +0200 Subject: [PATCH] stm-st-stm32mp: add support to wayland/weston recipes for STM32 paltforms https://onedigi.atlassian.net/browse/DEL-7981 Signed-off-by: Arturo Buzarra --- ...Add-support-for-YUV-Full-color-range.patch | 43 +++++ .../wayland/wayland-protocols_1.25.bbappend | 4 + .../wayland/weston-init.bbappend | 99 ++++++++++ .../wayland/weston-init/72-galcore.rules | 2 + .../weston-init/73-pulseaudio-hdmi.rules | 1 + .../wayland/weston-init/README-CHECK-GPU | 9 + .../wayland/weston-init/check-gpu | 115 +++++++++++ .../weston-init/default_pulseaudio_profile | 3 + .../wayland/weston-init/digi_background.png | Bin 0 -> 30276 bytes .../weston-init/pulseaudio_hdmi_switch.sh | 39 ++++ .../weston-init/weston-checkgpu.service | 13 ++ .../wayland/weston-init/weston-launch.service | 73 +++++++ .../wayland/weston-init/weston-start | 41 ++++ .../wayland/weston-init/weston.ini | 46 +++++ .../wayland/weston-init/weston.sh | 139 ++++++++++++++ .../wayland/weston-init/weston_profile.sh | 16 ++ ...get-hdmi-output-with-several-outputs.patch | 40 ++++ ...seless-code-from-new-Fragment-Shader.patch | 178 ++++++++++++++++++ .../0002-Force-to-close-all-output.patch | 36 ++++ .../wayland/weston/0003-Disable-gles3.patch | 49 +++++ ...er-Add-EGL_IMAGE_PRESERVED_KHR-to-ou.patch | 56 ++++++ .../wayland/weston_10.0.0.bbappend | 23 +++ 22 files changed, 1025 insertions(+) create mode 100644 meta-digi-arm/dynamic-layers/stm-st-stm32mp/recipes-graphics/wayland/wayland-protocols/0001-linux-dmabuf-Add-support-for-YUV-Full-color-range.patch create mode 100644 meta-digi-arm/dynamic-layers/stm-st-stm32mp/recipes-graphics/wayland/wayland-protocols_1.25.bbappend create mode 100644 meta-digi-arm/dynamic-layers/stm-st-stm32mp/recipes-graphics/wayland/weston-init.bbappend create mode 100644 meta-digi-arm/dynamic-layers/stm-st-stm32mp/recipes-graphics/wayland/weston-init/72-galcore.rules create mode 100644 meta-digi-arm/dynamic-layers/stm-st-stm32mp/recipes-graphics/wayland/weston-init/73-pulseaudio-hdmi.rules create mode 100644 meta-digi-arm/dynamic-layers/stm-st-stm32mp/recipes-graphics/wayland/weston-init/README-CHECK-GPU create mode 100755 meta-digi-arm/dynamic-layers/stm-st-stm32mp/recipes-graphics/wayland/weston-init/check-gpu create mode 100644 meta-digi-arm/dynamic-layers/stm-st-stm32mp/recipes-graphics/wayland/weston-init/default_pulseaudio_profile create mode 100644 meta-digi-arm/dynamic-layers/stm-st-stm32mp/recipes-graphics/wayland/weston-init/digi_background.png create mode 100644 meta-digi-arm/dynamic-layers/stm-st-stm32mp/recipes-graphics/wayland/weston-init/pulseaudio_hdmi_switch.sh create mode 100644 meta-digi-arm/dynamic-layers/stm-st-stm32mp/recipes-graphics/wayland/weston-init/weston-checkgpu.service create mode 100644 meta-digi-arm/dynamic-layers/stm-st-stm32mp/recipes-graphics/wayland/weston-init/weston-launch.service create mode 100644 meta-digi-arm/dynamic-layers/stm-st-stm32mp/recipes-graphics/wayland/weston-init/weston-start create mode 100644 meta-digi-arm/dynamic-layers/stm-st-stm32mp/recipes-graphics/wayland/weston-init/weston.ini create mode 100644 meta-digi-arm/dynamic-layers/stm-st-stm32mp/recipes-graphics/wayland/weston-init/weston.sh create mode 100644 meta-digi-arm/dynamic-layers/stm-st-stm32mp/recipes-graphics/wayland/weston-init/weston_profile.sh create mode 100644 meta-digi-arm/dynamic-layers/stm-st-stm32mp/recipes-graphics/wayland/weston/0001-Allow-to-get-hdmi-output-with-several-outputs.patch create mode 100644 meta-digi-arm/dynamic-layers/stm-st-stm32mp/recipes-graphics/wayland/weston/0001-Remove-useless-code-from-new-Fragment-Shader.patch create mode 100644 meta-digi-arm/dynamic-layers/stm-st-stm32mp/recipes-graphics/wayland/weston/0002-Force-to-close-all-output.patch create mode 100644 meta-digi-arm/dynamic-layers/stm-st-stm32mp/recipes-graphics/wayland/weston/0003-Disable-gles3.patch create mode 100644 meta-digi-arm/dynamic-layers/stm-st-stm32mp/recipes-graphics/wayland/weston/0004-Revert-gl-renderer-Add-EGL_IMAGE_PRESERVED_KHR-to-ou.patch create mode 100644 meta-digi-arm/dynamic-layers/stm-st-stm32mp/recipes-graphics/wayland/weston_10.0.0.bbappend diff --git a/meta-digi-arm/dynamic-layers/stm-st-stm32mp/recipes-graphics/wayland/wayland-protocols/0001-linux-dmabuf-Add-support-for-YUV-Full-color-range.patch b/meta-digi-arm/dynamic-layers/stm-st-stm32mp/recipes-graphics/wayland/wayland-protocols/0001-linux-dmabuf-Add-support-for-YUV-Full-color-range.patch new file mode 100644 index 000000000..e89a2bad2 --- /dev/null +++ b/meta-digi-arm/dynamic-layers/stm-st-stm32mp/recipes-graphics/wayland/wayland-protocols/0001-linux-dmabuf-Add-support-for-YUV-Full-color-range.patch @@ -0,0 +1,43 @@ +From cae18dad41f11683aa8c99d6e884b3d59a6e6739 Mon Sep 17 00:00:00 2001 +From: Mickael Reulier +Date: Wed, 22 Mar 2017 13:52:49 +0100 +Subject: [PATCH] linux-dmabuf: Add support for YUV Full color range + +Add new flag yuv_full_color_range to dmabuf protocol for +YUV components color range. +If set, components are in full color range. +If not set, components are in limited color range. + +Change-Id: Id4589f050d83d00298a834c444b01a13365ae6f2 +Signed-off-by: Mickael Reulier +--- + unstable/linux-dmabuf/linux-dmabuf-unstable-v1.xml | 6 ++++++ + 1 file changed, 6 insertions(+) + +diff --git a/unstable/linux-dmabuf/linux-dmabuf-unstable-v1.xml b/unstable/linux-dmabuf/linux-dmabuf-unstable-v1.xml +index 3b4861f..9f3df6e 100644 +--- a/unstable/linux-dmabuf/linux-dmabuf-unstable-v1.xml ++++ b/unstable/linux-dmabuf/linux-dmabuf-unstable-v1.xml +@@ -185,6 +185,8 @@ + + + ++ + + + +@@ -210,6 +212,10 @@ + 'bottom_first' is specified. It is undefined whether 'bottom_first' + is ignored if 'interlaced' is not set. + ++ Flag 'yuv_full_color_range' specifies YUV components color range. ++ If set, components are in full color range. ++ If not set, components are in limited color range. ++ + This protocol does not convey any information about field rate, + duration, or timing, other than the relative ordering between the + two fields in one buffer. A compositor may have to estimate the +-- +1.9.1 + diff --git a/meta-digi-arm/dynamic-layers/stm-st-stm32mp/recipes-graphics/wayland/wayland-protocols_1.25.bbappend b/meta-digi-arm/dynamic-layers/stm-st-stm32mp/recipes-graphics/wayland/wayland-protocols_1.25.bbappend new file mode 100644 index 000000000..1e02e8ed0 --- /dev/null +++ b/meta-digi-arm/dynamic-layers/stm-st-stm32mp/recipes-graphics/wayland/wayland-protocols_1.25.bbappend @@ -0,0 +1,4 @@ +FILESEXTRAPATHS:prepend := "${THISDIR}/${PN}:" + +SRC_URI += "file://0001-linux-dmabuf-Add-support-for-YUV-Full-color-range.patch" + diff --git a/meta-digi-arm/dynamic-layers/stm-st-stm32mp/recipes-graphics/wayland/weston-init.bbappend b/meta-digi-arm/dynamic-layers/stm-st-stm32mp/recipes-graphics/wayland/weston-init.bbappend new file mode 100644 index 000000000..62e42a610 --- /dev/null +++ b/meta-digi-arm/dynamic-layers/stm-st-stm32mp/recipes-graphics/wayland/weston-init.bbappend @@ -0,0 +1,99 @@ +FILESEXTRAPATHS:prepend := "${THISDIR}/${PN}:" + +DEPENDS += "${@oe.utils.conditional('DISTRO_FEATURES', 'pulseaudio', 'pulseaudio', '', d)}" + +SRC_URI += " \ + file://weston.ini \ + file://digi_background.png \ + file://weston-launch.service \ + file://weston-checkgpu.service \ + file://weston_profile.sh \ + file://README-CHECK-GPU \ + file://72-galcore.rules \ + file://73-pulseaudio-hdmi.rules \ + file://default_pulseaudio_profile \ + file://pulseaudio_hdmi_switch.sh \ + " +SRC_URI:append:stm32mpcommon = " file://check-gpu " + +FILES:${PN} += " ${datadir}/weston \ + ${sysconfdir}/etc/default \ + ${systemd_system_unitdir}/weston-launch.service \ + ${sbindir}/ \ + ${sysconfdir}/etc/default \ + ${sysconfdir}/etc/profile.d \ + ${sysconfdir}/xdg/weston/weston.ini \ + /home/root \ + " + +CONFFILES:${PN} += "${sysconfdir}/xdg/weston/weston.ini" + +do_install:append() { + install -d ${D}${sysconfdir}/xdg/weston/ + install -d ${D}${datadir}/weston/backgrounds + + install -m 0644 ${WORKDIR}/weston.ini ${D}${sysconfdir}/xdg/weston + + install -m 0644 ${WORKDIR}/digi_background.png ${D}${datadir}/weston/backgrounds/digi_background.png + + install -d ${D}${systemd_system_unitdir} ${D}${sbindir} + + install -d ${D}/lib/systemd/system/ + if [ -e ${D}/lib/systemd/system/weston.service ]; then + rm ${D}/lib/systemd/system/weston.service ${D}/lib/systemd/system/weston.socket + install -D -p -m0644 ${WORKDIR}/weston-launch.service ${D}${systemd_system_unitdir}/weston-launch.service + sed -i -e s:/etc:${sysconfdir}:g \ + -e s:/usr/bin:${bindir}:g \ + -e s:/var:${localstatedir}:g \ + ${D}${systemd_unitdir}/system/weston-launch.service + install -d ${D}${sysconfdir}/systemd/system/multi-user.target.wants/ + #ln -s /lib/systemd/system/weston-launch.service ${D}${sysconfdir}/systemd/system/multi-user.target.wants/display-manager.service + install -D -p -m0644 ${WORKDIR}/weston-checkgpu.service ${D}${systemd_system_unitdir}/ + fi + + install -d ${D}${sysconfdir}/profile.d + install -m 0755 ${WORKDIR}/weston_profile.sh ${D}${sysconfdir}/profile.d/ + + if ${@bb.utils.contains('DISTRO_FEATURES','xwayland','true','false',d)}; then + # uncomment modules line for support of xwayland + sed -i -e 's,#xwayland=true,xwayland=true,g' ${D}${sysconfdir}/xdg/weston/weston.ini + fi + sed -i 's,@DATADIR@,${datadir},g' ${D}${bindir}/weston-start + # /etc/default/weston + install -d ${D}${sysconfdir}/default + echo "WESTON_USER=weston" > ${D}${sysconfdir}/default/weston + + # check GPU + install -d ${D}/home/root/ + install -m 644 ${WORKDIR}/README-CHECK-GPU ${D}/home/root/ + if ! test -f ${D}${base_sbindir}/check-gpu; then + install -d ${D}${base_sbindir} + echo '#!/bin/sh' > ${WORKDIR}/check-gpu.empty + echo '/bin/true' >> ${WORKDIR}/check-gpu.empty + install -m 755 ${WORKDIR}/check-gpu.empty ${D}${base_sbindir}/check-gpu + fi + + # udev rules for galcore + install -D -p -m0644 ${WORKDIR}/72-galcore.rules ${D}${sysconfdir}/udev/rules.d/72-galcore.rules + + # AUDIO: swith between analog stero and HDMI + install -d ${D}${sysconfdir}/default + install -m 0644 ${WORKDIR}/default_pulseaudio_profile ${D}${sysconfdir}/default/pulseaudio_profile + install -d ${D}${sysconfdir}/udev/rules.d + install -p -m 0644 ${WORKDIR}/73-pulseaudio-hdmi.rules ${D}${sysconfdir}/udev/rules.d/73-pulseaudio-hdmi.rules + install -d ${D}${bindir} + install -m 0755 ${WORKDIR}/pulseaudio_hdmi_switch.sh ${D}${bindir}/ +} + +do_install:append:stm32mpcommon() { + if ${@bb.utils.contains('DISTRO_FEATURES','systemd','true','false',d)}; then + install -d ${D}${base_sbindir} + install -m 755 ${WORKDIR}/check-gpu ${D}${base_sbindir} + fi +} + +SYSTEMD_SERVICE:${PN}:remove = "weston.service weston.socket" +SYSTEMD_SERVICE:${PN} += "weston-launch.service weston-checkgpu.service" +#inherit useradd +USERADD_PARAM:${PN} = "--home /home/weston --shell /bin/sh --user-group -G video,input,tty,audio,weston-launch,dialout weston" +GROUPADD_PARAM:${PN} = "-r weston-launch; -r wayland" diff --git a/meta-digi-arm/dynamic-layers/stm-st-stm32mp/recipes-graphics/wayland/weston-init/72-galcore.rules b/meta-digi-arm/dynamic-layers/stm-st-stm32mp/recipes-graphics/wayland/weston-init/72-galcore.rules new file mode 100644 index 000000000..9422958b9 --- /dev/null +++ b/meta-digi-arm/dynamic-layers/stm-st-stm32mp/recipes-graphics/wayland/weston-init/72-galcore.rules @@ -0,0 +1,2 @@ +SUBSYSTEMS=="graphics_class", KERNEL=="galcore", GROUP="video", MODE="0666" + diff --git a/meta-digi-arm/dynamic-layers/stm-st-stm32mp/recipes-graphics/wayland/weston-init/73-pulseaudio-hdmi.rules b/meta-digi-arm/dynamic-layers/stm-st-stm32mp/recipes-graphics/wayland/weston-init/73-pulseaudio-hdmi.rules new file mode 100644 index 000000000..c1b256d7b --- /dev/null +++ b/meta-digi-arm/dynamic-layers/stm-st-stm32mp/recipes-graphics/wayland/weston-init/73-pulseaudio-hdmi.rules @@ -0,0 +1 @@ +SUBSYSTEMS=="drm", ACTION=="change", RUN+="/usr/bin/pulseaudio_hdmi_switch.sh diff --git a/meta-digi-arm/dynamic-layers/stm-st-stm32mp/recipes-graphics/wayland/weston-init/README-CHECK-GPU b/meta-digi-arm/dynamic-layers/stm-st-stm32mp/recipes-graphics/wayland/weston-init/README-CHECK-GPU new file mode 100644 index 000000000..3306a4fea --- /dev/null +++ b/meta-digi-arm/dynamic-layers/stm-st-stm32mp/recipes-graphics/wayland/weston-init/README-CHECK-GPU @@ -0,0 +1,9 @@ +Check GPU +========= + +GPU can be deactivated by fuse or not present in some SOC + +So in case the GPU is not present, you must configure weston on pix-man by creating this file : +/etc/default/weston with this content : + +OPTARGS=--use-pixman diff --git a/meta-digi-arm/dynamic-layers/stm-st-stm32mp/recipes-graphics/wayland/weston-init/check-gpu b/meta-digi-arm/dynamic-layers/stm-st-stm32mp/recipes-graphics/wayland/weston-init/check-gpu new file mode 100755 index 000000000..08fe5b840 --- /dev/null +++ b/meta-digi-arm/dynamic-layers/stm-st-stm32mp/recipes-graphics/wayland/weston-init/check-gpu @@ -0,0 +1,115 @@ +#!/bin/sh - +#=============================================================================== +# +# FILE: system-generator-check-gpu +# +# DESCRIPTION: The goal are to detect if the gpu are present/loaded or not +# ORGANIZATION: STMicroelectronics +# COPYRIGHT: Copyright (C) 2018, STMicroelectronics - All Rights Reserved +#=============================================================================== + +check_dt_status() { + gcnano_dir=$(ls /proc/device-tree/soc/ | grep gpu) + if [ -z "$gcnano_dir" ] || [ ! -d /proc/device-tree/soc/$gcnano_dir ]; + then + echo "Gcnano in /proc/device-tree/soc/ is not available" > /dev/kmsg + force_no_dtb_gpu="1" + else + if [ ! -f /proc/device-tree/soc/$gcnano_dir/status ]; then + gcnano_status="okay" + else + if $(grep -q "okay" /proc/device-tree/soc/$gcnano_dir/status); then + gcnano_status="okay" + fi + fi + fi +} + +check_load_module() { + local _timeout=0 + if [ -n "$(cat /proc/modules | grep etnaviv)" ]; then + galcore_module=$(cat /proc/modules | grep ^etnaviv) + return + fi + while [ -z "$(cat /proc/modules | grep galcore)" ]; do + sleep 1 + _timeout=$(($_timeout+1)) + if [ "$_timeout" -eq "10" ]; then + echo "Time out check load galcore module expired" > /dev/kmsg + break + fi + done + galcore_module=$(cat /proc/modules | grep galcore) +} + +check_devices() { + local _timeout=0 + if [ -n "$(cat /proc/modules | grep etnaviv)" ]; then + galcore_device=$(cat /proc/modules | grep ^etnaviv) + return + fi + while [ -z "$(ls -l /dev/ | grep galcore)" ]; do + sleep 1 + _timeout=$(($_timeout+1)) + if [ "$_timeout" -eq "10" ]; then + echo "Time out check galcore device expired" > /dev/kmsg + break + fi + done + galcore_device=$(ls -l /dev/ | grep galcore) +} + +check_default_weston_config() { + if [ "$force_no_dtb_gpu" = "1" ]; + then + if [ -e /etc/default/weston ] && $(grep -q "Autogenerated" /etc/default/weston); + then + default_weston_status="Autogenerated" + fi + fi +} +# +# Main +# +gcnano_status="disabled" +galcore_module="" +galcore_device="" +default_weston_status="" +force_no_dtb_gpu=0 + +check_dt_status +check_default_weston_config +if [ "$default_weston_status" = "Autogenerated" ]; +then + echo "Weston already configured" + exit 0 +fi + +check_load_module +check_devices + +if [ "$gcnano_status" = "okay" ] && [ -n "$galcore_module" ] && [ -n "$galcore_device" ]; +then + #echo "Gcnano is present and activated" > /dev/kmsg + if [ -f /etc/default/weston ] && $(grep -q "Autogenerated" /etc/default/weston) ; + then + sed -i "s/OPTARGS=--use-pixman/#OPTARGS=--use-pixman/g" /etc/default/weston + sed -i "/#Autogenerated/d" /etc/default/weston + fi +else + if [ -f /etc/default/weston ] && $(grep -q "Autogenerated" /etc/default/weston) ; + then + echo "Weston already configured on pixman" > /dev/kmsg + else + echo "Configure weston on pixman" > /dev/kmsg + echo "#Autogenerated" > /etc/default/weston + echo "OPTARGS=--use-pixman" >> /etc/default/weston + echo "WESTON_USER=weston" >> /etc/default/weston + fi +fi + +dri_device=$(ls -l /dev/ | grep dri) +if [ -z "$dri_device" ]; +then + exit 1 +fi diff --git a/meta-digi-arm/dynamic-layers/stm-st-stm32mp/recipes-graphics/wayland/weston-init/default_pulseaudio_profile b/meta-digi-arm/dynamic-layers/stm-st-stm32mp/recipes-graphics/wayland/weston-init/default_pulseaudio_profile new file mode 100644 index 000000000..f0f06fab6 --- /dev/null +++ b/meta-digi-arm/dynamic-layers/stm-st-stm32mp/recipes-graphics/wayland/weston-init/default_pulseaudio_profile @@ -0,0 +1,3 @@ +DEFAULT_PULSE_AUDIO_LOCAL_PROFILE=output:analog-stereo +DEFAULT_PULSE_AUDIO_HDMI_PROFILE=output:hdmi-stereo + diff --git a/meta-digi-arm/dynamic-layers/stm-st-stm32mp/recipes-graphics/wayland/weston-init/digi_background.png b/meta-digi-arm/dynamic-layers/stm-st-stm32mp/recipes-graphics/wayland/weston-init/digi_background.png new file mode 100644 index 0000000000000000000000000000000000000000..2963c6a1f1c547bc43aa661b6f2fcc33b3e83232 GIT binary patch literal 30276 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 literal 0 HcmV?d00001 diff --git a/meta-digi-arm/dynamic-layers/stm-st-stm32mp/recipes-graphics/wayland/weston-init/pulseaudio_hdmi_switch.sh b/meta-digi-arm/dynamic-layers/stm-st-stm32mp/recipes-graphics/wayland/weston-init/pulseaudio_hdmi_switch.sh new file mode 100644 index 000000000..d867153f7 --- /dev/null +++ b/meta-digi-arm/dynamic-layers/stm-st-stm32mp/recipes-graphics/wayland/weston-init/pulseaudio_hdmi_switch.sh @@ -0,0 +1,39 @@ +#!/bin/sh - +source /etc/default/pulseaudio_profile +PROFILE_LOCAL=$DEFAULT_PULSE_AUDIO_LOCAL_PROFILE +PROFILE_HDMI=$DEFAULT_PULSE_AUDIO_HDMI_PROFILE +HDMI_STATUS=$(cat /sys/class/drm/card0/*HDMI*/status) + +if [ "$HDMI_STATUS" = "connected" ]; then + PROFILE=$PROFILE_HDMI +else + PROFILE=$PROFILE_LOCAL +fi +cat > /tmp/pulse_temp_switch.sh < /tmp/splash_fifo + #kill -9 $PSPLASH_PID + echo "done." + fi + + ;; + *) + ;; +esac + + +#log file managment on weston CMD line +CMD_LINE_WESTON="" +if [ -z $LOG_FILE ]; +then + CMD_LINE_WESTON=" " +else + if [ -f $LOG_FILE ]; then + rm $LOG_FILE + fi + CMD_LINE_WESTON="--log=$LOG_FILE" +fi +if [ -z "$ST_WESTON_IDLE_TIME" ]; +then + ST_WESTON_IDLE_TIME=648000 +fi +#compositor managment on CMD line +if [ -z $USE_PIXMAN ]; +then + echo ""; +else + CMD_LINE_WESTON="$CMD_LINE_WESTON --use-pixman" +fi + +#Addons paramaters +if [ -n $ST_WESTON_ADDONS ]; +then + CMD_LINE_WESTON="$CMD_LINE_WESTON $ST_WESTON_ADDONS" +fi + +# See how we were called. +case "$1" in + start) + if [ ! -z $LOG_FILE ]; + then + echo "[SERVICE] start.........." >> $LOG_FILE + fi + echo "Starting Weston" + if [ -n "$DEBUG_OPENGL_VIA_OPENVT" ]; + then + echo "[DEBUG] use script /tmp/launch_basic_weston.sh" + echo "[DEBUG] output saved on file $DEBUG_OPENGL_VIA_OPENVT" + #generate a wrapper script to launch weston +cat > /tmp/launch_basic_weston.sh << EOF +/usr/bin/weston $CMD_LINE_WESTON 2>&1 > $DEBUG_OPENGL_VIA_OPENVT +EOF + chmod +x /tmp/launch_basic_weston.sh + openvt -s -w -- /tmp/launch_basic_weston.sh + else + echo "/usr/bin/weston $CMD_LINE_WESTON" + openvt -s -w -- /usr/bin/weston $CMD_LINE_WESTON +# weston --tty=1 $CMD_LINE_WESTON + fi + ;; + + stop) + echo "Stopping Weston" + if [ ! -z $LOG_FILE ]; + then + echo "[SERVICE] stop.........." >> $LOG_FILE + fi + pid_weston=`pidof weston` + kill -9 $pid_weston + ;; + + status) + if pidof weston >/dev/null + then + echo "Weston: running" + echo "CMDLINE of weston:" + echo " /usr/bin/weston $CMD_LINE_WESTON" + else + echo "Weston: not running" + exit 3 + fi + exit 0 + ;; + + restart) + $0 stop + sleep 1 + $0 start + ;; + + *) + echo "Usage: weston.sh {start|stop|status|restart}" + exit 1 + ;; +esac + +exit 0 + diff --git a/meta-digi-arm/dynamic-layers/stm-st-stm32mp/recipes-graphics/wayland/weston-init/weston_profile.sh b/meta-digi-arm/dynamic-layers/stm-st-stm32mp/recipes-graphics/wayland/weston-init/weston_profile.sh new file mode 100644 index 000000000..2d12244ee --- /dev/null +++ b/meta-digi-arm/dynamic-layers/stm-st-stm32mp/recipes-graphics/wayland/weston-init/weston_profile.sh @@ -0,0 +1,16 @@ +if [ "$USER" == "weston" ]; then + export XDG_RUNTIME_DIR=/run/user/`id -u weston` + + export ELM_ENGINE=wayland_shm + export ECORE_EVAS_ENGINE=wayland_shm + export ECORE_EVAS_ENGINE=wayland_shm + export GDK_BACKEND=wayland + export PULSE_RUNTIME_PATH=/run/user/`id -u weston` + if [ -e $XDG_RUNTIME_DIR/wayland-0 ]; then + export WAYLAND_DISPLAY=wayland-0 + else + if [ -e $XDG_RUNTIME_DIR/wayland-1 ]; then + export WAYLAND_DISPLAY=wayland-1 + fi + fi +fi diff --git a/meta-digi-arm/dynamic-layers/stm-st-stm32mp/recipes-graphics/wayland/weston/0001-Allow-to-get-hdmi-output-with-several-outputs.patch b/meta-digi-arm/dynamic-layers/stm-st-stm32mp/recipes-graphics/wayland/weston/0001-Allow-to-get-hdmi-output-with-several-outputs.patch new file mode 100644 index 000000000..49893aa3e --- /dev/null +++ b/meta-digi-arm/dynamic-layers/stm-st-stm32mp/recipes-graphics/wayland/weston/0001-Allow-to-get-hdmi-output-with-several-outputs.patch @@ -0,0 +1,40 @@ +From c2489e20f7803159444150ff03bd78fbf9b1bae4 Mon Sep 17 00:00:00 2001 +From: Christophe Priouzeau +Date: Thu, 19 Mar 2020 12:15:19 +0100 +Subject: [PATCH 1/4] Allow to get hdmi output with several outputs +MIME-Version: 1.0 +Content-Type: text/plain; charset=UTF-8 +Content-Transfer-Encoding: 8bit + +If an ouput fail to be attach or enable then this output must be only +destroyed and an error doesn't be re which detach & destroy +all other output. + +Signed-off-by: Yannick Fertré +--- + compositor/main.c | 8 +++++++- + 1 file changed, 7 insertions(+), 1 deletion(-) + +diff --git a/compositor/main.c b/compositor/main.c +index 322f2ff..055eed3 100644 +--- a/compositor/main.c ++++ b/compositor/main.c +@@ -2246,8 +2246,14 @@ drm_process_layoutput(struct wet_compositor *wet, struct wet_layoutput *lo) + return -1; + + if (drm_try_attach_enable(output->output, lo) < 0) { ++ /* ++ * if a wet_ouput fail to be attach or enable ++ * then this output must be destroyed ++ * but don't return an error which dettatch & destroy ++ * all other output. ++ */ + wet_output_destroy(output); +- return -1; ++ //return -1; + } + } + +-- +2.25.1 + diff --git a/meta-digi-arm/dynamic-layers/stm-st-stm32mp/recipes-graphics/wayland/weston/0001-Remove-useless-code-from-new-Fragment-Shader.patch b/meta-digi-arm/dynamic-layers/stm-st-stm32mp/recipes-graphics/wayland/weston/0001-Remove-useless-code-from-new-Fragment-Shader.patch new file mode 100644 index 000000000..6bdbf3f40 --- /dev/null +++ b/meta-digi-arm/dynamic-layers/stm-st-stm32mp/recipes-graphics/wayland/weston/0001-Remove-useless-code-from-new-Fragment-Shader.patch @@ -0,0 +1,178 @@ +From 7f9365919153c9ba17bfeb48049df2ee5a77b047 Mon Sep 17 00:00:00 2001 +From: Pierre-Yves MORDRET +Date: Mon, 23 May 2022 14:27:13 +0200 +Subject: [PATCH] Remove useless code from new Fragment Shader + +Generic Weston 10.0 consumes more GPU than before (8.0). +The compilation doesn't get rid from unreachable code. +Since not used and not optimized during compilation +state, we simply remove the code. + +Change-Id: I37880d5fcb8487c77e084b289db8d2fb945c21ab +Signed-off-by: Pierre-Yves MORDRET +--- + libweston/renderer-gl/fragment.glsl | 93 ++--------------------------- + libweston/renderer-gl/gl-shaders.c | 5 -- + 2 files changed, 5 insertions(+), 93 deletions(-) + +diff --git a/libweston/renderer-gl/fragment.glsl b/libweston/renderer-gl/fragment.glsl +index 63a20cd6..f735ab3a 100644 +--- a/libweston/renderer-gl/fragment.glsl ++++ b/libweston/renderer-gl/fragment.glsl +@@ -42,30 +42,17 @@ + #define SHADER_VARIANT_SOLID 7 + #define SHADER_VARIANT_EXTERNAL 8 + +-/* enum gl_shader_color_curve */ +-#define SHADER_COLOR_CURVE_IDENTITY 0 +-#define SHADER_COLOR_CURVE_LUT_3x1D 1 +- + #if DEF_VARIANT == SHADER_VARIANT_EXTERNAL + #extension GL_OES_EGL_image_external : require + #endif + +-#ifdef GL_FRAGMENT_PRECISION_HIGH +-#define HIGHPRECISION highp +-#else +-#define HIGHPRECISION mediump +-#endif +- +-precision HIGHPRECISION float; ++precision mediump float; + + /* + * These undeclared identifiers will be #defined by a runtime generated code + * snippet. + */ + compile_const int c_variant = DEF_VARIANT; +-compile_const bool c_input_is_premult = DEF_INPUT_IS_PREMULT; +-compile_const bool c_green_tint = DEF_GREEN_TINT; +-compile_const int c_color_pre_curve = DEF_COLOR_PRE_CURVE; + + vec4 + yuva2rgba(vec4 yuva) +@@ -91,6 +78,7 @@ yuva2rgba(vec4 yuva) + color_out.g = Y - 0.39176229 * su - 0.81296764 * sv; + color_out.b = Y + 2.01723214 * su; + ++ color_out.rgb *= yuva.w; + color_out.a = yuva.w; + + return color_out; +@@ -107,8 +95,6 @@ uniform sampler2D tex1; + uniform sampler2D tex2; + uniform float alpha; + uniform vec4 unicolor; +-uniform HIGHPRECISION sampler2D color_pre_curve_lut_2d; +-uniform HIGHPRECISION vec2 color_pre_curve_lut_scale_offset; + + vec4 + sample_input_texture() +@@ -154,85 +140,16 @@ sample_input_texture() + return yuva2rgba(yuva); + } + +-/* +- * Texture coordinates go from 0.0 to 1.0 corresponding to texture edges. +- * When we do LUT look-ups with linear filtering, the correct range to sample +- * from is not from edge to edge, but center of first texel to center of last +- * texel. This follows because with LUTs, you have the exact end points given, +- * you never extrapolate but only interpolate. +- * The scale and offset are precomputed to achieve this mapping. +- */ +-float +-lut_texcoord(float x, vec2 scale_offset) +-{ +- return x * scale_offset.s + scale_offset.t; +-} +- +-/* +- * Sample a 1D LUT which is a single row of a 2D texture. The 2D texture has +- * four rows so that the centers of texels have precise y-coordinates. +- */ +-float +-sample_color_pre_curve_lut_2d(float x, compile_const int row) +-{ +- float tx = lut_texcoord(x, color_pre_curve_lut_scale_offset); +- +- return texture2D(color_pre_curve_lut_2d, +- vec2(tx, (float(row) + 0.5) / 4.0)).x; +-} +- +-vec3 +-color_pre_curve(vec3 color) +-{ +- vec3 ret; +- +- if (c_color_pre_curve == SHADER_COLOR_CURVE_IDENTITY) { +- return color; +- } else if (c_color_pre_curve == SHADER_COLOR_CURVE_LUT_3x1D) { +- ret.r = sample_color_pre_curve_lut_2d(color.r, 0); +- ret.g = sample_color_pre_curve_lut_2d(color.g, 1); +- ret.b = sample_color_pre_curve_lut_2d(color.b, 2); +- return ret; +- } else { +- /* Never reached, bad c_color_pre_curve. */ +- return vec3(1.0, 0.3, 1.0); +- } +-} +- +-vec4 +-color_pipeline(vec4 color) +-{ +- /* View alpha (opacity) */ +- color.a *= alpha; +- +- color.rgb = color_pre_curve(color.rgb); +- +- return color; +-} +- + void + main() + { + vec4 color; + +- /* Electrical (non-linear) RGBA values, may be premult or not */ ++ /* Electrical (non-linear) RGBA values, pre-multiplied */ + color = sample_input_texture(); + +- /* Ensure straight alpha */ +- if (c_input_is_premult) { +- if (color.a == 0.0) +- color.rgb = vec3(0, 0, 0); +- else +- color.rgb *= 1.0 / color.a; +- } +- +- color = color_pipeline(color); +- +- /* pre-multiply for blending */ +- color.rgb *= color.a; +- +- if (c_green_tint) +- color = vec4(0.0, 0.3, 0.0, 0.2) + color * 0.8; ++ /* View alpha (opacity) */ ++ color *= alpha; + + gl_FragColor = color; + } +diff --git a/libweston/renderer-gl/gl-shaders.c b/libweston/renderer-gl/gl-shaders.c +index 97f288c0..c8e3d297 100644 +--- a/libweston/renderer-gl/gl-shaders.c ++++ b/libweston/renderer-gl/gl-shaders.c +@@ -263,11 +263,6 @@ gl_shader_create(struct gl_renderer *gr, + shader->alpha_uniform = glGetUniformLocation(shader->program, "alpha"); + shader->color_uniform = glGetUniformLocation(shader->program, + "unicolor"); +- shader->color_pre_curve_lut_2d_uniform = +- glGetUniformLocation(shader->program, "color_pre_curve_lut_2d"); +- shader->color_pre_curve_lut_scale_offset_uniform = +- glGetUniformLocation(shader->program, "color_pre_curve_lut_scale_offset"); +- + free(conf); + + wl_list_insert(&gr->shader_list, &shader->link); +-- +2.17.1 + diff --git a/meta-digi-arm/dynamic-layers/stm-st-stm32mp/recipes-graphics/wayland/weston/0002-Force-to-close-all-output.patch b/meta-digi-arm/dynamic-layers/stm-st-stm32mp/recipes-graphics/wayland/weston/0002-Force-to-close-all-output.patch new file mode 100644 index 000000000..9b06b6058 --- /dev/null +++ b/meta-digi-arm/dynamic-layers/stm-st-stm32mp/recipes-graphics/wayland/weston/0002-Force-to-close-all-output.patch @@ -0,0 +1,36 @@ +From 5d96505846d911c942a42f74c2a6f816f5c940b5 Mon Sep 17 00:00:00 2001 +From: Christophe Priouzeau +Date: Thu, 19 Mar 2020 12:20:32 +0100 +Subject: [PATCH 2/4] Force to close all output +MIME-Version: 1.0 +Content-Type: text/plain; charset=UTF-8 +Content-Transfer-Encoding: 8bit + +In case of plug/unplug HMDI, it's necessary to close all output enabled. +Without this patch, weston is stuck on DSI output. + +Signed-off-by: Yannick Fertré +--- + compositor/main.c | 6 +++++- + 1 file changed, 5 insertions(+), 1 deletion(-) + +diff --git a/compositor/main.c b/compositor/main.c +index 055eed3..ac366a0 100644 +--- a/compositor/main.c ++++ b/compositor/main.c +@@ -2322,7 +2322,11 @@ drm_heads_changed(struct wl_listener *listener, void *arg) + + if ((connected || forced) && !enabled) { + drm_head_prepare_enable(wet, head); +- } else if (!(connected || forced) && enabled) { ++ } else if (enabled) { ++ /* ++ * closed all output (connected or not connected) ++ * this is neccessary to switch between HDMI <> DSI ++ */ + drm_head_disable(head); + } else if (enabled && changed) { + weston_log("Detected a monitor change on head '%s', " +-- +2.25.1 + diff --git a/meta-digi-arm/dynamic-layers/stm-st-stm32mp/recipes-graphics/wayland/weston/0003-Disable-gles3.patch b/meta-digi-arm/dynamic-layers/stm-st-stm32mp/recipes-graphics/wayland/weston/0003-Disable-gles3.patch new file mode 100644 index 000000000..7951235ee --- /dev/null +++ b/meta-digi-arm/dynamic-layers/stm-st-stm32mp/recipes-graphics/wayland/weston/0003-Disable-gles3.patch @@ -0,0 +1,49 @@ +From 00384d5c39473f95868b1173aee81b763794de54 Mon Sep 17 00:00:00 2001 +From: Christophe Priouzeau +Date: Tue, 26 Apr 2022 09:59:10 +0200 +Subject: [PATCH 3/4] Disable gles3 + +Signed-off-by: Christophe Priouzeau +--- + libweston/renderer-gl/gl-renderer.c | 6 ++++++ + .../renderer-gl/gl-shader-config-color-transformation.c | 5 +++++ + 2 files changed, 11 insertions(+) + +diff --git a/libweston/renderer-gl/gl-renderer.c b/libweston/renderer-gl/gl-renderer.c +index a5f5eae..2f7941f 100644 +--- a/libweston/renderer-gl/gl-renderer.c ++++ b/libweston/renderer-gl/gl-renderer.c +@@ -29,7 +29,13 @@ + + #include + #include ++#if 0 + #include ++#else ++#define GL_RGBA16F 0x881A ++#define GL_RGB10_A2 0x8059 ++#define GL_HALF_FLOAT 0x140B ++#endif + + #include + #include +diff --git a/libweston/renderer-gl/gl-shader-config-color-transformation.c b/libweston/renderer-gl/gl-shader-config-color-transformation.c +index 21a4565..d5f2491 100644 +--- a/libweston/renderer-gl/gl-shader-config-color-transformation.c ++++ b/libweston/renderer-gl/gl-shader-config-color-transformation.c +@@ -25,7 +25,12 @@ + + #include "config.h" + ++#if 0 + #include ++#else ++#include ++#define GL_R32F 0x822E ++#endif + #include + + #include +-- +2.25.1 + diff --git a/meta-digi-arm/dynamic-layers/stm-st-stm32mp/recipes-graphics/wayland/weston/0004-Revert-gl-renderer-Add-EGL_IMAGE_PRESERVED_KHR-to-ou.patch b/meta-digi-arm/dynamic-layers/stm-st-stm32mp/recipes-graphics/wayland/weston/0004-Revert-gl-renderer-Add-EGL_IMAGE_PRESERVED_KHR-to-ou.patch new file mode 100644 index 000000000..cb9fe5513 --- /dev/null +++ b/meta-digi-arm/dynamic-layers/stm-st-stm32mp/recipes-graphics/wayland/weston/0004-Revert-gl-renderer-Add-EGL_IMAGE_PRESERVED_KHR-to-ou.patch @@ -0,0 +1,56 @@ +From 45a8c37e9dbff9207d58846df048406bf54ce30b Mon Sep 17 00:00:00 2001 +From: Christophe Priouzeau +Date: Fri, 6 May 2022 11:41:10 +0200 +Subject: [PATCH 4/4] Revert gl-renderer: Add EGL_IMAGE_PRESERVED_KHR to our + attributes + +Signed-off-by: Christophe Priouzeau +--- + libweston/renderer-gl/gl-renderer.c | 10 +++------- + 1 file changed, 3 insertions(+), 7 deletions(-) + +diff --git a/libweston/renderer-gl/gl-renderer.c b/libweston/renderer-gl/gl-renderer.c +index 2f7941f..2ab707c 100644 +--- a/libweston/renderer-gl/gl-renderer.c ++++ b/libweston/renderer-gl/gl-renderer.c +@@ -2152,7 +2152,7 @@ gl_renderer_attach_egl(struct weston_surface *es, struct weston_buffer *buffer, + struct weston_compositor *ec = es->compositor; + struct gl_renderer *gr = get_renderer(ec); + struct gl_surface_state *gs = get_surface_state(es); +- EGLint attribs[5]; ++ EGLint attribs[3]; + GLenum target; + int i, num_planes; + +@@ -2205,9 +2205,7 @@ gl_renderer_attach_egl(struct weston_surface *es, struct weston_buffer *buffer, + for (i = 0; i < num_planes; i++) { + attribs[0] = EGL_WAYLAND_PLANE_WL; + attribs[1] = i; +- attribs[2] = EGL_IMAGE_PRESERVED_KHR; +- attribs[3] = EGL_TRUE; +- attribs[4] = EGL_NONE; ++ attribs[2] = EGL_NONE; + + gs->images[i] = egl_image_create(gr, + EGL_WAYLAND_BUFFER_WL, +@@ -2242,7 +2240,7 @@ import_simple_dmabuf(struct gl_renderer *gr, + struct dmabuf_attributes *attributes) + { + struct egl_image *image; +- EGLint attribs[52]; ++ EGLint attribs[50]; + int atti = 0; + bool has_modifier; + +@@ -2260,8 +2258,6 @@ import_simple_dmabuf(struct gl_renderer *gr, + attribs[atti++] = attributes->height; + attribs[atti++] = EGL_LINUX_DRM_FOURCC_EXT; + attribs[atti++] = attributes->format; +- attribs[atti++] = EGL_IMAGE_PRESERVED_KHR; +- attribs[atti++] = EGL_TRUE; + + if (attributes->modifier[0] != DRM_FORMAT_MOD_INVALID) { + if (!gr->has_dmabuf_import_modifiers) +-- +2.25.1 + diff --git a/meta-digi-arm/dynamic-layers/stm-st-stm32mp/recipes-graphics/wayland/weston_10.0.0.bbappend b/meta-digi-arm/dynamic-layers/stm-st-stm32mp/recipes-graphics/wayland/weston_10.0.0.bbappend new file mode 100644 index 000000000..d48d6c9dd --- /dev/null +++ b/meta-digi-arm/dynamic-layers/stm-st-stm32mp/recipes-graphics/wayland/weston_10.0.0.bbappend @@ -0,0 +1,23 @@ +FILESEXTRAPATHS:prepend:stm32mpcommon := "${THISDIR}/${PN}:" + +SRC_URI:append:stm32mpcommon = " \ + file://0001-Allow-to-get-hdmi-output-with-several-outputs.patch \ + file://0002-Force-to-close-all-output.patch \ + file://0003-Disable-gles3.patch \ + file://0004-Revert-gl-renderer-Add-EGL_IMAGE_PRESERVED_KHR-to-ou.patch \ + file://0001-Remove-useless-code-from-new-Fragment-Shader.patch \ + " +SIMPLECLIENTS="egl,touch,dmabuf-v4l,dmabuf-egl" + +PACKAGECONFIG ??= "${@bb.utils.contains('DISTRO_FEATURES', 'wayland', 'kms wayland egl clients', '', d)} \ + ${@bb.utils.contains('DISTRO_FEATURES', 'x11 wayland', 'xwayland', '', d)} \ + ${@bb.utils.filter('DISTRO_FEATURES', 'systemd x11', d)} \ + ${@bb.utils.contains_any('DISTRO_FEATURES', 'wayland x11', '', 'headless', d)} \ + ${@oe.utils.conditional('VIRTUAL-RUNTIME_init_manager', 'sysvinit', 'launcher-libseat', '', d)} \ + image-jpeg \ + screenshare \ + shell-desktop \ + shell-fullscreen \ + launch" + +EXTRA_OEMESON += "-Ddeprecated-wl-shell=true"