diff options
author | Chris Dalton <csmartdalton@google.com> | 2017-05-15 11:03:26 -0600 |
---|---|---|
committer | Skia Commit-Bot <skia-commit-bot@chromium.org> | 2017-05-15 18:01:59 +0000 |
commit | bca46e29e9f96999df0b38fb9359e71b73217c94 (patch) | |
tree | 0bd487809346776fccfee12540968cb23aa6cb7a /src/gpu/GrMesh.h | |
parent | 18e9484ad5b5755757dc6badb986017a088a9c6b (diff) |
Convert GrMesh back to a class
Specific methods that limit the data to valid configurations are better
than a runtime mega-assert.
Bug: skia:
Change-Id: Ie15f2dc79659e44cfaddd16eb474795b110fda73
Reviewed-on: https://skia-review.googlesource.com/16577
Commit-Queue: Chris Dalton <csmartdalton@google.com>
Reviewed-by: Brian Salomon <bsalomon@google.com>
Diffstat (limited to 'src/gpu/GrMesh.h')
-rw-r--r-- | src/gpu/GrMesh.h | 98 |
1 files changed, 72 insertions, 26 deletions
diff --git a/src/gpu/GrMesh.h b/src/gpu/GrMesh.h index e2fd2dfda3..6aed8d3ca5 100644 --- a/src/gpu/GrMesh.h +++ b/src/gpu/GrMesh.h @@ -17,28 +17,88 @@ * and draw-issuing responsibility to GrPrimitiveProcessor. The rest of the vertex info lives there * already (stride, attribute mappings). */ -struct GrMesh { +class GrMesh { +public: + GrMesh(GrPrimitiveType primitiveType) + : fPrimitiveType(primitiveType) { + SkDEBUGCODE(fVertexCount = 0;) + SkDEBUGCODE(fBaseVertex = -1;) + } + + void setNonIndexed(); + void setIndexed(const GrBuffer* indexBuffer, int indexCount, int baseIndex = 0); + void setIndexedPatterned(const GrBuffer* indexBuffer, int indexCount, + int patternRepeatCount, int maxPatternRepetitionsInIndexBuffer); + + void setVertices(const GrBuffer* vertexBuffer, int vertexCount, int baseVertex = 0); + + GrPrimitiveType primitiveType() const { return fPrimitiveType; } + + bool isIndexed() const { return SkToBool(fIndexBuffer.get()); } + const GrBuffer* indexBuffer() const { return fIndexBuffer.get(); } + int indexCount() const { SkASSERT(this->isIndexed()); return fIndexCount; } + int baseIndex() const { SkASSERT(this->isIndexed()); return fBaseIndex; } + + const GrBuffer* vertexBuffer() const { return fVertexBuffer.get(); } + int vertexCount() const { SkASSERT(fVertexCount >= 1); return fVertexCount; } + int baseVertex() const { SkASSERT(fBaseVertex >= 0); return fBaseVertex; } + + struct PatternBatch; + +private: using PendingBuffer = GrPendingIOResource<const GrBuffer, kRead_GrIOType>; GrPrimitiveType fPrimitiveType; PendingBuffer fIndexBuffer; - int fIndexCount = 0; - int fBaseIndex = 0; + int fIndexCount; + int fBaseIndex; + int fPatternRepeatCount; + int fMaxPatternRepetitionsInIndexBuffer; PendingBuffer fVertexBuffer; - int fVertexCount = 0; - int fBaseVertex = 0; + int fVertexCount; + int fBaseVertex; - int fPatternRepeatCount = 1; - int fMaxPatternRepetitionsInIndexBuffer = 1; - - struct PatternBatch; class PatternIterator; - - SkDEBUGCODE(void validate() const;) + friend GrMesh::PatternIterator begin(const GrMesh&); + friend GrMesh::PatternIterator end(const GrMesh&); }; +inline void GrMesh::setNonIndexed() { + fIndexBuffer.reset(nullptr); +} + +inline void GrMesh::setIndexed(const GrBuffer* indexBuffer, int indexCount, int baseIndex) { + SkASSERT(indexBuffer); + SkASSERT(indexCount >= 1); + SkASSERT(baseIndex >= 0); + fIndexBuffer.reset(indexBuffer); + fIndexCount = indexCount; + fBaseIndex = baseIndex; + fPatternRepeatCount = fMaxPatternRepetitionsInIndexBuffer = 1; +} + +inline void GrMesh::setIndexedPatterned(const GrBuffer* indexBuffer, int indexCount, + int patternRepeatCount, + int maxPatternRepetitionsInIndexBuffer) { + SkASSERT(indexBuffer); + SkASSERT(indexCount >= 1); + SkASSERT(patternRepeatCount >= 1); + SkASSERT(maxPatternRepetitionsInIndexBuffer >= 1); + fIndexBuffer.reset(indexBuffer); + fIndexCount = indexCount; + fBaseIndex = 0; + fPatternRepeatCount = patternRepeatCount; + fMaxPatternRepetitionsInIndexBuffer = maxPatternRepetitionsInIndexBuffer; +} + +inline void GrMesh::setVertices(const GrBuffer* vertexBuffer, int vertexCount, int baseVertex) { + fVertexBuffer.reset(vertexBuffer); + fVertexCount = vertexCount; + fBaseVertex = baseVertex; +} + struct GrMesh::PatternBatch { int fBaseVertex; int fRepeatCount; @@ -49,7 +109,7 @@ public: PatternIterator(const GrMesh& mesh, int repetitionIdx) : fMesh(mesh) , fRepetitionIdx(repetitionIdx) { - SkDEBUGCODE(mesh.validate()); + SkASSERT(fMesh.isIndexed()); } bool operator!=(const PatternIterator& that) { @@ -83,18 +143,4 @@ inline GrMesh::PatternIterator end(const GrMesh& mesh) { return GrMesh::PatternIterator(mesh, mesh.fPatternRepeatCount); } -#ifdef SK_DEBUG -inline void GrMesh::validate() const { - SkASSERT(!fIndexBuffer || fIndexCount > 0); - SkASSERT(fBaseIndex >= 0); - - SkASSERT(fVertexBuffer); - SkASSERT(fVertexCount); - SkASSERT(fBaseVertex >= 0); - - SkASSERT(fPatternRepeatCount > 0); - SkASSERT(fMaxPatternRepetitionsInIndexBuffer > 0); -} -#endif - #endif |