diff --git a/README.md b/README.md index bb86887a..3d09c7fc 100644 --- a/README.md +++ b/README.md @@ -208,6 +208,9 @@ make -j$(nproc) - In-tree wrapper build: - `wowee_fsr3_vk_wrapper` now builds automatically when FSR3 SDK headers are present and outputs to `build/bin/libffx_fsr3_vk_wrapper.*`. - Wrapper backend override (what the wrapper loads underneath): `WOWEE_FSR3_WRAPPER_BACKEND_LIB=/absolute/path/to/libffx_fsr3_vk.so`. + - Wrapper backend mode: + - `WOWEE_FSR3_WRAPPER_BACKEND=vulkan_runtime` (default on non-Windows) + - `WOWEE_FSR3_WRAPPER_BACKEND=dx12_bridge` (default on Windows; bridge dispatch wiring still in progress) - Path B wrapper libraries must export the clean wrapper ABI (`include/rendering/amd_fsr3_wrapper_abi.h`): - `wowee_fsr3_wrapper_get_abi_version` - `wowee_fsr3_wrapper_initialize` diff --git a/docs/AMD_FSR2_INTEGRATION.md b/docs/AMD_FSR2_INTEGRATION.md index b1cd4dcb..db682777 100644 --- a/docs/AMD_FSR2_INTEGRATION.md +++ b/docs/AMD_FSR2_INTEGRATION.md @@ -52,6 +52,9 @@ Runtime note: - `wowee_fsr3_vk_wrapper` (output in `build/bin`). - Wrapper backend runtime override: - `WOWEE_FSR3_WRAPPER_BACKEND_LIB=/absolute/path/to/libffx_fsr3_vk.so` (or `.dll` / `.dylib`). +- Wrapper backend mode selection: + - `WOWEE_FSR3_WRAPPER_BACKEND=vulkan_runtime` + - `WOWEE_FSR3_WRAPPER_BACKEND=dx12_bridge` - Path B wrapper ABI contract is declared in: - `include/rendering/amd_fsr3_wrapper_abi.h` - Required wrapper exports: diff --git a/src/rendering/amd_fsr3_wrapper_impl.cpp b/src/rendering/amd_fsr3_wrapper_impl.cpp index c415a1f4..4ab3e1cd 100644 --- a/src/rendering/amd_fsr3_wrapper_impl.cpp +++ b/src/rendering/amd_fsr3_wrapper_impl.cpp @@ -7,6 +7,7 @@ #include #include +#include #include #include #include @@ -36,6 +37,32 @@ void writeError(char* outErrorText, uint32_t outErrorTextCapacity, const char* m } #if WOWEE_HAS_AMD_FSR3_FRAMEGEN +enum class WrapperBackend { + VulkanRuntime, + Dx12Bridge +}; + +WrapperBackend selectBackend() { + if (const char* envBackend = std::getenv("WOWEE_FSR3_WRAPPER_BACKEND")) { + if (envBackend && *envBackend) { + std::string mode(envBackend); + std::transform(mode.begin(), mode.end(), mode.begin(), + [](unsigned char c) { return static_cast(std::tolower(c)); }); + if (mode == "dx12" || mode == "dx12_bridge" || mode == "d3d12") { + return WrapperBackend::Dx12Bridge; + } + if (mode == "vulkan" || mode == "vk" || mode == "vulkan_runtime") { + return WrapperBackend::VulkanRuntime; + } + } + } +#if defined(_WIN32) + return WrapperBackend::Dx12Bridge; +#else + return WrapperBackend::VulkanRuntime; +#endif +} + FfxErrorCode vkSwapchainConfigureNoop(const FfxFrameGenerationConfig*) { return FFX_OK; } @@ -207,7 +234,7 @@ WOWEE_FSR3_WRAPPER_EXPORT uint32_t wowee_fsr3_wrapper_get_abi_version(void) { } WOWEE_FSR3_WRAPPER_EXPORT const char* wowee_fsr3_wrapper_get_name(void) { - return "WoWee FSR3 DX12/VK Wrapper"; + return "WoWee FSR3 Wrapper"; } WOWEE_FSR3_WRAPPER_EXPORT int32_t wowee_fsr3_wrapper_initialize(const WoweeFsr3WrapperInitDesc* initDesc, @@ -237,6 +264,18 @@ WOWEE_FSR3_WRAPPER_EXPORT int32_t wowee_fsr3_wrapper_initialize(const WoweeFsr3W return -1; } + if (selectBackend() == WrapperBackend::Dx12Bridge) { +#if !defined(_WIN32) + writeError(outErrorText, outErrorTextCapacity, + "dx12_bridge backend is Windows-only in current wrapper build"); + return -1; +#else + writeError(outErrorText, outErrorTextCapacity, + "dx12_bridge backend selected but Vulkan<->DX12 interop dispatch is not implemented yet"); + return -1; +#endif + } + std::vector candidates; if (const char* backendEnv = std::getenv("WOWEE_FSR3_WRAPPER_BACKEND_LIB")) { if (*backendEnv) candidates.emplace_back(backendEnv);