/* * Copyright 2020 Google LLC * * Use of this source code is governed by a BSD-style license that can be * found in the LICENSE file. */ #ifndef GrStagingBufferManager_DEFINED #define GrStagingBufferManager_DEFINED #include "include/core/SkRefCnt.h" #include "src/gpu/GrGpuBuffer.h" #include class GrGpu; class GrStagingBufferManager { public: GrStagingBufferManager(GrGpu* gpu) : fGpu(gpu) {} struct Slice { Slice() {} Slice(GrGpuBuffer* buffer, size_t offset, void* offsetMapPtr) : fBuffer(buffer), fOffset(offset), fOffsetMapPtr(offsetMapPtr) {} GrGpuBuffer* fBuffer = nullptr; size_t fOffset = 0; void* fOffsetMapPtr = nullptr; }; Slice allocateStagingBufferSlice(size_t size, size_t requiredAlignment = 1); // This call is used to move all the buffers off of the manager and to backend gpu by calling // the virtual GrGpu::takeOwnershipOfBuffer on each buffer. This is called during // submitToGpu. It is up to the backend to take refs to the buffers in their implemented // takeOwnershipOfBuffer implementation if they need to. After this call returns the // manager will have released all refs to its buffers. void detachBuffers(); bool hasBuffers() { return !fBuffers.empty(); } void reset() { for (size_t i = 0; i < fBuffers.size(); ++i) { fBuffers[i].fBuffer->unmap(); } fBuffers.clear(); } private: static constexpr size_t kMinStagingBufferSize = 64 * 1024; struct StagingBuffer { StagingBuffer(sk_sp buffer, void* mapPtr) : fBuffer(std::move(buffer)) , fMapPtr(mapPtr) {} sk_sp fBuffer; void* fMapPtr; size_t fOffset = 0; size_t remaining() { return fBuffer->size() - fOffset; } }; std::vector fBuffers; GrGpu* fGpu; }; #endif