• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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)15 GrStagingBufferManager::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()58 void 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