コード例 #1
0
        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();
        }
コード例 #2
0
        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();
        }
コード例 #3
0
        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;
        }