From 16fa3697db093de5fd9fc9db3a3410d0d2d091b7 Mon Sep 17 00:00:00 2001 From: vlj Date: Fri, 26 Jun 2015 20:24:31 +0200 Subject: [PATCH] d3d12: Use atomic for data heap --- rpcs3/Emu/RSX/D3D12/D3D12GSRender.h | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/rpcs3/Emu/RSX/D3D12/D3D12GSRender.h b/rpcs3/Emu/RSX/D3D12/D3D12GSRender.h index e2f1640fd2..ef62bd1ade 100644 --- a/rpcs3/Emu/RSX/D3D12/D3D12GSRender.h +++ b/rpcs3/Emu/RSX/D3D12/D3D12GSRender.h @@ -120,8 +120,8 @@ struct DataHeap { T *m_heap; size_t m_size; - size_t m_putPos, // Start of free space - m_getPos; // End of free space + size_t m_putPos; // Start of free space + std::atomic m_getPos; // End of free space std::vector > m_resourceStoredSinceLastSync; void Init(ID3D12Device *device, size_t heapSize, D3D12_HEAP_TYPE type, D3D12_HEAP_FLAGS flags) @@ -138,6 +138,7 @@ struct DataHeap bool canAlloc(size_t size) const { size_t allocSize = align(size, Alignment); + size_t currentGetPos = m_getPos.load(); if (m_putPos + allocSize < m_size) { // range before get @@ -193,14 +194,14 @@ struct DataHeap */ std::function getCleaningFunction() { - size_t& getPointer = m_getPos; + std::atomic& getPointer = m_getPos; auto duplicatem_resourceStoredSinceLastSync = m_resourceStoredSinceLastSync; m_resourceStoredSinceLastSync.clear(); return [=, &getPointer]() { for (auto tmp : duplicatem_resourceStoredSinceLastSync) { SAFE_RELEASE(std::get<2>(tmp)); - getPointer = std::get<0>(tmp); + getPointer.exchange(std::get<0>(tmp)); } }; }