mirror of
https://github.com/GPUOpen-LibrariesAndSDKs/VulkanMemoryAllocator.git
synced 2024-11-22 07:04:34 +00:00
extra safety
This commit is contained in:
parent
8c665c4c95
commit
c41e3fb5a6
@ -6093,7 +6093,7 @@ public:
|
||||
|
||||
public:
|
||||
// Strengthened
|
||||
VkResult GetHandle(VkDevice device, VkDeviceMemory memory, decltype(&vkGetMemoryWin32HandleKHR) pvkGetMemoryWin32HandleKHR, HANDLE hTargetProcess, HANDLE* pHandle) noexcept
|
||||
VkResult GetHandle(VkDevice device, VkDeviceMemory memory, decltype(&vkGetMemoryWin32HandleKHR) pvkGetMemoryWin32HandleKHR, HANDLE hTargetProcess, bool useMutex, HANDLE* pHandle) noexcept
|
||||
{
|
||||
*pHandle = VMA_NULL;
|
||||
// We only care about atomicity of handle retrieval, not about memory order.
|
||||
@ -6108,27 +6108,17 @@ public:
|
||||
|
||||
HANDLE hCreatedHandle = VMA_NULL;
|
||||
|
||||
VkResult res = VK_SUCCESS;
|
||||
// If failed, try to create it.
|
||||
VkResult res = Create(device, memory, pvkGetMemoryWin32HandleKHR, &hCreatedHandle);
|
||||
if (res == VK_SUCCESS)
|
||||
{
|
||||
// Successfully created handle, try to set it.
|
||||
if (!m_hHandle.compare_exchange_strong(handle, hCreatedHandle, std::memory_order_relaxed))
|
||||
VmaMutexLockWrite lock(m_Mutex, useMutex);
|
||||
if (m_hHandle.load(std::memory_order_relaxed) == VMA_NULL)
|
||||
{
|
||||
// AMD workaround
|
||||
if (hCreatedHandle != m_hHandle.load(std::memory_order_relaxed))
|
||||
{
|
||||
::CloseHandle(hCreatedHandle);
|
||||
res = Create(device, memory, pvkGetMemoryWin32HandleKHR, &hCreatedHandle);
|
||||
m_hHandle.store(hCreatedHandle, std::memory_order_relaxed);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// If somehow it was set in the meantime, return it.
|
||||
if (m_hHandle.load(std::memory_order_relaxed))
|
||||
{
|
||||
*pHandle = Duplicate(hTargetProcess);
|
||||
return VK_SUCCESS;
|
||||
}
|
||||
return res;
|
||||
}
|
||||
|
||||
@ -6164,6 +6154,7 @@ private:
|
||||
}
|
||||
private:
|
||||
std::atomic<HANDLE> m_hHandle;
|
||||
VMA_RW_MUTEX m_Mutex; // Protects access m_Handle
|
||||
};
|
||||
#else
|
||||
class VmaWin32Handle
|
||||
@ -10802,7 +10793,7 @@ VkResult VmaDeviceMemoryBlock::BindImageMemory(
|
||||
VkResult VmaDeviceMemoryBlock::CreateWin32Handle(const VmaAllocator hAllocator, decltype(&vkGetMemoryWin32HandleKHR) pvkGetMemoryWin32HandleKHR, HANDLE hTargetProcess, HANDLE* pHandle) noexcept
|
||||
{
|
||||
VMA_ASSERT(pHandle);
|
||||
return m_Handle.GetHandle(hAllocator->m_hDevice, m_hMemory, &vkGetMemoryWin32HandleKHR, hTargetProcess, pHandle);
|
||||
return m_Handle.GetHandle(hAllocator->m_hDevice, m_hMemory, &vkGetMemoryWin32HandleKHR, hTargetProcess, hAllocator->m_UseMutex, pHandle);
|
||||
}
|
||||
#endif // VK_USE_PLATFORM_WIN32_KHR
|
||||
#endif // _VMA_DEVICE_MEMORY_BLOCK_FUNCTIONS
|
||||
@ -11115,7 +11106,7 @@ VkResult VmaAllocation_T::GetWin32Handle(VmaAllocator hAllocator, HANDLE hTarget
|
||||
case ALLOCATION_TYPE_BLOCK:
|
||||
return m_BlockAllocation.m_Block->CreateWin32Handle(hAllocator, pvkGetMemoryWin32HandleKHR, hTargetProcess, pHandle);
|
||||
case ALLOCATION_TYPE_DEDICATED:
|
||||
return m_DedicatedAllocation.m_Handle.GetHandle(hAllocator->m_hDevice, m_DedicatedAllocation.m_hMemory, pvkGetMemoryWin32HandleKHR, hTargetProcess, pHandle);
|
||||
return m_DedicatedAllocation.m_Handle.GetHandle(hAllocator->m_hDevice, m_DedicatedAllocation.m_hMemory, pvkGetMemoryWin32HandleKHR, hTargetProcess, hAllocator->m_UseMutex, pHandle);
|
||||
default:
|
||||
VMA_ASSERT(0);
|
||||
return VK_ERROR_FEATURE_NOT_PRESENT;
|
||||
|
Loading…
Reference in New Issue
Block a user