diff options
author | bsalomon <bsalomon@google.com> | 2015-05-04 08:09:30 -0700 |
---|---|---|
committer | Commit bot <commit-bot@chromium.org> | 2015-05-04 08:09:30 -0700 |
commit | ab622c7b8cc8c39f0a594e4392b9e31b7e1ddb26 (patch) | |
tree | 37f3f06f49ac232382c691d09df3a8da0aada0ba /src/gpu/GrResourceProvider.h | |
parent | f15132fdcf5aabb874f1c151a872efe54ee95118 (diff) |
Move instanced index buffer creation to flush time
Review URL: https://codereview.chromium.org/1116943004
Diffstat (limited to 'src/gpu/GrResourceProvider.h')
-rw-r--r-- | src/gpu/GrResourceProvider.h | 60 |
1 files changed, 59 insertions, 1 deletions
diff --git a/src/gpu/GrResourceProvider.h b/src/gpu/GrResourceProvider.h index f560afa0fd..0d80cdd2a0 100644 --- a/src/gpu/GrResourceProvider.h +++ b/src/gpu/GrResourceProvider.h @@ -10,6 +10,9 @@ #include "GrTextureProvider.h" +class GrIndexBuffer; +class GrVertexBuffer; + /** * An extension of the texture provider for arbitrary resource types. This class is intended for * use within the Gr code base, not by clients or extensions (e.g. third party GrProcessor @@ -18,12 +21,67 @@ class GrResourceProvider : public GrTextureProvider { public: - GrResourceProvider(GrGpu* gpu, GrResourceCache* cache) : INHERITED(gpu, cache) {} + GrResourceProvider(GrGpu* gpu, GrResourceCache* cache); + + template <typename T> T* findAndRefTByUniqueKey(const GrUniqueKey& key) { + return static_cast<T*>(this->findAndRefResourceByUniqueKey(key)); + } + + /** + * Either finds and refs, or creates an index buffer for instanced drawing with a specific + * pattern if the index buffer is not found. If the return is non-null, the caller owns + * a ref on the returned GrIndexBuffer. + * + * @param pattern the pattern of indices to repeat + * @param patternSize size in bytes of the pattern + * @param reps number of times to repeat the pattern + * @param vertCount number of vertices the pattern references + * @param key Key to be assigned to the index buffer. + * + * @return The index buffer if successful, otherwise NULL. + */ + const GrIndexBuffer* refOrCreateInstancedIndexBuffer(const uint16_t* pattern, + int patternSize, + int reps, + int vertCount, + const GrUniqueKey& key) { + if (GrIndexBuffer* buffer = this->findAndRefTByUniqueKey<GrIndexBuffer>(key)) { + return buffer; + } + return this->createInstancedIndexBuffer(pattern, patternSize, reps, vertCount, key); + } + + /** + * Returns an index buffer that can be used to render quads. + * Six indices per quad: 0, 1, 2, 0, 2, 3, etc. + * The max number of quads can be queried using GrIndexBuffer::maxQuads(). + * Draw with kTriangles_GrPrimitiveType + * @ return the quad index buffer + */ + const GrIndexBuffer* refQuadIndexBuffer() { + if (GrIndexBuffer* buffer = + this->findAndRefTByUniqueKey<GrIndexBuffer>(fQuadIndexBufferKey)) { + return buffer; + } + return this->createQuadIndexBuffer(); + } + using GrTextureProvider::assignUniqueKeyToResource; using GrTextureProvider::findAndRefResourceByUniqueKey; using GrTextureProvider::abandon; +private: + const GrIndexBuffer* createInstancedIndexBuffer(const uint16_t* pattern, + int patternSize, + int reps, + int vertCount, + const GrUniqueKey& key); + + const GrIndexBuffer* createQuadIndexBuffer(); + + GrUniqueKey fQuadIndexBufferKey; + typedef GrTextureProvider INHERITED; }; |