aboutsummaryrefslogtreecommitdiffhomepage
path: root/src/gpu/GrMesh.h
diff options
context:
space:
mode:
authorGravatar Chris Dalton <csmartdalton@google.com>2017-05-15 11:03:26 -0600
committerGravatar Skia Commit-Bot <skia-commit-bot@chromium.org>2017-05-15 18:01:59 +0000
commitbca46e29e9f96999df0b38fb9359e71b73217c94 (patch)
tree0bd487809346776fccfee12540968cb23aa6cb7a /src/gpu/GrMesh.h
parent18e9484ad5b5755757dc6badb986017a088a9c6b (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.h98
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