aboutsummaryrefslogtreecommitdiffhomepage
path: root/src/gpu/ops
diff options
context:
space:
mode:
Diffstat (limited to 'src/gpu/ops')
-rw-r--r--src/gpu/ops/GrAAConvexPathRenderer.cpp34
-rw-r--r--src/gpu/ops/GrAAFillRectOp.cpp4
-rw-r--r--src/gpu/ops/GrAAHairLinePathRenderer.cpp37
-rw-r--r--src/gpu/ops/GrAALinearizingConvexPathRenderer.cpp17
-rw-r--r--src/gpu/ops/GrAAStrokeRectOp.cpp6
-rw-r--r--src/gpu/ops/GrAtlasTextOp.cpp11
-rw-r--r--src/gpu/ops/GrDefaultPathRenderer.cpp11
-rw-r--r--src/gpu/ops/GrDrawVerticesOp.cpp12
-rw-r--r--src/gpu/ops/GrLatticeOp.cpp2
-rw-r--r--src/gpu/ops/GrMSAAPathRenderer.cpp30
-rw-r--r--src/gpu/ops/GrMeshDrawOp.cpp24
-rw-r--r--src/gpu/ops/GrMeshDrawOp.h16
-rw-r--r--src/gpu/ops/GrNonAAFillRectOp.cpp2
-rw-r--r--src/gpu/ops/GrNonAAFillRectPerspectiveOp.cpp2
-rw-r--r--src/gpu/ops/GrNonAAStrokeRectOp.cpp5
-rw-r--r--src/gpu/ops/GrOvalOpFactory.cpp24
-rw-r--r--src/gpu/ops/GrRegionOp.cpp2
-rw-r--r--src/gpu/ops/GrShadowRRectOp.cpp9
-rw-r--r--src/gpu/ops/GrSmallPathRenderer.cpp11
-rw-r--r--src/gpu/ops/GrTessellatingPathRenderer.cpp5
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);
}