public void FrameCleanup() { var numBuffers = m_ThreadData->m_NumBuffers; if (numBuffers == 0) { return; } // These buffers where never used, so they gets returned to the pool at once for (int iBuf = 0; iBuf < numBuffers; ++iBuf) { var mappedBuffer = m_MappedBuffers[iBuf]; MappedBuffer.UnpackMarker(mappedBuffer.m_Marker, out var operationOffset, out var dataOffset); var computeBufferID = mappedBuffer.m_BufferID; var computeBuffer = m_UploadBufferPool.GetBufferFromId(computeBufferID); computeBuffer.EndWrite <byte>(0); m_UploadBufferPool.PutBufferId(computeBufferID); } m_MappedBuffers.Dispose(); StepFrame(); }
public void EndAndCommit(ThreadedSparseUploader tsu) { var numBuffers = m_ThreadData->m_NumBuffers; var frameData = m_FreeFrameData.Count > 0 ? m_FreeFrameData.Pop() : new FrameData(); for (int iBuf = 0; iBuf < numBuffers; ++iBuf) { var mappedBuffer = m_MappedBuffers[iBuf]; MappedBuffer.UnpackMarker(mappedBuffer.m_Marker, out var operationOffset, out var dataOffset); var numOps = (int)(operationOffset / UnsafeUtility.SizeOf <Operation>()); var computeBufferID = mappedBuffer.m_BufferID; var computeBuffer = m_UploadBufferPool.GetBufferFromId(computeBufferID); if (numOps > 0) { computeBuffer.EndWrite <byte>(m_BufferChunkSize); DispatchUploads(numOps, computeBuffer); frameData.m_Buffers.Push(computeBufferID); } else { computeBuffer.EndWrite <byte>(0); m_UploadBufferPool.PutBufferId(computeBufferID); } } if (SystemInfo.supportsAsyncGPUReadback) { var fenceBufferId = m_FenceBufferPool.GetBufferId(); frameData.m_FenceBuffer = fenceBufferId; frameData.m_Fence = AsyncGPUReadback.Request(m_FenceBufferPool.GetBufferFromId(fenceBufferId)); } m_FrameData.Add(frameData); m_MappedBuffers.Dispose(); StepFrame(); }
public void EndAndCommit(ThreadedSparseUploader tsu) { var numBuffers = m_ThreadData->m_NumBuffers; for (int iBuf = 0; iBuf < numBuffers; ++iBuf) { var mappedBuffer = m_MappedBuffers[iBuf]; MappedBuffer.UnpackMarker(mappedBuffer.m_Marker, out var operationOffset, out var dataOffset); var numOps = (int)(operationOffset / UnsafeUtility.SizeOf <Operation>()); var computeBufferID = mappedBuffer.m_BufferID; var computeBuffer = m_UploadBuffers[computeBufferID]; if (numOps > 0) { computeBuffer.EndWrite <byte>(m_BufferChunkSize); DispatchUploads(numOps, computeBuffer); m_FrameReuseBuffers[m_CurrFrame].Push(computeBufferID); } else { computeBuffer.EndWrite <byte>(0); m_FreeBuffers.Push(computeBufferID); } } m_MappedBuffers.Dispose(); m_CurrFrame += 1; if (m_CurrFrame >= m_NumBufferedFrames) { m_CurrFrame = 0; } // TODO: release safety handle of thread data m_ThreadData->m_Buffers = null; m_ThreadData->m_NumBuffers = 0; m_ThreadData->m_CurrBuffer = 0; }