summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--tools/gfx/d3d12/render-d3d12.cpp15
-rw-r--r--tools/gfx/renderer-shared.h2
-rw-r--r--tools/gfx/vulkan/render-vk.cpp21
-rw-r--r--tools/gfx/vulkan/vk-api.h1
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) \