Resuming happens on the other machine, so anything that lived only in this workspace either comes into the repo or gets named as something to carry. **The launchers come in.** `run-canary-safe.sh` (Wine) and `run-canary-native-safe.sh` (native) are the ONLY sanctioned way to start Canary from the editor — they force software Vulkan and refuse to launch while a hardware Vulkan device is visible, because Canary on the AMD GPU takes VS Code with it. They sat in the workspace root, outside git, hardcoding one machine's absolute paths, which is exactly why they could not be checked in. They now derive the workspace from their own location and honour `$SYLPHEED_ISO` and `$CANARY_BIN`, so the layout is a default rather than a requirement. Same for `run-canary-native.sh` (interactive, hardware Vulkan — not from the IDE), `diagnose-freeze.sh`, `live-guest-state.sh`, `heaptrack-wrap.sh` and the `asound-null.conf` the native launcher needs beside it. Both safe launchers were run from `tools/` before this commit: the native one reached content in 20 s (`VERDICT: HEALTHY`, title + 25,398 XMA lines, no faults), the Wine one ran 25 s and logged 4 `ADV.wmv` hits. **`docs/agents/HANDOFF-2026-09-18.md`** records what changed since 2026-09-16, what is on the server, what cannot travel through git, and the traps this machine paid for — chiefly that the guest-PC branch probe exists only on the fork's snapshot branch, so a rebuild from `sylpheed-re` silently loses it. **`HANDOFF-2026-09-06.md`** gets a correction note rather than an edit: a plain clone works again now that the 545 MB branch is gone, and its baselines are two baselines old. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
73 lines
3.4 KiB
Bash
Executable File
73 lines
3.4 KiB
Bash
Executable File
#!/usr/bin/env bash
|
|
# SAFE Xenia-Canary launcher for THIS box (shared AMD GPU + GPU-accelerated VS Code).
|
|
#
|
|
# Canary's vkd3d-proton renders D3D12->Vulkan; if it picks the AMD GPU it CRASHES
|
|
# VS Code. This wrapper forces software Vulkan (llvmpipe/lavapipe) IN THE SAME
|
|
# process as wine (env vars do NOT survive across separate shells!), and REFUSES
|
|
# to launch if any hardware Vulkan device is still visible (hard pre-flight gate).
|
|
#
|
|
# Usage: tools/run-canary-safe.sh [audit61_pcs_csv] [seconds]
|
|
# e.g. tools/run-canary-safe.sh 0x82507458,0x8250747c 95
|
|
# Output: /tmp/canary_video.stdout (+ xenia.log in the binary dir). Prints rc + ADV.wmv hit count.
|
|
set -u
|
|
|
|
# --- force software Vulkan, belt-and-suspenders across loader/driver variants ---
|
|
export VK_ICD_FILENAMES=/usr/share/vulkan/icd.d/lvp_icd.json
|
|
export VK_DRIVER_FILES=/usr/share/vulkan/icd.d/lvp_icd.json
|
|
export MESA_VK_DEVICE_SELECT=llvmpipe
|
|
export DXVK_FILTER_DEVICE_NAME=llvmpipe
|
|
export VKD3D_FILTER_DEVICE_NAME=llvmpipe
|
|
export LIBGL_ALWAYS_SOFTWARE=1
|
|
|
|
# Paths come from where this script sits — tools/ inside the repo, whose parent
|
|
# directory is the workspace holding the fork checkouts and the game data. Both
|
|
# are overridable, so a machine that lays things out differently sets the env
|
|
# var instead of editing the script. (This file used to hardcode one machine's
|
|
# absolute paths, which is why it could not be checked in.)
|
|
HERE="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
|
|
WORKSPACE="$(cd "$HERE/../.." && pwd)"
|
|
BIN="${CANARY_WINE_BIN_DIR:-$WORKSPACE/xenia-canary/build-cross/bin/Windows/Debug}"
|
|
ISO="${SYLPHEED_ISO:-$WORKSPACE/Project Sylpheed - Arc of Deception (USA, Europe) (En,Ja).iso}"
|
|
[ -f "$ISO" ] || { echo "ABORT: no ISO at '$ISO' — set \$SYLPHEED_ISO"; exit 4; }
|
|
PROBES="${1:-}"
|
|
SECS="${2:-95}"
|
|
|
|
# --- HARD PRE-FLIGHT GATE: only proceed if Vulkan exposes software devices ONLY ---
|
|
devs="$(vulkaninfo --summary 2>/dev/null | grep -i deviceName || true)"
|
|
if echo "$devs" | grep -qiE 'radv|amd|radeon|nvidia|geforce|intel\b'; then
|
|
echo "ABORT(pre-flight): a HARDWARE Vulkan device is still visible -> refusing (would crash VS Code):"
|
|
echo "$devs"
|
|
exit 3
|
|
fi
|
|
if ! echo "$devs" | grep -qiE 'llvmpipe'; then
|
|
echo "ABORT(pre-flight): llvmpipe not visible; lavapipe ICD missing? devs=[$devs]"
|
|
exit 3
|
|
fi
|
|
echo "pre-flight OK: software-only Vulkan -> $devs"
|
|
|
|
# --- clean slate ---
|
|
pkill -x xenia_canary_i2d.exe 2>/dev/null; wineserver -k 2>/dev/null; pkill -x Xvfb 2>/dev/null; sleep 1
|
|
|
|
Xvfb :99 -screen 0 1280x720x24 -nolisten tcp >/tmp/xvfb.log 2>&1 &
|
|
XVFB=$!
|
|
sleep 2
|
|
export DISPLAY=:99
|
|
cd "$BIN" || { echo "ABORT: bin dir missing"; kill "$XVFB" 2>/dev/null; exit 4; }
|
|
rm -f xenia.log
|
|
|
|
# Binary is overridable (default keeps the historical _i2d snapshot); extra
|
|
# cvars pass through via CANARY_EXTRA_ARGS (space-separated, values w/o spaces).
|
|
BIN_EXE="${CANARY_BIN:-xenia_canary_i2d.exe}"
|
|
args=(--log_level=3 --mute=true)
|
|
[ -n "$PROBES" ] && args+=("--audit_61_branch_probe_pcs=$PROBES")
|
|
if [ -n "${CANARY_EXTRA_ARGS:-}" ]; then
|
|
read -ra EXTRA <<< "$CANARY_EXTRA_ARGS"
|
|
args+=("${EXTRA[@]}")
|
|
fi
|
|
echo "launch (sw-vulkan, muted, ${SECS}s): wine $BIN_EXE ${args[*]}"
|
|
timeout "$SECS" wine "./$BIN_EXE" "$ISO" "${args[@]}" >/tmp/canary_video.stdout 2>&1
|
|
rc=$?
|
|
|
|
pkill -x xenia_canary_i2d.exe 2>/dev/null; wineserver -k 2>/dev/null; kill "$XVFB" 2>/dev/null; pkill -x Xvfb 2>/dev/null
|
|
echo "rc=$rc ADV.wmv=$(grep -ac 'ADV.wmv' xenia.log 2>/dev/null) logsize=$(wc -c < xenia.log 2>/dev/null)"
|