Add wrapper backend mode switch and explicit DX12 bridge runtime errors

This commit is contained in:
Kelsi 2026-03-09 00:45:39 -07:00
parent e93f097272
commit 5030f5435f
3 changed files with 46 additions and 1 deletions

View file

@ -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`

View file

@ -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:

View file

@ -7,6 +7,7 @@
#include <algorithm>
#include <array>
#include <cctype>
#include <cstdint>
#include <cstdlib>
#include <cstring>
@ -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<char>(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<std::string> candidates;
if (const char* backendEnv = std::getenv("WOWEE_FSR3_WRAPPER_BACKEND_LIB")) {
if (*backendEnv) candidates.emplace_back(backendEnv);