@@ -6093,7 +6093,7 @@ class VmaWin32Handle
6093
6093
6094
6094
public:
6095
6095
// Strengthened
6096
- VkResult GetHandle(VkDevice device, VkDeviceMemory memory, decltype(&vkGetMemoryWin32HandleKHR) pvkGetMemoryWin32HandleKHR, HANDLE hTargetProcess, HANDLE* pHandle) noexcept
6096
+ VkResult GetHandle(VkDevice device, VkDeviceMemory memory, decltype(&vkGetMemoryWin32HandleKHR) pvkGetMemoryWin32HandleKHR, HANDLE hTargetProcess, bool useMutex, HANDLE* pHandle) noexcept
6097
6097
{
6098
6098
*pHandle = VMA_NULL;
6099
6099
// We only care about atomicity of handle retrieval, not about memory order.
@@ -6108,8 +6108,15 @@ class VmaWin32Handle
6108
6108
6109
6109
HANDLE hCreatedHandle = VMA_NULL;
6110
6110
6111
+ VkResult res = VK_SUCCESS;
6111
6112
// If failed, try to create it.
6112
- VkResult res = Create(device, memory, pvkGetMemoryWin32HandleKHR, &hCreatedHandle);
6113
+ {
6114
+ VmaMutexLockWrite lock(m_Mutex, useMutex);
6115
+ if (m_hHandle.load(std::memory_order_relaxed) == VMA_NULL)
6116
+ {
6117
+ VkResult res = Create(device, memory, pvkGetMemoryWin32HandleKHR, &hCreatedHandle);
6118
+ }
6119
+ }
6113
6120
if (res == VK_SUCCESS)
6114
6121
{
6115
6122
// Successfully created handle, try to set it.
@@ -6164,6 +6171,7 @@ class VmaWin32Handle
6164
6171
}
6165
6172
private:
6166
6173
std::atomic<HANDLE> m_hHandle;
6174
+ VMA_RW_MUTEX m_Mutex; // Protects access m_Handle
6167
6175
};
6168
6176
#else
6169
6177
class VmaWin32Handle
@@ -10802,7 +10810,7 @@ VkResult VmaDeviceMemoryBlock::BindImageMemory(
10802
10810
VkResult VmaDeviceMemoryBlock::CreateWin32Handle(const VmaAllocator hAllocator, decltype(&vkGetMemoryWin32HandleKHR) pvkGetMemoryWin32HandleKHR, HANDLE hTargetProcess, HANDLE* pHandle) noexcept
10803
10811
{
10804
10812
VMA_ASSERT(pHandle);
10805
- return m_Handle.GetHandle(hAllocator->m_hDevice, m_hMemory, &vkGetMemoryWin32HandleKHR, hTargetProcess, pHandle);
10813
+ return m_Handle.GetHandle(hAllocator->m_hDevice, m_hMemory, &vkGetMemoryWin32HandleKHR, hTargetProcess, hAllocator->m_UseMutex, pHandle);
10806
10814
}
10807
10815
#endif // VK_USE_PLATFORM_WIN32_KHR
10808
10816
#endif // _VMA_DEVICE_MEMORY_BLOCK_FUNCTIONS
@@ -11115,7 +11123,7 @@ VkResult VmaAllocation_T::GetWin32Handle(VmaAllocator hAllocator, HANDLE hTarget
11115
11123
case ALLOCATION_TYPE_BLOCK:
11116
11124
return m_BlockAllocation.m_Block->CreateWin32Handle(hAllocator, pvkGetMemoryWin32HandleKHR, hTargetProcess, pHandle);
11117
11125
case ALLOCATION_TYPE_DEDICATED:
11118
- return m_DedicatedAllocation.m_Handle.GetHandle(hAllocator->m_hDevice, m_DedicatedAllocation.m_hMemory, pvkGetMemoryWin32HandleKHR, hTargetProcess, pHandle);
11126
+ return m_DedicatedAllocation.m_Handle.GetHandle(hAllocator->m_hDevice, m_DedicatedAllocation.m_hMemory, pvkGetMemoryWin32HandleKHR, hTargetProcess, hAllocator->m_UseMutex, pHandle);
11119
11127
default:
11120
11128
VMA_ASSERT(0);
11121
11129
return VK_ERROR_FEATURE_NOT_PRESENT;
0 commit comments