d3d12: Do not use atomic for heaps

This commit is contained in:
Vincent Lejeune 2015-10-03 01:29:32 +02:00
parent 3acc900363
commit 81546d357c
2 changed files with 11 additions and 8 deletions

View File

@ -872,11 +872,14 @@ void D3D12GSRender::Flip()
ResourceStorage &newStorage = getCurrentResourceStorage(); ResourceStorage &newStorage = getCurrentResourceStorage();
newStorage.WaitAndClean(); newStorage.WaitAndClean();
m_constantsData.m_getPos.store(newStorage.m_getPosConstantsHeap, std::memory_order_release); if (newStorage.m_inUse)
m_vertexIndexData.m_getPos.store(newStorage.m_getPosVertexIndexHeap, std::memory_order_release); {
m_textureUploadData.m_getPos.store(newStorage.m_getPosTextureUploadHeap, std::memory_order_release); m_constantsData.m_getPos = newStorage.m_getPosConstantsHeap;
m_readbackResources.m_getPos.store(newStorage.m_getPosReadbackHeap, std::memory_order_release); m_vertexIndexData.m_getPos = newStorage.m_getPosVertexIndexHeap;
m_UAVHeap.m_getPos.store(newStorage.m_getPosUAVHeap, std::memory_order_release); m_textureUploadData.m_getPos = newStorage.m_getPosTextureUploadHeap;
m_readbackResources.m_getPos = newStorage.m_getPosReadbackHeap;
m_UAVHeap.m_getPos = newStorage.m_getPosUAVHeap;
}
m_frame->Flip(nullptr); m_frame->Flip(nullptr);

View File

@ -119,14 +119,14 @@ struct DataHeap
T *m_heap; T *m_heap;
size_t m_size; size_t m_size;
size_t m_putPos; // Start of free space size_t m_putPos; // Start of free space
std::atomic<size_t> m_getPos; // End of free space size_t m_getPos; // End of free space
void Init(ID3D12Device *device, size_t heapSize, D3D12_HEAP_TYPE type, D3D12_HEAP_FLAGS flags) void Init(ID3D12Device *device, size_t heapSize, D3D12_HEAP_TYPE type, D3D12_HEAP_FLAGS flags)
{ {
m_size = heapSize; m_size = heapSize;
m_heap = InitHeap<T>::Init(device, heapSize, type, flags); m_heap = InitHeap<T>::Init(device, heapSize, type, flags);
m_putPos = 0; m_putPos = 0;
m_getPos = m_size - 1; m_getPos = heapSize - 1;
} }
/** /**
@ -135,7 +135,7 @@ struct DataHeap
bool canAlloc(size_t size) const bool canAlloc(size_t size) const
{ {
size_t allocSize = align(size, Alignment); size_t allocSize = align(size, Alignment);
size_t currentGetPos = m_getPos.load(); size_t currentGetPos = m_getPos;
if (m_putPos + allocSize < m_size) if (m_putPos + allocSize < m_size)
{ {
// range before get // range before get