#!/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] [key=value ...] # Example: bash tests/screenshot.sh res://world/Main.tscn /tmp/out.png 60 720x1280 # bash tests/screenshot.sh res://surface/PlanetSurface.tscn /tmp/gas.png 90 720x1280 planet_definition_id=gas_giant # # Trailing key=value pairs are set on the GameState autoload before the # scene loads - see tests/_screenshot_tool.gd. # # 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}" shift 4 2>/dev/null || shift $# STATE_ARGS=("$@") 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' ${STATE_ARGS[*]} "