Update GrTextureOp to use index buffer offsets for draws

This should, hopefully, be faster on GL as we will only need to update the index-range for a draw rather than the offset into an vertex buffer.

Change-Id: I09e54c37262168661443fa8bf8d3b43cd8faa9db
Reviewed-on: https://skia-review.googlesource.com/c/skia/+/251757
Commit-Queue: Robert Phillips <robertphillips@google.com>
Reviewed-by: Michael Ludwig <michaelludwig@google.com>
diff --git a/src/gpu/ops/GrQuadPerEdgeAA.cpp b/src/gpu/ops/GrQuadPerEdgeAA.cpp
index b9b2d65..8bdeeb8 100644
--- a/src/gpu/ops/GrQuadPerEdgeAA.cpp
+++ b/src/gpu/ops/GrQuadPerEdgeAA.cpp
@@ -131,50 +131,58 @@
     return vb.fPtr;
 }
 
-bool ConfigureMeshIndices(GrMeshDrawOp::Target* target, GrMesh* mesh, const VertexSpec& spec,
-                          int quadCount) {
+sk_sp<const GrBuffer> GetIndexBuffer(GrMeshDrawOp::Target* target,
+                                     IndexBufferOption indexBufferOption) {
     auto resourceProvider = target->resourceProvider();
 
-    if (spec.usesCoverageAA()) {
-        SkASSERT(spec.indexBufferOption() == IndexBufferOption::kPictureFramed);
+    switch (indexBufferOption) {
+        case IndexBufferOption::kPictureFramed: return resourceProvider->refAAQuadIndexBuffer();
+        case IndexBufferOption::kIndexedRects:  return resourceProvider->refNonAAQuadIndexBuffer();
+        case IndexBufferOption::kTriStrips:     // fall through
+        default:                                return nullptr;
+    }
+}
 
-        // AA quads use 8 vertices, basically nested rectangles
-        sk_sp<const GrGpuBuffer> ibuffer = resourceProvider->refAAQuadIndexBuffer();
-        if (!ibuffer) {
-            return false;
-        }
 
-        mesh->setPrimitiveType(GrPrimitiveType::kTriangles);
-        mesh->setIndexedPatterned(std::move(ibuffer),
-                                  GrResourceProvider::NumIndicesPerAAQuad(),
-                                  GrResourceProvider::NumVertsPerAAQuad(),
-                                  quadCount,
-                                  GrResourceProvider::MaxNumAAQuads());
-    } else {
-        // Non-AA quads use 4 vertices, and regular triangle strip layout
-        if (quadCount > 1) {
-            SkASSERT(spec.indexBufferOption() == IndexBufferOption::kIndexedRects);
+void ConfigureMesh(GrMesh* mesh, const VertexSpec& spec,
+                   int runningQuadCount, int quadsInDraw, int maxVerts,
+                   sk_sp<const GrBuffer> vertexBuffer,
+                   sk_sp<const GrBuffer> indexBuffer, int absVertBufferOffset) {
+    SkASSERT(vertexBuffer);
 
-            sk_sp<const GrGpuBuffer> ibuffer = resourceProvider->refNonAAQuadIndexBuffer();
-            if (!ibuffer) {
-                return false;
-            }
+    if (spec.indexBufferOption() == IndexBufferOption::kTriStrips) {
+        SkASSERT(!indexBuffer);
 
-            mesh->setPrimitiveType(GrPrimitiveType::kTriangles);
-            mesh->setIndexedPatterned(std::move(ibuffer),
-                                      GrResourceProvider::NumIndicesPerNonAAQuad(),
-                                      GrResourceProvider::NumVertsPerNonAAQuad(),
-                                      quadCount,
-                                      GrResourceProvider::MaxNumNonAAQuads());
-        } else {
-            SkASSERT(spec.indexBufferOption() != IndexBufferOption::kPictureFramed);
-
-            mesh->setPrimitiveType(GrPrimitiveType::kTriangleStrip);
-            mesh->setNonIndexedNonInstanced(4);
-        }
+        mesh->setPrimitiveType(GrPrimitiveType::kTriangleStrip);
+        mesh->setNonIndexedNonInstanced(4);
+        int offset = absVertBufferOffset +
+                                    runningQuadCount * GrResourceProvider::NumVertsPerNonAAQuad();
+        mesh->setVertexData(std::move(vertexBuffer), offset);
+        return;
     }
 
-    return true;
+    SkASSERT(spec.indexBufferOption() == IndexBufferOption::kPictureFramed ||
+             spec.indexBufferOption() == IndexBufferOption::kIndexedRects);
+    SkASSERT(indexBuffer);
+
+    int baseIndex, numIndicesToDraw;
+
+    if (spec.indexBufferOption() == IndexBufferOption::kPictureFramed) {
+        SkASSERT(runningQuadCount + quadsInDraw <= GrResourceProvider::MaxNumAAQuads());
+        // AA uses 8 vertices and 30 indices per quad, basically nested rectangles
+        baseIndex = runningQuadCount * GrResourceProvider::NumIndicesPerAAQuad();
+        numIndicesToDraw = quadsInDraw * GrResourceProvider::NumIndicesPerAAQuad();
+    } else {
+        SkASSERT(runningQuadCount + quadsInDraw <= GrResourceProvider::MaxNumNonAAQuads());
+        // Non-AA uses 4 vertices and 6 indices per quad
+        baseIndex = runningQuadCount * GrResourceProvider::NumIndicesPerNonAAQuad();
+        numIndicesToDraw = quadsInDraw * GrResourceProvider::NumIndicesPerNonAAQuad();
+    }
+
+    mesh->setPrimitiveType(GrPrimitiveType::kTriangles);
+    mesh->setIndexed(std::move(indexBuffer), numIndicesToDraw, baseIndex, 0, maxVerts-1,
+                     GrPrimitiveRestart::kNo);
+    mesh->setVertexData(std::move(vertexBuffer), absVertBufferOffset);
 }
 
 ////////////////// VertexSpec Implementation