Flutter Engine
The Flutter Engine
Loading...
Searching...
No Matches
GrStagingBufferManager.cpp
Go to the documentation of this file.
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
9
14
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,
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
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
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}
@ kDynamic_GrAccessPattern
#define SkASSERT(cond)
Definition SkAssert.h:116
const GrContextOptions & options() const
GrResourceProvider * resourceProvider()
GrDirectContextPriv priv()
GrDirectContext * getContext()
Definition GrGpu.h:67
virtual void takeOwnershipOfBuffer(sk_sp< GrGpuBuffer >)
Definition GrGpu.h:432
sk_sp< GrGpuBuffer > createBuffer(size_t size, GrGpuBufferType, GrAccessPattern, ZeroInit)
Slice allocateStagingBufferSlice(size_t size, size_t requiredAlignment=1)
static const uint8_t buffer[]
Point offset