mirror of
https://github.com/Kelsidavis/WoWee.git
synced 2026-03-22 23:30:14 +00:00
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.
202 lines
7.4 KiB
Bash
Executable file
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"
|