diff --git a/include/rendering/amd_fsr3_runtime.hpp b/include/rendering/amd_fsr3_runtime.hpp index 4e9417d5..9044bbbc 100644 --- a/include/rendering/amd_fsr3_runtime.hpp +++ b/include/rendering/amd_fsr3_runtime.hpp @@ -76,6 +76,7 @@ public: bool isFrameGenerationReady() const { return frameGenerationReady_; } const std::string& loadedLibraryPath() const { return loadedLibraryPath_; } LoadPathKind loadPathKind() const { return loadPathKind_; } + const std::string& wrapperBackendName() const { return wrapperBackendName_; } const std::string& lastError() const { return lastError_; } private: @@ -92,6 +93,7 @@ private: bool ready_ = false; bool frameGenerationReady_ = false; LoadPathKind loadPathKind_ = LoadPathKind::None; + std::string wrapperBackendName_; std::string lastError_; struct RuntimeFns; diff --git a/include/rendering/amd_fsr3_wrapper_abi.h b/include/rendering/amd_fsr3_wrapper_abi.h index 58ee8144..a13783be 100644 --- a/include/rendering/amd_fsr3_wrapper_abi.h +++ b/include/rendering/amd_fsr3_wrapper_abi.h @@ -80,6 +80,7 @@ enum { uint32_t wowee_fsr3_wrapper_get_abi_version(void); const char* wowee_fsr3_wrapper_get_name(void); +const char* wowee_fsr3_wrapper_get_backend(WoweeFsr3WrapperContext context); int32_t wowee_fsr3_wrapper_initialize(const WoweeFsr3WrapperInitDesc* initDesc, WoweeFsr3WrapperContext* outContext, char* outErrorText, diff --git a/src/rendering/amd_fsr3_runtime.cpp b/src/rendering/amd_fsr3_runtime.cpp index e83618dc..f32e0538 100644 --- a/src/rendering/amd_fsr3_runtime.cpp +++ b/src/rendering/amd_fsr3_runtime.cpp @@ -28,6 +28,7 @@ namespace wowee::rendering { struct AmdFsr3Runtime::RuntimeFns { uint32_t (*wrapperGetAbiVersion)() = nullptr; const char* (*wrapperGetName)() = nullptr; + const char* (*wrapperGetBackend)(WoweeFsr3WrapperContext) = nullptr; int32_t (*wrapperInitialize)(const WoweeFsr3WrapperInitDesc*, WoweeFsr3WrapperContext*, char*, uint32_t) = nullptr; int32_t (*wrapperDispatchUpscale)(WoweeFsr3WrapperContext, const WoweeFsr3WrapperDispatchDesc*) = nullptr; int32_t (*wrapperDispatchFramegen)(WoweeFsr3WrapperContext, const WoweeFsr3WrapperDispatchDesc*) = nullptr; @@ -158,6 +159,7 @@ bool AmdFsr3Runtime::initialize(const AmdFsr3RuntimeInitDesc& desc) { shutdown(); lastError_.clear(); loadPathKind_ = LoadPathKind::None; + wrapperBackendName_.clear(); backend_ = RuntimeBackend::None; #if !WOWEE_HAS_AMD_FSR3_FRAMEGEN @@ -235,6 +237,7 @@ bool AmdFsr3Runtime::initialize(const AmdFsr3RuntimeInitDesc& desc) { if (loadPathKind_ == LoadPathKind::Wrapper) { fns_->wrapperGetAbiVersion = reinterpret_castwrapperGetAbiVersion)>(resolveSym("wowee_fsr3_wrapper_get_abi_version")); fns_->wrapperGetName = reinterpret_castwrapperGetName)>(resolveSym("wowee_fsr3_wrapper_get_name")); + fns_->wrapperGetBackend = reinterpret_castwrapperGetBackend)>(resolveSym("wowee_fsr3_wrapper_get_backend")); fns_->wrapperInitialize = reinterpret_castwrapperInitialize)>(resolveSym("wowee_fsr3_wrapper_initialize")); fns_->wrapperDispatchUpscale = reinterpret_castwrapperDispatchUpscale)>(resolveSym("wowee_fsr3_wrapper_dispatch_upscale")); fns_->wrapperDispatchFramegen = reinterpret_castwrapperDispatchFramegen)>(resolveSym("wowee_fsr3_wrapper_dispatch_framegen")); @@ -293,6 +296,10 @@ bool AmdFsr3Runtime::initialize(const AmdFsr3RuntimeInitDesc& desc) { frameGenerationReady_ = desc.enableFrameGeneration; ready_ = true; backend_ = RuntimeBackend::Wrapper; + if (fns_->wrapperGetBackend) { + const char* backendName = fns_->wrapperGetBackend(wrapperCtx); + if (backendName && *backendName) wrapperBackendName_ = backendName; + } if (fns_->wrapperGetName) { const char* wrapperName = fns_->wrapperGetName(); if (wrapperName && *wrapperName) { @@ -678,6 +685,7 @@ void AmdFsr3Runtime::shutdown() { libHandle_ = nullptr; loadedLibraryPath_.clear(); loadPathKind_ = LoadPathKind::None; + wrapperBackendName_.clear(); backend_ = RuntimeBackend::None; } diff --git a/src/rendering/amd_fsr3_wrapper_impl.cpp b/src/rendering/amd_fsr3_wrapper_impl.cpp index 3f0d5086..f77102c3 100644 --- a/src/rendering/amd_fsr3_wrapper_impl.cpp +++ b/src/rendering/amd_fsr3_wrapper_impl.cpp @@ -116,6 +116,17 @@ WrapperBackend selectBackend() { return WrapperBackend::VulkanRuntime; } +const char* backendName(WrapperBackend backend) { + switch (backend) { + case WrapperBackend::Dx12Bridge: + return "dx12_bridge"; + case WrapperBackend::VulkanRuntime: + return "vulkan_runtime"; + default: + return "unknown"; + } +} + FfxErrorCode vkSwapchainConfigureNoop(const FfxFrameGenerationConfig*) { return FFX_OK; } @@ -574,6 +585,17 @@ WOWEE_FSR3_WRAPPER_EXPORT const char* wowee_fsr3_wrapper_get_name(void) { return "WoWee FSR3 Wrapper"; } +WOWEE_FSR3_WRAPPER_EXPORT const char* wowee_fsr3_wrapper_get_backend(WoweeFsr3WrapperContext context) { +#if WOWEE_HAS_AMD_FSR3_FRAMEGEN + WrapperContext* ctx = reinterpret_cast(context); + if (!ctx) return "invalid"; + return backendName(ctx->backend); +#else + (void)context; + return "unavailable"; +#endif +} + WOWEE_FSR3_WRAPPER_EXPORT int32_t wowee_fsr3_wrapper_initialize(const WoweeFsr3WrapperInitDesc* initDesc, WoweeFsr3WrapperContext* outContext, char* outErrorText, diff --git a/src/rendering/renderer.cpp b/src/rendering/renderer.cpp index 87c651b3..9590f70d 100644 --- a/src/rendering/renderer.cpp +++ b/src/rendering/renderer.cpp @@ -3945,7 +3945,12 @@ bool Renderer::initFSR2Resources() { if (fsr2_.amdFsr3FramegenRuntimeReady) { fsr2_.amdFsr3RuntimeLastError.clear(); if (fsr2_.amdFsr3Runtime->loadPathKind() == AmdFsr3Runtime::LoadPathKind::Wrapper) { - fsr2_.amdFsr3RuntimePath = "Path B"; + const std::string& wrapperBackend = fsr2_.amdFsr3Runtime->wrapperBackendName(); + if (!wrapperBackend.empty()) { + fsr2_.amdFsr3RuntimePath = "Path B (" + wrapperBackend + ")"; + } else { + fsr2_.amdFsr3RuntimePath = "Path B"; + } } else { fsr2_.amdFsr3RuntimePath = "Path A"; }