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");
        }
Beispiel #3
0
        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");
        }