summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorskallweitNV <64953474+skallweitNV@users.noreply.github.com>2024-02-27 17:42:39 +0100
committerGitHub <noreply@github.com>2024-02-27 08:42:39 -0800
commite3fdfe5176e28c6b4548aeb860c1abaa1987ee57 (patch)
treefa9b88565426eff0d8c91e1743b41ff96383d79c
parent188482e83dc4f7dc4c940214033dd95518b9d18c (diff)
add support for shared resources on vulkan/linux (#3636)
-rw-r--r--tools/gfx/vulkan/vk-buffer.cpp20
-rw-r--r--tools/gfx/vulkan/vk-device.cpp23
-rw-r--r--tools/gfx/vulkan/vk-texture.cpp17
3 files changed, 55 insertions, 5 deletions
diff --git a/tools/gfx/vulkan/vk-buffer.cpp b/tools/gfx/vulkan/vk-buffer.cpp
index 9e1986b38..32c14bcb9 100644
--- a/tools/gfx/vulkan/vk-buffer.cpp
+++ b/tools/gfx/vulkan/vk-buffer.cpp
@@ -57,10 +57,12 @@ Result VKBufferHandleRAII::init(
#if SLANG_WINDOWS_FAMILY
VkExportMemoryWin32HandleInfoKHR exportMemoryWin32HandleInfo = {
VK_STRUCTURE_TYPE_EXPORT_MEMORY_WIN32_HANDLE_INFO_KHR };
+#endif
VkExportMemoryAllocateInfoKHR exportMemoryAllocateInfo = {
VK_STRUCTURE_TYPE_EXPORT_MEMORY_ALLOCATE_INFO_KHR };
if (isShared)
{
+#if SLANG_WINDOWS_FAMILY
exportMemoryWin32HandleInfo.pNext = nullptr;
exportMemoryWin32HandleInfo.pAttributes = nullptr;
exportMemoryWin32HandleInfo.dwAccess =
@@ -71,10 +73,10 @@ Result VKBufferHandleRAII::init(
extMemHandleType & VK_EXTERNAL_MEMORY_HANDLE_TYPE_OPAQUE_WIN32_BIT_KHR
? &exportMemoryWin32HandleInfo
: nullptr;
+#endif
exportMemoryAllocateInfo.handleTypes = extMemHandleType;
allocateInfo.pNext = &exportMemoryAllocateInfo;
}
-#endif
VkMemoryAllocateFlagsInfo flagInfo = { VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_FLAGS_INFO };
if (usage & VK_BUFFER_USAGE_SHADER_DEVICE_ADDRESS_BIT)
{
@@ -151,6 +153,22 @@ Result BufferResourceImpl::getSharedHandle(InteropHandle* outHandle)
}
SLANG_VK_RETURN_ON_FAIL(
vkCreateSharedHandle(api->m_device, &info, (HANDLE*)&outHandle->handleValue));
+#else
+ VkMemoryGetFdInfoKHR info = {};
+ info.sType = VK_STRUCTURE_TYPE_MEMORY_GET_FD_INFO_KHR;
+ info.pNext = nullptr;
+ info.memory = m_buffer.m_memory;
+ info.handleType = VK_EXTERNAL_MEMORY_HANDLE_TYPE_OPAQUE_FD_BIT;
+
+ auto api = m_buffer.m_api;
+ PFN_vkGetMemoryFdKHR vkCreateSharedHandle;
+ vkCreateSharedHandle = api->vkGetMemoryFdKHR;
+ if (!vkCreateSharedHandle)
+ {
+ return SLANG_FAIL;
+ }
+ SLANG_VK_RETURN_ON_FAIL(
+ vkCreateSharedHandle(api->m_device, &info, (int*)&outHandle->handleValue));
#endif
outHandle->api = InteropHandleAPI::Vulkan;
return SLANG_OK;
diff --git a/tools/gfx/vulkan/vk-device.cpp b/tools/gfx/vulkan/vk-device.cpp
index 886e1ae75..641b50bf6 100644
--- a/tools/gfx/vulkan/vk-device.cpp
+++ b/tools/gfx/vulkan/vk-device.cpp
@@ -712,6 +712,11 @@ Result DeviceImpl::initVulkanInstanceAndDevice(
{
deviceExtensions.add(VK_KHR_EXTERNAL_MEMORY_WIN32_EXTENSION_NAME);
}
+#else
+ if (extensionNames.contains("VK_KHR_external_memory_fd"))
+ {
+ deviceExtensions.add(VK_KHR_EXTERNAL_MEMORY_FD_EXTENSION_NAME);
+ }
#endif
m_features.add("external-memory");
}
@@ -1468,16 +1473,18 @@ Result DeviceImpl::createTextureResource(
VkExternalMemoryImageCreateInfo externalMemoryImageCreateInfo = {
VK_STRUCTURE_TYPE_EXTERNAL_MEMORY_IMAGE_CREATE_INFO };
-#if SLANG_WINDOWS_FAMILY
VkExternalMemoryHandleTypeFlags extMemoryHandleType =
+#if SLANG_WINDOWS_FAMILY
VK_EXTERNAL_MEMORY_HANDLE_TYPE_OPAQUE_WIN32_BIT;
+#else
+ VK_EXTERNAL_MEMORY_HANDLE_TYPE_OPAQUE_FD_BIT;
+#endif
if (descIn.isShared)
{
externalMemoryImageCreateInfo.pNext = nullptr;
externalMemoryImageCreateInfo.handleTypes = extMemoryHandleType;
imageInfo.pNext = &externalMemoryImageCreateInfo;
}
-#endif
SLANG_VK_RETURN_ON_FAIL(m_api.vkCreateImage(m_device, &imageInfo, nullptr, &texture->m_image));
VkMemoryRequirements memRequirements;
@@ -1497,10 +1504,12 @@ Result DeviceImpl::createTextureResource(
#if SLANG_WINDOWS_FAMILY
VkExportMemoryWin32HandleInfoKHR exportMemoryWin32HandleInfo = {
VK_STRUCTURE_TYPE_EXPORT_MEMORY_WIN32_HANDLE_INFO_KHR };
+#endif
VkExportMemoryAllocateInfoKHR exportMemoryAllocateInfo = {
VK_STRUCTURE_TYPE_EXPORT_MEMORY_ALLOCATE_INFO_KHR };
if (descIn.isShared)
{
+#if SLANG_WINDOWS_FAMILY
exportMemoryWin32HandleInfo.pNext = nullptr;
exportMemoryWin32HandleInfo.pAttributes = nullptr;
exportMemoryWin32HandleInfo.dwAccess =
@@ -1511,10 +1520,10 @@ Result DeviceImpl::createTextureResource(
extMemoryHandleType & VK_EXTERNAL_MEMORY_HANDLE_TYPE_OPAQUE_WIN32_BIT_KHR
? &exportMemoryWin32HandleInfo
: nullptr;
+#endif
exportMemoryAllocateInfo.handleTypes = extMemoryHandleType;
allocInfo.pNext = &exportMemoryAllocateInfo;
}
-#endif
SLANG_VK_RETURN_ON_FAIL(
m_api.vkAllocateMemory(m_device, &allocInfo, nullptr, &texture->m_imageMemory));
@@ -1731,13 +1740,19 @@ Result DeviceImpl::createBufferResourceImpl(
RefPtr<BufferResourceImpl> buffer(new BufferResourceImpl(desc, this));
if (desc.isShared)
{
+ VkExternalMemoryHandleTypeFlagsKHR extMemHandleType
+#if SLANG_WINDOWS_FAMILY
+ = VK_EXTERNAL_MEMORY_HANDLE_TYPE_OPAQUE_WIN32_BIT;
+#else
+ = VK_EXTERNAL_MEMORY_HANDLE_TYPE_OPAQUE_FD_BIT;
+#endif
SLANG_RETURN_ON_FAIL(buffer->m_buffer.init(
m_api,
desc.sizeInBytes,
usage,
reqMemoryProperties,
desc.isShared,
- VK_EXTERNAL_MEMORY_HANDLE_TYPE_OPAQUE_WIN32_BIT));
+ extMemHandleType));
}
else
{
diff --git a/tools/gfx/vulkan/vk-texture.cpp b/tools/gfx/vulkan/vk-texture.cpp
index 80a120033..13775cef0 100644
--- a/tools/gfx/vulkan/vk-texture.cpp
+++ b/tools/gfx/vulkan/vk-texture.cpp
@@ -64,6 +64,23 @@ Result TextureResourceImpl::getSharedHandle(InteropHandle* outHandle)
SLANG_RETURN_ON_FAIL(
vkCreateSharedHandle(m_device->m_device, &info, (HANDLE*)&outHandle->handleValue) !=
VK_SUCCESS);
+#else
+ VkMemoryGetFdInfoKHR info = {};
+ info.sType = VK_STRUCTURE_TYPE_MEMORY_GET_FD_INFO_KHR;
+ info.pNext = nullptr;
+ info.memory = m_imageMemory;
+ info.handleType = VK_EXTERNAL_MEMORY_HANDLE_TYPE_OPAQUE_FD_BIT;
+
+ auto& api = m_device->m_api;
+ PFN_vkGetMemoryFdKHR vkCreateSharedHandle;
+ vkCreateSharedHandle = api.vkGetMemoryFdKHR;
+ if (!vkCreateSharedHandle)
+ {
+ return SLANG_FAIL;
+ }
+ SLANG_RETURN_ON_FAIL(
+ vkCreateSharedHandle(m_device->m_device, &info, (int*)&outHandle->handleValue) !=
+ VK_SUCCESS);
#endif
outHandle->api = InteropHandleAPI::Vulkan;
return SLANG_OK;