| Index: src/gpu/GrResourceProvider.cpp
|
| diff --git a/src/gpu/GrResourceProvider.cpp b/src/gpu/GrResourceProvider.cpp
|
| new file mode 100644
|
| index 0000000000000000000000000000000000000000..8fc3272ae2204715650cd45e664b5d56a1ff1399
|
| --- /dev/null
|
| +++ b/src/gpu/GrResourceProvider.cpp
|
| @@ -0,0 +1,65 @@
|
| +/*
|
| + * 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();
|
| + }
|
| + this->assignUniqueKeyToResource(key, buffer);
|
| + 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 };
|
| +
|
| + return this->createInstancedIndexBuffer(kPattern, 6, kMaxQuads, 4, fQuadIndexBufferKey);
|
| +}
|
| +
|
|
|