#!/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 [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 [wait_frames] [WxH]}" OUTPUT_PATH="${2:?usage: screenshot.sh [wait_frames] [WxH]}" WAIT_FRAMES="${3:-60}" RESOLUTION="${4:-1280x720}" proot-distro login ubuntu -- bash -c " # A killed run (or a session that ended mid-screenshot) leaves /tmp/.X99-lock # behind, and Xvfb then refuses to claim :99 - which surfaces much later and # far less obviously as Godot's 'X11 Display is not available'. Nothing else # uses :99 here, so a lock with no live Xvfb behind it is always stale. if ! pgrep -x Xvfb >/dev/null; then rm -f /tmp/.X99-lock /tmp/.X11-unix/X99 fi Xvfb :99 -screen 0 ${RESOLUTION}x24 & XVFB_PID=\$! 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' --rendering-driver opengl3 --rendering-method gl_compatibility --resolution '$RESOLUTION' -s res://tests/_screenshot_tool.gd -- '$SCENE_PATH' '$OUTPUT_PATH' '$WAIT_FRAMES' kill \$XVFB_PID "