xref: /aosp_15_r20/external/skia/src/gpu/ganesh/GrBufferAllocPool.h (revision c8dee2aa9b3f27cf6c858bd81872bdeb2c07ed17)
1*c8dee2aaSAndroid Build Coastguard Worker /*
2*c8dee2aaSAndroid Build Coastguard Worker  * Copyright 2010 Google Inc.
3*c8dee2aaSAndroid Build Coastguard Worker  *
4*c8dee2aaSAndroid Build Coastguard Worker  * Use of this source code is governed by a BSD-style license that can be
5*c8dee2aaSAndroid Build Coastguard Worker  * found in the LICENSE file.
6*c8dee2aaSAndroid Build Coastguard Worker  */
7*c8dee2aaSAndroid Build Coastguard Worker 
8*c8dee2aaSAndroid Build Coastguard Worker #ifndef GrBufferAllocPool_DEFINED
9*c8dee2aaSAndroid Build Coastguard Worker #define GrBufferAllocPool_DEFINED
10*c8dee2aaSAndroid Build Coastguard Worker 
11*c8dee2aaSAndroid Build Coastguard Worker #include "include/core/SkRefCnt.h"
12*c8dee2aaSAndroid Build Coastguard Worker #include "include/core/SkTypes.h"
13*c8dee2aaSAndroid Build Coastguard Worker #include "include/private/base/SkNoncopyable.h"
14*c8dee2aaSAndroid Build Coastguard Worker #include "include/private/base/SkTArray.h"
15*c8dee2aaSAndroid Build Coastguard Worker #include "include/private/base/SkTypeTraits.h"
16*c8dee2aaSAndroid Build Coastguard Worker #include "include/private/gpu/ganesh/GrTypesPriv.h"
17*c8dee2aaSAndroid Build Coastguard Worker #include "src/gpu/ganesh/GrBuffer.h"
18*c8dee2aaSAndroid Build Coastguard Worker #include "src/gpu/ganesh/GrCpuBuffer.h"
19*c8dee2aaSAndroid Build Coastguard Worker #include "src/gpu/ganesh/GrDrawIndirectCommand.h"
20*c8dee2aaSAndroid Build Coastguard Worker #include "src/gpu/ganesh/GrNonAtomicRef.h"
21*c8dee2aaSAndroid Build Coastguard Worker 
22*c8dee2aaSAndroid Build Coastguard Worker #include <cstddef>
23*c8dee2aaSAndroid Build Coastguard Worker #include <memory>
24*c8dee2aaSAndroid Build Coastguard Worker #include <type_traits>
25*c8dee2aaSAndroid Build Coastguard Worker #include <utility>
26*c8dee2aaSAndroid Build Coastguard Worker 
27*c8dee2aaSAndroid Build Coastguard Worker class GrGpu;
28*c8dee2aaSAndroid Build Coastguard Worker 
29*c8dee2aaSAndroid Build Coastguard Worker /**
30*c8dee2aaSAndroid Build Coastguard Worker  * A pool of geometry buffers tied to a GrGpu.
31*c8dee2aaSAndroid Build Coastguard Worker  *
32*c8dee2aaSAndroid Build Coastguard Worker  * The pool allows a client to make space for geometry and then put back excess
33*c8dee2aaSAndroid Build Coastguard Worker  * space if it over allocated. When a client is ready to draw from the pool
34*c8dee2aaSAndroid Build Coastguard Worker  * it calls unmap on the pool ensure buffers are ready for drawing. The pool
35*c8dee2aaSAndroid Build Coastguard Worker  * can be reset after drawing is completed to recycle space.
36*c8dee2aaSAndroid Build Coastguard Worker  *
37*c8dee2aaSAndroid Build Coastguard Worker  * At creation time a minimum per-buffer size can be specified. Additionally,
38*c8dee2aaSAndroid Build Coastguard Worker  * a number of buffers to preallocate can be specified. These will
39*c8dee2aaSAndroid Build Coastguard Worker  * be allocated at the min size and kept around until the pool is destroyed.
40*c8dee2aaSAndroid Build Coastguard Worker  */
41*c8dee2aaSAndroid Build Coastguard Worker class GrBufferAllocPool : SkNoncopyable {
42*c8dee2aaSAndroid Build Coastguard Worker public:
43*c8dee2aaSAndroid Build Coastguard Worker     inline static constexpr size_t kDefaultBufferSize = 1 << 15;
44*c8dee2aaSAndroid Build Coastguard Worker 
45*c8dee2aaSAndroid Build Coastguard Worker     /**
46*c8dee2aaSAndroid Build Coastguard Worker      * A cache object that can be shared by multiple GrBufferAllocPool instances. It caches
47*c8dee2aaSAndroid Build Coastguard Worker      * cpu buffer allocations to avoid reallocating them.
48*c8dee2aaSAndroid Build Coastguard Worker      */
49*c8dee2aaSAndroid Build Coastguard Worker     class CpuBufferCache : public GrNonAtomicRef<CpuBufferCache> {
50*c8dee2aaSAndroid Build Coastguard Worker     public:
51*c8dee2aaSAndroid Build Coastguard Worker         static sk_sp<CpuBufferCache> Make(int maxBuffersToCache);
52*c8dee2aaSAndroid Build Coastguard Worker 
53*c8dee2aaSAndroid Build Coastguard Worker         sk_sp<GrCpuBuffer> makeBuffer(size_t size, bool mustBeInitialized);
54*c8dee2aaSAndroid Build Coastguard Worker         void releaseAll();
55*c8dee2aaSAndroid Build Coastguard Worker 
56*c8dee2aaSAndroid Build Coastguard Worker     private:
57*c8dee2aaSAndroid Build Coastguard Worker         CpuBufferCache(int maxBuffersToCache);
58*c8dee2aaSAndroid Build Coastguard Worker 
59*c8dee2aaSAndroid Build Coastguard Worker         struct Buffer {
60*c8dee2aaSAndroid Build Coastguard Worker             sk_sp<GrCpuBuffer> fBuffer;
61*c8dee2aaSAndroid Build Coastguard Worker             bool fCleared = false;
62*c8dee2aaSAndroid Build Coastguard Worker         };
63*c8dee2aaSAndroid Build Coastguard Worker         std::unique_ptr<Buffer[]> fBuffers;
64*c8dee2aaSAndroid Build Coastguard Worker         int fMaxBuffersToCache = 0;
65*c8dee2aaSAndroid Build Coastguard Worker     };
66*c8dee2aaSAndroid Build Coastguard Worker 
67*c8dee2aaSAndroid Build Coastguard Worker     /**
68*c8dee2aaSAndroid Build Coastguard Worker      * Ensures all buffers are unmapped and have all data written to them.
69*c8dee2aaSAndroid Build Coastguard Worker      * Call before drawing using buffers from the pool.
70*c8dee2aaSAndroid Build Coastguard Worker      */
71*c8dee2aaSAndroid Build Coastguard Worker     void unmap();
72*c8dee2aaSAndroid Build Coastguard Worker 
73*c8dee2aaSAndroid Build Coastguard Worker     /**
74*c8dee2aaSAndroid Build Coastguard Worker      *  Invalidates all the data in the pool, unrefs non-preallocated buffers.
75*c8dee2aaSAndroid Build Coastguard Worker      */
76*c8dee2aaSAndroid Build Coastguard Worker     void reset();
77*c8dee2aaSAndroid Build Coastguard Worker 
78*c8dee2aaSAndroid Build Coastguard Worker     /**
79*c8dee2aaSAndroid Build Coastguard Worker      * Frees data from makeSpaces in LIFO order.
80*c8dee2aaSAndroid Build Coastguard Worker      */
81*c8dee2aaSAndroid Build Coastguard Worker     void putBack(size_t bytes);
82*c8dee2aaSAndroid Build Coastguard Worker 
83*c8dee2aaSAndroid Build Coastguard Worker protected:
84*c8dee2aaSAndroid Build Coastguard Worker     /**
85*c8dee2aaSAndroid Build Coastguard Worker      * Constructor
86*c8dee2aaSAndroid Build Coastguard Worker      *
87*c8dee2aaSAndroid Build Coastguard Worker      * @param gpu                   The GrGpu used to create the buffers.
88*c8dee2aaSAndroid Build Coastguard Worker      * @param bufferType            The type of buffers to create.
89*c8dee2aaSAndroid Build Coastguard Worker      * @param cpuBufferCache        If non-null a cache for client side array buffers
90*c8dee2aaSAndroid Build Coastguard Worker      *                              or staging buffers used before data is uploaded to
91*c8dee2aaSAndroid Build Coastguard Worker      *                              GPU buffer objects.
92*c8dee2aaSAndroid Build Coastguard Worker      */
93*c8dee2aaSAndroid Build Coastguard Worker     GrBufferAllocPool(GrGpu* gpu, GrGpuBufferType bufferType, sk_sp<CpuBufferCache> cpuBufferCache);
94*c8dee2aaSAndroid Build Coastguard Worker 
95*c8dee2aaSAndroid Build Coastguard Worker     virtual ~GrBufferAllocPool();
96*c8dee2aaSAndroid Build Coastguard Worker 
97*c8dee2aaSAndroid Build Coastguard Worker     /**
98*c8dee2aaSAndroid Build Coastguard Worker      * Returns a block of memory to hold data. A buffer designated to hold the
99*c8dee2aaSAndroid Build Coastguard Worker      * data is given to the caller. The buffer may or may not be locked. The
100*c8dee2aaSAndroid Build Coastguard Worker      * returned ptr remains valid until any of the following:
101*c8dee2aaSAndroid Build Coastguard Worker      *      *makeSpace is called again.
102*c8dee2aaSAndroid Build Coastguard Worker      *      *unmap is called.
103*c8dee2aaSAndroid Build Coastguard Worker      *      *reset is called.
104*c8dee2aaSAndroid Build Coastguard Worker      *      *this object is destroyed.
105*c8dee2aaSAndroid Build Coastguard Worker      *
106*c8dee2aaSAndroid Build Coastguard Worker      * Once unmap on the pool is called the data is guaranteed to be in the
107*c8dee2aaSAndroid Build Coastguard Worker      * buffer at the offset indicated by offset. Until that time it may be
108*c8dee2aaSAndroid Build Coastguard Worker      * in temporary storage and/or the buffer may be locked.
109*c8dee2aaSAndroid Build Coastguard Worker      *
110*c8dee2aaSAndroid Build Coastguard Worker      * @param size         the amount of data to make space for
111*c8dee2aaSAndroid Build Coastguard Worker      * @param alignment    alignment constraint from start of buffer
112*c8dee2aaSAndroid Build Coastguard Worker      * @param buffer       returns the buffer that will hold the data.
113*c8dee2aaSAndroid Build Coastguard Worker      * @param offset       returns the offset into buffer of the data.
114*c8dee2aaSAndroid Build Coastguard Worker      * @return pointer to where the client should write the data.
115*c8dee2aaSAndroid Build Coastguard Worker      */
116*c8dee2aaSAndroid Build Coastguard Worker     void* makeSpace(size_t size, size_t alignment, sk_sp<const GrBuffer>* buffer, size_t* offset);
117*c8dee2aaSAndroid Build Coastguard Worker 
118*c8dee2aaSAndroid Build Coastguard Worker     /**
119*c8dee2aaSAndroid Build Coastguard Worker      * Returns a block of memory to hold data. A buffer designated to hold the
120*c8dee2aaSAndroid Build Coastguard Worker      * data is given to the caller. The buffer may or may not be locked. The
121*c8dee2aaSAndroid Build Coastguard Worker      * returned ptr remains valid until any of the following:
122*c8dee2aaSAndroid Build Coastguard Worker      *      *makeSpace is called again.
123*c8dee2aaSAndroid Build Coastguard Worker      *      *unmap is called.
124*c8dee2aaSAndroid Build Coastguard Worker      *      *reset is called.
125*c8dee2aaSAndroid Build Coastguard Worker      *      *this object is destroyed.
126*c8dee2aaSAndroid Build Coastguard Worker      *
127*c8dee2aaSAndroid Build Coastguard Worker      * Once unmap on the pool is called the data is guaranteed to be in the
128*c8dee2aaSAndroid Build Coastguard Worker      * buffer at the offset indicated by offset. Until that time it may be
129*c8dee2aaSAndroid Build Coastguard Worker      * in temporary storage and/or the buffer may be locked.
130*c8dee2aaSAndroid Build Coastguard Worker      *
131*c8dee2aaSAndroid Build Coastguard Worker      * The caller requests a minimum number of bytes, but the block may be (much)
132*c8dee2aaSAndroid Build Coastguard Worker      * larger. Assuming that a new block must be allocated, it will be fallbackSize bytes.
133*c8dee2aaSAndroid Build Coastguard Worker      * The actual block size is returned in actualSize.
134*c8dee2aaSAndroid Build Coastguard Worker      *
135*c8dee2aaSAndroid Build Coastguard Worker      * @param minSize        the minimum amount of data to make space for
136*c8dee2aaSAndroid Build Coastguard Worker      * @param fallbackSize   the amount of data to make space for if a new block is needed
137*c8dee2aaSAndroid Build Coastguard Worker      * @param alignment      alignment constraint from start of buffer
138*c8dee2aaSAndroid Build Coastguard Worker      * @param buffer         returns the buffer that will hold the data.
139*c8dee2aaSAndroid Build Coastguard Worker      * @param offset         returns the offset into buffer of the data.
140*c8dee2aaSAndroid Build Coastguard Worker      * @param actualSize     returns the capacity of the block
141*c8dee2aaSAndroid Build Coastguard Worker      * @return pointer to where the client should write the data.
142*c8dee2aaSAndroid Build Coastguard Worker      */
143*c8dee2aaSAndroid Build Coastguard Worker     void* makeSpaceAtLeast(size_t minSize,
144*c8dee2aaSAndroid Build Coastguard Worker                            size_t fallbackSize,
145*c8dee2aaSAndroid Build Coastguard Worker                            size_t alignment,
146*c8dee2aaSAndroid Build Coastguard Worker                            sk_sp<const GrBuffer>* buffer,
147*c8dee2aaSAndroid Build Coastguard Worker                            size_t* offset,
148*c8dee2aaSAndroid Build Coastguard Worker                            size_t* actualSize);
149*c8dee2aaSAndroid Build Coastguard Worker 
150*c8dee2aaSAndroid Build Coastguard Worker     sk_sp<GrBuffer> getBuffer(size_t size);
151*c8dee2aaSAndroid Build Coastguard Worker 
152*c8dee2aaSAndroid Build Coastguard Worker private:
153*c8dee2aaSAndroid Build Coastguard Worker     struct BufferBlock {
154*c8dee2aaSAndroid Build Coastguard Worker         size_t fBytesFree;
155*c8dee2aaSAndroid Build Coastguard Worker         sk_sp<GrBuffer> fBuffer;
156*c8dee2aaSAndroid Build Coastguard Worker 
157*c8dee2aaSAndroid Build Coastguard Worker         static_assert(::sk_is_trivially_relocatable<decltype(fBuffer)>::value);
158*c8dee2aaSAndroid Build Coastguard Worker 
159*c8dee2aaSAndroid Build Coastguard Worker         using sk_is_trivially_relocatable = std::true_type;
160*c8dee2aaSAndroid Build Coastguard Worker     };
161*c8dee2aaSAndroid Build Coastguard Worker 
162*c8dee2aaSAndroid Build Coastguard Worker     bool createBlock(size_t requestSize);
163*c8dee2aaSAndroid Build Coastguard Worker     void destroyBlock();
164*c8dee2aaSAndroid Build Coastguard Worker     void deleteBlocks();
165*c8dee2aaSAndroid Build Coastguard Worker     void flushCpuData(const BufferBlock& block, size_t flushSize);
166*c8dee2aaSAndroid Build Coastguard Worker     void resetCpuData(size_t newSize);
167*c8dee2aaSAndroid Build Coastguard Worker #ifdef SK_DEBUG
168*c8dee2aaSAndroid Build Coastguard Worker     void validate(bool unusedBlockAllowed = false) const;
169*c8dee2aaSAndroid Build Coastguard Worker #endif
170*c8dee2aaSAndroid Build Coastguard Worker     size_t fBytesInUse = 0;
171*c8dee2aaSAndroid Build Coastguard Worker 
172*c8dee2aaSAndroid Build Coastguard Worker     skia_private::TArray<BufferBlock> fBlocks;
173*c8dee2aaSAndroid Build Coastguard Worker     sk_sp<CpuBufferCache> fCpuBufferCache;
174*c8dee2aaSAndroid Build Coastguard Worker     sk_sp<GrCpuBuffer> fCpuStagingBuffer;
175*c8dee2aaSAndroid Build Coastguard Worker     GrGpu* fGpu;
176*c8dee2aaSAndroid Build Coastguard Worker     GrGpuBufferType fBufferType;
177*c8dee2aaSAndroid Build Coastguard Worker     void* fBufferPtr = nullptr;
178*c8dee2aaSAndroid Build Coastguard Worker };
179*c8dee2aaSAndroid Build Coastguard Worker 
180*c8dee2aaSAndroid Build Coastguard Worker /**
181*c8dee2aaSAndroid Build Coastguard Worker  * A GrBufferAllocPool of vertex buffers
182*c8dee2aaSAndroid Build Coastguard Worker  */
183*c8dee2aaSAndroid Build Coastguard Worker class GrVertexBufferAllocPool : public GrBufferAllocPool {
184*c8dee2aaSAndroid Build Coastguard Worker public:
185*c8dee2aaSAndroid Build Coastguard Worker     /**
186*c8dee2aaSAndroid Build Coastguard Worker      * Constructor
187*c8dee2aaSAndroid Build Coastguard Worker      *
188*c8dee2aaSAndroid Build Coastguard Worker      * @param gpu                   The GrGpu used to create the vertex buffers.
189*c8dee2aaSAndroid Build Coastguard Worker      * @param cpuBufferCache        If non-null a cache for client side array buffers
190*c8dee2aaSAndroid Build Coastguard Worker      *                              or staging buffers used before data is uploaded to
191*c8dee2aaSAndroid Build Coastguard Worker      *                              GPU buffer objects.
192*c8dee2aaSAndroid Build Coastguard Worker      */
193*c8dee2aaSAndroid Build Coastguard Worker     GrVertexBufferAllocPool(GrGpu* gpu, sk_sp<CpuBufferCache> cpuBufferCache);
194*c8dee2aaSAndroid Build Coastguard Worker 
195*c8dee2aaSAndroid Build Coastguard Worker     /**
196*c8dee2aaSAndroid Build Coastguard Worker      * Returns a block of memory to hold vertices. A buffer designated to hold
197*c8dee2aaSAndroid Build Coastguard Worker      * the vertices given to the caller. The buffer may or may not be locked.
198*c8dee2aaSAndroid Build Coastguard Worker      * The returned ptr remains valid until any of the following:
199*c8dee2aaSAndroid Build Coastguard Worker      *      *makeSpace is called again.
200*c8dee2aaSAndroid Build Coastguard Worker      *      *unmap is called.
201*c8dee2aaSAndroid Build Coastguard Worker      *      *reset is called.
202*c8dee2aaSAndroid Build Coastguard Worker      *      *this object is destroyed.
203*c8dee2aaSAndroid Build Coastguard Worker      *
204*c8dee2aaSAndroid Build Coastguard Worker      * Once unmap on the pool is called the vertices are guaranteed to be in
205*c8dee2aaSAndroid Build Coastguard Worker      * the buffer at the offset indicated by startVertex. Until that time they
206*c8dee2aaSAndroid Build Coastguard Worker      * may be in temporary storage and/or the buffer may be locked.
207*c8dee2aaSAndroid Build Coastguard Worker      *
208*c8dee2aaSAndroid Build Coastguard Worker      * @param vertexSize   specifies size of a vertex to allocate space for
209*c8dee2aaSAndroid Build Coastguard Worker      * @param vertexCount  number of vertices to allocate space for
210*c8dee2aaSAndroid Build Coastguard Worker      * @param buffer       returns the vertex buffer that will hold the
211*c8dee2aaSAndroid Build Coastguard Worker      *                     vertices.
212*c8dee2aaSAndroid Build Coastguard Worker      * @param startVertex  returns the offset into buffer of the first vertex.
213*c8dee2aaSAndroid Build Coastguard Worker      *                     In units of the size of a vertex from layout param.
214*c8dee2aaSAndroid Build Coastguard Worker      * @return pointer to first vertex.
215*c8dee2aaSAndroid Build Coastguard Worker      */
216*c8dee2aaSAndroid Build Coastguard Worker     void* makeSpace(size_t vertexSize,
217*c8dee2aaSAndroid Build Coastguard Worker                     int vertexCount,
218*c8dee2aaSAndroid Build Coastguard Worker                     sk_sp<const GrBuffer>* buffer,
219*c8dee2aaSAndroid Build Coastguard Worker                     int* startVertex);
220*c8dee2aaSAndroid Build Coastguard Worker 
221*c8dee2aaSAndroid Build Coastguard Worker     /**
222*c8dee2aaSAndroid Build Coastguard Worker      * Returns a block of memory to hold vertices. A buffer designated to hold
223*c8dee2aaSAndroid Build Coastguard Worker      * the vertices given to the caller. The buffer may or may not be locked.
224*c8dee2aaSAndroid Build Coastguard Worker      * The returned ptr remains valid until any of the following:
225*c8dee2aaSAndroid Build Coastguard Worker      *      *makeSpace is called again.
226*c8dee2aaSAndroid Build Coastguard Worker      *      *unmap is called.
227*c8dee2aaSAndroid Build Coastguard Worker      *      *reset is called.
228*c8dee2aaSAndroid Build Coastguard Worker      *      *this object is destroyed.
229*c8dee2aaSAndroid Build Coastguard Worker      *
230*c8dee2aaSAndroid Build Coastguard Worker      * Once unmap on the pool is called the vertices are guaranteed to be in
231*c8dee2aaSAndroid Build Coastguard Worker      * the buffer at the offset indicated by startVertex. Until that time they
232*c8dee2aaSAndroid Build Coastguard Worker      * may be in temporary storage and/or the buffer may be locked.
233*c8dee2aaSAndroid Build Coastguard Worker      *
234*c8dee2aaSAndroid Build Coastguard Worker      * The caller requests a minimum number of vertices, but the block may be (much)
235*c8dee2aaSAndroid Build Coastguard Worker      * larger. Assuming that a new block must be allocated, it will be sized to hold
236*c8dee2aaSAndroid Build Coastguard Worker      * fallbackVertexCount vertices. The actual block size (in vertices) is returned in
237*c8dee2aaSAndroid Build Coastguard Worker      * actualVertexCount.
238*c8dee2aaSAndroid Build Coastguard Worker      *
239*c8dee2aaSAndroid Build Coastguard Worker      * @param vertexSize           specifies size of a vertex to allocate space for
240*c8dee2aaSAndroid Build Coastguard Worker      * @param minVertexCount       minimum number of vertices to allocate space for
241*c8dee2aaSAndroid Build Coastguard Worker      * @param fallbackVertexCount  number of vertices to allocate space for if a new block is needed
242*c8dee2aaSAndroid Build Coastguard Worker      * @param buffer               returns the vertex buffer that will hold the vertices.
243*c8dee2aaSAndroid Build Coastguard Worker      * @param startVertex          returns the offset into buffer of the first vertex.
244*c8dee2aaSAndroid Build Coastguard Worker      *                             In units of the size of a vertex from layout param.
245*c8dee2aaSAndroid Build Coastguard Worker      * @param actualVertexCount    returns the capacity of the block (in vertices)
246*c8dee2aaSAndroid Build Coastguard Worker      * @return pointer to first vertex.
247*c8dee2aaSAndroid Build Coastguard Worker      */
248*c8dee2aaSAndroid Build Coastguard Worker     void* makeSpaceAtLeast(size_t vertexSize,
249*c8dee2aaSAndroid Build Coastguard Worker                            int minVertexCount,
250*c8dee2aaSAndroid Build Coastguard Worker                            int fallbackVertexCount,
251*c8dee2aaSAndroid Build Coastguard Worker                            sk_sp<const GrBuffer>* buffer,
252*c8dee2aaSAndroid Build Coastguard Worker                            int* startVertex,
253*c8dee2aaSAndroid Build Coastguard Worker                            int* actualVertexCount);
254*c8dee2aaSAndroid Build Coastguard Worker 
255*c8dee2aaSAndroid Build Coastguard Worker private:
256*c8dee2aaSAndroid Build Coastguard Worker     using INHERITED = GrBufferAllocPool;
257*c8dee2aaSAndroid Build Coastguard Worker };
258*c8dee2aaSAndroid Build Coastguard Worker 
259*c8dee2aaSAndroid Build Coastguard Worker /**
260*c8dee2aaSAndroid Build Coastguard Worker  * A GrBufferAllocPool of index buffers
261*c8dee2aaSAndroid Build Coastguard Worker  */
262*c8dee2aaSAndroid Build Coastguard Worker class GrIndexBufferAllocPool : public GrBufferAllocPool {
263*c8dee2aaSAndroid Build Coastguard Worker public:
264*c8dee2aaSAndroid Build Coastguard Worker     /**
265*c8dee2aaSAndroid Build Coastguard Worker      * Constructor
266*c8dee2aaSAndroid Build Coastguard Worker      *
267*c8dee2aaSAndroid Build Coastguard Worker      * @param gpu                   The GrGpu used to create the index buffers.
268*c8dee2aaSAndroid Build Coastguard Worker      * @param cpuBufferCache        If non-null a cache for client side array buffers
269*c8dee2aaSAndroid Build Coastguard Worker      *                              or staging buffers used before data is uploaded to
270*c8dee2aaSAndroid Build Coastguard Worker      *                              GPU buffer objects.
271*c8dee2aaSAndroid Build Coastguard Worker      */
272*c8dee2aaSAndroid Build Coastguard Worker     GrIndexBufferAllocPool(GrGpu* gpu, sk_sp<CpuBufferCache> cpuBufferCache);
273*c8dee2aaSAndroid Build Coastguard Worker 
274*c8dee2aaSAndroid Build Coastguard Worker     /**
275*c8dee2aaSAndroid Build Coastguard Worker      * Returns a block of memory to hold indices. A buffer designated to hold
276*c8dee2aaSAndroid Build Coastguard Worker      * the indices is given to the caller. The buffer may or may not be locked.
277*c8dee2aaSAndroid Build Coastguard Worker      * The returned ptr remains valid until any of the following:
278*c8dee2aaSAndroid Build Coastguard Worker      *      *makeSpace is called again.
279*c8dee2aaSAndroid Build Coastguard Worker      *      *unmap is called.
280*c8dee2aaSAndroid Build Coastguard Worker      *      *reset is called.
281*c8dee2aaSAndroid Build Coastguard Worker      *      *this object is destroyed.
282*c8dee2aaSAndroid Build Coastguard Worker      *
283*c8dee2aaSAndroid Build Coastguard Worker      * Once unmap on the pool is called the indices are guaranteed to be in the
284*c8dee2aaSAndroid Build Coastguard Worker      * buffer at the offset indicated by startIndex. Until that time they may be
285*c8dee2aaSAndroid Build Coastguard Worker      * in temporary storage and/or the buffer may be locked.
286*c8dee2aaSAndroid Build Coastguard Worker      *
287*c8dee2aaSAndroid Build Coastguard Worker      * @param indexCount   number of indices to allocate space for
288*c8dee2aaSAndroid Build Coastguard Worker      * @param buffer       returns the index buffer that will hold the indices.
289*c8dee2aaSAndroid Build Coastguard Worker      * @param startIndex   returns the offset into buffer of the first index.
290*c8dee2aaSAndroid Build Coastguard Worker      * @return pointer to first index.
291*c8dee2aaSAndroid Build Coastguard Worker      */
292*c8dee2aaSAndroid Build Coastguard Worker     void* makeSpace(int indexCount, sk_sp<const GrBuffer>* buffer, int* startIndex);
293*c8dee2aaSAndroid Build Coastguard Worker 
294*c8dee2aaSAndroid Build Coastguard Worker     /**
295*c8dee2aaSAndroid Build Coastguard Worker      * Returns a block of memory to hold indices. A buffer designated to hold
296*c8dee2aaSAndroid Build Coastguard Worker      * the indices is given to the caller. The buffer may or may not be locked.
297*c8dee2aaSAndroid Build Coastguard Worker      * The returned ptr remains valid until any of the following:
298*c8dee2aaSAndroid Build Coastguard Worker      *      *makeSpace is called again.
299*c8dee2aaSAndroid Build Coastguard Worker      *      *unmap is called.
300*c8dee2aaSAndroid Build Coastguard Worker      *      *reset is called.
301*c8dee2aaSAndroid Build Coastguard Worker      *      *this object is destroyed.
302*c8dee2aaSAndroid Build Coastguard Worker      *
303*c8dee2aaSAndroid Build Coastguard Worker      * Once unmap on the pool is called the indices are guaranteed to be in the
304*c8dee2aaSAndroid Build Coastguard Worker      * buffer at the offset indicated by startIndex. Until that time they may be
305*c8dee2aaSAndroid Build Coastguard Worker      * in temporary storage and/or the buffer may be locked.
306*c8dee2aaSAndroid Build Coastguard Worker      *
307*c8dee2aaSAndroid Build Coastguard Worker      * The caller requests a minimum number of indices, but the block may be (much)
308*c8dee2aaSAndroid Build Coastguard Worker      * larger. Assuming that a new block must be allocated, it will be sized to hold
309*c8dee2aaSAndroid Build Coastguard Worker      * fallbackIndexCount indices. The actual block size (in indices) is returned in
310*c8dee2aaSAndroid Build Coastguard Worker      * actualIndexCount.
311*c8dee2aaSAndroid Build Coastguard Worker      *
312*c8dee2aaSAndroid Build Coastguard Worker      * @param minIndexCount        minimum number of indices to allocate space for
313*c8dee2aaSAndroid Build Coastguard Worker      * @param fallbackIndexCount   number of indices to allocate space for if a new block is needed
314*c8dee2aaSAndroid Build Coastguard Worker      * @param buffer               returns the index buffer that will hold the indices.
315*c8dee2aaSAndroid Build Coastguard Worker      * @param startIndex           returns the offset into buffer of the first index.
316*c8dee2aaSAndroid Build Coastguard Worker      * @param actualIndexCount     returns the capacity of the block (in indices)
317*c8dee2aaSAndroid Build Coastguard Worker      * @return pointer to first index.
318*c8dee2aaSAndroid Build Coastguard Worker      */
319*c8dee2aaSAndroid Build Coastguard Worker     void* makeSpaceAtLeast(int minIndexCount,
320*c8dee2aaSAndroid Build Coastguard Worker                            int fallbackIndexCount,
321*c8dee2aaSAndroid Build Coastguard Worker                            sk_sp<const GrBuffer>* buffer,
322*c8dee2aaSAndroid Build Coastguard Worker                            int* startIndex,
323*c8dee2aaSAndroid Build Coastguard Worker                            int* actualIndexCount);
324*c8dee2aaSAndroid Build Coastguard Worker 
325*c8dee2aaSAndroid Build Coastguard Worker private:
326*c8dee2aaSAndroid Build Coastguard Worker     using INHERITED = GrBufferAllocPool;
327*c8dee2aaSAndroid Build Coastguard Worker };
328*c8dee2aaSAndroid Build Coastguard Worker 
329*c8dee2aaSAndroid Build Coastguard Worker class GrDrawIndirectBufferAllocPool : private GrBufferAllocPool {
330*c8dee2aaSAndroid Build Coastguard Worker public:
GrDrawIndirectBufferAllocPool(GrGpu * gpu,sk_sp<CpuBufferCache> cpuBufferCache)331*c8dee2aaSAndroid Build Coastguard Worker     GrDrawIndirectBufferAllocPool(GrGpu* gpu, sk_sp<CpuBufferCache> cpuBufferCache)
332*c8dee2aaSAndroid Build Coastguard Worker             : GrBufferAllocPool(gpu, GrGpuBufferType::kDrawIndirect, std::move(cpuBufferCache)) {}
333*c8dee2aaSAndroid Build Coastguard Worker 
makeSpace(int drawCount,sk_sp<const GrBuffer> * buffer,size_t * offset)334*c8dee2aaSAndroid Build Coastguard Worker     GrDrawIndirectWriter makeSpace(int drawCount, sk_sp<const GrBuffer>* buffer, size_t* offset) {
335*c8dee2aaSAndroid Build Coastguard Worker         return this->GrBufferAllocPool::makeSpace(drawCount * sizeof(GrDrawIndirectCommand), 4,
336*c8dee2aaSAndroid Build Coastguard Worker                                                   buffer, offset);
337*c8dee2aaSAndroid Build Coastguard Worker     }
338*c8dee2aaSAndroid Build Coastguard Worker 
putBack(int drawCount)339*c8dee2aaSAndroid Build Coastguard Worker     void putBack(int drawCount) {
340*c8dee2aaSAndroid Build Coastguard Worker         this->GrBufferAllocPool::putBack(drawCount * sizeof(GrDrawIndirectCommand));
341*c8dee2aaSAndroid Build Coastguard Worker     }
342*c8dee2aaSAndroid Build Coastguard Worker 
makeIndexedSpace(int drawCount,sk_sp<const GrBuffer> * buffer,size_t * offset)343*c8dee2aaSAndroid Build Coastguard Worker     GrDrawIndexedIndirectWriter makeIndexedSpace(int drawCount, sk_sp<const GrBuffer>* buffer,
344*c8dee2aaSAndroid Build Coastguard Worker                                                  size_t* offset) {
345*c8dee2aaSAndroid Build Coastguard Worker         return this->GrBufferAllocPool::makeSpace(
346*c8dee2aaSAndroid Build Coastguard Worker                 drawCount * sizeof(GrDrawIndexedIndirectCommand), 4, buffer, offset);
347*c8dee2aaSAndroid Build Coastguard Worker     }
348*c8dee2aaSAndroid Build Coastguard Worker 
putBackIndexed(int drawCount)349*c8dee2aaSAndroid Build Coastguard Worker     void putBackIndexed(int drawCount) {
350*c8dee2aaSAndroid Build Coastguard Worker         this->GrBufferAllocPool::putBack(drawCount * sizeof(GrDrawIndexedIndirectCommand));
351*c8dee2aaSAndroid Build Coastguard Worker     }
352*c8dee2aaSAndroid Build Coastguard Worker 
353*c8dee2aaSAndroid Build Coastguard Worker     using GrBufferAllocPool::unmap;
354*c8dee2aaSAndroid Build Coastguard Worker     using GrBufferAllocPool::reset;
355*c8dee2aaSAndroid Build Coastguard Worker };
356*c8dee2aaSAndroid Build Coastguard Worker 
357*c8dee2aaSAndroid Build Coastguard Worker #endif
358