diff options
Diffstat (limited to 'src/gpu/ops')
-rw-r--r-- | src/gpu/ops/GrAAConvexPathRenderer.cpp | 34 | ||||
-rw-r--r-- | src/gpu/ops/GrAAFillRectOp.cpp | 4 | ||||
-rw-r--r-- | src/gpu/ops/GrAAHairLinePathRenderer.cpp | 37 | ||||
-rw-r--r-- | src/gpu/ops/GrAALinearizingConvexPathRenderer.cpp | 17 | ||||
-rw-r--r-- | src/gpu/ops/GrAAStrokeRectOp.cpp | 6 | ||||
-rw-r--r-- | src/gpu/ops/GrAtlasTextOp.cpp | 11 | ||||
-rw-r--r-- | src/gpu/ops/GrDefaultPathRenderer.cpp | 11 | ||||
-rw-r--r-- | src/gpu/ops/GrDrawVerticesOp.cpp | 12 | ||||
-rw-r--r-- | src/gpu/ops/GrLatticeOp.cpp | 2 | ||||
-rw-r--r-- | src/gpu/ops/GrMSAAPathRenderer.cpp | 30 | ||||
-rw-r--r-- | src/gpu/ops/GrMeshDrawOp.cpp | 24 | ||||
-rw-r--r-- | src/gpu/ops/GrMeshDrawOp.h | 16 | ||||
-rw-r--r-- | src/gpu/ops/GrNonAAFillRectOp.cpp | 2 | ||||
-rw-r--r-- | src/gpu/ops/GrNonAAFillRectPerspectiveOp.cpp | 2 | ||||
-rw-r--r-- | src/gpu/ops/GrNonAAStrokeRectOp.cpp | 5 | ||||
-rw-r--r-- | src/gpu/ops/GrOvalOpFactory.cpp | 24 | ||||
-rw-r--r-- | src/gpu/ops/GrRegionOp.cpp | 2 | ||||
-rw-r--r-- | src/gpu/ops/GrShadowRRectOp.cpp | 9 | ||||
-rw-r--r-- | src/gpu/ops/GrSmallPathRenderer.cpp | 11 | ||||
-rw-r--r-- | src/gpu/ops/GrTessellatingPathRenderer.cpp | 5 |
20 files changed, 164 insertions, 100 deletions
diff --git a/src/gpu/ops/GrAAConvexPathRenderer.cpp b/src/gpu/ops/GrAAConvexPathRenderer.cpp index efc6622c15..f9e95c7b59 100644 --- a/src/gpu/ops/GrAAConvexPathRenderer.cpp +++ b/src/gpu/ops/GrAAConvexPathRenderer.cpp @@ -813,10 +813,13 @@ private: extract_verts(tess, verts, vertexStride, fColor, idxs, canTweakAlphaForCoverage); GrMesh mesh; - mesh.initIndexed(kTriangles_GrPrimitiveType, - vertexBuffer, indexBuffer, - firstVertex, firstIndex, - tess.numPts(), tess.numIndices()); + mesh.fPrimitiveType = kTriangles_GrPrimitiveType; + mesh.fIndexBuffer.reset(indexBuffer); + mesh.fIndexCount = tess.numIndices(); + mesh.fBaseIndex = firstIndex; + mesh.fVertexBuffer.reset(vertexBuffer); + mesh.fVertexCount = tess.numPts(); + mesh.fBaseVertex = firstVertex; target->draw(gp.get(), this->pipeline(), mesh); } } @@ -875,12 +878,14 @@ private: continue; } - const GrBuffer* vertexBuffer; - int firstVertex; + GrMesh mesh; + mesh.fPrimitiveType = kTriangles_GrPrimitiveType; + const GrBuffer* vertexBuffer; size_t vertexStride = quadProcessor->getVertexStride(); QuadVertex* verts = reinterpret_cast<QuadVertex*>(target->makeVertexSpace( - vertexStride, vertexCount, &vertexBuffer, &firstVertex)); + vertexStride, vertexCount, &vertexBuffer, &mesh.fBaseVertex)); + mesh.fVertexBuffer.reset(vertexBuffer); if (!verts) { SkDebugf("Could not allocate vertices\n"); @@ -888,26 +893,23 @@ private: } const GrBuffer* indexBuffer; - int firstIndex; - - uint16_t *idxs = target->makeIndexSpace(indexCount, &indexBuffer, &firstIndex); + uint16_t *idxs = target->makeIndexSpace(indexCount, &indexBuffer, &mesh.fBaseIndex); if (!idxs) { SkDebugf("Could not allocate indices\n"); return; } + mesh.fIndexBuffer.reset(indexBuffer); SkSTArray<kPreallocDrawCnt, Draw, true> draws; create_vertices(segments, fanPt, &draws, verts, idxs); - GrMesh mesh; - for (int j = 0; j < draws.count(); ++j) { const Draw& draw = draws[j]; - mesh.initIndexed(kTriangles_GrPrimitiveType, vertexBuffer, indexBuffer, - firstVertex, firstIndex, draw.fVertexCnt, draw.fIndexCnt); + mesh.fIndexCount = draw.fIndexCnt; + mesh.fVertexCount = draw.fVertexCnt; target->draw(quadProcessor.get(), this->pipeline(), mesh); - firstVertex += draw.fVertexCnt; - firstIndex += draw.fIndexCnt; + mesh.fBaseIndex += draw.fIndexCnt; + mesh.fBaseVertex += draw.fVertexCnt; } } } diff --git a/src/gpu/ops/GrAAFillRectOp.cpp b/src/gpu/ops/GrAAFillRectOp.cpp index 7bf62ece23..ca91e94cd5 100644 --- a/src/gpu/ops/GrAAFillRectOp.cpp +++ b/src/gpu/ops/GrAAFillRectOp.cpp @@ -41,7 +41,7 @@ const GrBuffer* get_index_buffer(GrResourceProvider* resourceProvider) { // clang-format on GR_STATIC_ASSERT(SK_ARRAY_COUNT(gFillAARectIdx) == kIndicesPerAAFillRect); - return resourceProvider->findOrCreateInstancedIndexBuffer( + return resourceProvider->findOrCreatePatternedIndexBuffer( gFillAARectIdx, kIndicesPerAAFillRect, kNumAAFillRectsInIndexBuffer, kVertsPerAAFillRect, gAAFillRectIndexBufferKey); } @@ -231,7 +231,7 @@ private: size_t vertexStride = gp->getVertexStride(); sk_sp<const GrBuffer> indexBuffer(get_index_buffer(target->resourceProvider())); - InstancedHelper helper; + PatternHelper helper; void* vertices = helper.init(target, kTriangles_GrPrimitiveType, vertexStride, indexBuffer.get(), kVertsPerAAFillRect, kIndicesPerAAFillRect, fRectCnt); diff --git a/src/gpu/ops/GrAAHairLinePathRenderer.cpp b/src/gpu/ops/GrAAHairLinePathRenderer.cpp index 274e308465..b8ec966d48 100644 --- a/src/gpu/ops/GrAAHairLinePathRenderer.cpp +++ b/src/gpu/ops/GrAAHairLinePathRenderer.cpp @@ -64,7 +64,7 @@ GR_DECLARE_STATIC_UNIQUE_KEY(gQuadsIndexBufferKey); static const GrBuffer* ref_quads_index_buffer(GrResourceProvider* resourceProvider) { GR_DEFINE_STATIC_UNIQUE_KEY(gQuadsIndexBufferKey); - return resourceProvider->findOrCreateInstancedIndexBuffer( + return resourceProvider->findOrCreatePatternedIndexBuffer( kQuadIdxBufPattern, kIdxsPerQuad, kQuadsNumInIdxBuffer, kQuadNumVertices, gQuadsIndexBufferKey); } @@ -98,7 +98,7 @@ GR_DECLARE_STATIC_UNIQUE_KEY(gLinesIndexBufferKey); static const GrBuffer* ref_lines_index_buffer(GrResourceProvider* resourceProvider) { GR_DEFINE_STATIC_UNIQUE_KEY(gLinesIndexBufferKey); - return resourceProvider->findOrCreateInstancedIndexBuffer( + return resourceProvider->findOrCreatePatternedIndexBuffer( kLineSegIdxBufPattern, kIdxsPerLineSeg, kLineSegsNumInIdxBuffer, kLineSegNumVertices, gLinesIndexBufferKey); } @@ -861,9 +861,14 @@ void AAHairlineOp::onPrepareDraws(Target* target) const { } GrMesh mesh; - mesh.initInstanced(kTriangles_GrPrimitiveType, vertexBuffer, linesIndexBuffer.get(), - firstVertex, kLineSegNumVertices, kIdxsPerLineSeg, lineCount, - kLineSegsNumInIdxBuffer); + mesh.fPrimitiveType = kTriangles_GrPrimitiveType; + mesh.fIndexBuffer.reset(linesIndexBuffer.get()); + mesh.fIndexCount = kIdxsPerLineSeg; + mesh.fVertexBuffer.reset(vertexBuffer); + mesh.fVertexCount = kLineSegNumVertices; + mesh.fBaseVertex = firstVertex; + mesh.fPatternRepeatCount = lineCount; + mesh.fMaxPatternRepetitionsInIndexBuffer = kLineSegsNumInIdxBuffer; target->draw(lineGP.get(), this->pipeline(), mesh); } @@ -918,18 +923,28 @@ void AAHairlineOp::onPrepareDraws(Target* target) const { if (quadCount > 0) { GrMesh mesh; - mesh.initInstanced(kTriangles_GrPrimitiveType, vertexBuffer, quadsIndexBuffer.get(), - firstVertex, kQuadNumVertices, kIdxsPerQuad, quadCount, - kQuadsNumInIdxBuffer); + mesh.fPrimitiveType = kTriangles_GrPrimitiveType; + mesh.fIndexBuffer.reset(quadsIndexBuffer.get()); + mesh.fIndexCount = kIdxsPerQuad; + mesh.fVertexBuffer.reset(vertexBuffer); + mesh.fVertexCount = kQuadNumVertices; + mesh.fBaseVertex = firstVertex; + mesh.fPatternRepeatCount = quadCount; + mesh.fMaxPatternRepetitionsInIndexBuffer = kQuadsNumInIdxBuffer; target->draw(quadGP.get(), this->pipeline(), mesh); firstVertex += quadCount * kQuadNumVertices; } if (conicCount > 0) { GrMesh mesh; - mesh.initInstanced(kTriangles_GrPrimitiveType, vertexBuffer, quadsIndexBuffer.get(), - firstVertex, kQuadNumVertices, kIdxsPerQuad, conicCount, - kQuadsNumInIdxBuffer); + mesh.fPrimitiveType = kTriangles_GrPrimitiveType; + mesh.fIndexBuffer.reset(quadsIndexBuffer.get()); + mesh.fIndexCount = kIdxsPerQuad; + mesh.fVertexBuffer.reset(vertexBuffer); + mesh.fVertexCount = kQuadNumVertices; + mesh.fBaseVertex = firstVertex; + mesh.fPatternRepeatCount = conicCount; + mesh.fMaxPatternRepetitionsInIndexBuffer = kQuadsNumInIdxBuffer; target->draw(conicGP.get(), this->pipeline(), mesh); } } diff --git a/src/gpu/ops/GrAALinearizingConvexPathRenderer.cpp b/src/gpu/ops/GrAALinearizingConvexPathRenderer.cpp index 2a5464c130..6c94793a35 100644 --- a/src/gpu/ops/GrAALinearizingConvexPathRenderer.cpp +++ b/src/gpu/ops/GrAALinearizingConvexPathRenderer.cpp @@ -189,27 +189,30 @@ private: if (vertexCount == 0 || indexCount == 0) { return; } - const GrBuffer* vertexBuffer; + GrMesh mesh; - int firstVertex; + mesh.fPrimitiveType = kTriangles_GrPrimitiveType; + const GrBuffer* vertexBuffer; void* verts = target->makeVertexSpace(vertexStride, vertexCount, &vertexBuffer, - &firstVertex); + &mesh.fBaseVertex); if (!verts) { SkDebugf("Could not allocate vertices\n"); return; } + mesh.fVertexBuffer.reset(vertexBuffer); + mesh.fVertexCount = vertexCount; memcpy(verts, vertices, vertexCount * vertexStride); const GrBuffer* indexBuffer; - int firstIndex; - uint16_t* idxs = target->makeIndexSpace(indexCount, &indexBuffer, &firstIndex); + uint16_t* idxs = target->makeIndexSpace(indexCount, &indexBuffer, &mesh.fBaseIndex); if (!idxs) { SkDebugf("Could not allocate indices\n"); return; } + mesh.fIndexBuffer.reset(indexBuffer); + mesh.fIndexCount = indexCount; memcpy(idxs, indices, indexCount * sizeof(uint16_t)); - mesh.initIndexed(kTriangles_GrPrimitiveType, vertexBuffer, indexBuffer, firstVertex, - firstIndex, vertexCount, indexCount); + target->draw(gp, this->pipeline(), mesh); } diff --git a/src/gpu/ops/GrAAStrokeRectOp.cpp b/src/gpu/ops/GrAAStrokeRectOp.cpp index 8b47f5e30f..cf16d1bea4 100644 --- a/src/gpu/ops/GrAAStrokeRectOp.cpp +++ b/src/gpu/ops/GrAAStrokeRectOp.cpp @@ -262,7 +262,7 @@ void AAStrokeRectOp::onPrepareDraws(Target* target) const { const sk_sp<const GrBuffer> indexBuffer( GetIndexBuffer(target->resourceProvider(), this->miterStroke())); - InstancedHelper helper; + PatternHelper helper; void* vertices = helper.init(target, kTriangles_GrPrimitiveType, vertexStride, indexBuffer.get(), verticesPerInstance, indicesPerInstance, instanceCount); @@ -312,7 +312,7 @@ const GrBuffer* AAStrokeRectOp::GetIndexBuffer(GrResourceProvider* resourceProvi // clang-format on GR_STATIC_ASSERT(SK_ARRAY_COUNT(gMiterIndices) == kMiterIndexCnt); GR_DEFINE_STATIC_UNIQUE_KEY(gMiterIndexBufferKey); - return resourceProvider->findOrCreateInstancedIndexBuffer( + return resourceProvider->findOrCreatePatternedIndexBuffer( gMiterIndices, kMiterIndexCnt, kNumMiterRectsInIndexBuffer, kMiterVertexCnt, gMiterIndexBufferKey); } else { @@ -377,7 +377,7 @@ const GrBuffer* AAStrokeRectOp::GetIndexBuffer(GrResourceProvider* resourceProvi GR_STATIC_ASSERT(SK_ARRAY_COUNT(gBevelIndices) == kBevelIndexCnt); GR_DEFINE_STATIC_UNIQUE_KEY(gBevelIndexBufferKey); - return resourceProvider->findOrCreateInstancedIndexBuffer( + return resourceProvider->findOrCreatePatternedIndexBuffer( gBevelIndices, kBevelIndexCnt, kNumBevelRectsInIndexBuffer, kBevelVertexCnt, gBevelIndexBufferKey); } diff --git a/src/gpu/ops/GrAtlasTextOp.cpp b/src/gpu/ops/GrAtlasTextOp.cpp index 64710e7d8d..5271d423d8 100644 --- a/src/gpu/ops/GrAtlasTextOp.cpp +++ b/src/gpu/ops/GrAtlasTextOp.cpp @@ -149,9 +149,14 @@ void GrAtlasTextOp::flush(GrLegacyMeshDrawOp::Target* target, FlushInfo* flushIn GrMesh mesh; int maxGlyphsPerDraw = static_cast<int>(flushInfo->fIndexBuffer->gpuMemorySize() / sizeof(uint16_t) / 6); - mesh.initInstanced(kTriangles_GrPrimitiveType, flushInfo->fVertexBuffer.get(), - flushInfo->fIndexBuffer.get(), flushInfo->fVertexOffset, kVerticesPerGlyph, - kIndicesPerGlyph, flushInfo->fGlyphsToFlush, maxGlyphsPerDraw); + mesh.fPrimitiveType = kTriangles_GrPrimitiveType; + mesh.fIndexBuffer.reset(flushInfo->fIndexBuffer.get()); + mesh.fIndexCount = kIndicesPerGlyph; + mesh.fVertexBuffer.reset(flushInfo->fVertexBuffer.get()); + mesh.fVertexCount = kVerticesPerGlyph; + mesh.fBaseVertex = flushInfo->fVertexOffset; + mesh.fPatternRepeatCount = flushInfo->fGlyphsToFlush; + mesh.fMaxPatternRepetitionsInIndexBuffer = maxGlyphsPerDraw; target->draw(flushInfo->fGeometryProcessor.get(), this->pipeline(), mesh); flushInfo->fVertexOffset += kVerticesPerGlyph * flushInfo->fGlyphsToFlush; flushInfo->fGlyphsToFlush = 0; diff --git a/src/gpu/ops/GrDefaultPathRenderer.cpp b/src/gpu/ops/GrDefaultPathRenderer.cpp index 762084cba8..b2baf2eaff 100644 --- a/src/gpu/ops/GrDefaultPathRenderer.cpp +++ b/src/gpu/ops/GrDefaultPathRenderer.cpp @@ -251,12 +251,15 @@ private: } GrMesh mesh; + mesh.fPrimitiveType = primitiveType; if (isIndexed) { - mesh.initIndexed(primitiveType, vertexBuffer, indexBuffer, firstVertex, firstIndex, - vertexOffset, indexOffset); - } else { - mesh.init(primitiveType, vertexBuffer, firstVertex, vertexOffset); + mesh.fIndexBuffer.reset(indexBuffer); + mesh.fIndexCount = indexOffset; + mesh.fBaseIndex = firstIndex; } + mesh.fVertexBuffer.reset(vertexBuffer); + mesh.fVertexCount = vertexOffset; + mesh.fBaseVertex = firstVertex; target->draw(gp.get(), this->pipeline(), mesh); // put back reserves diff --git a/src/gpu/ops/GrDrawVerticesOp.cpp b/src/gpu/ops/GrDrawVerticesOp.cpp index c67233c9ed..aa90db9afd 100644 --- a/src/gpu/ops/GrDrawVerticesOp.cpp +++ b/src/gpu/ops/GrDrawVerticesOp.cpp @@ -236,13 +236,15 @@ void GrDrawVerticesOp::onPrepareDraws(Target* target) const { } GrMesh mesh; + mesh.fPrimitiveType = this->primitiveType(); if (indices) { - mesh.initIndexed(this->primitiveType(), vertexBuffer, indexBuffer, firstVertex, firstIndex, - fVertexCount, fIndexCount); - - } else { - mesh.init(this->primitiveType(), vertexBuffer, firstVertex, fVertexCount); + mesh.fIndexBuffer.reset(indexBuffer); + mesh.fIndexCount = fIndexCount; + mesh.fBaseIndex = firstIndex; } + mesh.fVertexBuffer.reset(vertexBuffer); + mesh.fVertexCount = fVertexCount; + mesh.fBaseVertex = firstVertex; target->draw(gp.get(), this->pipeline(), mesh); } diff --git a/src/gpu/ops/GrLatticeOp.cpp b/src/gpu/ops/GrLatticeOp.cpp index 4b8f5e3c73..0ba0164302 100644 --- a/src/gpu/ops/GrLatticeOp.cpp +++ b/src/gpu/ops/GrLatticeOp.cpp @@ -86,7 +86,7 @@ private: } sk_sp<const GrBuffer> indexBuffer(target->resourceProvider()->refQuadIndexBuffer()); - InstancedHelper helper; + PatternHelper helper; void* vertices = helper.init(target, kTriangles_GrPrimitiveType, vertexStride, indexBuffer.get(), kVertsPerRect, kIndicesPerRect, numRects); if (!vertices || !indexBuffer) { diff --git a/src/gpu/ops/GrMSAAPathRenderer.cpp b/src/gpu/ops/GrMSAAPathRenderer.cpp index 8e320063e3..f4d14cdf71 100644 --- a/src/gpu/ops/GrMSAAPathRenderer.cpp +++ b/src/gpu/ops/GrMSAAPathRenderer.cpp @@ -413,14 +413,16 @@ private: SkASSERT(lineVertexStride == lineGP->getVertexStride()); GrMesh lineMeshes; + lineMeshes.fPrimitiveType = primitiveType; if (fIsIndexed) { - lineMeshes.initIndexed(primitiveType, lineVertexBuffer, lineIndexBuffer, - firstLineVertex, firstLineIndex, lineVertexOffset, - lineIndexOffset); - } else { - lineMeshes.init(primitiveType, lineVertexBuffer, firstLineVertex, - lineVertexOffset); + lineMeshes.fIndexBuffer.reset(lineIndexBuffer); + lineMeshes.fIndexCount = lineIndexOffset; + lineMeshes.fBaseIndex = firstLineIndex; } + lineMeshes.fVertexBuffer.reset(lineVertexBuffer); + lineMeshes.fVertexCount = lineVertexOffset; + lineMeshes.fBaseVertex = firstLineVertex; + target->draw(lineGP.get(), this->pipeline(), lineMeshes); } @@ -435,20 +437,20 @@ private: &firstQuadVertex); memcpy(quadVertices, quads.vertices, quadVertexStride * quadVertexOffset); GrMesh quadMeshes; + quadMeshes.fPrimitiveType = kTriangles_GrPrimitiveType; if (fIsIndexed) { const GrBuffer* quadIndexBuffer; - int firstQuadIndex; uint16_t* quadIndices = (uint16_t*) target->makeIndexSpace(quadIndexOffset, &quadIndexBuffer, - &firstQuadIndex); + &quadMeshes.fBaseIndex); + quadMeshes.fIndexBuffer.reset(quadIndexBuffer); + quadMeshes.fIndexCount = quadIndexOffset; memcpy(quadIndices, quads.indices, sizeof(uint16_t) * quadIndexOffset); - quadMeshes.initIndexed(kTriangles_GrPrimitiveType, quadVertexBuffer, - quadIndexBuffer, firstQuadVertex, firstQuadIndex, - quadVertexOffset, quadIndexOffset); - } else { - quadMeshes.init(kTriangles_GrPrimitiveType, quadVertexBuffer, firstQuadVertex, - quadVertexOffset); } + quadMeshes.fVertexBuffer.reset(quadVertexBuffer); + quadMeshes.fVertexCount = quadVertexOffset; + quadMeshes.fBaseVertex = firstQuadVertex; + target->draw(quadGP.get(), this->pipeline(), quadMeshes); } } diff --git a/src/gpu/ops/GrMeshDrawOp.cpp b/src/gpu/ops/GrMeshDrawOp.cpp index 378524541b..92571d6c70 100644 --- a/src/gpu/ops/GrMeshDrawOp.cpp +++ b/src/gpu/ops/GrMeshDrawOp.cpp @@ -17,17 +17,17 @@ void GrMeshDrawOp::onPrepare(GrOpFlushState* state) { this->onPrepareDraws(&target); } -void* GrMeshDrawOp::InstancedHelper::init(Target* target, GrPrimitiveType primType, +void* GrMeshDrawOp::PatternHelper::init(Target* target, GrPrimitiveType primType, size_t vertexStride, const GrBuffer* indexBuffer, - int verticesPerInstance, int indicesPerInstance, - int instancesToDraw) { + int verticesPerRepetition, int indicesPerRepetition, + int repeatCount) { SkASSERT(target); if (!indexBuffer) { return nullptr; } const GrBuffer* vertexBuffer; int firstVertex; - int vertexCount = verticesPerInstance * instancesToDraw; + int vertexCount = verticesPerRepetition * repeatCount; void* vertices = target->makeVertexSpace(vertexStride, vertexCount, &vertexBuffer, &firstVertex); if (!vertices) { @@ -36,16 +36,22 @@ void* GrMeshDrawOp::InstancedHelper::init(Target* target, GrPrimitiveType primTy } SkASSERT(vertexBuffer); size_t ibSize = indexBuffer->gpuMemorySize(); - int maxInstancesPerDraw = static_cast<int>(ibSize / (sizeof(uint16_t) * indicesPerInstance)); + int maxRepetitions = static_cast<int>(ibSize / (sizeof(uint16_t) * indicesPerRepetition)); - fMesh.initInstanced(primType, vertexBuffer, indexBuffer, firstVertex, verticesPerInstance, - indicesPerInstance, instancesToDraw, maxInstancesPerDraw); + fMesh.fPrimitiveType = primType; + fMesh.fIndexBuffer.reset(indexBuffer); + fMesh.fIndexCount = indicesPerRepetition; + fMesh.fBaseIndex = 0; + fMesh.fVertexBuffer.reset(vertexBuffer); + fMesh.fVertexCount = verticesPerRepetition; + fMesh.fBaseVertex = firstVertex; + fMesh.fPatternRepeatCount = repeatCount; + fMesh.fMaxPatternRepetitionsInIndexBuffer = maxRepetitions; return vertices; } -void GrMeshDrawOp::InstancedHelper::recordDraw(Target* target, const GrGeometryProcessor* gp, +void GrMeshDrawOp::PatternHelper::recordDraw(Target* target, const GrGeometryProcessor* gp, const GrPipeline* pipeline) { - SkASSERT(fMesh.instanceCount()); target->draw(gp, pipeline, fMesh); } diff --git a/src/gpu/ops/GrMeshDrawOp.h b/src/gpu/ops/GrMeshDrawOp.h index a4b172d357..92a4c1e89d 100644 --- a/src/gpu/ops/GrMeshDrawOp.h +++ b/src/gpu/ops/GrMeshDrawOp.h @@ -29,15 +29,15 @@ public: protected: GrMeshDrawOp(uint32_t classID); - /** Helper for rendering instances using an instanced index buffer. This class creates the space - for the vertices and flushes the draws to the GrMeshDrawOp::Target. */ - class InstancedHelper { + /** Helper for rendering repeating meshes using a patterned index buffer. This class creates the + space for the vertices and flushes the draws to the GrMeshDrawOp::Target. */ + class PatternHelper { public: - InstancedHelper() {} + PatternHelper() {} /** Returns the allocated storage for the vertices. The caller should populate the vertices before calling recordDraws(). */ void* init(Target*, GrPrimitiveType, size_t vertexStride, const GrBuffer*, - int verticesPerInstance, int indicesPerInstance, int instancesToDraw); + int verticesPerRepetition, int indicesPerRepetition, int repeatCount); /** Call after init() to issue draws to the GrMeshDrawOp::Target.*/ void recordDraw(Target*, const GrGeometryProcessor*, const GrPipeline*); @@ -50,7 +50,7 @@ protected: static const int kIndicesPerQuad = 6; /** A specialization of InstanceHelper for quad rendering. */ - class QuadHelper : private InstancedHelper { + class QuadHelper : private PatternHelper { public: QuadHelper() : INHERITED() {} /** Finds the cached quad index buffer and reserves vertex space. Returns nullptr on failure @@ -58,10 +58,10 @@ protected: calling recordDraws(). */ void* init(Target*, size_t vertexStride, int quadsToDraw); - using InstancedHelper::recordDraw; + using PatternHelper::recordDraw; private: - typedef InstancedHelper INHERITED; + typedef PatternHelper INHERITED; }; private: diff --git a/src/gpu/ops/GrNonAAFillRectOp.cpp b/src/gpu/ops/GrNonAAFillRectOp.cpp index 69bfe291e2..b9c20e146a 100644 --- a/src/gpu/ops/GrNonAAFillRectOp.cpp +++ b/src/gpu/ops/GrNonAAFillRectOp.cpp @@ -133,7 +133,7 @@ private: int instanceCount = fRects.count(); sk_sp<const GrBuffer> indexBuffer(target->resourceProvider()->refQuadIndexBuffer()); - InstancedHelper helper; + PatternHelper helper; void* vertices = helper.init(target, kTriangles_GrPrimitiveType, vertexStride, indexBuffer.get(), kVertsPerInstance, kIndicesPerInstance, instanceCount); diff --git a/src/gpu/ops/GrNonAAFillRectPerspectiveOp.cpp b/src/gpu/ops/GrNonAAFillRectPerspectiveOp.cpp index fef515421f..647f69e907 100644 --- a/src/gpu/ops/GrNonAAFillRectPerspectiveOp.cpp +++ b/src/gpu/ops/GrNonAAFillRectPerspectiveOp.cpp @@ -158,7 +158,7 @@ private: int instanceCount = fRects.count(); sk_sp<const GrBuffer> indexBuffer(target->resourceProvider()->refQuadIndexBuffer()); - InstancedHelper helper; + PatternHelper helper; void* vertices = helper.init(target, kTriangles_GrPrimitiveType, vertexStride, indexBuffer.get(), kVertsPerInstance, kIndicesPerInstance, instanceCount); diff --git a/src/gpu/ops/GrNonAAStrokeRectOp.cpp b/src/gpu/ops/GrNonAAStrokeRectOp.cpp index 69958c0d41..c40364dcb1 100644 --- a/src/gpu/ops/GrNonAAStrokeRectOp.cpp +++ b/src/gpu/ops/GrNonAAStrokeRectOp.cpp @@ -157,7 +157,10 @@ private: } GrMesh mesh; - mesh.init(primType, vertexBuffer, firstVertex, vertexCount); + mesh.fPrimitiveType = primType; + mesh.fVertexBuffer.reset(vertexBuffer); + mesh.fVertexCount = vertexCount; + mesh.fBaseVertex = firstVertex; target->draw(gp.get(), this->pipeline(), mesh); } diff --git a/src/gpu/ops/GrOvalOpFactory.cpp b/src/gpu/ops/GrOvalOpFactory.cpp index 71f8bb089f..4d44b13949 100644 --- a/src/gpu/ops/GrOvalOpFactory.cpp +++ b/src/gpu/ops/GrOvalOpFactory.cpp @@ -1097,8 +1097,13 @@ private: } GrMesh mesh; - mesh.initIndexed(kTriangles_GrPrimitiveType, vertexBuffer, indexBuffer, firstVertex, - firstIndex, fVertCount, fIndexCount); + mesh.fPrimitiveType = kTriangles_GrPrimitiveType; + mesh.fIndexBuffer.reset(indexBuffer); + mesh.fIndexCount = fIndexCount; + mesh.fBaseIndex = firstIndex; + mesh.fVertexBuffer.reset(vertexBuffer); + mesh.fVertexCount = fVertCount; + mesh.fBaseVertex = firstVertex; target->draw(gp.get(), this->pipeline(), mesh); } @@ -1998,8 +2003,13 @@ private: } GrMesh mesh; - mesh.initIndexed(kTriangles_GrPrimitiveType, vertexBuffer, indexBuffer, firstVertex, - firstIndex, fVertCount, fIndexCount); + mesh.fPrimitiveType = kTriangles_GrPrimitiveType; + mesh.fIndexBuffer.reset(indexBuffer); + mesh.fIndexCount = fIndexCount; + mesh.fBaseIndex = firstIndex; + mesh.fVertexBuffer.reset(vertexBuffer); + mesh.fVertexCount = fVertCount; + mesh.fBaseVertex = firstVertex; target->draw(gp.get(), this->pipeline(), mesh); } @@ -2055,11 +2065,11 @@ static const GrBuffer* ref_rrect_index_buffer(RRectType type, GR_DEFINE_STATIC_UNIQUE_KEY(gRRectOnlyIndexBufferKey); switch (type) { case kFill_RRectType: - return resourceProvider->findOrCreateInstancedIndexBuffer( + return resourceProvider->findOrCreatePatternedIndexBuffer( gStandardRRectIndices, kIndicesPerFillRRect, kNumRRectsInIndexBuffer, kVertsPerStandardRRect, gRRectOnlyIndexBufferKey); case kStroke_RRectType: - return resourceProvider->findOrCreateInstancedIndexBuffer( + return resourceProvider->findOrCreatePatternedIndexBuffer( gStandardRRectIndices, kIndicesPerStrokeRRect, kNumRRectsInIndexBuffer, kVertsPerStandardRRect, gStrokeRRectOnlyIndexBufferKey); default: @@ -2185,7 +2195,7 @@ private: sk_sp<const GrBuffer> indexBuffer(ref_rrect_index_buffer( fStroked ? kStroke_RRectType : kFill_RRectType, target->resourceProvider())); - InstancedHelper helper; + PatternHelper helper; EllipseVertex* verts = reinterpret_cast<EllipseVertex*>( helper.init(target, kTriangles_GrPrimitiveType, vertexStride, indexBuffer.get(), kVertsPerStandardRRect, indicesPerInstance, instanceCount)); diff --git a/src/gpu/ops/GrRegionOp.cpp b/src/gpu/ops/GrRegionOp.cpp index 91191f3a3f..7c90ae7ea6 100644 --- a/src/gpu/ops/GrRegionOp.cpp +++ b/src/gpu/ops/GrRegionOp.cpp @@ -103,7 +103,7 @@ private: size_t vertexStride = gp->getVertexStride(); sk_sp<const GrBuffer> indexBuffer(target->resourceProvider()->refQuadIndexBuffer()); - InstancedHelper helper; + PatternHelper helper; void* vertices = helper.init(target, kTriangles_GrPrimitiveType, vertexStride, indexBuffer.get(), kVertsPerInstance, kIndicesPerInstance, numRects); diff --git a/src/gpu/ops/GrShadowRRectOp.cpp b/src/gpu/ops/GrShadowRRectOp.cpp index 4c2c322378..7803449346 100644 --- a/src/gpu/ops/GrShadowRRectOp.cpp +++ b/src/gpu/ops/GrShadowRRectOp.cpp @@ -608,8 +608,13 @@ private: } GrMesh mesh; - mesh.initIndexed(kTriangles_GrPrimitiveType, vertexBuffer, indexBuffer, firstVertex, - firstIndex, fVertCount, fIndexCount); + mesh.fPrimitiveType = kTriangles_GrPrimitiveType; + mesh.fIndexBuffer.reset(indexBuffer); + mesh.fIndexCount = fIndexCount; + mesh.fBaseIndex = firstIndex; + mesh.fVertexBuffer.reset(vertexBuffer); + mesh.fVertexCount = fVertCount; + mesh.fBaseVertex = firstVertex; target->draw(gp.get(), this->pipeline(), mesh); } diff --git a/src/gpu/ops/GrSmallPathRenderer.cpp b/src/gpu/ops/GrSmallPathRenderer.cpp index 0986a09141..53de77905c 100644 --- a/src/gpu/ops/GrSmallPathRenderer.cpp +++ b/src/gpu/ops/GrSmallPathRenderer.cpp @@ -682,9 +682,14 @@ private: GrMesh mesh; int maxInstancesPerDraw = static_cast<int>(flushInfo->fIndexBuffer->gpuMemorySize() / sizeof(uint16_t) / 6); - mesh.initInstanced(kTriangles_GrPrimitiveType, flushInfo->fVertexBuffer.get(), - flushInfo->fIndexBuffer.get(), flushInfo->fVertexOffset, kVerticesPerQuad, - kIndicesPerQuad, flushInfo->fInstancesToFlush, maxInstancesPerDraw); + mesh.fPrimitiveType = kTriangles_GrPrimitiveType; + mesh.fIndexBuffer.reset(flushInfo->fIndexBuffer.get()); + mesh.fIndexCount = kIndicesPerQuad; + mesh.fVertexBuffer.reset(flushInfo->fVertexBuffer.get()); + mesh.fVertexCount = kVerticesPerQuad; + mesh.fBaseVertex = flushInfo->fVertexOffset; + mesh.fPatternRepeatCount = flushInfo->fInstancesToFlush; + mesh.fMaxPatternRepetitionsInIndexBuffer = maxInstancesPerDraw; target->draw(flushInfo->fGeometryProcessor.get(), this->pipeline(), mesh); flushInfo->fVertexOffset += kVerticesPerQuad * flushInfo->fInstancesToFlush; flushInfo->fInstancesToFlush = 0; diff --git a/src/gpu/ops/GrTessellatingPathRenderer.cpp b/src/gpu/ops/GrTessellatingPathRenderer.cpp index 059d8314c4..96c91247d5 100644 --- a/src/gpu/ops/GrTessellatingPathRenderer.cpp +++ b/src/gpu/ops/GrTessellatingPathRenderer.cpp @@ -316,7 +316,10 @@ private: GrPrimitiveType primitiveType = TESSELLATOR_WIREFRAME ? kLines_GrPrimitiveType : kTriangles_GrPrimitiveType; GrMesh mesh; - mesh.init(primitiveType, vb, firstVertex, count); + mesh.fPrimitiveType = primitiveType; + mesh.fVertexBuffer.reset(vb); + mesh.fVertexCount = count; + mesh.fBaseVertex = firstVertex; target->draw(gp, this->pipeline(), mesh); } |