diff --git a/CMakeLists.txt b/CMakeLists.txt index 1f33a0a2..94c57484 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -22,6 +22,25 @@ set(CMAKE_ARCHIVE_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/lib) option(BUILD_SHARED_LIBS "Build shared libraries" OFF) option(WOWEE_BUILD_TESTS "Build tests" OFF) option(WOWEE_ENABLE_ASAN "Enable AddressSanitizer (Debug builds)" OFF) +option(WOWEE_ENABLE_AMD_FSR2 "Enable AMD FidelityFX FSR2 backend when SDK is present" ON) + +# AMD FidelityFX FSR2 SDK detection (drop-in under extern/FidelityFX-FSR2) +set(WOWEE_AMD_FSR2_DIR ${CMAKE_SOURCE_DIR}/extern/FidelityFX-FSR2) +set(WOWEE_AMD_FSR2_HEADER ${WOWEE_AMD_FSR2_DIR}/src/ffx-fsr2-api/ffx_fsr2.h) +if(WOWEE_ENABLE_AMD_FSR2 AND EXISTS ${WOWEE_AMD_FSR2_HEADER}) + message(STATUS "AMD FSR2 SDK detected at ${WOWEE_AMD_FSR2_DIR}") + add_compile_definitions(WOWEE_HAS_AMD_FSR2=1) + include_directories( + ${WOWEE_AMD_FSR2_DIR}/src + ${WOWEE_AMD_FSR2_DIR}/src/ffx-fsr2-api + ${WOWEE_AMD_FSR2_DIR}/src/ffx-fsr2-api/vk + ) +else() + add_compile_definitions(WOWEE_HAS_AMD_FSR2=0) + if(WOWEE_ENABLE_AMD_FSR2) + message(WARNING "AMD FSR2 SDK not found at ${WOWEE_AMD_FSR2_DIR}; using internal fallback implementation.") + endif() +endif() # Opcode registry generation/validation find_package(Python3 COMPONENTS Interpreter QUIET) diff --git a/docs/AMD_FSR2_INTEGRATION.md b/docs/AMD_FSR2_INTEGRATION.md new file mode 100644 index 00000000..767fcf19 --- /dev/null +++ b/docs/AMD_FSR2_INTEGRATION.md @@ -0,0 +1,50 @@ +# AMD FSR2 Integration Notes + +This project currently has two FSR2 states: + +- `AMD FidelityFX SDK` backend (preferred): enabled when SDK sources are present. +- `Internal fallback` backend: used when SDK is missing. + +## SDK Location + +Drop AMD's official FSR2 repo at: + +`extern/FidelityFX-FSR2` + +Expected header for detection: + +`extern/FidelityFX-FSR2/src/ffx-fsr2-api/ffx_fsr2.h` + +## Build Flags + +- `WOWEE_ENABLE_AMD_FSR2=ON` (default): try to use AMD SDK if detected. +- `WOWEE_HAS_AMD_FSR2` compile define: + - `1` when SDK header is found. + - `0` otherwise (fallback path). + +## Current Status + +- CMake detects the SDK and defines `WOWEE_HAS_AMD_FSR2`. +- UI shows active FSR2 backend label in settings. +- Runtime logs clearly indicate whether AMD SDK is available. + +## Remaining Work (to finish official AMD path) + +1. Add backend wrapper around `FfxFsr2Context` and Vulkan backend helpers. +2. Feed required inputs each frame: + - Color, depth, motion vectors + - Jitter offsets + - Delta time and render/display resolution + - Exposure / reactive mask as needed +3. Replace custom compute accumulation path with `ffxFsr2ContextDispatch`. +4. Keep current fallback path behind a runtime switch for safety. +5. Add a debug overlay: + - Backend in use + - Internal resolution + - Jitter values + - Motion vector validity stats +6. Validate with fixed camera + movement sweeps: + - Static shimmer + - Moving blur/ghosting + - Fine geometry stability + diff --git a/include/rendering/renderer.hpp b/include/rendering/renderer.hpp index 6af0518d..af9191e0 100644 --- a/include/rendering/renderer.hpp +++ b/include/rendering/renderer.hpp @@ -270,6 +270,11 @@ public: float getFSRSharpness() const { return fsr_.sharpness; } void setFSR2Enabled(bool enabled); bool isFSR2Enabled() const { return fsr2_.enabled; } +#if WOWEE_HAS_AMD_FSR2 + bool isAmdFsr2SdkAvailable() const { return true; } +#else + bool isAmdFsr2SdkAvailable() const { return false; } +#endif void setWaterRefractionEnabled(bool enabled); bool isWaterRefractionEnabled() const; diff --git a/src/rendering/renderer.cpp b/src/rendering/renderer.cpp index 1bc9730b..293127f5 100644 --- a/src/rendering/renderer.cpp +++ b/src/rendering/renderer.cpp @@ -3739,6 +3739,11 @@ bool Renderer::initFSR2Resources() { LOG_INFO("FSR2: initializing at ", fsr2_.internalWidth, "x", fsr2_.internalHeight, " -> ", swapExtent.width, "x", swapExtent.height, " (scale=", fsr2_.scaleFactor, ")"); +#if WOWEE_HAS_AMD_FSR2 + LOG_INFO("FSR2: AMD FidelityFX SDK detected at build time."); +#else + LOG_WARNING("FSR2: AMD FidelityFX SDK not detected; using internal fallback path."); +#endif VkFormat colorFmt = vkCtx->getSwapchainFormat(); VkFormat depthFmt = vkCtx->getDepthFormat(); diff --git a/src/ui/game_screen.cpp b/src/ui/game_screen.cpp index eab00305..830bd9ec 100644 --- a/src/ui/game_screen.cpp +++ b/src/ui/game_screen.cpp @@ -6311,6 +6311,10 @@ void GameScreen::renderSettingsWindow() { saveSettings(); } if (fsrMode > 0) { + if (fsrMode == 2 && renderer) { + ImGui::TextDisabled("FSR2 backend: %s", + renderer->isAmdFsr2SdkAvailable() ? "AMD FidelityFX SDK" : "Internal fallback"); + } const char* fsrQualityLabels[] = { "Ultra Quality (77%)", "Quality (67%)", "Balanced (59%)", "Performance (50%)" }; static const float fsrScaleFactors[] = { 0.77f, 0.67f, 0.59f, 0.50f }; if (ImGui::Combo("FSR Quality", &pendingFSRQuality, fsrQualityLabels, 4)) {