| Index: src/gpu/GrResourceProvider.cpp
|
| diff --git a/src/gpu/GrResourceProvider.cpp b/src/gpu/GrResourceProvider.cpp
|
| index 8fc3272ae2204715650cd45e664b5d56a1ff1399..e5f1d9cd0b4c4b842a5360e8aa77f4d00e382909 100644
|
| --- a/src/gpu/GrResourceProvider.cpp
|
| +++ b/src/gpu/GrResourceProvider.cpp
|
| @@ -26,7 +26,7 @@ const GrIndexBuffer* GrResourceProvider::createInstancedIndexBuffer(const uint16
|
| const GrUniqueKey& key) {
|
| size_t bufferSize = patternSize * reps * sizeof(uint16_t);
|
|
|
| - GrIndexBuffer* buffer = this->gpu()->createIndexBuffer(bufferSize, /* dynamic = */ false);
|
| + GrIndexBuffer* buffer = this->getIndexBuffer(bufferSize, /* dynamic = */ false, true);
|
| if (!buffer) {
|
| return NULL;
|
| }
|
| @@ -63,3 +63,58 @@ const GrIndexBuffer* GrResourceProvider::createQuadIndexBuffer() {
|
| return this->createInstancedIndexBuffer(kPattern, 6, kMaxQuads, 4, fQuadIndexBufferKey);
|
| }
|
|
|
| +GrIndexBuffer* GrResourceProvider::getIndexBuffer(size_t size, bool dynamic,
|
| + bool calledDuringFlush) {
|
| + if (this->isAbandoned()) {
|
| + return NULL;
|
| + }
|
| +
|
| + if (dynamic) {
|
| + // bin by pow2 with a reasonable min
|
| + static const size_t MIN_SIZE = 1 << 12;
|
| + size = SkTMax(MIN_SIZE, GrNextPow2(size));
|
| +
|
| + GrScratchKey key;
|
| + GrIndexBuffer::ComputeScratchKey(size, dynamic, &key);
|
| + uint32_t scratchFlags = 0;
|
| + if (calledDuringFlush) {
|
| + scratchFlags = GrResourceCache::kRequireNoPendingIO_ScratchFlag;
|
| + } else {
|
| + scratchFlags = GrResourceCache::kPreferNoPendingIO_ScratchFlag;
|
| + }
|
| + GrGpuResource* resource = this->cache()->findAndRefScratchResource(key, scratchFlags);
|
| + if (resource) {
|
| + return static_cast<GrIndexBuffer*>(resource);
|
| + }
|
| + }
|
| +
|
| + return this->gpu()->createIndexBuffer(size, dynamic);
|
| +}
|
| +
|
| +GrVertexBuffer* GrResourceProvider::getVertexBuffer(size_t size, bool dynamic,
|
| + bool calledDuringFlush) {
|
| + if (this->isAbandoned()) {
|
| + return NULL;
|
| + }
|
| +
|
| + if (dynamic) {
|
| + // bin by pow2 with a reasonable min
|
| + static const size_t MIN_SIZE = 1 << 15;
|
| + size = SkTMax(MIN_SIZE, GrNextPow2(size));
|
| +
|
| + GrScratchKey key;
|
| + GrVertexBuffer::ComputeScratchKey(size, dynamic, &key);
|
| + uint32_t scratchFlags = 0;
|
| + if (calledDuringFlush) {
|
| + scratchFlags = GrResourceCache::kRequireNoPendingIO_ScratchFlag;
|
| + } else {
|
| + scratchFlags = GrResourceCache::kPreferNoPendingIO_ScratchFlag;
|
| + }
|
| + GrGpuResource* resource = this->cache()->findAndRefScratchResource(key, scratchFlags);
|
| + if (resource) {
|
| + return static_cast<GrVertexBuffer*>(resource);
|
| + }
|
| + }
|
| +
|
| + return this->gpu()->createVertexBuffer(size, dynamic);
|
| +}
|
|
|