blob: ac34b5cfcc1d1d53221ff4cd2b9f299475ba4900 [file] [log] [blame]
epoger@google.comec3ed6a2011-07-28 14:26:00 +00001
bsalomon@google.com1c13c962011-02-14 16:51:21 +00002/*
epoger@google.comec3ed6a2011-07-28 14:26:00 +00003 * Copyright 2010 Google Inc.
4 *
5 * Use of this source code is governed by a BSD-style license that can be
6 * found in the LICENSE file.
bsalomon@google.com1c13c962011-02-14 16:51:21 +00007 */
8
epoger@google.comec3ed6a2011-07-28 14:26:00 +00009
bsalomon@google.com1c13c962011-02-14 16:51:21 +000010#include "GrBufferAllocPool.h"
cdalton397536c2016-03-25 12:15:03 -070011#include "GrBuffer.h"
bsalomoneb1cb5c2015-05-22 08:01:09 -070012#include "GrCaps.h"
robertphillips1b8e1b52015-06-24 06:54:10 -070013#include "GrContext.h"
bsalomon@google.comc26d94f2013-03-25 18:19:00 +000014#include "GrGpu.h"
robertphillips1b8e1b52015-06-24 06:54:10 -070015#include "GrResourceProvider.h"
bsalomon@google.com1c13c962011-02-14 16:51:21 +000016#include "GrTypes.h"
bsalomon@google.com1c13c962011-02-14 16:51:21 +000017
bsalomon3512eda2014-06-26 12:56:22 -070018#include "SkTraceEvent.h"
19
commit-bot@chromium.org515dcd32013-08-28 14:17:03 +000020#ifdef SK_DEBUG
bsalomon@google.com1c13c962011-02-14 16:51:21 +000021 #define VALIDATE validate
22#else
sugoi@google.come0e385c2013-03-11 18:50:03 +000023 static void VALIDATE(bool = false) {}
bsalomon@google.com1c13c962011-02-14 16:51:21 +000024#endif
25
robertphillips1b8e1b52015-06-24 06:54:10 -070026static const size_t MIN_VERTEX_BUFFER_SIZE = 1 << 15;
27static const size_t MIN_INDEX_BUFFER_SIZE = 1 << 12;
28
bsalomon@google.com25fb21f2011-06-21 18:17:25 +000029// page size
joshualitt0709ca02015-06-04 09:13:46 -070030#define GrBufferAllocPool_MIN_BLOCK_SIZE ((size_t)1 << 15)
bsalomon@google.com1c13c962011-02-14 16:51:21 +000031
bsalomon3512eda2014-06-26 12:56:22 -070032#define UNMAP_BUFFER(block) \
33do { \
34 TRACE_EVENT_INSTANT1(TRACE_DISABLED_BY_DEFAULT("skia.gpu"), \
35 "GrBufferAllocPool Unmapping Buffer", \
36 TRACE_EVENT_SCOPE_THREAD, \
37 "percent_unwritten", \
38 (float)((block).fBytesFree) / (block).fBuffer->gpuMemorySize()); \
39 (block).fBuffer->unmap(); \
40} while (false)
41
bsalomon@google.com1c13c962011-02-14 16:51:21 +000042GrBufferAllocPool::GrBufferAllocPool(GrGpu* gpu,
cdalton397536c2016-03-25 12:15:03 -070043 GrBufferType bufferType,
robertphillips1b8e1b52015-06-24 06:54:10 -070044 size_t blockSize)
45 : fBlocks(8) {
bsalomon@google.com11f0b512011-03-29 20:52:23 +000046
bsalomonecb8e3e2015-04-29 04:33:52 -070047 fGpu = SkRef(gpu);
bsalomon7dea7b72015-08-19 08:26:51 -070048 fCpuData = nullptr;
bsalomon@google.com1c13c962011-02-14 16:51:21 +000049 fBufferType = bufferType;
bsalomon7dea7b72015-08-19 08:26:51 -070050 fBufferPtr = nullptr;
commit-bot@chromium.org972f9cd2014-03-28 17:58:28 +000051 fMinBlockSize = SkTMax(GrBufferAllocPool_MIN_BLOCK_SIZE, blockSize);
bsalomon@google.com1c13c962011-02-14 16:51:21 +000052
bsalomon@google.com25fb21f2011-06-21 18:17:25 +000053 fBytesInUse = 0;
robertphillipseea2ff72015-05-14 05:24:53 -070054
cdalton397536c2016-03-25 12:15:03 -070055 fBufferMapThreshold = gpu->caps()->bufferMapThreshold();
bsalomon@google.com1c13c962011-02-14 16:51:21 +000056}
57
robertphillips1b8e1b52015-06-24 06:54:10 -070058void GrBufferAllocPool::deleteBlocks() {
bsalomon@google.com1c13c962011-02-14 16:51:21 +000059 if (fBlocks.count()) {
cdalton397536c2016-03-25 12:15:03 -070060 GrBuffer* buffer = fBlocks.back().fBuffer;
commit-bot@chromium.org8341eb72014-05-07 20:51:05 +000061 if (buffer->isMapped()) {
bsalomon3512eda2014-06-26 12:56:22 -070062 UNMAP_BUFFER(fBlocks.back());
bsalomon@google.com1c13c962011-02-14 16:51:21 +000063 }
64 }
bsalomon@google.com1c13c962011-02-14 16:51:21 +000065 while (!fBlocks.empty()) {
robertphillips91d06bc2015-05-06 04:38:36 -070066 this->destroyBlock();
bsalomon@google.com1c13c962011-02-14 16:51:21 +000067 }
robertphillips1b8e1b52015-06-24 06:54:10 -070068 SkASSERT(!fBufferPtr);
69}
70
71GrBufferAllocPool::~GrBufferAllocPool() {
72 VALIDATE();
73 this->deleteBlocks();
bsalomon7dea7b72015-08-19 08:26:51 -070074 sk_free(fCpuData);
bsalomonecb8e3e2015-04-29 04:33:52 -070075 fGpu->unref();
bsalomon@google.com1c13c962011-02-14 16:51:21 +000076}
77
78void GrBufferAllocPool::reset() {
79 VALIDATE();
bsalomon@google.com25fb21f2011-06-21 18:17:25 +000080 fBytesInUse = 0;
robertphillips1b8e1b52015-06-24 06:54:10 -070081 this->deleteBlocks();
bsalomon7dea7b72015-08-19 08:26:51 -070082
83 // we may have created a large cpu mirror of a large VB. Reset the size to match our minimum.
84 this->resetCpuData(fMinBlockSize);
85
bsalomon@google.com1c13c962011-02-14 16:51:21 +000086 VALIDATE();
87}
88
commit-bot@chromium.org8341eb72014-05-07 20:51:05 +000089void GrBufferAllocPool::unmap() {
bsalomon@google.com1c13c962011-02-14 16:51:21 +000090 VALIDATE();
91
bsalomon49f085d2014-09-05 13:34:00 -070092 if (fBufferPtr) {
bsalomon@google.com1c13c962011-02-14 16:51:21 +000093 BufferBlock& block = fBlocks.back();
commit-bot@chromium.org8341eb72014-05-07 20:51:05 +000094 if (block.fBuffer->isMapped()) {
bsalomon3512eda2014-06-26 12:56:22 -070095 UNMAP_BUFFER(block);
bsalomon@google.com1c13c962011-02-14 16:51:21 +000096 } else {
commit-bot@chromium.org089a7802014-05-02 21:38:22 +000097 size_t flushSize = block.fBuffer->gpuMemorySize() - block.fBytesFree;
bsalomon3512eda2014-06-26 12:56:22 -070098 this->flushCpuData(fBlocks.back(), flushSize);
bsalomon@google.com1c13c962011-02-14 16:51:21 +000099 }
bsalomon7dea7b72015-08-19 08:26:51 -0700100 fBufferPtr = nullptr;
bsalomon@google.com1c13c962011-02-14 16:51:21 +0000101 }
102 VALIDATE();
103}
104
commit-bot@chromium.org515dcd32013-08-28 14:17:03 +0000105#ifdef SK_DEBUG
bsalomon@google.com25fb21f2011-06-21 18:17:25 +0000106void GrBufferAllocPool::validate(bool unusedBlockAllowed) const {
bsalomon71cb0c22014-11-14 12:10:14 -0800107 bool wasDestroyed = false;
bsalomon49f085d2014-09-05 13:34:00 -0700108 if (fBufferPtr) {
tfarina@chromium.orgf6de4752013-08-17 00:02:59 +0000109 SkASSERT(!fBlocks.empty());
commit-bot@chromium.org8341eb72014-05-07 20:51:05 +0000110 if (fBlocks.back().fBuffer->isMapped()) {
cdalton397536c2016-03-25 12:15:03 -0700111 GrBuffer* buf = fBlocks.back().fBuffer;
commit-bot@chromium.org8341eb72014-05-07 20:51:05 +0000112 SkASSERT(buf->mapPtr() == fBufferPtr);
bsalomon@google.com1c13c962011-02-14 16:51:21 +0000113 } else {
bsalomon7dea7b72015-08-19 08:26:51 -0700114 SkASSERT(fCpuData == fBufferPtr);
bsalomon@google.com1c13c962011-02-14 16:51:21 +0000115 }
116 } else {
commit-bot@chromium.org8341eb72014-05-07 20:51:05 +0000117 SkASSERT(fBlocks.empty() || !fBlocks.back().fBuffer->isMapped());
bsalomon@google.com1c13c962011-02-14 16:51:21 +0000118 }
bsalomon@google.com25fb21f2011-06-21 18:17:25 +0000119 size_t bytesInUse = 0;
bsalomon@google.com1c13c962011-02-14 16:51:21 +0000120 for (int i = 0; i < fBlocks.count() - 1; ++i) {
commit-bot@chromium.org8341eb72014-05-07 20:51:05 +0000121 SkASSERT(!fBlocks[i].fBuffer->isMapped());
bsalomon@google.com1c13c962011-02-14 16:51:21 +0000122 }
bsalomon71cb0c22014-11-14 12:10:14 -0800123 for (int i = 0; !wasDestroyed && i < fBlocks.count(); ++i) {
124 if (fBlocks[i].fBuffer->wasDestroyed()) {
125 wasDestroyed = true;
126 } else {
127 size_t bytes = fBlocks[i].fBuffer->gpuMemorySize() - fBlocks[i].fBytesFree;
128 bytesInUse += bytes;
129 SkASSERT(bytes || unusedBlockAllowed);
130 }
bsalomon@google.com25fb21f2011-06-21 18:17:25 +0000131 }
rmistry@google.comfbfcd562012-08-23 18:09:54 +0000132
bsalomon71cb0c22014-11-14 12:10:14 -0800133 if (!wasDestroyed) {
134 SkASSERT(bytesInUse == fBytesInUse);
135 if (unusedBlockAllowed) {
136 SkASSERT((fBytesInUse && !fBlocks.empty()) ||
137 (!fBytesInUse && (fBlocks.count() < 2)));
138 } else {
139 SkASSERT((0 == fBytesInUse) == fBlocks.empty());
140 }
bsalomon@google.com25fb21f2011-06-21 18:17:25 +0000141 }
bsalomon@google.com1c13c962011-02-14 16:51:21 +0000142}
143#endif
144
145void* GrBufferAllocPool::makeSpace(size_t size,
146 size_t alignment,
cdalton397536c2016-03-25 12:15:03 -0700147 const GrBuffer** buffer,
bsalomon@google.com1c13c962011-02-14 16:51:21 +0000148 size_t* offset) {
149 VALIDATE();
150
bsalomon49f085d2014-09-05 13:34:00 -0700151 SkASSERT(buffer);
152 SkASSERT(offset);
bsalomon@google.com1c13c962011-02-14 16:51:21 +0000153
bsalomon49f085d2014-09-05 13:34:00 -0700154 if (fBufferPtr) {
bsalomon@google.com1c13c962011-02-14 16:51:21 +0000155 BufferBlock& back = fBlocks.back();
commit-bot@chromium.org089a7802014-05-02 21:38:22 +0000156 size_t usedBytes = back.fBuffer->gpuMemorySize() - back.fBytesFree;
robertphillips1b8e1b52015-06-24 06:54:10 -0700157 size_t pad = GrSizeAlignUpPad(usedBytes, alignment);
bsalomon@google.com1c13c962011-02-14 16:51:21 +0000158 if ((size + pad) <= back.fBytesFree) {
dongseong.hwang8f25c662015-01-22 10:40:20 -0800159 memset((void*)(reinterpret_cast<intptr_t>(fBufferPtr) + usedBytes), 0, pad);
bsalomon@google.com1c13c962011-02-14 16:51:21 +0000160 usedBytes += pad;
161 *offset = usedBytes;
162 *buffer = back.fBuffer;
163 back.fBytesFree -= size + pad;
bsalomon@google.comd5108092012-03-08 15:10:39 +0000164 fBytesInUse += size + pad;
165 VALIDATE();
bsalomon@google.com1c13c962011-02-14 16:51:21 +0000166 return (void*)(reinterpret_cast<intptr_t>(fBufferPtr) + usedBytes);
167 }
168 }
169
bsalomon@google.com96e96df2011-10-10 14:49:29 +0000170 // We could honor the space request using by a partial update of the current
171 // VB (if there is room). But we don't currently use draw calls to GL that
bsalomon@google.com25fb21f2011-06-21 18:17:25 +0000172 // allow the driver to know that previously issued draws won't read from
bsalomon@google.com96e96df2011-10-10 14:49:29 +0000173 // the part of the buffer we update. Also, the GL buffer implementation
174 // may be cheating on the actual buffer size by shrinking the buffer on
175 // updateData() if the amount of data passed is less than the full buffer
176 // size.
rmistry@google.comfbfcd562012-08-23 18:09:54 +0000177
robertphillips91d06bc2015-05-06 04:38:36 -0700178 if (!this->createBlock(size)) {
bsalomon7dea7b72015-08-19 08:26:51 -0700179 return nullptr;
bsalomon@google.com1c13c962011-02-14 16:51:21 +0000180 }
bsalomon49f085d2014-09-05 13:34:00 -0700181 SkASSERT(fBufferPtr);
bsalomon@google.com1c13c962011-02-14 16:51:21 +0000182
183 *offset = 0;
184 BufferBlock& back = fBlocks.back();
185 *buffer = back.fBuffer;
186 back.fBytesFree -= size;
bsalomon@google.com25fb21f2011-06-21 18:17:25 +0000187 fBytesInUse += size;
188 VALIDATE();
bsalomon@google.com1c13c962011-02-14 16:51:21 +0000189 return fBufferPtr;
190}
191
bsalomon@google.com1c13c962011-02-14 16:51:21 +0000192void GrBufferAllocPool::putBack(size_t bytes) {
193 VALIDATE();
bsalomon@google.com25fb21f2011-06-21 18:17:25 +0000194
195 while (bytes) {
robertphillips91d06bc2015-05-06 04:38:36 -0700196 // caller shouldn't try to put back more than they've taken
tfarina@chromium.orgf6de4752013-08-17 00:02:59 +0000197 SkASSERT(!fBlocks.empty());
bsalomon@google.com25fb21f2011-06-21 18:17:25 +0000198 BufferBlock& block = fBlocks.back();
commit-bot@chromium.org089a7802014-05-02 21:38:22 +0000199 size_t bytesUsed = block.fBuffer->gpuMemorySize() - block.fBytesFree;
bsalomon@google.com1c13c962011-02-14 16:51:21 +0000200 if (bytes >= bytesUsed) {
bsalomon@google.com1c13c962011-02-14 16:51:21 +0000201 bytes -= bytesUsed;
bsalomon@google.com25fb21f2011-06-21 18:17:25 +0000202 fBytesInUse -= bytesUsed;
bsalomon@google.com6513cd02011-08-05 20:12:30 +0000203 // if we locked a vb to satisfy the make space and we're releasing
commit-bot@chromium.org8341eb72014-05-07 20:51:05 +0000204 // beyond it, then unmap it.
205 if (block.fBuffer->isMapped()) {
bsalomon3512eda2014-06-26 12:56:22 -0700206 UNMAP_BUFFER(block);
bsalomon@google.com6513cd02011-08-05 20:12:30 +0000207 }
208 this->destroyBlock();
bsalomon@google.com1c13c962011-02-14 16:51:21 +0000209 } else {
bsalomon@google.com25fb21f2011-06-21 18:17:25 +0000210 block.fBytesFree += bytes;
211 fBytesInUse -= bytes;
212 bytes = 0;
213 break;
bsalomon@google.com1c13c962011-02-14 16:51:21 +0000214 }
215 }
robertphillips1b8e1b52015-06-24 06:54:10 -0700216
bsalomon@google.com1c13c962011-02-14 16:51:21 +0000217 VALIDATE();
bsalomon@google.com1c13c962011-02-14 16:51:21 +0000218}
219
220bool GrBufferAllocPool::createBlock(size_t requestSize) {
221
commit-bot@chromium.org972f9cd2014-03-28 17:58:28 +0000222 size_t size = SkTMax(requestSize, fMinBlockSize);
tfarina@chromium.orgf6de4752013-08-17 00:02:59 +0000223 SkASSERT(size >= GrBufferAllocPool_MIN_BLOCK_SIZE);
bsalomon@google.com1c13c962011-02-14 16:51:21 +0000224
225 VALIDATE();
226
227 BufferBlock& block = fBlocks.push_back();
228
robertphillips1b8e1b52015-06-24 06:54:10 -0700229 block.fBuffer = this->getBuffer(size);
bsalomon7dea7b72015-08-19 08:26:51 -0700230 if (!block.fBuffer) {
robertphillips1b8e1b52015-06-24 06:54:10 -0700231 fBlocks.pop_back();
232 return false;
bsalomon@google.com1c13c962011-02-14 16:51:21 +0000233 }
234
robertphillips1b8e1b52015-06-24 06:54:10 -0700235 block.fBytesFree = block.fBuffer->gpuMemorySize();
bsalomon49f085d2014-09-05 13:34:00 -0700236 if (fBufferPtr) {
tfarina@chromium.orgf6de4752013-08-17 00:02:59 +0000237 SkASSERT(fBlocks.count() > 1);
bsalomon@google.com1c13c962011-02-14 16:51:21 +0000238 BufferBlock& prev = fBlocks.fromBack(1);
commit-bot@chromium.org8341eb72014-05-07 20:51:05 +0000239 if (prev.fBuffer->isMapped()) {
bsalomon3512eda2014-06-26 12:56:22 -0700240 UNMAP_BUFFER(prev);
bsalomon@google.com1c13c962011-02-14 16:51:21 +0000241 } else {
bsalomon3512eda2014-06-26 12:56:22 -0700242 this->flushCpuData(prev, prev.fBuffer->gpuMemorySize() - prev.fBytesFree);
bsalomon@google.com1c13c962011-02-14 16:51:21 +0000243 }
bsalomon7dea7b72015-08-19 08:26:51 -0700244 fBufferPtr = nullptr;
bsalomon@google.com1c13c962011-02-14 16:51:21 +0000245 }
246
bsalomon7dea7b72015-08-19 08:26:51 -0700247 SkASSERT(!fBufferPtr);
bsalomon@google.com1c13c962011-02-14 16:51:21 +0000248
commit-bot@chromium.org8341eb72014-05-07 20:51:05 +0000249 // If the buffer is CPU-backed we map it because it is free to do so and saves a copy.
bsalomonecb8e3e2015-04-29 04:33:52 -0700250 // Otherwise when buffer mapping is supported we map if the buffer size is greater than the
251 // threshold.
commit-bot@chromium.org8341eb72014-05-07 20:51:05 +0000252 bool attemptMap = block.fBuffer->isCPUBacked();
bsalomon4b91f762015-05-19 09:29:46 -0700253 if (!attemptMap && GrCaps::kNone_MapFlags != fGpu->caps()->mapBufferFlags()) {
cdalton397536c2016-03-25 12:15:03 -0700254 attemptMap = size > fBufferMapThreshold;
bsalomon@google.comee3bc3b2013-02-21 14:33:46 +0000255 }
256
commit-bot@chromium.org8341eb72014-05-07 20:51:05 +0000257 if (attemptMap) {
258 fBufferPtr = block.fBuffer->map();
bsalomon@google.com1c13c962011-02-14 16:51:21 +0000259 }
260
bsalomon7dea7b72015-08-19 08:26:51 -0700261 if (!fBufferPtr) {
262 fBufferPtr = this->resetCpuData(block.fBytesFree);
bsalomon@google.com1c13c962011-02-14 16:51:21 +0000263 }
264
bsalomon@google.com25fb21f2011-06-21 18:17:25 +0000265 VALIDATE(true);
bsalomon@google.com1c13c962011-02-14 16:51:21 +0000266
267 return true;
268}
269
270void GrBufferAllocPool::destroyBlock() {
tfarina@chromium.orgf6de4752013-08-17 00:02:59 +0000271 SkASSERT(!fBlocks.empty());
bsalomon@google.com1c13c962011-02-14 16:51:21 +0000272
273 BufferBlock& block = fBlocks.back();
robertphillips1b8e1b52015-06-24 06:54:10 -0700274
commit-bot@chromium.org8341eb72014-05-07 20:51:05 +0000275 SkASSERT(!block.fBuffer->isMapped());
bsalomon@google.com1c13c962011-02-14 16:51:21 +0000276 block.fBuffer->unref();
277 fBlocks.pop_back();
bsalomon7dea7b72015-08-19 08:26:51 -0700278 fBufferPtr = nullptr;
bsalomon@google.com1c13c962011-02-14 16:51:21 +0000279}
280
bsalomon7dea7b72015-08-19 08:26:51 -0700281void* GrBufferAllocPool::resetCpuData(size_t newSize) {
282 sk_free(fCpuData);
283 if (newSize) {
284 if (fGpu->caps()->mustClearUploadedBufferData()) {
285 fCpuData = sk_calloc(newSize);
286 } else {
287 fCpuData = sk_malloc_throw(newSize);
288 }
289 } else {
290 fCpuData = nullptr;
291 }
292 return fCpuData;
293}
294
295
bsalomon3512eda2014-06-26 12:56:22 -0700296void GrBufferAllocPool::flushCpuData(const BufferBlock& block, size_t flushSize) {
cdalton397536c2016-03-25 12:15:03 -0700297 GrBuffer* buffer = block.fBuffer;
bsalomon49f085d2014-09-05 13:34:00 -0700298 SkASSERT(buffer);
commit-bot@chromium.org8341eb72014-05-07 20:51:05 +0000299 SkASSERT(!buffer->isMapped());
bsalomon7dea7b72015-08-19 08:26:51 -0700300 SkASSERT(fCpuData == fBufferPtr);
commit-bot@chromium.org089a7802014-05-02 21:38:22 +0000301 SkASSERT(flushSize <= buffer->gpuMemorySize());
bsalomon@google.comd5108092012-03-08 15:10:39 +0000302 VALIDATE(true);
bsalomon@google.com1c13c962011-02-14 16:51:21 +0000303
bsalomon4b91f762015-05-19 09:29:46 -0700304 if (GrCaps::kNone_MapFlags != fGpu->caps()->mapBufferFlags() &&
cdalton397536c2016-03-25 12:15:03 -0700305 flushSize > fBufferMapThreshold) {
commit-bot@chromium.org8341eb72014-05-07 20:51:05 +0000306 void* data = buffer->map();
bsalomon49f085d2014-09-05 13:34:00 -0700307 if (data) {
bsalomon@google.com1c13c962011-02-14 16:51:21 +0000308 memcpy(data, fBufferPtr, flushSize);
bsalomon3512eda2014-06-26 12:56:22 -0700309 UNMAP_BUFFER(block);
bsalomon@google.com71bd1ef2011-12-12 20:42:26 +0000310 return;
bsalomon@google.com1c13c962011-02-14 16:51:21 +0000311 }
312 }
313 buffer->updateData(fBufferPtr, flushSize);
bsalomon@google.comd5108092012-03-08 15:10:39 +0000314 VALIDATE(true);
bsalomon@google.com1c13c962011-02-14 16:51:21 +0000315}
316
cdalton397536c2016-03-25 12:15:03 -0700317GrBuffer* GrBufferAllocPool::getBuffer(size_t size) {
robertphillips1b8e1b52015-06-24 06:54:10 -0700318
319 GrResourceProvider* rp = fGpu->getContext()->resourceProvider();
320
halcanary6950de62015-11-07 05:29:00 -0800321 // Shouldn't have to use this flag (https://bug.skia.org/4156)
bsalomoneae62002015-07-31 13:59:30 -0700322 static const uint32_t kFlags = GrResourceProvider::kNoPendingIO_Flag;
cdalton397536c2016-03-25 12:15:03 -0700323 return rp->createBuffer(fBufferType, size, kDynamic_GrAccessPattern, kFlags);
bsalomon@google.com1c13c962011-02-14 16:51:21 +0000324}
325
326////////////////////////////////////////////////////////////////////////////////
327
robertphillips1b8e1b52015-06-24 06:54:10 -0700328GrVertexBufferAllocPool::GrVertexBufferAllocPool(GrGpu* gpu)
cdalton397536c2016-03-25 12:15:03 -0700329 : GrBufferAllocPool(gpu, kVertex_GrBufferType, MIN_VERTEX_BUFFER_SIZE) {
bsalomon@google.com1c13c962011-02-14 16:51:21 +0000330}
331
jvanverth@google.coma6338982013-01-31 21:34:25 +0000332void* GrVertexBufferAllocPool::makeSpace(size_t vertexSize,
bsalomon@google.com1c13c962011-02-14 16:51:21 +0000333 int vertexCount,
cdalton397536c2016-03-25 12:15:03 -0700334 const GrBuffer** buffer,
bsalomon@google.com1c13c962011-02-14 16:51:21 +0000335 int* startVertex) {
336
tfarina@chromium.orgf6de4752013-08-17 00:02:59 +0000337 SkASSERT(vertexCount >= 0);
bsalomon49f085d2014-09-05 13:34:00 -0700338 SkASSERT(buffer);
339 SkASSERT(startVertex);
bsalomon@google.com1c13c962011-02-14 16:51:21 +0000340
bsalomon@google.com8b484412011-04-18 19:07:44 +0000341 size_t offset = 0; // assign to suppress warning
jvanverth@google.coma6338982013-01-31 21:34:25 +0000342 void* ptr = INHERITED::makeSpace(vertexSize * vertexCount,
343 vertexSize,
cdalton397536c2016-03-25 12:15:03 -0700344 buffer,
bsalomon@google.com1c13c962011-02-14 16:51:21 +0000345 &offset);
346
tfarina@chromium.orgf6de4752013-08-17 00:02:59 +0000347 SkASSERT(0 == offset % vertexSize);
robertphillips@google.comadacc702013-10-14 21:53:24 +0000348 *startVertex = static_cast<int>(offset / vertexSize);
bsalomon@google.com1c13c962011-02-14 16:51:21 +0000349 return ptr;
350}
351
bsalomon@google.com1c13c962011-02-14 16:51:21 +0000352////////////////////////////////////////////////////////////////////////////////
353
robertphillips1b8e1b52015-06-24 06:54:10 -0700354GrIndexBufferAllocPool::GrIndexBufferAllocPool(GrGpu* gpu)
cdalton397536c2016-03-25 12:15:03 -0700355 : GrBufferAllocPool(gpu, kIndex_GrBufferType, MIN_INDEX_BUFFER_SIZE) {
bsalomon@google.com1c13c962011-02-14 16:51:21 +0000356}
357
358void* GrIndexBufferAllocPool::makeSpace(int indexCount,
cdalton397536c2016-03-25 12:15:03 -0700359 const GrBuffer** buffer,
bsalomon@google.com1c13c962011-02-14 16:51:21 +0000360 int* startIndex) {
361
tfarina@chromium.orgf6de4752013-08-17 00:02:59 +0000362 SkASSERT(indexCount >= 0);
bsalomon49f085d2014-09-05 13:34:00 -0700363 SkASSERT(buffer);
364 SkASSERT(startIndex);
bsalomon@google.com1c13c962011-02-14 16:51:21 +0000365
bsalomon@google.com8b484412011-04-18 19:07:44 +0000366 size_t offset = 0; // assign to suppress warning
bsalomon@google.com1c13c962011-02-14 16:51:21 +0000367 void* ptr = INHERITED::makeSpace(indexCount * sizeof(uint16_t),
368 sizeof(uint16_t),
cdalton397536c2016-03-25 12:15:03 -0700369 buffer,
bsalomon@google.com1c13c962011-02-14 16:51:21 +0000370 &offset);
371
tfarina@chromium.orgf6de4752013-08-17 00:02:59 +0000372 SkASSERT(0 == offset % sizeof(uint16_t));
robertphillips@google.comadacc702013-10-14 21:53:24 +0000373 *startIndex = static_cast<int>(offset / sizeof(uint16_t));
bsalomon@google.com1c13c962011-02-14 16:51:21 +0000374 return ptr;
375}