public SparseUploader(ComputeBuffer dst) { m_CurrFrame = 0; m_DestinationBuffer = dst; m_DataBuffer = new ComputeBuffer[k_NumBufferedFrames]; m_OperationsBuffer = new ComputeBuffer[k_NumBufferedFrames]; m_DataArray = new NativeArray <byte>(); m_OperationsArray = new NativeArray <Operation>(); m_ThreadData = (ThreadedSparseUploaderData *)UnsafeUtility.Malloc(sizeof(ThreadedSparseUploaderData), UnsafeUtility.AlignOf <ThreadedSparseUploaderData>(), Allocator.Persistent); m_ThreadData->m_DataPtr = null; m_ThreadData->m_OperationsPtr = null; m_ThreadData->m_CurrDataOffset = 0; m_ThreadData->m_CurrOperation = 0; m_ThreadData->m_MaxDataOffset = 0; m_ThreadData->m_MaxOperations = 0; m_SparseUploaderShader = Resources.Load <ComputeShader>("SparseUploader"); m_KernelIndex = m_SparseUploaderShader.FindKernel("CopyKernel"); m_OperationsID = Shader.PropertyToID("operations"); m_SrcBufferID = Shader.PropertyToID("srcBuffer"); m_DstBufferID = Shader.PropertyToID("dstBuffer"); m_OperationsBaseID = Shader.PropertyToID("operationsBase"); }
public SparseUploader(ComputeBuffer destinationBuffer, int bufferChunkSize = 16 * 1024 * 1024) { m_BufferChunkSize = bufferChunkSize; m_DestinationBuffer = destinationBuffer; m_FenceBufferPool = new BufferPool(1, 4); m_UploadBufferPool = new BufferPool(m_BufferChunkSize / 4, 4, ComputeBufferType.Raw, ComputeBufferMode.SubUpdates); m_MappedBuffers = new NativeArray <MappedBuffer>(); m_FreeFrameData = new Stack <FrameData>(); m_FrameData = new List <FrameData>(); m_ThreadData = (ThreadedSparseUploaderData *)Memory.Unmanaged.Allocate(sizeof(ThreadedSparseUploaderData), UnsafeUtility.AlignOf <ThreadedSparseUploaderData>(), Allocator.Persistent); m_ThreadData->m_Buffers = null; m_ThreadData->m_NumBuffers = 0; m_ThreadData->m_CurrBuffer = 0; m_SparseUploaderShader = Resources.Load <ComputeShader>("SparseUploader"); m_CopyKernelIndex = m_SparseUploaderShader.FindKernel("CopyKernel"); m_ReplaceKernelIndex = m_SparseUploaderShader.FindKernel("ReplaceKernel"); m_SrcBufferID = Shader.PropertyToID("srcBuffer"); m_DstBufferID = Shader.PropertyToID("dstBuffer"); m_OperationsBaseID = Shader.PropertyToID("operationsBase"); m_ReplaceOperationSize = Shader.PropertyToID("replaceOperationSize"); }
public SparseUploader(ComputeBuffer destinationBuffer, int bufferChunkSize = 16 * 1024 * 1024) { if (SystemInfo.graphicsDeviceType == GraphicsDeviceType.Metal) { m_NumBufferedFrames = 4; // metal is hardcoded to 4 } else { m_NumBufferedFrames = 3; // We use 3 to be safe, but the default value is 2. } #if !DISABLE_HYBRID_RENDERER_V2_FRAME_LIMIT // initialize frame queue limitation if we have async readback // if async readback is not available we have to fallback to frame counting if (SystemInfo.supportsAsyncGPUReadback) { m_LimitingBuffers = new ComputeBuffer[m_NumBufferedFrames]; m_LimitingRequests = new AsyncGPUReadbackRequest[m_NumBufferedFrames]; for (var i = 0; i < m_NumBufferedFrames; i++) { m_LimitingBuffers[i] = new ComputeBuffer(1, 4, ComputeBufferType.Default); m_LimitingRequests[i] = AsyncGPUReadback.Request(m_LimitingBuffers[i]); } } else #endif { m_LimitingBuffers = null; m_LimitingRequests = null; } m_BufferChunkSize = bufferChunkSize; m_CurrFrame = 0; m_DestinationBuffer = destinationBuffer; m_UploadBuffers = new List <ComputeBuffer>(); m_MappedBuffers = new NativeArray <MappedBuffer>(); m_FreeBuffers = new Stack <int>(); m_FrameReuseBuffers = new Stack <int> [m_NumBufferedFrames]; for (int i = 0; i < m_NumBufferedFrames; ++i) { m_FrameReuseBuffers[i] = new Stack <int>(); } m_ThreadData = (ThreadedSparseUploaderData *)Memory.Unmanaged.Allocate(sizeof(ThreadedSparseUploaderData), UnsafeUtility.AlignOf <ThreadedSparseUploaderData>(), Allocator.Persistent); m_ThreadData->m_Buffers = null; m_ThreadData->m_NumBuffers = 0; m_ThreadData->m_CurrBuffer = 0; m_SparseUploaderShader = Resources.Load <ComputeShader>("SparseUploader"); m_CopyKernelIndex = m_SparseUploaderShader.FindKernel("CopyKernel"); m_ReplaceKernelIndex = m_SparseUploaderShader.FindKernel("ReplaceKernel"); m_SrcBufferID = Shader.PropertyToID("srcBuffer"); m_DstBufferID = Shader.PropertyToID("dstBuffer"); m_OperationsBaseID = Shader.PropertyToID("operationsBase"); m_ReplaceOperationSize = Shader.PropertyToID("replaceOperationSize"); }