diff --git a/Runner/config/pkg_command_map.conf b/Runner/config/pkg_command_map.conf index a7313dad..92cf7870 100755 --- a/Runner/config/pkg_command_map.conf +++ b/Runner/config/pkg_command_map.conf @@ -292,8 +292,11 @@ debian:package-set:graphics=kgsl-dkms adreno-common libgbm-msm1 adreno-gles1 adr # Upstream Debian Mesa/freedreno userspace required by the default KMSCube run. debian:package-set:graphics-base=libegl-mesa0 libgl1-mesa-dri libgbm1 libegl1 libgles2 mesa-utils -# TODO on ubuntu -ubuntu:package-set:graphics=kgsl-dkms adreno-common adreno-gles1 adreno-gles2 adreno-egl1 adreno-vulkan-icd adreno-opencl-icd adreno-opencl-dev +# Ubuntu uses the same Mesa/freedreno base userspace as Debian. +ubuntu:package-set:graphics-base=libegl-mesa0 libgl1-mesa-dri libgbm1 libegl1 libgles2 mesa-utils + +# Qualcomm proprietary graphics overlay package set for Ubuntu. +ubuntu:package-set:graphics=kgsl-dkms adreno-common libgbm-msm adreno-gles1 adreno-gles2 adreno-egl1 adreno-vulkan-icd adreno-opencl-icd adreno-opencl-dev # --------------------------------------------------------------------------- # Audio validation package recovery. diff --git a/Runner/suites/Multimedia/Graphics/KMSCube/run.sh b/Runner/suites/Multimedia/Graphics/KMSCube/run.sh index a85c204f..2f35ba04 100755 --- a/Runner/suites/Multimedia/Graphics/KMSCube/run.sh +++ b/Runner/suites/Multimedia/Graphics/KMSCube/run.sh @@ -69,7 +69,7 @@ GPU_BOOT_ARTIFACTS_CHANGED=0 GPU_MODULE="msm_kgsl" GPU_OVERLAY_DEVICE="/dev/kgsl-3d0" -GPU_OVERLAY_GBM_PACKAGE="${GPU_OVERLAY_GBM_PACKAGE:-libgbm-msm1}" +GPU_OVERLAY_GBM_PACKAGE="${GPU_OVERLAY_GBM_PACKAGE:-}" DISPLAY_MANAGER_SERVICE="${DISPLAY_MANAGER_SERVICE:-display-manager.service}" DISPLAY_MANAGER_STATE_FILE="/tmp/qcom-testkit-${TESTNAME}-display-manager.$$.state" @@ -114,6 +114,17 @@ fi [ -n "$OS_ID" ] || OS_ID="unknown" +if [ -z "$GPU_OVERLAY_GBM_PACKAGE" ]; then + case "$OS_ID" in + ubuntu) + GPU_OVERLAY_GBM_PACKAGE="libgbm-msm" + ;; + *) + GPU_OVERLAY_GBM_PACKAGE="libgbm-msm1" + ;; + esac +fi + case "$OS_ID" in debian|ubuntu|centos|rhel|fedora) DISTRO_GPU_HANDLING_SUPPORTED=1 diff --git a/Runner/suites/Multimedia/Graphics/weston-simple-egl/README_weston-simple-egl.md b/Runner/suites/Multimedia/Graphics/weston-simple-egl/README_weston-simple-egl.md index 0e661c99..c4f5d6ba 100755 --- a/Runner/suites/Multimedia/Graphics/weston-simple-egl/README_weston-simple-egl.md +++ b/Runner/suites/Multimedia/Graphics/weston-simple-egl/README_weston-simple-egl.md @@ -1,9 +1,12 @@ Copyright (c) Qualcomm Technologies, Inc. and/or its subsidiaries. -SPDX-License-Identifier: BSD-3-Clause# weston-simple-egl GraphicsTest Scripts for Qualcomm Linux based platform (Yocto) +SPDX-License-Identifier: BSD-3-Clause + +# weston-simple-egl Graphics Test + # Overview -Graphics scripts automates the validation of Graphics OpenGL ES 2.0 capabilities on the Qualcomm RB3 Gen2 platform running a Yocto-based Linux system. It utilizes Weston-Simple-EGL test app which is publicly available at https://github.com/krh/weston +This suite validates OpenGL ES 2.0 through the `weston-simple-egl` Wayland client on Qualcomm Linux platforms. It supports image-provided Weston on Yocto and active desktop Wayland sessions on Debian-family distributions. ## Features @@ -13,11 +16,27 @@ Graphics scripts automates the validation of Graphics OpenGL ES 2.0 capabilities ## Prerequisites -Ensure the following components are present in the target Yocto build: +Yocto images must provide the required client and Weston runtime. On Ubuntu and Debian, the shared package provider ensures the mapped Weston and graphics packages. - `weston-simple-egl` (Binary Available in /usr/bin) be default - Write access to root filesystem (for environment setup) +## Desktop distribution modes + +- `./run.sh --base` selects the upstream MSM/freedreno stack and ensures the OS-specific Mesa package set. +- `./run.sh --overlay` selects the Qualcomm KGSL/Adreno stack and ensures the OS-specific overlay package set. Package or DKMS changes can require a reboot before validation continues. +- Debian uses `libgbm-msm1`, while Ubuntu uses `libgbm-msm`. Set `GPU_OVERLAY_GBM_PACKAGE` only when an explicit override is required. +- On Ubuntu, the test reuses an active GNOME Wayland session when Weston is not running. A root-launched test executes the client as the Wayland socket owner without stopping or restarting GDM. +- GDM can throttle an unfocused greeter client. That path validates compositor connectivity and EGL startup while recording, but not performance-gating, any FPS samples. + +Examples: + +```sh +./run.sh --base +./run.sh --overlay +./run.sh --auto +``` + ## Directory Structure ``` diff --git a/Runner/suites/Multimedia/Graphics/weston-simple-egl/run.sh b/Runner/suites/Multimedia/Graphics/weston-simple-egl/run.sh index c3914c27..f53e4d4a 100755 --- a/Runner/suites/Multimedia/Graphics/weston-simple-egl/run.sh +++ b/Runner/suites/Multimedia/Graphics/weston-simple-egl/run.sh @@ -81,7 +81,7 @@ ALLOW_RELAUNCH="${ALLOW_RELAUNCH:-0}" GPU_MODULE="${GPU_MODULE:-msm_kgsl}" GPU_OVERLAY_DEVICE="${GPU_OVERLAY_DEVICE:-/dev/kgsl-3d0}" -GPU_OVERLAY_GBM_PACKAGE="${GPU_OVERLAY_GBM_PACKAGE:-libgbm-msm1}" +GPU_OVERLAY_GBM_PACKAGE="${GPU_OVERLAY_GBM_PACKAGE:-}" OS_ID="unknown" DISTRO_GPU_HANDLING_SUPPORTED=0 @@ -287,6 +287,17 @@ fi [ -n "$OS_ID" ] || OS_ID="unknown" +if [ -z "$GPU_OVERLAY_GBM_PACKAGE" ]; then + case "$OS_ID" in + ubuntu) + GPU_OVERLAY_GBM_PACKAGE="libgbm-msm" + ;; + *) + GPU_OVERLAY_GBM_PACKAGE="libgbm-msm1" + ;; + esac +fi + case "$OS_ID" in debian|ubuntu|centos|rhel|fedora) DISTRO_GPU_HANDLING_SUPPORTED=1 @@ -442,17 +453,19 @@ fi case "$OS_ID" in debian|ubuntu|centos|rhel|fedora) - if ! command -v weston_prepare_runtime >/dev/null 2>&1; then + if [ "$OS_ID" = "ubuntu" ] && + command -v display_adopt_gnome_wayland_session >/dev/null 2>&1 && + display_adopt_gnome_wayland_session; then + log_info "Using the active GNOME Wayland session for onscreen EGL validation" + elif ! command -v weston_prepare_runtime >/dev/null 2>&1; then log_fail "$TESTNAME FAIL - weston_prepare_runtime helper is unavailable" echo "$TESTNAME FAIL" >"$RES_FILE" exit 0 - fi - - if ! weston_prepare_runtime \ - "$TESTNAME" \ - "$WAIT_SECS" \ - client \ - "$ALLOW_RELAUNCH"; then + elif ! weston_prepare_runtime \ + "$TESTNAME" \ + "$WAIT_SECS" \ + client \ + "$ALLOW_RELAUNCH"; then log_fail "$TESTNAME FAIL - no usable managed Weston runtime is available for onscreen EGL clients" echo "$TESTNAME FAIL" >"$RES_FILE" exit 0 @@ -501,6 +514,15 @@ if ! display_resolve_test_fps_gate_policy \ exit 0 fi +if [ "${DISPLAY_RUNTIME_MODEL:-}" = "desktop-gnome-session" ]; then + # GDM intentionally throttles non-interactive greeter clients, so their + # compositor frame cadence is not a display-refresh or GPU-performance + # measurement. The client connection and EGL startup remain validated. + DISPLAY_TEST_FPS_POLICY="desktop-session-connectivity" + export DISPLAY_TEST_FPS_POLICY + log_info "FPS policy, desktop-session-connectivity, GNOME greeter throttling is not performance evidence" +fi + if [ "${DISPLAY_TEST_FPS_POLICY:-shared}" = "desktop-functional-cap" ]; then log_info "FPS policy, desktop-functional-cap" log_info "Detected output refresh, ${DISPLAY_TEST_FPS_REFRESH:-unknown}Hz" @@ -567,8 +589,9 @@ fi log_info "Using client binary, $BIN" log_info "Wayland socket, ${DISPLAY_WAYLAND_SOCKET:-}" -log_info "XDG_RUNTIME_DIR, ${XDG_RUNTIME_DIR:-}" -log_info "WAYLAND_DISPLAY, ${WAYLAND_DISPLAY:-}" +log_info "Wayland session user, ${DISPLAY_WAYLAND_SESSION_USER:-current-user}" +log_info "XDG_RUNTIME_DIR, ${DISPLAY_WAYLAND_SESSION_RUNTIME_DIR:-${XDG_RUNTIME_DIR:-}}" +log_info "WAYLAND_DISPLAY, $(basename "${DISPLAY_WAYLAND_SOCKET:-${WAYLAND_DISPLAY:-}}")" log_info "Client mode, compositor-synchronized weston-simple-egl" # Retain the existing environment on Yocto. Upstream weston-simple-egl prints @@ -592,9 +615,32 @@ rc=0 if command -v run_with_timeout >/dev/null 2>&1; then log_info "Using run_with_timeout" - if command -v stdbuf >/dev/null 2>&1; then + if [ -n "${DISPLAY_WAYLAND_SESSION_USER:-}" ] && + command -v timeout >/dev/null 2>&1; then + log_info "Using session-local timeout to reap the desktop Wayland client" + + if command -v stdbuf >/dev/null 2>&1; then + display_run_in_wayland_session \ + timeout \ + "$DURATION" \ + stdbuf \ + -oL \ + -eL \ + "$BIN" >>"$RUN_LOG" 2>&1 + rc=$? + else + log_warn "stdbuf is unavailable, running the client without line buffering" + + display_run_in_wayland_session \ + timeout \ + "$DURATION" \ + "$BIN" >>"$RUN_LOG" 2>&1 + rc=$? + fi + elif command -v stdbuf >/dev/null 2>&1; then run_with_timeout \ "$DURATION" \ + display_run_in_wayland_session \ stdbuf \ -oL \ -eL \ @@ -605,6 +651,7 @@ if command -v run_with_timeout >/dev/null 2>&1; then run_with_timeout \ "$DURATION" \ + display_run_in_wayland_session \ "$BIN" >>"$RUN_LOG" 2>&1 rc=$? fi @@ -624,7 +671,7 @@ else [ -n "$duration_secs" ] || duration_secs=30 [ -n "$stop_grace_secs" ] || stop_grace_secs=3 - "$BIN" >>"$RUN_LOG" 2>&1 & + display_run_in_wayland_session "$BIN" >>"$RUN_LOG" 2>&1 & APP_PID=$! run_elapsed=0 @@ -713,6 +760,8 @@ fi if [ "${DISPLAY_TEST_FPS_POLICY:-shared}" = "desktop-functional-cap" ]; then log_info "Result summary, rc=${rc} elapsed=${elapsed}s fps=${fps_for_summary} mode=desktop-functional refresh=${DISPLAY_TEST_FPS_REFRESH:-unknown}Hz target=${DISPLAY_TEST_FPS_EXPECTED:-unknown} min_ok=${DISPLAY_TEST_FPS_MIN_OK:-unknown} graphics=${DISPLAY_BUILD_FLAVOUR} source=client-synchronized" +elif [ "${DISPLAY_TEST_FPS_POLICY:-shared}" = "desktop-session-connectivity" ]; then + log_info "Result summary, rc=${rc} elapsed=${elapsed}s fps=${fps_for_summary} mode=desktop-session-connectivity graphics=${DISPLAY_BUILD_FLAVOUR} source=client-synchronized" elif [ "${DISPLAY_FPS_MODE:-}" = "detected" ]; then log_info "Result summary, rc=${rc} elapsed=${elapsed}s fps=${fps_for_summary} mode=${DISPLAY_FPS_MODE} refresh=${DISPLAY_FPS_DETECTED_HZ}Hz expected=${DISPLAY_FPS_EXPECTED} min_ok=${DISPLAY_FPS_MIN_OK} graphics=${DISPLAY_BUILD_FLAVOUR} source=client-synchronized" else @@ -724,6 +773,12 @@ final="PASS" case "$rc" in 0|143) ;; + 124) + if [ "${DISPLAY_RUNTIME_MODEL:-}" != "desktop-gnome-session" ]; then + log_fail "$TESTNAME execution timed out unexpectedly, rc=$rc runtime=${DISPLAY_RUNTIME_MODEL:-unknown}" + final="FAIL" + fi + ;; *) log_fail "$TESTNAME execution failed, rc=$rc" final="FAIL" diff --git a/Runner/suites/Multimedia/Graphics/weston-simple-shm/run.sh b/Runner/suites/Multimedia/Graphics/weston-simple-shm/run.sh index cde61a18..b33363cb 100755 --- a/Runner/suites/Multimedia/Graphics/weston-simple-shm/run.sh +++ b/Runner/suites/Multimedia/Graphics/weston-simple-shm/run.sh @@ -53,7 +53,7 @@ ALLOW_RELAUNCH="${ALLOW_RELAUNCH:-0}" REQUESTED_GRAPHICS_MODE="default" GPU_MODULE="${GPU_MODULE:-msm_kgsl}" GPU_OVERLAY_DEVICE="${GPU_OVERLAY_DEVICE:-/dev/kgsl-3d0}" -GPU_OVERLAY_GBM_PACKAGE="${GPU_OVERLAY_GBM_PACKAGE:-libgbm-msm1}" +GPU_OVERLAY_GBM_PACKAGE="${GPU_OVERLAY_GBM_PACKAGE:-}" CLIENT_PID="" while [ "$#" -gt 0 ]; do @@ -153,6 +153,17 @@ elif [ -r /etc/os-release ]; then fi [ -n "$OS_ID" ] || OS_ID="unknown" +if [ -z "$GPU_OVERLAY_GBM_PACKAGE" ]; then + case "$OS_ID" in + ubuntu) + GPU_OVERLAY_GBM_PACKAGE="libgbm-msm" + ;; + *) + GPU_OVERLAY_GBM_PACKAGE="libgbm-msm1" + ;; + esac +fi + DISTRO_GPU_HANDLING_SUPPORTED=0 case "$OS_ID" in debian|ubuntu|centos|rhel|fedora) diff --git a/Runner/utils/lib_display.sh b/Runner/utils/lib_display.sh index 62860fd9..47b22f51 100755 --- a/Runner/utils/lib_display.sh +++ b/Runner/utils/lib_display.sh @@ -656,6 +656,114 @@ discover_wayland_socket_anywhere() { return 1 } +# Adopt the live GNOME Wayland session without changing the desktop compositor. +# The selected socket must be owned by a running gnome-shell user so later +# clients can be executed with the same uid and runtime directory. +display_adopt_gnome_wayland_session() { + dagws_pid="" + dagws_user="" + dagws_uid="" + dagws_runtime_dir="" + dagws_socket="" + dagws_socket_uid="" + dagws_home="" + + DISPLAY_WAYLAND_SESSION_USER="" + DISPLAY_WAYLAND_SESSION_HOME="" + DISPLAY_WAYLAND_SESSION_RUNTIME_DIR="" + DISPLAY_WAYLAND_SOCKET="" + DISPLAY_RUNTIME_MODEL="unknown" + export DISPLAY_WAYLAND_SESSION_USER + export DISPLAY_WAYLAND_SESSION_HOME + export DISPLAY_WAYLAND_SESSION_RUNTIME_DIR + export DISPLAY_WAYLAND_SOCKET + export DISPLAY_RUNTIME_MODEL + + command -v pgrep >/dev/null 2>&1 || return 1 + command -v ps >/dev/null 2>&1 || return 1 + command -v id >/dev/null 2>&1 || return 1 + + for dagws_pid in $(pgrep -x gnome-shell 2>/dev/null); do + dagws_user="$(ps -o user= -p "$dagws_pid" 2>/dev/null | awk 'NR == 1 { print $1 }')" + [ -n "$dagws_user" ] || continue + + dagws_uid="$(id -u "$dagws_user" 2>/dev/null || true)" + [ -n "$dagws_uid" ] || continue + + dagws_runtime_dir="/run/user/$dagws_uid" + [ -d "$dagws_runtime_dir" ] || continue + + for dagws_socket in "$dagws_runtime_dir"/wayland-*; do + [ -S "$dagws_socket" ] || continue + + dagws_socket_uid="$(stat -c '%u' "$dagws_socket" 2>/dev/null || true)" + [ "$dagws_socket_uid" = "$dagws_uid" ] || continue + + dagws_home="$(getent passwd "$dagws_user" 2>/dev/null | awk -F: 'NR == 1 { print $6 }')" + [ -n "$dagws_home" ] || dagws_home="/" + + DISPLAY_WAYLAND_SESSION_USER="$dagws_user" + DISPLAY_WAYLAND_SESSION_HOME="$dagws_home" + DISPLAY_WAYLAND_SESSION_RUNTIME_DIR="$dagws_runtime_dir" + DISPLAY_WAYLAND_SOCKET="$dagws_socket" + DISPLAY_RUNTIME_MODEL="desktop-gnome-session" + export DISPLAY_WAYLAND_SESSION_USER + export DISPLAY_WAYLAND_SESSION_HOME + export DISPLAY_WAYLAND_SESSION_RUNTIME_DIR + export DISPLAY_WAYLAND_SOCKET + export DISPLAY_RUNTIME_MODEL + + log_info "Adopted GNOME Wayland session, user=$dagws_user socket=$dagws_socket" + return 0 + done + done + + return 1 +} + +# Run a command in the user context that owns an adopted GNOME Wayland socket. +# When no GNOME session was adopted, preserve the caller's existing execution. +display_run_in_wayland_session() { + drws_user="${DISPLAY_WAYLAND_SESSION_USER:-}" + drws_home="${DISPLAY_WAYLAND_SESSION_HOME:-/}" + drws_runtime_dir="${DISPLAY_WAYLAND_SESSION_RUNTIME_DIR:-}" + drws_socket="${DISPLAY_WAYLAND_SOCKET:-}" + + if [ -z "$drws_user" ] || + [ -z "$drws_runtime_dir" ] || + [ -z "$drws_socket" ]; then + "$@" + return $? + fi + + if [ "$(id -un 2>/dev/null || true)" = "$drws_user" ]; then + env \ + HOME="$drws_home" \ + XDG_RUNTIME_DIR="$drws_runtime_dir" \ + WAYLAND_DISPLAY="$(basename "$drws_socket")" \ + DBUS_SESSION_BUS_ADDRESS="unix:path=$drws_runtime_dir/bus" \ + "$@" + return $? + fi + + if [ "$(id -u 2>/dev/null || echo 1)" -ne 0 ]; then + log_error "Cannot access the adopted GNOME Wayland session as user=$drws_user without root" + return 1 + fi + + if ! command -v runuser >/dev/null 2>&1; then + log_error "runuser is unavailable, cannot access the adopted GNOME Wayland session" + return 1 + fi + + runuser -u "$drws_user" -- env \ + HOME="$drws_home" \ + XDG_RUNTIME_DIR="$drws_runtime_dir" \ + WAYLAND_DISPLAY="$(basename "$drws_socket")" \ + DBUS_SESSION_BUS_ADDRESS="unix:path=$drws_runtime_dir/bus" \ + "$@" +} + adopt_wayland_env_from_socket() { sock="$1" [ -n "$sock" ] || return 1 @@ -5450,11 +5558,20 @@ display_prepare_desktop_graphics_stack() { dpdgs_mode="${2:-auto}" dpdgs_gpu_module="${3:-msm_kgsl}" dpdgs_gpu_device="${4:-/dev/kgsl-3d0}" - dpdgs_gbm_package="${5:-libgbm-msm1}" + dpdgs_gbm_package="${5:-}" dpdgs_rc=0 dpdgs_package_changed=0 dpdgs_boot_changed=0 + if [ -z "$dpdgs_gbm_package" ]; then + if command -v pkg_detect_os_id >/dev/null 2>&1 && + [ "$(pkg_detect_os_id 2>/dev/null || true)" = "ubuntu" ]; then + dpdgs_gbm_package="libgbm-msm" + else + dpdgs_gbm_package="libgbm-msm1" + fi + fi + case "$dpdgs_mode" in auto) log_info "Desktop graphics mode is auto, preserving the currently installed and booted stack" @@ -5865,6 +5982,16 @@ display_apply_test_fps_gate_policy() { ;; esac + if [ "${DISPLAY_TEST_FPS_POLICY:-shared}" = "desktop-session-connectivity" ]; then + if [ "$datfgp_count" -eq 0 ]; then + log_warn "No FPS samples were produced by the desktop session, compositor connectivity was validated" + else + log_info "Recording desktop-session FPS samples without performance gating, samples=$datfgp_count avg=$datfgp_avg" + fi + + return 0 + fi + if [ "${DISPLAY_TEST_FPS_POLICY:-shared}" != "desktop-functional-cap" ]; then if command -v display_fps_gate_avg >/dev/null 2>&1; then display_fps_gate_avg "$datfgp_avg" "$datfgp_count" @@ -5912,4 +6039,3 @@ display_apply_test_fps_gate_policy() { log_info "Desktop functional FPS gate passed, avg=$datfgp_avg (~$datfgp_rounded) >= ${DISPLAY_TEST_FPS_MIN_OK:-1} (target=${DISPLAY_TEST_FPS_EXPECTED:-unknown}, output=${DISPLAY_TEST_FPS_REFRESH:-unknown}Hz)" return 0 } -