diff options
| author | lucy96chen <47800040+lucy96chen@users.noreply.github.com> | 2022-02-18 22:17:13 -0800 |
|---|---|---|
| committer | GitHub <noreply@github.com> | 2022-02-18 22:17:13 -0800 |
| commit | e993ff5f8d21d77dd3fb579f7afc51c6dcad834c (patch) | |
| tree | 37e5a9fc2f285a2bdd073cd11835d020d20d5c33 | |
| parent | 7953c0b6e4e6328bacf9945763013f9e0af6e435 (diff) | |
Added implementations for IFence::getSharedHandle() for Vulkan and D3D12 (#2137)
Co-authored-by: Yong He <yonghe@outlook.com>
| -rw-r--r-- | tools/gfx/d3d12/render-d3d12.cpp | 15 | ||||
| -rw-r--r-- | tools/gfx/renderer-shared.h | 2 | ||||
| -rw-r--r-- | tools/gfx/vulkan/render-vk.cpp | 21 | ||||
| -rw-r--r-- | tools/gfx/vulkan/vk-api.h | 1 |
4 files changed, 35 insertions, 4 deletions
diff --git a/tools/gfx/d3d12/render-d3d12.cpp b/tools/gfx/d3d12/render-d3d12.cpp index 9be157605..5500b024a 100644 --- a/tools/gfx/d3d12/render-d3d12.cpp +++ b/tools/gfx/d3d12/render-d3d12.cpp @@ -4947,8 +4947,19 @@ public: virtual SLANG_NO_THROW Result SLANG_MCALL getSharedHandle(InteropHandle* outHandle) override { - outHandle->handleValue = 0; - return SLANG_FAIL; + // Check if a shared handle already exists. + if (sharedHandle.handleValue != 0) + { + *outHandle = sharedHandle; + return SLANG_OK; + } + + ComPtr<ID3D12Device> devicePtr; + m_fence->GetDevice(IID_PPV_ARGS(devicePtr.writeRef())); + SLANG_RETURN_ON_FAIL(devicePtr->CreateSharedHandle(m_fence, NULL, GENERIC_ALL, nullptr, (HANDLE*)&outHandle->handleValue)); + outHandle->api = InteropHandleAPI::D3D12; + sharedHandle = *outHandle; + return SLANG_OK; } virtual SLANG_NO_THROW Result SLANG_MCALL diff --git a/tools/gfx/renderer-shared.h b/tools/gfx/renderer-shared.h index 5afc77027..8fc74158c 100644 --- a/tools/gfx/renderer-shared.h +++ b/tools/gfx/renderer-shared.h @@ -192,6 +192,8 @@ class FenceBase : public IFence, public Slang::ComObject public: SLANG_COM_OBJECT_IUNKNOWN_ALL IFence* getInterface(const Slang::Guid& guid); +protected: + InteropHandle sharedHandle = {}; }; class Resource : public Slang::ComObject diff --git a/tools/gfx/vulkan/render-vk.cpp b/tools/gfx/vulkan/render-vk.cpp index 1a42f3261..0a66c653b 100644 --- a/tools/gfx/vulkan/render-vk.cpp +++ b/tools/gfx/vulkan/render-vk.cpp @@ -412,8 +412,25 @@ public: virtual SLANG_NO_THROW Result SLANG_MCALL getSharedHandle(InteropHandle* outHandle) override { - outHandle->handleValue = 0; - return SLANG_FAIL; + // Check if a shared handle already exists. + if (sharedHandle.handleValue != 0) + { + *outHandle = sharedHandle; + return SLANG_OK; + } + +#if SLANG_WINDOWS_FAMILY + VkSemaphoreGetWin32HandleInfoKHR handleInfo = { VK_STRUCTURE_TYPE_SEMAPHORE_GET_WIN32_HANDLE_INFO_KHR }; + handleInfo.pNext = nullptr; + handleInfo.semaphore = m_semaphore; + handleInfo.handleType = VK_EXTERNAL_SEMAPHORE_HANDLE_TYPE_OPAQUE_WIN32_BIT; + + SLANG_VK_RETURN_ON_FAIL( + m_device->m_api.vkGetSemaphoreWin32HandleKHR(m_device->m_api.m_device, &handleInfo, (HANDLE*)&outHandle->handleValue) + ); +#endif + sharedHandle.api = InteropHandleAPI::Vulkan; + return SLANG_OK; } virtual SLANG_NO_THROW Result SLANG_MCALL diff --git a/tools/gfx/vulkan/vk-api.h b/tools/gfx/vulkan/vk-api.h index fa601ef35..af2234f55 100644 --- a/tools/gfx/vulkan/vk-api.h +++ b/tools/gfx/vulkan/vk-api.h @@ -171,6 +171,7 @@ namespace gfx { #if SLANG_WINDOWS_FAMILY # define VK_API_DEVICE_PLATFORM_OPT_PROCS(x) \ x(vkGetMemoryWin32HandleKHR) \ + x(vkGetSemaphoreWin32HandleKHR) \ /* */ #else # define VK_API_DEVICE_PLATFORM_OPT_PROCS(x) \ |
