spaceship/tests/screenshot.sh

42 lines
2.1 KiB
Shell
Raw Normal View History

#!/data/data/com.termux/files/usr/bin/bash
# Renders a real screenshot of a Godot scene from Termux, via the Godot
# 4.7.1 Linux arm64 build inside the proot-distro Ubuntu container, using
# Xvfb (virtual display) + Mesa's softpipe software rasterizer.
#
# NOTE: Mesa's default software rasterizer, llvmpipe, crashes with
# SIGILL in this environment (confirmed via feasibility spike - its LLVM
# JIT appears to emit a CPU instruction this ARM64/proot/Android setup
# doesn't actually support, reproduced even with an empty project and no
# script). softpipe is Mesa's older non-JIT (pure C) rasterizer - slower,
# but doesn't hit this crash. Good enough for one-shot screenshots.
#
# Usage: bash tests/screenshot.sh <scene_res_path> <output_png_path> [wait_frames] [WxH]
# Example: bash tests/screenshot.sh res://Main.tscn /tmp/out.png 60 720x1280
#
# The resolution matters for anything with UI in it: the game is authored
# for a 720x1280 portrait viewport, so rendering at the default landscape
# size stretches the layout and makes it useless for judging whether
# controls fit. Pass 720x1280 when checking UI.
set -e
PROJECT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")/.." && pwd)"
GODOT_BIN="/root/Godot_v4.7.1-stable_linux.arm64"
SCENE_PATH="${1:?usage: screenshot.sh <scene_res_path> <output_png_path> [wait_frames] [WxH]}"
OUTPUT_PATH="${2:?usage: screenshot.sh <scene_res_path> <output_png_path> [wait_frames] [WxH]}"
WAIT_FRAMES="${3:-60}"
RESOLUTION="${4:-1280x720}"
proot-distro login ubuntu -- bash -c "
# Display :99 is dedicated to this helper. Clear both a live process left by
# an interrupted capture and its lock/socket before claiming it again.
pkill -x Xvfb >/dev/null 2>&1 || true
rm -f /tmp/.X99-lock /tmp/.X11-unix/X99
Xvfb :99 -screen 0 ${RESOLUTION}x24 &
XVFB_PID=\$!
trap 'kill \$XVFB_PID >/dev/null 2>&1 || true' EXIT
sleep 2
mkdir -p /tmp/xdgrt && chmod 700 /tmp/xdgrt
cd '$PROJECT_DIR'
DISPLAY=:99 XDG_RUNTIME_DIR=/tmp/xdgrt GALLIUM_DRIVER=softpipe '$GODOT_BIN' --audio-driver Dummy --rendering-driver opengl3 --rendering-method gl_compatibility --resolution '$RESOLUTION' -s res://tests/_screenshot_tool.gd -- '$SCENE_PATH' '$OUTPUT_PATH' '$WAIT_FRAMES'
"