Wire Win32 semaphore handles into FSR3 wrapper bridge payload

This commit is contained in:
Kelsi 2026-03-09 01:33:39 -07:00
parent 61cb2df400
commit d06d1df873
3 changed files with 43 additions and 5 deletions

View file

@ -67,7 +67,7 @@ Runtime note:
- required device extensions: `VK_KHR_external_memory`, `VK_KHR_external_memory_win32`, `VK_KHR_external_semaphore`, `VK_KHR_external_semaphore_win32` - required device extensions: `VK_KHR_external_memory`, `VK_KHR_external_memory_win32`, `VK_KHR_external_semaphore`, `VK_KHR_external_semaphore_win32`
- Path B wrapper ABI contract is declared in: - Path B wrapper ABI contract is declared in:
- `include/rendering/amd_fsr3_wrapper_abi.h` - `include/rendering/amd_fsr3_wrapper_abi.h`
- Current wrapper ABI version: `2` (adds external memory/semaphore handle fields in dispatch payload for bridge interop). - Current wrapper ABI version: `2` (adds external memory and semaphore handle fields in dispatch payload for bridge interop).
- Required wrapper exports: - Required wrapper exports:
- `wowee_fsr3_wrapper_get_abi_version` - `wowee_fsr3_wrapper_get_abi_version`
- `wowee_fsr3_wrapper_initialize` - `wowee_fsr3_wrapper_initialize`

View file

@ -663,10 +663,13 @@ WOWEE_FSR3_WRAPPER_EXPORT int32_t wowee_fsr3_wrapper_dispatch_upscale(WoweeFsr3W
WOWEE_FSR3_WRAPPER_EXTERNAL_COLOR_MEMORY | WOWEE_FSR3_WRAPPER_EXTERNAL_COLOR_MEMORY |
WOWEE_FSR3_WRAPPER_EXTERNAL_DEPTH_MEMORY | WOWEE_FSR3_WRAPPER_EXTERNAL_DEPTH_MEMORY |
WOWEE_FSR3_WRAPPER_EXTERNAL_MOTION_MEMORY | WOWEE_FSR3_WRAPPER_EXTERNAL_MOTION_MEMORY |
WOWEE_FSR3_WRAPPER_EXTERNAL_OUTPUT_MEMORY; WOWEE_FSR3_WRAPPER_EXTERNAL_OUTPUT_MEMORY |
WOWEE_FSR3_WRAPPER_EXTERNAL_ACQUIRE_SEMAPHORE |
WOWEE_FSR3_WRAPPER_EXTERNAL_RELEASE_SEMAPHORE;
if ((dispatchDesc->externalFlags & requiredMask) != requiredMask || if ((dispatchDesc->externalFlags & requiredMask) != requiredMask ||
dispatchDesc->colorMemoryHandle == 0 || dispatchDesc->depthMemoryHandle == 0 || dispatchDesc->colorMemoryHandle == 0 || dispatchDesc->depthMemoryHandle == 0 ||
dispatchDesc->motionVectorMemoryHandle == 0 || dispatchDesc->outputMemoryHandle == 0) { dispatchDesc->motionVectorMemoryHandle == 0 || dispatchDesc->outputMemoryHandle == 0 ||
dispatchDesc->acquireSemaphoreHandle == 0 || dispatchDesc->releaseSemaphoreHandle == 0) {
return -1; return -1;
} }
} }
@ -730,9 +733,12 @@ WOWEE_FSR3_WRAPPER_EXPORT int32_t wowee_fsr3_wrapper_dispatch_framegen(WoweeFsr3
if (ctx->backend == WrapperBackend::Dx12Bridge) { if (ctx->backend == WrapperBackend::Dx12Bridge) {
const uint32_t requiredMask = const uint32_t requiredMask =
WOWEE_FSR3_WRAPPER_EXTERNAL_OUTPUT_MEMORY | WOWEE_FSR3_WRAPPER_EXTERNAL_OUTPUT_MEMORY |
WOWEE_FSR3_WRAPPER_EXTERNAL_FRAMEGEN_OUTPUT_MEMORY; WOWEE_FSR3_WRAPPER_EXTERNAL_FRAMEGEN_OUTPUT_MEMORY |
WOWEE_FSR3_WRAPPER_EXTERNAL_ACQUIRE_SEMAPHORE |
WOWEE_FSR3_WRAPPER_EXTERNAL_RELEASE_SEMAPHORE;
if ((dispatchDesc->externalFlags & requiredMask) != requiredMask || if ((dispatchDesc->externalFlags & requiredMask) != requiredMask ||
dispatchDesc->outputMemoryHandle == 0 || dispatchDesc->frameGenOutputMemoryHandle == 0) { dispatchDesc->outputMemoryHandle == 0 || dispatchDesc->frameGenOutputMemoryHandle == 0 ||
dispatchDesc->acquireSemaphoreHandle == 0 || dispatchDesc->releaseSemaphoreHandle == 0) {
return -1; return -1;
} }
} }

View file

@ -58,6 +58,7 @@
#include "rendering/vk_pipeline.hpp" #include "rendering/vk_pipeline.hpp"
#include "rendering/vk_utils.hpp" #include "rendering/vk_utils.hpp"
#include "rendering/amd_fsr3_runtime.hpp" #include "rendering/amd_fsr3_runtime.hpp"
#include "rendering/amd_fsr3_wrapper_abi.h"
#include <imgui.h> #include <imgui.h>
#include <imgui_impl_vulkan.h> #include <imgui_impl_vulkan.h>
#include <glm/gtc/matrix_transform.hpp> #include <glm/gtc/matrix_transform.hpp>
@ -134,6 +135,23 @@ static uint64_t exportImageMemoryHandleWin32(VkDevice device, PFN_vkGetDevicePro
if (getMemHandle(device, &handleInfo, &outHandle) != VK_SUCCESS || !outHandle) return 0; if (getMemHandle(device, &handleInfo, &outHandle) != VK_SUCCESS || !outHandle) return 0;
return reinterpret_cast<uint64_t>(outHandle); return reinterpret_cast<uint64_t>(outHandle);
} }
static uint64_t exportSemaphoreHandleWin32(VkDevice device, PFN_vkGetDeviceProcAddr getDeviceProcAddr,
VkSemaphore semaphore) {
if (!device || !getDeviceProcAddr || !semaphore) return 0;
auto getSemHandle = reinterpret_cast<PFN_vkGetSemaphoreWin32HandleKHR>(
getDeviceProcAddr(device, "vkGetSemaphoreWin32HandleKHR"));
if (!getSemHandle) return 0;
VkSemaphoreGetWin32HandleInfoKHR handleInfo{};
handleInfo.sType = VK_STRUCTURE_TYPE_SEMAPHORE_GET_WIN32_HANDLE_INFO_KHR;
handleInfo.semaphore = semaphore;
handleInfo.handleType = VK_EXTERNAL_SEMAPHORE_HANDLE_TYPE_OPAQUE_WIN32_BIT;
HANDLE outHandle = nullptr;
if (getSemHandle(device, &handleInfo, &outHandle) != VK_SUCCESS || !outHandle) return 0;
return reinterpret_cast<uint64_t>(outHandle);
}
#endif #endif
static std::vector<std::string> parseEmoteCommands(const std::string& raw) { static std::vector<std::string> parseEmoteCommands(const std::string& raw) {
@ -4559,6 +4577,20 @@ void Renderer::dispatchAmdFsr3Framegen() {
fgDispatch.externalFlags |= WOWEE_FSR3_WRAPPER_EXTERNAL_FRAMEGEN_OUTPUT_MEMORY; fgDispatch.externalFlags |= WOWEE_FSR3_WRAPPER_EXTERNAL_FRAMEGEN_OUTPUT_MEMORY;
trackHandle(fgDispatch.frameGenOutputMemoryHandle); trackHandle(fgDispatch.frameGenOutputMemoryHandle);
} }
const FrameData& frameData = vkCtx->getCurrentFrameData();
fgDispatch.acquireSemaphoreHandle = exportSemaphoreHandleWin32(
device, vkGetDeviceProcAddr, frameData.imageAvailableSemaphore);
if (fgDispatch.acquireSemaphoreHandle) {
fgDispatch.externalFlags |= WOWEE_FSR3_WRAPPER_EXTERNAL_ACQUIRE_SEMAPHORE;
trackHandle(fgDispatch.acquireSemaphoreHandle);
}
fgDispatch.releaseSemaphoreHandle = exportSemaphoreHandleWin32(
device, vkGetDeviceProcAddr, frameData.renderFinishedSemaphore);
if (fgDispatch.releaseSemaphoreHandle) {
fgDispatch.externalFlags |= WOWEE_FSR3_WRAPPER_EXTERNAL_RELEASE_SEMAPHORE;
trackHandle(fgDispatch.releaseSemaphoreHandle);
}
#endif #endif
if (!fsr2_.amdFsr3Runtime->dispatchUpscale(fgDispatch)) { if (!fsr2_.amdFsr3Runtime->dispatchUpscale(fgDispatch)) {