@@ -242,7 +242,7 @@ extern "C" {
242
242
#endif
243
243
#endif
244
244
245
- // Defined to 1 when VK_KHR_external_memory device extension is defined in Vulkan headers.
245
+ // Defined to 1 when VK_KHR_external_memory_win32 device extension is defined in Vulkan headers.
246
246
#if !defined(VMA_EXTERNAL_MEMORY_WIN32)
247
247
#if VK_KHR_external_memory_win32
248
248
#define VMA_EXTERNAL_MEMORY_WIN32 1
@@ -1052,7 +1052,7 @@ typedef struct VmaVulkanFunctions
1052
1052
/// Fetch from "vkGetDeviceImageMemoryRequirements" on Vulkan >= 1.3, but you can also fetch it from "vkGetDeviceImageMemoryRequirementsKHR" if you enabled extension VK_KHR_maintenance4.
1053
1053
PFN_vkGetDeviceImageMemoryRequirementsKHR VMA_NULLABLE vkGetDeviceImageMemoryRequirements;
1054
1054
#endif
1055
- #ifdef VK_USE_PLATFORM_WIN32_KHR
1055
+ #ifdef VMA_EXTERNAL_MEMORY_WIN32
1056
1056
PFN_vkGetMemoryWin32HandleKHR VMA_NULLABLE vkGetMemoryWin32HandleKHR;
1057
1057
#else
1058
1058
void* VMA_NULLABLE vkGetMemoryWin32HandleKHR;
@@ -6096,7 +6096,7 @@ class VmaWin32Handle
6096
6096
{
6097
6097
public:
6098
6098
VmaWin32Handle() noexcept : m_hHandle(VMA_NULL) { }
6099
- VmaWin32Handle(HANDLE hHandle) noexcept : m_hHandle(hHandle) { }
6099
+ explicit VmaWin32Handle(HANDLE hHandle) noexcept : m_hHandle(hHandle) { }
6100
6100
~VmaWin32Handle() noexcept { if (m_hHandle != VMA_NULL) { ::CloseHandle(m_hHandle); } }
6101
6101
VMA_CLASS_NO_COPY_NO_MOVE(VmaWin32Handle)
6102
6102
@@ -6105,32 +6105,26 @@ class VmaWin32Handle
6105
6105
VkResult GetHandle(VkDevice device, VkDeviceMemory memory, decltype(&vkGetMemoryWin32HandleKHR) pvkGetMemoryWin32HandleKHR, HANDLE hTargetProcess, bool useMutex, HANDLE* pHandle) noexcept
6106
6106
{
6107
6107
*pHandle = VMA_NULL;
6108
- // We only care about atomicity of handle retrieval, not about memory order.
6109
- HANDLE handle = m_hHandle.load(std::memory_order_relaxed);
6110
-
6111
6108
// Try to get handle first.
6112
- if (handle != VMA_NULL)
6109
+ if (m_hHandle != VMA_NULL)
6113
6110
{
6114
6111
*pHandle = Duplicate(hTargetProcess);
6115
6112
return VK_SUCCESS;
6116
6113
}
6117
6114
6118
- HANDLE hCreatedHandle = VMA_NULL;
6119
-
6120
6115
VkResult res = VK_SUCCESS;
6121
6116
// If failed, try to create it.
6122
6117
{
6123
6118
VmaMutexLockWrite lock(m_Mutex, useMutex);
6124
- if (m_hHandle.load(std::memory_order_relaxed) == VMA_NULL)
6119
+ if (m_hHandle == VMA_NULL)
6125
6120
{
6126
- VkResult res = Create(device, memory, pvkGetMemoryWin32HandleKHR, &hCreatedHandle);
6127
- m_hHandle.store(hCreatedHandle, std::memory_order_relaxed);
6121
+ res = Create(device, memory, pvkGetMemoryWin32HandleKHR, &m_hHandle);
6128
6122
}
6129
6123
}
6130
6124
6131
6125
*pHandle = Duplicate(hTargetProcess);
6132
6126
return res;
6133
- }
6127
+ }
6134
6128
6135
6129
operator bool() const noexcept { return m_hHandle != VMA_NULL; }
6136
6130
private:
@@ -6150,20 +6144,19 @@ class VmaWin32Handle
6150
6144
}
6151
6145
HANDLE Duplicate(HANDLE hTargetProcess = VMA_NULL) const noexcept
6152
6146
{
6153
- HANDLE handle = m_hHandle.load(std::memory_order_relaxed);
6154
- if (!handle)
6155
- return handle;
6147
+ if (!m_hHandle)
6148
+ return m_hHandle;
6156
6149
6157
6150
HANDLE hCurrentProcess = ::GetCurrentProcess();
6158
6151
HANDLE hDupHandle = VMA_NULL;
6159
- if (!::DuplicateHandle(hCurrentProcess, handle , hTargetProcess ? hTargetProcess : hCurrentProcess, &hDupHandle, 0, FALSE, DUPLICATE_SAME_ACCESS))
6152
+ if (!::DuplicateHandle(hCurrentProcess, m_hHandle , hTargetProcess ? hTargetProcess : hCurrentProcess, &hDupHandle, 0, FALSE, DUPLICATE_SAME_ACCESS))
6160
6153
{
6161
6154
VMA_ASSERT(0 && "Failed to duplicate handle.");
6162
6155
}
6163
6156
return hDupHandle;
6164
6157
}
6165
6158
private:
6166
- std::atomic< HANDLE> m_hHandle;
6159
+ HANDLE m_hHandle;
6167
6160
VMA_RW_MUTEX m_Mutex; // Protects access m_Handle
6168
6161
};
6169
6162
#else
@@ -10804,7 +10797,7 @@ VkResult VmaDeviceMemoryBlock::BindImageMemory(
10804
10797
VkResult VmaDeviceMemoryBlock::CreateWin32Handle(const VmaAllocator hAllocator, decltype(&vkGetMemoryWin32HandleKHR) pvkGetMemoryWin32HandleKHR, HANDLE hTargetProcess, HANDLE* pHandle) noexcept
10805
10798
{
10806
10799
VMA_ASSERT(pHandle);
10807
- return m_Handle.GetHandle(hAllocator->m_hDevice, m_hMemory, &vkGetMemoryWin32HandleKHR , hTargetProcess, hAllocator->m_UseMutex, pHandle);
10800
+ return m_Handle.GetHandle(hAllocator->m_hDevice, m_hMemory, pvkGetMemoryWin32HandleKHR , hTargetProcess, hAllocator->m_UseMutex, pHandle);
10808
10801
}
10809
10802
#endif // VMA_EXTERNAL_MEMORY_WIN32
10810
10803
#endif // _VMA_DEVICE_MEMORY_BLOCK_FUNCTIONS
0 commit comments