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