diff options
Diffstat (limited to 'src/gpu/GrResourceProvider.cpp')
-rw-r--r-- | src/gpu/GrResourceProvider.cpp | 57 |
1 files changed, 56 insertions, 1 deletions
diff --git a/src/gpu/GrResourceProvider.cpp b/src/gpu/GrResourceProvider.cpp index 4b9d265129..3c447bded6 100644 --- a/src/gpu/GrResourceProvider.cpp +++ b/src/gpu/GrResourceProvider.cpp @@ -28,7 +28,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; } @@ -83,3 +83,58 @@ GrPathRange* GrResourceProvider::createGlyphs(const SkTypeface* tf, const SkDesc return this->gpu()->pathRendering()->createGlyphs(tf, desc, stroke); } +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 uint32_t MIN_SIZE = 1 << 12; + size = SkTMax(MIN_SIZE, GrNextPow2(SkToUInt(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 uint32_t MIN_SIZE = 1 << 15; + size = SkTMax(MIN_SIZE, GrNextPow2(SkToUInt(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); +} |