Chromium Code Reviews| Index: src/gpu/GrResourceProvider.cpp |
| diff --git a/src/gpu/GrResourceProvider.cpp b/src/gpu/GrResourceProvider.cpp |
| new file mode 100644 |
| index 0000000000000000000000000000000000000000..1342cccea45535884c223c7c158c1e3b1df4be86 |
| --- /dev/null |
| +++ b/src/gpu/GrResourceProvider.cpp |
| @@ -0,0 +1,64 @@ |
| +/* |
| + * Copyright 2015 Google Inc. |
| + * |
| + * Use of this source code is governed by a BSD-style license that can be |
| + * found in the LICENSE file. |
| + */ |
| + |
| +#include "GrResourceProvider.h" |
| + |
| +#include "GrGpu.h" |
| +#include "GrResourceCache.h" |
| +#include "GrResourceKey.h" |
| +#include "GrVertexBuffer.h" |
| + |
| +GR_DECLARE_STATIC_UNIQUE_KEY(gQuadIndexBufferKey); |
| + |
| +GrResourceProvider::GrResourceProvider(GrGpu* gpu, GrResourceCache* cache) : INHERITED(gpu, cache) { |
| + GR_DEFINE_STATIC_UNIQUE_KEY(gQuadIndexBufferKey); |
| + fQuadIndexBufferKey = gQuadIndexBufferKey; |
| +} |
| + |
| +const GrIndexBuffer* GrResourceProvider::createInstancedIndexBuffer(const uint16_t* pattern, |
| + int patternSize, |
| + int reps, |
| + int vertCount, |
| + const GrUniqueKey& key) { |
| + size_t bufferSize = patternSize * reps * sizeof(uint16_t); |
| + |
| + GrIndexBuffer* buffer = this->gpu()->createIndexBuffer(bufferSize, /* dynamic = */ false); |
| + if (!buffer) { |
| + return NULL; |
| + } |
| + uint16_t* data = (uint16_t*) buffer->map(); |
| + bool useTempData = (NULL == data); |
| + if (useTempData) { |
| + data = SkNEW_ARRAY(uint16_t, reps * patternSize); |
| + } |
| + for (int i = 0; i < reps; ++i) { |
| + int baseIdx = i * patternSize; |
| + uint16_t baseVert = (uint16_t)(i * vertCount); |
| + for (int j = 0; j < patternSize; ++j) { |
| + data[baseIdx+j] = baseVert + pattern[j]; |
| + } |
| + } |
| + if (useTempData) { |
| + if (!buffer->updateData(data, bufferSize)) { |
| + buffer->unref(); |
| + return NULL; |
| + } |
| + SkDELETE_ARRAY(data); |
| + } else { |
| + buffer->unmap(); |
| + } |
| + return buffer; |
| +} |
| + |
| +const GrIndexBuffer* GrResourceProvider::createQuadIndexBuffer() { |
| + static const int kMaxQuads = 1 << 12; // max possible: (1 << 14) - 1; |
| + GR_STATIC_ASSERT(4 * kMaxQuads <= 65535); |
| + static const uint16_t kPattern[] = { 0, 1, 2, 0, 2, 3 }; |
| + |
|
robertphillips
2015/05/04 13:16:00
So we can't just use gQuadIndexBufferKey in here ?
bsalomon
2015/05/04 15:01:09
Right, it is not globally visible, just static in
|
| + return this->createInstancedIndexBuffer(kPattern, 6, kMaxQuads, 4, fQuadIndexBufferKey); |
| +} |
| + |