xref: /aosp_15_r20/external/skia/src/gpu/ganesh/GrEagerVertexAllocator.cpp (revision c8dee2aa9b3f27cf6c858bd81872bdeb2c07ed17)
1 /*
2  * Copyright 2021 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/GrEagerVertexAllocator.h"
9 
10 #include "include/private/base/SkMalloc.h"
11 #include "src/gpu/ganesh/GrBuffer.h"
12 #include "src/gpu/ganesh/GrMeshDrawTarget.h"
13 
14 #include <utility>
15 
16 //-------------------------------------------------------------------------------------------------
lock(size_t stride,int eagerCount)17 void* GrEagerDynamicVertexAllocator::lock(size_t stride, int eagerCount) {
18     SkASSERT(!fLockCount);
19     SkASSERT(eagerCount);
20     if (void* data = fTarget->makeVertexSpace(stride, eagerCount, fVertexBuffer, fBaseVertex)) {
21         fLockStride = stride;
22         fLockCount = eagerCount;
23         return data;
24     }
25     fVertexBuffer->reset();
26     *fBaseVertex = 0;
27     return nullptr;
28 }
29 
unlock(int actualCount)30 void GrEagerDynamicVertexAllocator::unlock(int actualCount) {
31     SkASSERT(fLockCount);
32     SkASSERT(actualCount <= fLockCount);
33     fTarget->putBackVertices(fLockCount - actualCount, fLockStride);
34     if (!actualCount) {
35         fVertexBuffer->reset();
36         *fBaseVertex = 0;
37     }
38     fLockCount = 0;
39 }
40 
41 //-------------------------------------------------------------------------------------------------
lock(size_t stride,int eagerCount)42 void* GrCpuVertexAllocator::lock(size_t stride, int eagerCount) {
43     SkASSERT(!fLockStride && !fVertices && !fVertexData);
44     SkASSERT(stride && eagerCount);
45 
46     fVertices = sk_malloc_throw(eagerCount * stride);
47     fLockStride = stride;
48 
49     return fVertices;
50 }
51 
unlock(int actualCount)52 void GrCpuVertexAllocator::unlock(int actualCount) {
53     SkASSERT(fLockStride && fVertices && !fVertexData);
54 
55     fVertices = sk_realloc_throw(fVertices, actualCount * fLockStride);
56 
57     fVertexData = GrThreadSafeCache::MakeVertexData(fVertices, actualCount, fLockStride);
58 
59     fVertices = nullptr;
60     fLockStride = 0;
61 }
62 
detachVertexData()63 sk_sp<GrThreadSafeCache::VertexData> GrCpuVertexAllocator::detachVertexData() {
64     SkASSERT(!fLockStride && !fVertices && fVertexData);
65 
66     return std::move(fVertexData);
67 }
68