1 /* 2 * Copyright 2020 Google LLC 3 * 4 * Use of this source code is governed by a BSD-style license that can be 5 * found in the LICENSE file. 6 */ 7 8 #include "src/gpu/ganesh/GrStagingBufferManager.h" 9 10 #include "include/gpu/GrDirectContext.h" 11 #include "src/gpu/ganesh/GrDirectContextPriv.h" 12 #include "src/gpu/ganesh/GrGpu.h" 13 #include "src/gpu/ganesh/GrResourceProvider.h" 14 allocateStagingBufferSlice(size_t size,size_t requiredAlignment)15GrStagingBufferManager::Slice GrStagingBufferManager::allocateStagingBufferSlice( 16 size_t size, size_t requiredAlignment) { 17 StagingBuffer* buffer = nullptr; 18 size_t offset = 0; 19 for (size_t i = 0; i < fBuffers.size(); ++i) { 20 size_t totalBufferSize = fBuffers[i].fBuffer->size(); 21 size_t currentOffset = fBuffers[i].fOffset; 22 offset = ((currentOffset + requiredAlignment - 1)/requiredAlignment)*requiredAlignment; 23 if (totalBufferSize - offset >= size) { 24 buffer = &fBuffers[i]; 25 break; 26 } 27 } 28 29 if (!buffer) { 30 GrResourceProvider* resourceProvider = fGpu->getContext()->priv().resourceProvider(); 31 size_t minSize = fGpu->getContext()->priv().options().fMinimumStagingBufferSize; 32 size_t bufferSize = std::max(size, minSize); 33 sk_sp<GrGpuBuffer> newBuffer = resourceProvider->createBuffer( 34 bufferSize, 35 GrGpuBufferType::kXferCpuToGpu, 36 kDynamic_GrAccessPattern, 37 GrResourceProvider::ZeroInit::kNo); 38 if (!newBuffer) { 39 return {}; // invalid slice 40 } 41 void* mapPtr = newBuffer->map(); 42 if (!mapPtr) { 43 return {}; // invalid slice 44 } 45 fBuffers.emplace_back(std::move(newBuffer), mapPtr); 46 buffer = &fBuffers.back(); 47 offset = 0; 48 } 49 50 SkASSERT(buffer); 51 SkASSERT(buffer->remaining() >= size); 52 53 buffer->fOffset = offset + size; 54 char* offsetMapPtr = static_cast<char*>(buffer->fMapPtr) + offset; 55 return {buffer->fBuffer.get(), offset, offsetMapPtr}; 56 } 57 detachBuffers()58void GrStagingBufferManager::detachBuffers() { 59 for (size_t i = 0; i < fBuffers.size(); ++i) { 60 fBuffers[i].fBuffer->unmap(); 61 fGpu->takeOwnershipOfBuffer(std::move(fBuffers[i].fBuffer)); 62 } 63 fBuffers.clear(); 64 } 65