Kelsidavis-WoWee/tools/generate_ffx_sdk_vk_permutations.sh
Kelsi e2b89c9b42 Fix FSR3 permutation script failures on arm64 Linux and Windows
Linux arm64 (Exec format error):
- The script was downloading the x86_64 DXC release on all Linux hosts;
  on aarch64 runners the x86_64 ELF fails with EXEC_FORMAT_ERROR at
  shader compilation time. Add uname -m guard: when running on aarch64/
  arm64 Linux without a DXC in PATH, exit 0 with an advisory message
  rather than downloading an incompatible binary. The FSR3 SDK build
  proceeds as it did before the permutation script was introduced
  (permutation headers are expected to be pre-built in the SDK checkout).

Windows (bash: command not found, exit 127):
- cmake custom-target COMMANDs run via cmd.exe on Windows even when
  cmake is configured from a MSYS2 shell, so bare 'bash' is not resolved.
- Use find_program(BASH_EXECUTABLE bash) at configure time (which runs
  under shell: msys2 in CI and thus finds the MSYS2 bash at its native
  Windows-absolute path). When bash is found, embed the full path in the
  COMMAND; when not found (unusual non-MSYS2 Windows setups), skip the
  permutation step and emit a STATUS message.
2026-03-09 13:11:03 -07:00

202 lines
7.4 KiB
Bash
Executable file

#!/usr/bin/env bash
set -euo pipefail
ROOT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")/.." && pwd)"
SDK_ROOT="${1:-$ROOT_DIR/extern/FidelityFX-SDK}"
KITS_DIR="$SDK_ROOT/Kits/FidelityFX"
FFX_SC="$KITS_DIR/tools/ffx_sc/ffx_sc.py"
OUT_DIR="$KITS_DIR/framegeneration/fsr3/internal/permutations/vk"
SHADER_DIR="$KITS_DIR/upscalers/fsr3/internal/shaders"
if [[ ! -f "$FFX_SC" ]]; then
echo "Missing ffx_sc.py at $FFX_SC" >&2
exit 1
fi
required_headers=(
"$OUT_DIR/ffx_fsr2_accumulate_pass_wave64_16bit_permutations.h"
"$OUT_DIR/ffx_fsr3upscaler_accumulate_pass_wave64_16bit_permutations.h"
"$OUT_DIR/ffx_fsr3upscaler_autogen_reactive_pass_permutations.h"
)
if [[ "${WOWEE_FORCE_REGEN_PERMS:-0}" != "1" ]]; then
missing=0
for h in "${required_headers[@]}"; do
[[ -f "$h" ]] || missing=1
done
if [[ $missing -eq 0 ]]; then
echo "FidelityFX VK permutation headers already present."
exit 0
fi
fi
if [[ -z "${DXC:-}" ]]; then
if [[ -x /tmp/dxc/bin/dxc ]]; then
export DXC=/tmp/dxc/bin/dxc
elif command -v dxc >/dev/null 2>&1; then
export DXC="$(command -v dxc)"
elif [[ "$(uname -s)" == "Linux" ]]; then
_arch="$(uname -m)"
if [[ "$_arch" == "aarch64" || "$_arch" == "arm64" ]]; then
echo "Linux aarch64: no official arm64 DXC release available." >&2
echo "Install 'directx-shader-compiler' via apt or set DXC=/path/to/dxc to regenerate." >&2
echo "Skipping VK permutation codegen (permutations may be pre-built in the SDK checkout)."
exit 0
fi
echo "DXC not found; downloading Linux DXC release to /tmp/dxc ..."
tmp_json="$(mktemp)"
curl -sS https://api.github.com/repos/microsoft/DirectXShaderCompiler/releases/latest > "$tmp_json"
dxc_url="$(python3 - << 'PY' "$tmp_json"
import json, sys
with open(sys.argv[1], 'r', encoding='utf-8') as f:
data = json.load(f)
for a in data.get('assets', []):
name = a.get('name', '')
if name.startswith('linux_dxc_') and name.endswith('.x86_64.tar.gz'):
print(a.get('browser_download_url', ''))
break
PY
)"
rm -f "$tmp_json"
if [[ -z "$dxc_url" ]]; then
echo "Failed to locate Linux DXC release asset URL." >&2
exit 1
fi
rm -rf /tmp/dxc /tmp/linux_dxc.tar.gz
curl -L --fail "$dxc_url" -o /tmp/linux_dxc.tar.gz
mkdir -p /tmp/dxc
tar -xzf /tmp/linux_dxc.tar.gz -C /tmp/dxc --strip-components=1
export DXC=/tmp/dxc/bin/dxc
elif [[ "$(uname -s)" =~ MINGW|MSYS|CYGWIN ]]; then
echo "DXC not found; downloading Windows DXC release to /tmp/dxc ..."
tmp_json="$(mktemp)"
curl -sS https://api.github.com/repos/microsoft/DirectXShaderCompiler/releases/latest > "$tmp_json"
dxc_url="$(python3 - << 'PY' "$tmp_json"
import json, sys
with open(sys.argv[1], 'r', encoding='utf-8') as f:
data = json.load(f)
for a in data.get('assets', []):
name = a.get('name', '')
if name.startswith('dxc_') and name.endswith('.zip'):
print(a.get('browser_download_url', ''))
break
PY
)"
rm -f "$tmp_json"
if [[ -z "$dxc_url" ]]; then
echo "Failed to locate Windows DXC release asset URL." >&2
exit 1
fi
rm -rf /tmp/dxc /tmp/dxc_win.zip
curl -L --fail "$dxc_url" -o /tmp/dxc_win.zip
mkdir -p /tmp/dxc
unzip -q /tmp/dxc_win.zip -d /tmp/dxc
if [[ -x /tmp/dxc/bin/x64/dxc.exe ]]; then
export DXC=/tmp/dxc/bin/x64/dxc.exe
elif [[ -x /tmp/dxc/bin/x86/dxc.exe ]]; then
export DXC=/tmp/dxc/bin/x86/dxc.exe
else
echo "DXC download succeeded, but dxc.exe was not found." >&2
exit 1
fi
else
echo "DXC not found. Set DXC=/path/to/dxc or install to /tmp/dxc/bin/dxc" >&2
exit 1
fi
fi
mkdir -p "$OUT_DIR"
# First generate frame interpolation + optical flow permutations via SDK script.
(
cd "$SDK_ROOT"
./generate_vk_permutations.sh
)
BASE_ARGS=(-reflection -embed-arguments -E CS -Wno-for-redefinition -Wno-ambig-lit-shift -DFFX_GPU=1 -DFFX_HLSL=1 -DFFX_IMPLICIT_SHADER_REGISTER_BINDING_HLSL=0)
WAVE32=(-DFFX_HLSL_SM=62 -T cs_6_2)
WAVE64=("-DFFX_PREFER_WAVE64=[WaveSize(64)]" -DFFX_HLSL_SM=66 -T cs_6_6)
BIT16=(-DFFX_HALF=1 -enable-16bit-types)
compile_shader() {
local file="$1"; shift
local name="$1"; shift
python3 "$FFX_SC" "${BASE_ARGS[@]}" "$@" -name="$name" -output="$OUT_DIR" "$file"
}
# FSR2 (for upscalers/fsr3/internal/ffx_fsr2_shaderblobs.cpp)
FSR2_COMMON=(
-DFFX_FSR2_EMBED_ROOTSIG=0
-DFFX_FSR2_OPTION_UPSAMPLE_SAMPLERS_USE_DATA_HALF=0
-DFFX_FSR2_OPTION_ACCUMULATE_SAMPLERS_USE_DATA_HALF=0
-DFFX_FSR2_OPTION_REPROJECT_SAMPLERS_USE_DATA_HALF=1
-DFFX_FSR2_OPTION_POSTPROCESSLOCKSTATUS_SAMPLERS_USE_DATA_HALF=0
-DFFX_FSR2_OPTION_UPSAMPLE_USE_LANCZOS_TYPE=2
"-DFFX_FSR2_OPTION_REPROJECT_USE_LANCZOS_TYPE={0,1}"
"-DFFX_FSR2_OPTION_HDR_COLOR_INPUT={0,1}"
"-DFFX_FSR2_OPTION_LOW_RESOLUTION_MOTION_VECTORS={0,1}"
"-DFFX_FSR2_OPTION_JITTERED_MOTION_VECTORS={0,1}"
"-DFFX_FSR2_OPTION_INVERTED_DEPTH={0,1}"
"-DFFX_FSR2_OPTION_APPLY_SHARPENING={0,1}"
-I "$KITS_DIR/api/internal/include/gpu"
-I "$KITS_DIR/upscalers/fsr3/include/gpu"
)
FSR2_SHADERS=(
ffx_fsr2_autogen_reactive_pass
ffx_fsr2_accumulate_pass
ffx_fsr2_compute_luminance_pyramid_pass
ffx_fsr2_depth_clip_pass
ffx_fsr2_lock_pass
ffx_fsr2_reconstruct_previous_depth_pass
ffx_fsr2_rcas_pass
ffx_fsr2_tcr_autogen_pass
)
for shader in "${FSR2_SHADERS[@]}"; do
file="$SHADER_DIR/$shader.hlsl"
[[ -f "$file" ]] || continue
compile_shader "$file" "$shader" -DFFX_HALF=0 "${WAVE32[@]}" "${FSR2_COMMON[@]}"
compile_shader "$file" "${shader}_wave64" -DFFX_HALF=0 "${WAVE64[@]}" "${FSR2_COMMON[@]}"
compile_shader "$file" "${shader}_16bit" "${BIT16[@]}" "${WAVE32[@]}" "${FSR2_COMMON[@]}"
compile_shader "$file" "${shader}_wave64_16bit" "${BIT16[@]}" "${WAVE64[@]}" "${FSR2_COMMON[@]}"
done
# FSR3 upscaler (for upscalers/fsr3/internal/ffx_fsr3upscaler_shaderblobs.cpp)
FSR3_COMMON=(
-DFFX_FSR3UPSCALER_EMBED_ROOTSIG=0
-DFFX_FSR3UPSCALER_OPTION_UPSAMPLE_SAMPLERS_USE_DATA_HALF=0
-DFFX_FSR3UPSCALER_OPTION_ACCUMULATE_SAMPLERS_USE_DATA_HALF=0
-DFFX_FSR3UPSCALER_OPTION_REPROJECT_SAMPLERS_USE_DATA_HALF=1
-DFFX_FSR3UPSCALER_OPTION_POSTPROCESSLOCKSTATUS_SAMPLERS_USE_DATA_HALF=0
-DFFX_FSR3UPSCALER_OPTION_UPSAMPLE_USE_LANCZOS_TYPE=2
"-DFFX_FSR3UPSCALER_OPTION_REPROJECT_USE_LANCZOS_TYPE={0,1}"
"-DFFX_FSR3UPSCALER_OPTION_HDR_COLOR_INPUT={0,1}"
"-DFFX_FSR3UPSCALER_OPTION_LOW_RESOLUTION_MOTION_VECTORS={0,1}"
"-DFFX_FSR3UPSCALER_OPTION_JITTERED_MOTION_VECTORS={0,1}"
"-DFFX_FSR3UPSCALER_OPTION_INVERTED_DEPTH={0,1}"
"-DFFX_FSR3UPSCALER_OPTION_APPLY_SHARPENING={0,1}"
-I "$KITS_DIR/api/internal/gpu"
-I "$KITS_DIR/upscalers/fsr3/include/gpu"
)
FSR3_SHADERS=(
ffx_fsr3upscaler_autogen_reactive_pass
ffx_fsr3upscaler_accumulate_pass
ffx_fsr3upscaler_luma_pyramid_pass
ffx_fsr3upscaler_prepare_reactivity_pass
ffx_fsr3upscaler_prepare_inputs_pass
ffx_fsr3upscaler_shading_change_pass
ffx_fsr3upscaler_rcas_pass
ffx_fsr3upscaler_shading_change_pyramid_pass
ffx_fsr3upscaler_luma_instability_pass
ffx_fsr3upscaler_debug_view_pass
)
for shader in "${FSR3_SHADERS[@]}"; do
file="$SHADER_DIR/$shader.hlsl"
[[ -f "$file" ]] || continue
compile_shader "$file" "$shader" -DFFX_HALF=0 "${WAVE32[@]}" "${FSR3_COMMON[@]}"
compile_shader "$file" "${shader}_wave64" -DFFX_HALF=0 "${WAVE64[@]}" "${FSR3_COMMON[@]}"
compile_shader "$file" "${shader}_16bit" "${BIT16[@]}" "${WAVE32[@]}" "${FSR3_COMMON[@]}"
compile_shader "$file" "${shader}_wave64_16bit" "${BIT16[@]}" "${WAVE64[@]}" "${FSR3_COMMON[@]}"
done
echo "Generated VK permutation headers in $OUT_DIR"