From 548dcf0304f795aa6bb39cdaf006c275d352fa46 Mon Sep 17 00:00:00 2001 From: Adrien Beudin Date: Thu, 29 May 2025 18:09:15 +0200 Subject: [PATCH 1/3] feat: add grim for wayland screenshot --- Config.in | 1 + .../recalbox/scripts/recalbox-utils.sh | 8 ++++++++ board/recalbox/fsoverlay/usr/bin/raspi2png | 12 +++++++++--- package/grim/Config.in | 8 ++++++++ package/grim/grim.mk | 18 ++++++++++++++++++ package/recalbox-system/Config.in | 1 + 6 files changed, 45 insertions(+), 3 deletions(-) create mode 100644 package/grim/Config.in create mode 100644 package/grim/grim.mk diff --git a/Config.in b/Config.in index fc3d0afd96..c0d19ad5f3 100644 --- a/Config.in +++ b/Config.in @@ -392,6 +392,7 @@ menu "Utils" source "$BR2_EXTERNAL_RECALBOX_PATH/package/rpi-eeprom/Config.in" source "$BR2_EXTERNAL_RECALBOX_PATH/package/rpi-utils/Config.in" source "$BR2_EXTERNAL_RECALBOX_PATH/package/nodejs-quasar/Config.in.host" + source "$BR2_EXTERNAL_RECALBOX_PATH/package/grim/Config.in" endmenu menu "Small TFT Screen" source "$BR2_EXTERNAL_RECALBOX_PATH/package/rpi-fbcp/Config.in" diff --git a/board/recalbox/fsoverlay/recalbox/scripts/recalbox-utils.sh b/board/recalbox/fsoverlay/recalbox/scripts/recalbox-utils.sh index 86b3958325..64b2f59a41 100644 --- a/board/recalbox/fsoverlay/recalbox/scripts/recalbox-utils.sh +++ b/board/recalbox/fsoverlay/recalbox/scripts/recalbox-utils.sh @@ -313,3 +313,11 @@ function isRecalboxRGBDUAL2ForceComposite { function isRecalboxRGBDUAL2Force50Hz { grep -q "0" /sys/devices/platform/recalboxrgbdual2/dipswitch-50hz/value } +useWayland() { + count=$(ps aux | grep dwl | grep -v grep | wc -l) + if [ "$count" -gt "0" ]; then + return 0 + else + return 1 + fi +} diff --git a/board/recalbox/fsoverlay/usr/bin/raspi2png b/board/recalbox/fsoverlay/usr/bin/raspi2png index a858b93fab..96e1c60a21 100755 --- a/board/recalbox/fsoverlay/usr/bin/raspi2png +++ b/board/recalbox/fsoverlay/usr/bin/raspi2png @@ -1,5 +1,5 @@ #!/bin/bash - +set -x source /recalbox/scripts/recalbox-utils.sh ARCH=$(getArchName) @@ -12,10 +12,16 @@ case "$ARCH" in /usr/bin/ffmpeg -f x11grab -framerate 1 -video_size "$(DISPLAY=:0 xrandr |grep \* |awk '{print $1}')" -i :0.0 -vframes 1 -vcodec png "$2" ;; *) - /usr/bin/kmsgrab "$2" + if currentVideoOnCRT; then + /usr/bin/ffmpeg -device /dev/dri/card2 -f kmsgrab -i - -vf 'hwdownload,format=bgr0' -framerate 1 -frames:v 1 "$2" + /usr/bin/ffmpeg -i "$2" -vf scale=320:240 /tmp/temp.png && mv -f /tmp/temp.png "$2" + elif useWayland; then + grim "$2" + else + /usr/bin/kmsgrab "$2" + fi if [ "$ARCH" = "odroidgo2" ] && [ $? -eq 0 ]; then ffmpeg -y -i "$2" -vf transpose=1 /tmp/temp.png && mv -f /tmp/temp.png "$2" fi ;; esac - diff --git a/package/grim/Config.in b/package/grim/Config.in new file mode 100644 index 0000000000..0721d8f26d --- /dev/null +++ b/package/grim/Config.in @@ -0,0 +1,8 @@ +config BR2_PACKAGE_GRIM + bool "grim" + select BR2_PACKAGE_WAYLAND + select BR2_PACKAGE_LIBPNG + help + Grab images from a Wayland compositor + + https://gitlab.freedesktop.org/emersion/grim diff --git a/package/grim/grim.mk b/package/grim/grim.mk new file mode 100644 index 0000000000..404bb4db49 --- /dev/null +++ b/package/grim/grim.mk @@ -0,0 +1,18 @@ +################################################################################ +# +# grim +# +################################################################################ + +GRIM_VERSION = 7ba46364ab95141c79e0e18093aa66597256182c +GRIM_SITE = https://gitlab.freedesktop.org/emersion/grim/-/archive/$(GRIM_VERSION) +GRIM_LICENSE = MIT +GRIM_LICENSE_FILES = LICENSE + +GRIM_DEPENDENCIES = wayland libpng + +GRIM_CONF_OPTS = \ + -Dman-pages=disabled \ + -Djpeg=disabled + +$(eval $(meson-package)) diff --git a/package/recalbox-system/Config.in b/package/recalbox-system/Config.in index da76aa550a..38c95df2fa 100644 --- a/package/recalbox-system/Config.in +++ b/package/recalbox-system/Config.in @@ -281,6 +281,7 @@ config BR2_PACKAGE_RECALBOX_VIDEO_XWAYLAND select BR2_PACKAGE_SDL2_X11 select BR2_PACKAGE_SDL2_OPENGL select BR2_PACKAGE_XLIB_LIBXI + select BR2_PACKAGE_GRIM config BR2_PACKAGE_RECALBOX_QT6 bool -- GitLab From 420feae6bab0731872c13ea9decca9d49ff5e2ff Mon Sep 17 00:00:00 2001 From: Adrien Beudin Date: Sat, 31 May 2025 23:24:44 +0200 Subject: [PATCH 2/3] fix: screenshot with superrez --- .../libretro/crtswitchres/LibretroConfigCRTSwitchres.py | 2 ++ 1 file changed, 2 insertions(+) diff --git a/projects/configgen/configgen/generators/libretro/crtswitchres/LibretroConfigCRTSwitchres.py b/projects/configgen/configgen/generators/libretro/crtswitchres/LibretroConfigCRTSwitchres.py index c02aa20117..e2a4b6433d 100644 --- a/projects/configgen/configgen/generators/libretro/crtswitchres/LibretroConfigCRTSwitchres.py +++ b/projects/configgen/configgen/generators/libretro/crtswitchres/LibretroConfigCRTSwitchres.py @@ -78,6 +78,7 @@ class LibretroConfigCRTSwitchres: "video_message_pos_x": '"0.04"', "video_message_pos_y": '"0.05"', "quick_menu_show_crt_cali": 'true', + "video_gpu_screenshot": '"true"' } print("[CRTSwitchres]: configuration on {} with {} signal with resolution {}". @@ -235,6 +236,7 @@ class LibretroConfigCRTSwitchres: if system.CRTSuperrez in ["1920", "2560", "3840"]: config["video_font_path"] = '"/usr/share/fonts/truetype/ubuntu_condensed-4x_wide.ttf"' + config["video_gpu_screenshot"] = '"false"' else: config["video_font_path"] = '"/usr/share/fonts/truetype/ubuntu_condensed.ttf"' -- GitLab From 1fd9365536fec6ea1e794d1adbf0d454791bf0df Mon Sep 17 00:00:00 2001 From: Adrien Beudin Date: Thu, 28 Aug 2025 17:12:59 +0200 Subject: [PATCH 3/3] fix: screenshot for vga --- .../recalbox/scripts/recalbox-utils.sh | 11 +++++ board/recalbox/fsoverlay/usr/bin/raspi2png | 45 +++++++++++-------- 2 files changed, 38 insertions(+), 18 deletions(-) diff --git a/board/recalbox/fsoverlay/recalbox/scripts/recalbox-utils.sh b/board/recalbox/fsoverlay/recalbox/scripts/recalbox-utils.sh index 64b2f59a41..3d1c0220f2 100644 --- a/board/recalbox/fsoverlay/recalbox/scripts/recalbox-utils.sh +++ b/board/recalbox/fsoverlay/recalbox/scripts/recalbox-utils.sh @@ -321,3 +321,14 @@ useWayland() { return 1 fi } + +function getCurrentCrtDriDevice() { + for card in "$(ls /sys/class/drm/ | grep VGA)" "$(ls /sys/class/drm/ | grep Composite)"; do + if [ -n "$card" ] && grep -q "^connected" /sys/class/drm/"$card"/status; then + dev="/dev/$(grep DEVNAME /sys/class/drm/"$card"/device/uevent | awk -F= '{print $2}')" + echo "${dev}" + return 0 + fi + done + return 1 +} diff --git a/board/recalbox/fsoverlay/usr/bin/raspi2png b/board/recalbox/fsoverlay/usr/bin/raspi2png index 96e1c60a21..5f1ba62e0a 100755 --- a/board/recalbox/fsoverlay/usr/bin/raspi2png +++ b/board/recalbox/fsoverlay/usr/bin/raspi2png @@ -5,23 +5,32 @@ source /recalbox/scripts/recalbox-utils.sh ARCH=$(getArchName) case "$ARCH" in - rpi1|rpizero2legacy) - /usr/bin/raspi2png.real "$@" - ;; - x86|x86_64) - /usr/bin/ffmpeg -f x11grab -framerate 1 -video_size "$(DISPLAY=:0 xrandr |grep \* |awk '{print $1}')" -i :0.0 -vframes 1 -vcodec png "$2" - ;; - *) - if currentVideoOnCRT; then - /usr/bin/ffmpeg -device /dev/dri/card2 -f kmsgrab -i - -vf 'hwdownload,format=bgr0' -framerate 1 -frames:v 1 "$2" - /usr/bin/ffmpeg -i "$2" -vf scale=320:240 /tmp/temp.png && mv -f /tmp/temp.png "$2" - elif useWayland; then - grim "$2" - else - /usr/bin/kmsgrab "$2" - fi - if [ "$ARCH" = "odroidgo2" ] && [ $? -eq 0 ]; then + rpi1|rpizero2legacy) + /usr/bin/raspi2png.real "$@" + ;; + x86|x86_64) + /usr/bin/ffmpeg -f x11grab -framerate 1 -video_size "$(DISPLAY=:0 xrandr |grep \* |awk '{print $1}')" -i :0.0 -vframes 1 -vcodec png "$2" + ;; + odroidgo2) ffmpeg -y -i "$2" -vf transpose=1 /tmp/temp.png && mv -f /tmp/temp.png "$2" - fi - ;; + ;; + *) + if currentVideoOnCRT; then + card=$(getCurrentCrtDriDevice) + if [ "$card" = "/dev/dri/card2" ]; then + res="720×480" + else + res="320:240" + fi + /usr/bin/ffmpeg -device $card -f kmsgrab -i - -vf 'hwdownload,format=bgr0' -framerate 1 -frames:v 1 "$2" + /usr/bin/ffmpeg -i "$2" -vf scale=$res /tmp/temp.png && mv -f /tmp/temp.png "$2" + elif useWayland; then + grim "$2" + else + /usr/bin/kmsgrab "$2" + fi + if [ "$ARCH" = "odroidgo2" ] && [ $? -eq 0 ]; then + ffmpeg -y -i "$2" -vf transpose=1 /tmp/temp.png && mv -f /tmp/temp.png "$2" + fi + ;; esac -- GitLab