private void PushDataImpl(CommandBufferScoped cbs, BufferHolder dst, int dstOffset, ReadOnlySpan <byte> data) { var srcBuffer = _buffer.GetBuffer(); var dstBuffer = dst.GetBuffer(); int offset = _freeOffset; int capacity = BufferSize - offset; if (capacity < data.Length) { _buffer.SetDataUnchecked(offset, data.Slice(0, capacity)); _buffer.SetDataUnchecked(0, data.Slice(capacity)); BufferHolder.Copy(_gd, cbs, srcBuffer, dstBuffer, offset, dstOffset, capacity); BufferHolder.Copy(_gd, cbs, srcBuffer, dstBuffer, 0, dstOffset + capacity, data.Length - capacity); } else { _buffer.SetDataUnchecked(offset, data); BufferHolder.Copy(_gd, cbs, srcBuffer, dstBuffer, offset, dstOffset, data.Length); } _freeOffset = (offset + data.Length) & (BufferSize - 1); _freeSize -= data.Length; Debug.Assert(_freeSize >= 0); _pendingCopies.Enqueue(new PendingCopy(cbs.GetFence(), data.Length)); }
public void CopyBuffer(BufferHandle source, BufferHandle destination, int srcOffset, int dstOffset, int size) { EndRenderPass(); var src = Gd.BufferManager.GetBuffer(CommandBuffer, source, false); var dst = Gd.BufferManager.GetBuffer(CommandBuffer, destination, true); BufferHolder.Copy(Gd, Cbs, src, dst, srcOffset, dstOffset, size); }
public Span <byte> GetBufferData(CommandBufferPool cbp, BufferHolder buffer, int offset, int size) { var flushStorage = ResizeIfNeeded(size); using (var cbs = cbp.Rent()) { var srcBuffer = buffer.GetBuffer(cbs.CommandBuffer); var dstBuffer = flushStorage.GetBuffer(cbs.CommandBuffer); BufferHolder.Copy(_gd, cbs, srcBuffer, dstBuffer, offset, 0, size); } flushStorage.WaitForFences(); return(flushStorage.GetDataStorage(0, size)); }
public unsafe bool TryPushData(CommandBufferScoped cbs, Action endRenderPass, BufferHolder dst, int dstOffset, ReadOnlySpan <byte> data) { if (data.Length > BufferSize) { return(false); } if (_freeSize < data.Length) { FreeCompleted(); if (_freeSize < data.Length) { return(false); } } endRenderPass(); var srcBuffer = _buffer.GetBuffer(); var dstBuffer = dst.GetBuffer(); int offset = _freeOffset; int capacity = BufferSize - offset; if (capacity < data.Length) { _buffer.SetDataUnchecked(offset, data.Slice(0, capacity)); _buffer.SetDataUnchecked(0, data.Slice(capacity)); BufferHolder.Copy(_gd, cbs, srcBuffer, dstBuffer, offset, dstOffset, capacity); BufferHolder.Copy(_gd, cbs, srcBuffer, dstBuffer, 0, dstOffset + capacity, data.Length - capacity); } else { _buffer.SetDataUnchecked(offset, data); BufferHolder.Copy(_gd, cbs, srcBuffer, dstBuffer, offset, dstOffset, data.Length); } _freeOffset = (offset + data.Length) & (BufferSize - 1); _freeSize -= data.Length; Debug.Assert(_freeSize >= 0); _pendingCopies.Enqueue(new PendingCopy(cbs.GetFence(), data.Length)); return(true); }