From 96f77282276163b6390b12e85abe701d11676ef5 Mon Sep 17 00:00:00 2001 From: Kelsi Date: Sun, 8 Mar 2026 20:27:39 -0700 Subject: [PATCH] Add AMD FSR2 CI build job and adjust jitter offset sign --- .github/workflows/build.yml | 103 ++++++++++++++++++++++++++++++++++++ src/rendering/renderer.cpp | 6 ++- 2 files changed, 107 insertions(+), 2 deletions(-) diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index b903a442..e4c2fb53 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -73,6 +73,109 @@ jobs: path: build/wowee-*.deb if-no-files-found: error + build-linux-amd-fsr2: + name: Build (linux-amd-fsr2) + runs-on: ubuntu-24.04 + steps: + - name: Checkout + uses: actions/checkout@v4 + with: + submodules: true + + - name: Install dependencies + run: | + sudo apt-get update + sudo apt-get install -y \ + cmake \ + build-essential \ + pkg-config \ + libsdl2-dev \ + libglew-dev \ + libglm-dev \ + libssl-dev \ + zlib1g-dev \ + libvulkan-dev \ + vulkan-tools \ + glslc \ + libavformat-dev \ + libavcodec-dev \ + libswscale-dev \ + libavutil-dev \ + libunicorn-dev \ + libx11-dev \ + wine64 + sudo apt-get install -y libstorm-dev || true + + - name: Fetch AMD FSR2 SDK + run: | + rm -rf extern/FidelityFX-FSR2 + git clone --depth 1 https://github.com/GPUOpen-Effects/FidelityFX-FSR2.git extern/FidelityFX-FSR2 + + - name: Generate AMD FSR2 Vulkan permutation headers + run: | + set -euo pipefail + SDK_DIR="$PWD/extern/FidelityFX-FSR2" + SHADER_DIR="$SDK_DIR/src/ffx-fsr2-api/shaders" + OUT_DIR="$SDK_DIR/src/ffx-fsr2-api/vk/shaders" + SC="$SDK_DIR/tools/sc/FidelityFX_SC.exe" + + BASE_ARGS=( + -reflection + -deps=gcc + -DFFX_GPU=1 + -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 + -compiler=glslang + -e + main + --target-env + vulkan1.1 + -S + comp + -Os + -DFFX_GLSL=1 + -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} + ) + + PASSES=( + ffx_fsr2_tcr_autogen_pass + 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 + ) + + for pass in "${PASSES[@]}"; do + HALF_ARG="-DFFX_HALF={0,1}" + if [ "$pass" = "ffx_fsr2_compute_luminance_pyramid_pass" ]; then + HALF_ARG="-DFFX_HALF=0" + fi + wine "$SC" "${BASE_ARGS[@]}" "$HALF_ARG" \ + "-name=${pass}" \ + "-I${SHADER_DIR}" \ + "-output=${OUT_DIR}" \ + "${SHADER_DIR}/${pass}.glsl" + done + + test -f "$OUT_DIR/ffx_fsr2_accumulate_pass_permutations.h" + + - name: Configure (AMD ON) + run: cmake -S . -B build -DCMAKE_BUILD_TYPE=Release -DWOWEE_ENABLE_AMD_FSR2=ON + + - name: Build + run: cmake --build build --parallel $(nproc) + build-macos: name: Build (macOS ${{ matrix.arch }}) runs-on: ${{ matrix.runner }} diff --git a/src/rendering/renderer.cpp b/src/rendering/renderer.cpp index ecec244e..bd22c400 100644 --- a/src/rendering/renderer.cpp +++ b/src/rendering/renderer.cpp @@ -4323,9 +4323,11 @@ void Renderer::dispatchAmdFsr2() { L"FSR2_Output", FFX_RESOURCE_STATE_UNORDERED_ACCESS); // Camera jitter is stored as NDC projection offsets; convert to render-pixel offsets. + // AMD jitter convention is opposite our projection offset sign in Vulkan space. + const float jitterSign = static_cast(envIntOrDefault("WOWEE_FSR2_JITTER_SIGN", -1)); glm::vec2 jitterNdc = camera->getJitter(); - desc.jitterOffset.x = jitterNdc.x * 0.5f * static_cast(fsr2_.internalWidth); - desc.jitterOffset.y = jitterNdc.y * 0.5f * static_cast(fsr2_.internalHeight); + desc.jitterOffset.x = jitterSign * jitterNdc.x * 0.5f * static_cast(fsr2_.internalWidth); + desc.jitterOffset.y = jitterSign * jitterNdc.y * 0.5f * static_cast(fsr2_.internalHeight); desc.motionVectorScale.x = static_cast(fsr2_.internalWidth); desc.motionVectorScale.y = static_cast(fsr2_.internalHeight); desc.renderSize.width = fsr2_.internalWidth;