summaryrefslogtreecommitdiffstats
path: root/tools/gfx/vulkan
diff options
context:
space:
mode:
Diffstat (limited to 'tools/gfx/vulkan')
-rw-r--r--tools/gfx/vulkan/render-vk.cpp21
-rw-r--r--tools/gfx/vulkan/vk-api.h1
2 files changed, 20 insertions, 2 deletions
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) \