Remove instanced draws and simplify GrMesh
Change-Id: I053a72892542be96fbab261eeb7fbfac76eecf01
Reviewed-on: https://skia-review.googlesource.com/c/skia/+/276817
Reviewed-by: Robert Phillips <robertphillips@google.com>
Commit-Queue: Chris Dalton <csmartdalton@google.com>
diff --git a/src/gpu/GrMesh.h b/src/gpu/GrMesh.h
index b84eb88..c47b986 100644
--- a/src/gpu/GrMesh.h
+++ b/src/gpu/GrMesh.h
@@ -22,25 +22,8 @@
*/
class GrMesh {
public:
- GrMesh() {
- SkDEBUGCODE(fNonIndexNonInstanceData.fVertexCount = -1;)
- }
-
- bool isIndexed() const { return SkToBool(fIndexBuffer.get()); }
- const GrBuffer* indexBuffer() const {
- SkASSERT(this->isIndexed());
- return fIndexBuffer.get();
- }
- GrPrimitiveRestart primitiveRestart() const {
- return GrPrimitiveRestart(fFlags & Flags::kUsePrimitiveRestart);
- }
-
- bool isInstanced() const { return fFlags & Flags::kIsInstanced; }
- const GrBuffer* instanceBuffer() const {
- SkASSERT(this->isInstanced() || !fInstanceBuffer);
- return fInstanceBuffer.get();
- }
-
+ const GrBuffer* indexBuffer() const { return fIndexBuffer.get(); }
+ GrPrimitiveRestart primitiveRestart() const { return fPrimitiveRestart; }
const GrBuffer* vertexBuffer() const { return fVertexBuffer.get(); }
void setNonIndexedNonInstanced(int vertexCount);
@@ -50,84 +33,32 @@
void setIndexedPatterned(sk_sp<const GrBuffer> indexBuffer, int indexCount, int vertexCount,
int patternRepeatCount, int maxPatternRepetitionsInIndexBuffer);
- void setInstanced(sk_sp<const GrBuffer> instanceBuffer, int instanceCount, int baseInstance,
- int vertexCount);
- void setIndexedInstanced(sk_sp<const GrBuffer> indexBuffer, int indexCount,
- sk_sp<const GrBuffer> instanceBuffer, int instanceCount,
- int baseInstance, GrPrimitiveRestart);
-
void setVertexData(sk_sp<const GrBuffer> vertexBuffer, int baseVertex = 0);
void draw(GrOpsRenderPass*) const;
private:
- enum class Flags : uint8_t {
- kNone = 0,
- kUsePrimitiveRestart = 1 << 0,
- kIsInstanced = 1 << 1,
- };
-
- GR_DECL_BITFIELD_CLASS_OPS_FRIENDS(Flags);
- static_assert(Flags(GrPrimitiveRestart::kNo) == Flags::kNone);
- static_assert(Flags(GrPrimitiveRestart::kYes) == Flags::kUsePrimitiveRestart);
-
sk_sp<const GrBuffer> fIndexBuffer;
- sk_sp<const GrBuffer> fInstanceBuffer;
+ int fIndexCount;
+ int fPatternRepeatCount;
+ int fMaxPatternRepetitionsInIndexBuffer;
+ int fBaseIndex;
+ uint16_t fMinIndexValue;
+ uint16_t fMaxIndexValue;
+ GrPrimitiveRestart fPrimitiveRestart = GrPrimitiveRestart::kNo;
+
sk_sp<const GrBuffer> fVertexBuffer;
+ int fVertexCount;
int fBaseVertex = 0;
- Flags fFlags = Flags::kNone;
- union {
- struct { // When fIndexBuffer == nullptr and isInstanced() == false.
- int fVertexCount;
- } fNonIndexNonInstanceData;
-
- struct { // When fIndexBuffer != nullptr and isInstanced() == false.
- struct {
- int fIndexCount;
- int fPatternRepeatCount;
- } fIndexData;
-
- union {
- struct { // When fPatternRepeatCount == 0.
- int fBaseIndex;
- uint16_t fMinIndexValue;
- uint16_t fMaxIndexValue;
- } fNonPatternIndexData;
-
- struct { // When fPatternRepeatCount != 0.
- int fVertexCount;
- int fMaxPatternRepetitionsInIndexBuffer;
- } fPatternData;
- };
- };
-
- struct { // When isInstanced() != false.
- struct {
- int fInstanceCount;
- int fBaseInstance;
- } fInstanceData;
-
- union { // When fIndexBuffer == nullptr.
- struct {
- int fVertexCount;
- } fInstanceNonIndexData;
-
- struct { // When fIndexBuffer != nullptr.
- int fIndexCount;
- } fInstanceIndexData;
- };
- };
- };
+ SkDEBUGCODE(bool fIsInitialized = false;)
};
-GR_MAKE_BITFIELD_CLASS_OPS(GrMesh::Flags);
-
inline void GrMesh::setNonIndexedNonInstanced(int vertexCount) {
fIndexBuffer.reset();
- fInstanceBuffer.reset();
- fNonIndexNonInstanceData.fVertexCount = vertexCount;
- fFlags = Flags::kNone;
+ fVertexCount = vertexCount;
+ fPrimitiveRestart = GrPrimitiveRestart::kNo;
+ SkDEBUGCODE(fIsInitialized = true;)
}
inline void GrMesh::setIndexed(sk_sp<const GrBuffer> indexBuffer, int indexCount, int baseIndex,
@@ -138,13 +69,13 @@
SkASSERT(baseIndex >= 0);
SkASSERT(maxIndexValue >= minIndexValue);
fIndexBuffer = std::move(indexBuffer);
- fInstanceBuffer.reset();
- fIndexData.fIndexCount = indexCount;
- fIndexData.fPatternRepeatCount = 0;
- fNonPatternIndexData.fBaseIndex = baseIndex;
- fNonPatternIndexData.fMinIndexValue = minIndexValue;
- fNonPatternIndexData.fMaxIndexValue = maxIndexValue;
- fFlags = Flags(primitiveRestart);
+ fIndexCount = indexCount;
+ fPatternRepeatCount = 0;
+ fBaseIndex = baseIndex;
+ fMinIndexValue = minIndexValue;
+ fMaxIndexValue = maxIndexValue;
+ fPrimitiveRestart = primitiveRestart;
+ SkDEBUGCODE(fIsInitialized = true;)
}
inline void GrMesh::setIndexedPatterned(sk_sp<const GrBuffer> indexBuffer, int indexCount,
@@ -156,39 +87,12 @@
SkASSERT(patternRepeatCount >= 1);
SkASSERT(maxPatternRepetitionsInIndexBuffer >= 1);
fIndexBuffer = std::move(indexBuffer);
- fInstanceBuffer.reset();
- fIndexData.fIndexCount = indexCount;
- fIndexData.fPatternRepeatCount = patternRepeatCount;
- fPatternData.fVertexCount = vertexCount;
- fPatternData.fMaxPatternRepetitionsInIndexBuffer = maxPatternRepetitionsInIndexBuffer;
- fFlags = Flags::kNone;
-}
-
-inline void GrMesh::setInstanced(sk_sp<const GrBuffer> instanceBuffer, int instanceCount,
- int baseInstance, int vertexCount) {
- SkASSERT(instanceCount >= 1);
- SkASSERT(baseInstance >= 0);
- fIndexBuffer.reset();
- fInstanceBuffer = std::move(instanceBuffer);
- fInstanceData.fInstanceCount = instanceCount;
- fInstanceData.fBaseInstance = baseInstance;
- fInstanceNonIndexData.fVertexCount = vertexCount;
- fFlags = Flags::kIsInstanced;
-}
-
-inline void GrMesh::setIndexedInstanced(sk_sp<const GrBuffer> indexBuffer, int indexCount,
- sk_sp<const GrBuffer> instanceBuffer, int instanceCount,
- int baseInstance, GrPrimitiveRestart primitiveRestart) {
- SkASSERT(indexBuffer);
- SkASSERT(indexCount >= 1);
- SkASSERT(instanceCount >= 1);
- SkASSERT(baseInstance >= 0);
- fIndexBuffer = std::move(indexBuffer);
- fInstanceBuffer = std::move(instanceBuffer);
- fInstanceData.fInstanceCount = instanceCount;
- fInstanceData.fBaseInstance = baseInstance;
- fInstanceIndexData.fIndexCount = indexCount;
- fFlags = Flags::kIsInstanced | Flags(primitiveRestart);
+ fIndexCount = indexCount;
+ fPatternRepeatCount = patternRepeatCount;
+ fVertexCount = vertexCount;
+ fMaxPatternRepetitionsInIndexBuffer = maxPatternRepetitionsInIndexBuffer;
+ fPrimitiveRestart = GrPrimitiveRestart::kNo;
+ SkDEBUGCODE(fIsInitialized = true;)
}
inline void GrMesh::setVertexData(sk_sp<const GrBuffer> vertexBuffer, int baseVertex) {
@@ -198,42 +102,23 @@
}
inline void GrMesh::draw(GrOpsRenderPass* opsRenderPass) const {
- if (this->isInstanced()) {
- if (!this->isIndexed()) {
- opsRenderPass->bindBuffers(nullptr, fInstanceBuffer.get(), fVertexBuffer.get());
- opsRenderPass->drawInstanced(fInstanceData.fInstanceCount, fInstanceData.fBaseInstance,
- fInstanceNonIndexData.fVertexCount, fBaseVertex);
- } else {
- opsRenderPass->bindBuffers(fIndexBuffer.get(), fInstanceBuffer.get(),
- fVertexBuffer.get(), this->primitiveRestart());
- opsRenderPass->drawIndexedInstanced(
- fInstanceIndexData.fIndexCount, 0, fInstanceData.fInstanceCount,
- fInstanceData.fBaseInstance, fBaseVertex);
- }
- return;
- }
+ SkASSERT(fIsInitialized);
- if (!this->isIndexed()) {
- SkASSERT(fNonIndexNonInstanceData.fVertexCount > 0);
+ if (!fIndexBuffer) {
opsRenderPass->bindBuffers(nullptr, nullptr, fVertexBuffer.get());
- opsRenderPass->draw(fNonIndexNonInstanceData.fVertexCount, fBaseVertex);
- return;
+ opsRenderPass->draw(fVertexCount, fBaseVertex);
+ } else {
+ opsRenderPass->bindBuffers(fIndexBuffer.get(), nullptr, fVertexBuffer.get(),
+ this->primitiveRestart());
+ if (0 == fPatternRepeatCount) {
+ opsRenderPass->drawIndexed(fIndexCount, fBaseIndex, fMinIndexValue, fMaxIndexValue,
+ fBaseVertex);
+ } else {
+ opsRenderPass->drawIndexPattern(fIndexCount, fPatternRepeatCount,
+ fMaxPatternRepetitionsInIndexBuffer, fVertexCount,
+ fBaseVertex);
+ }
}
-
- opsRenderPass->bindBuffers(fIndexBuffer.get(), nullptr, fVertexBuffer.get(),
- this->primitiveRestart());
-
- if (0 == fIndexData.fPatternRepeatCount) {
- opsRenderPass->drawIndexed(fIndexData.fIndexCount, fNonPatternIndexData.fBaseIndex,
- fNonPatternIndexData.fMinIndexValue,
- fNonPatternIndexData.fMaxIndexValue, fBaseVertex);
- return;
- }
-
- SkASSERT(fIndexData.fPatternRepeatCount > 0);
- opsRenderPass->drawIndexPattern(fIndexData.fIndexCount, fIndexData.fPatternRepeatCount,
- fPatternData.fMaxPatternRepetitionsInIndexBuffer,
- fPatternData.fVertexCount, fBaseVertex);
}
#endif