| Index: src/gpu/GrOvalRenderer.cpp
|
| diff --git a/src/gpu/GrOvalRenderer.cpp b/src/gpu/GrOvalRenderer.cpp
|
| index 38efefa8570071157bbcb72a763ff3c7f5e9fa01..2d7cc49181b279a7445f7cd610b689273bc0049b 100644
|
| --- a/src/gpu/GrOvalRenderer.cpp
|
| +++ b/src/gpu/GrOvalRenderer.cpp
|
| @@ -744,34 +744,22 @@ public:
|
| gp->initBatchTracker(batchTarget->currentBatchTracker(), init);
|
|
|
| int instanceCount = fGeoData.count();
|
| - int vertexCount = kVertsPerCircle * instanceCount;
|
| size_t vertexStride = gp->getVertexStride();
|
| SkASSERT(vertexStride == sizeof(CircleVertex));
|
| -
|
| - SkAutoTUnref<const GrIndexBuffer> indexBuffer(
|
| - batchTarget->resourceProvider()->refQuadIndexBuffer());
|
| - const GrVertexBuffer* vertexBuffer;
|
| - int firstVertex;
|
| -
|
| - void *vertices = batchTarget->vertexPool()->makeSpace(vertexStride,
|
| - vertexCount,
|
| - &vertexBuffer,
|
| - &firstVertex);
|
| -
|
| - if (!vertices || !indexBuffer) {
|
| - SkDebugf("Could not allocate buffers\n");
|
| + QuadHelper helper;
|
| + CircleVertex* verts = reinterpret_cast<CircleVertex*>(helper.init(batchTarget, vertexStride,
|
| + instanceCount));
|
| + if (!verts) {
|
| return;
|
| }
|
|
|
| - CircleVertex* verts = reinterpret_cast<CircleVertex*>(vertices);
|
| -
|
| for (int i = 0; i < instanceCount; i++) {
|
| - Geometry& args = fGeoData[i];
|
| + Geometry& geom = fGeoData[i];
|
|
|
| - SkScalar innerRadius = args.fInnerRadius;
|
| - SkScalar outerRadius = args.fOuterRadius;
|
| + SkScalar innerRadius = geom.fInnerRadius;
|
| + SkScalar outerRadius = geom.fOuterRadius;
|
|
|
| - const SkRect& bounds = args.fDevBounds;
|
| + const SkRect& bounds = geom.fDevBounds;
|
|
|
| // The inner radius in the vertex data must be specified in normalized space.
|
| innerRadius = innerRadius / outerRadius;
|
| @@ -795,31 +783,9 @@ public:
|
| verts[3].fOuterRadius = outerRadius;
|
| verts[3].fInnerRadius = innerRadius;
|
|
|
| - verts += kVertsPerCircle;
|
| - }
|
| -
|
| - GrDrawTarget::DrawInfo drawInfo;
|
| - drawInfo.setPrimitiveType(kTriangles_GrPrimitiveType);
|
| - drawInfo.setStartVertex(0);
|
| - drawInfo.setStartIndex(0);
|
| - drawInfo.setVerticesPerInstance(kVertsPerCircle);
|
| - drawInfo.setIndicesPerInstance(kIndicesPerCircle);
|
| - drawInfo.adjustStartVertex(firstVertex);
|
| - drawInfo.setVertexBuffer(vertexBuffer);
|
| - drawInfo.setIndexBuffer(indexBuffer);
|
| -
|
| - int maxInstancesPerDraw = indexBuffer->maxQuads();
|
| -
|
| - while (instanceCount) {
|
| - drawInfo.setInstanceCount(SkTMin(instanceCount, maxInstancesPerDraw));
|
| - drawInfo.setVertexCount(drawInfo.instanceCount() * drawInfo.verticesPerInstance());
|
| - drawInfo.setIndexCount(drawInfo.instanceCount() * drawInfo.indicesPerInstance());
|
| -
|
| - batchTarget->draw(drawInfo);
|
| -
|
| - drawInfo.setStartVertex(drawInfo.startVertex() + drawInfo.vertexCount());
|
| - instanceCount -= drawInfo.instanceCount();
|
| + verts += kVerticesPerQuad;
|
| }
|
| + helper.issueDraws(batchTarget);
|
| }
|
|
|
| SkSTArray<1, Geometry, true>* geoData() { return &fGeoData; }
|
| @@ -867,9 +833,6 @@ private:
|
| bool fCoverageIgnored;
|
| };
|
|
|
| - static const int kVertsPerCircle = 4;
|
| - static const int kIndicesPerCircle = 6;
|
| -
|
| BatchTracker fBatch;
|
| SkSTArray<1, Geometry, true> fGeoData;
|
| };
|
| @@ -1009,40 +972,28 @@ public:
|
| gp->initBatchTracker(batchTarget->currentBatchTracker(), init);
|
|
|
| int instanceCount = fGeoData.count();
|
| - int vertexCount = kVertsPerEllipse * instanceCount;
|
| + QuadHelper helper;
|
| size_t vertexStride = gp->getVertexStride();
|
| SkASSERT(vertexStride == sizeof(EllipseVertex));
|
| -
|
| - const GrVertexBuffer* vertexBuffer;
|
| - SkAutoTUnref<const GrIndexBuffer> indexBuffer(
|
| - batchTarget->resourceProvider()->refQuadIndexBuffer());
|
| - int firstVertex;
|
| -
|
| - void *vertices = batchTarget->vertexPool()->makeSpace(vertexStride,
|
| - vertexCount,
|
| - &vertexBuffer,
|
| - &firstVertex);
|
| -
|
| - if (!vertices || !indexBuffer) {
|
| - SkDebugf("Could not allocate buffers\n");
|
| + EllipseVertex* verts = reinterpret_cast<EllipseVertex*>(
|
| + helper.init(batchTarget, vertexStride, instanceCount));
|
| + if (!verts) {
|
| return;
|
| }
|
|
|
| - EllipseVertex* verts = reinterpret_cast<EllipseVertex*>(vertices);
|
| -
|
| for (int i = 0; i < instanceCount; i++) {
|
| - Geometry& args = fGeoData[i];
|
| + Geometry& geom = fGeoData[i];
|
|
|
| - SkScalar xRadius = args.fXRadius;
|
| - SkScalar yRadius = args.fYRadius;
|
| + SkScalar xRadius = geom.fXRadius;
|
| + SkScalar yRadius = geom.fYRadius;
|
|
|
| // Compute the reciprocals of the radii here to save time in the shader
|
| SkScalar xRadRecip = SkScalarInvert(xRadius);
|
| SkScalar yRadRecip = SkScalarInvert(yRadius);
|
| - SkScalar xInnerRadRecip = SkScalarInvert(args.fInnerXRadius);
|
| - SkScalar yInnerRadRecip = SkScalarInvert(args.fInnerYRadius);
|
| + SkScalar xInnerRadRecip = SkScalarInvert(geom.fInnerXRadius);
|
| + SkScalar yInnerRadRecip = SkScalarInvert(geom.fInnerYRadius);
|
|
|
| - const SkRect& bounds = args.fDevBounds;
|
| + const SkRect& bounds = geom.fDevBounds;
|
|
|
| // The inner radius in the vertex data must be specified in normalized space.
|
| verts[0].fPos = SkPoint::Make(bounds.fLeft, bounds.fTop);
|
| @@ -1065,31 +1016,9 @@ public:
|
| verts[3].fOuterRadii = SkPoint::Make(xRadRecip, yRadRecip);
|
| verts[3].fInnerRadii = SkPoint::Make(xInnerRadRecip, yInnerRadRecip);
|
|
|
| - verts += kVertsPerEllipse;
|
| - }
|
| -
|
| - GrDrawTarget::DrawInfo drawInfo;
|
| - drawInfo.setPrimitiveType(kTriangles_GrPrimitiveType);
|
| - drawInfo.setStartVertex(0);
|
| - drawInfo.setStartIndex(0);
|
| - drawInfo.setVerticesPerInstance(kVertsPerEllipse);
|
| - drawInfo.setIndicesPerInstance(kIndicesPerEllipse);
|
| - drawInfo.adjustStartVertex(firstVertex);
|
| - drawInfo.setVertexBuffer(vertexBuffer);
|
| - drawInfo.setIndexBuffer(indexBuffer);
|
| -
|
| - int maxInstancesPerDraw = indexBuffer->maxQuads();
|
| -
|
| - while (instanceCount) {
|
| - drawInfo.setInstanceCount(SkTMin(instanceCount, maxInstancesPerDraw));
|
| - drawInfo.setVertexCount(drawInfo.instanceCount() * drawInfo.verticesPerInstance());
|
| - drawInfo.setIndexCount(drawInfo.instanceCount() * drawInfo.indicesPerInstance());
|
| -
|
| - batchTarget->draw(drawInfo);
|
| -
|
| - drawInfo.setStartVertex(drawInfo.startVertex() + drawInfo.vertexCount());
|
| - instanceCount -= drawInfo.instanceCount();
|
| + verts += kVerticesPerQuad;
|
| }
|
| + helper.issueDraws(batchTarget);
|
| }
|
|
|
| SkSTArray<1, Geometry, true>* geoData() { return &fGeoData; }
|
| @@ -1137,9 +1066,6 @@ private:
|
| bool fCoverageIgnored;
|
| };
|
|
|
| - static const int kVertsPerEllipse = 4;
|
| - static const int kIndicesPerEllipse = 6;
|
| -
|
| BatchTracker fBatch;
|
| SkSTArray<1, Geometry, true> fGeoData;
|
| };
|
| @@ -1317,41 +1243,30 @@ public:
|
| init.fUsesLocalCoords = this->usesLocalCoords();
|
| gp->initBatchTracker(batchTarget->currentBatchTracker(), init);
|
|
|
| - SkAutoTUnref<const GrIndexBuffer> indexBuffer(
|
| - batchTarget->resourceProvider()->refQuadIndexBuffer());
|
| -
|
| int instanceCount = fGeoData.count();
|
| - int vertexCount = kVertsPerEllipse * instanceCount;
|
| size_t vertexStride = gp->getVertexStride();
|
| SkASSERT(vertexStride == sizeof(DIEllipseVertex));
|
| - const GrVertexBuffer* vertexBuffer;
|
| - int firstVertex;
|
| - void *vertices = batchTarget->vertexPool()->makeSpace(vertexStride,
|
| - vertexCount,
|
| - &vertexBuffer,
|
| - &firstVertex);
|
| -
|
| - if (!vertices || !indexBuffer) {
|
| - SkDebugf("Could not allocate buffers\n");
|
| + QuadHelper helper;
|
| + DIEllipseVertex* verts = reinterpret_cast<DIEllipseVertex*>(
|
| + helper.init(batchTarget, vertexStride, instanceCount));
|
| + if (!verts) {
|
| return;
|
| }
|
|
|
| - DIEllipseVertex* verts = reinterpret_cast<DIEllipseVertex*>(vertices);
|
| -
|
| for (int i = 0; i < instanceCount; i++) {
|
| - Geometry& args = fGeoData[i];
|
| + Geometry& geom = fGeoData[i];
|
|
|
| - SkScalar xRadius = args.fXRadius;
|
| - SkScalar yRadius = args.fYRadius;
|
| + SkScalar xRadius = geom.fXRadius;
|
| + SkScalar yRadius = geom.fYRadius;
|
|
|
| - const SkRect& bounds = args.fBounds;
|
| + const SkRect& bounds = geom.fBounds;
|
|
|
| // This adjusts the "radius" to include the half-pixel border
|
| - SkScalar offsetDx = SkScalarDiv(args.fGeoDx, xRadius);
|
| - SkScalar offsetDy = SkScalarDiv(args.fGeoDy, yRadius);
|
| + SkScalar offsetDx = SkScalarDiv(geom.fGeoDx, xRadius);
|
| + SkScalar offsetDy = SkScalarDiv(geom.fGeoDy, yRadius);
|
|
|
| - SkScalar innerRatioX = SkScalarDiv(xRadius, args.fInnerXRadius);
|
| - SkScalar innerRatioY = SkScalarDiv(yRadius, args.fInnerYRadius);
|
| + SkScalar innerRatioX = SkScalarDiv(xRadius, geom.fInnerXRadius);
|
| + SkScalar innerRatioY = SkScalarDiv(yRadius, geom.fInnerYRadius);
|
|
|
| verts[0].fPos = SkPoint::Make(bounds.fLeft, bounds.fTop);
|
| verts[0].fOuterOffset = SkPoint::Make(-1.0f - offsetDx, -1.0f - offsetDy);
|
| @@ -1369,31 +1284,9 @@ public:
|
| verts[3].fOuterOffset = SkPoint::Make(1.0f + offsetDx, -1.0f - offsetDy);
|
| verts[3].fInnerOffset = SkPoint::Make(innerRatioX + offsetDx, -innerRatioY - offsetDy);
|
|
|
| - verts += kVertsPerEllipse;
|
| - }
|
| -
|
| - GrDrawTarget::DrawInfo drawInfo;
|
| - drawInfo.setPrimitiveType(kTriangles_GrPrimitiveType);
|
| - drawInfo.setStartVertex(0);
|
| - drawInfo.setStartIndex(0);
|
| - drawInfo.setVerticesPerInstance(kVertsPerEllipse);
|
| - drawInfo.setIndicesPerInstance(kIndicesPerEllipse);
|
| - drawInfo.adjustStartVertex(firstVertex);
|
| - drawInfo.setVertexBuffer(vertexBuffer);
|
| - drawInfo.setIndexBuffer(indexBuffer);
|
| -
|
| - int maxInstancesPerDraw = indexBuffer->maxQuads();
|
| -
|
| - while (instanceCount) {
|
| - drawInfo.setInstanceCount(SkTMin(instanceCount, maxInstancesPerDraw));
|
| - drawInfo.setVertexCount(drawInfo.instanceCount() * drawInfo.verticesPerInstance());
|
| - drawInfo.setIndexCount(drawInfo.instanceCount() * drawInfo.indicesPerInstance());
|
| -
|
| - batchTarget->draw(drawInfo);
|
| -
|
| - drawInfo.setStartVertex(drawInfo.startVertex() + drawInfo.vertexCount());
|
| - instanceCount -= drawInfo.instanceCount();
|
| + verts += kVerticesPerQuad;
|
| }
|
| + helper.issueDraws(batchTarget);
|
| }
|
|
|
| SkSTArray<1, Geometry, true>* geoData() { return &fGeoData; }
|
| @@ -1441,9 +1334,6 @@ private:
|
| bool fCoverageIgnored;
|
| };
|
|
|
| - static const int kVertsPerEllipse = 4;
|
| - static const int kIndicesPerEllipse = 6;
|
| -
|
| BatchTracker fBatch;
|
| SkSTArray<1, Geometry, true> fGeoData;
|
| };
|
| @@ -1722,27 +1612,23 @@ public:
|
| gp->initBatchTracker(batchTarget->currentBatchTracker(), init);
|
|
|
| int instanceCount = fGeoData.count();
|
| - int vertexCount = kVertsPerRRect * instanceCount;
|
| size_t vertexStride = gp->getVertexStride();
|
| SkASSERT(vertexStride == sizeof(CircleVertex));
|
|
|
| - const GrVertexBuffer* vertexBuffer;
|
| + // drop out the middle quad if we're stroked
|
| + int indicesPerInstance = this->stroke() ? kIndicesPerStrokeRRect : kIndicesPerRRect;
|
| SkAutoTUnref<const GrIndexBuffer> indexBuffer(
|
| ref_rrect_index_buffer(this->stroke(), batchTarget->resourceProvider()));
|
| - int firstVertex;
|
| -
|
| - void *vertices = batchTarget->vertexPool()->makeSpace(vertexStride,
|
| - vertexCount,
|
| - &vertexBuffer,
|
| - &firstVertex);
|
|
|
| - if (!vertices || !indexBuffer) {
|
| + InstancedHelper helper;
|
| + CircleVertex* verts = reinterpret_cast<CircleVertex*>(helper.init(batchTarget,
|
| + kTriangles_GrPrimitiveType, vertexStride, indexBuffer, kVertsPerRRect,
|
| + indicesPerInstance, instanceCount));
|
| + if (!verts || !indexBuffer) {
|
| SkDebugf("Could not allocate vertices\n");
|
| return;
|
| }
|
|
|
| - CircleVertex* verts = reinterpret_cast<CircleVertex*>(vertices);
|
| -
|
| for (int i = 0; i < instanceCount; i++) {
|
| Geometry& args = fGeoData[i];
|
|
|
| @@ -1787,32 +1673,7 @@ public:
|
| }
|
| }
|
|
|
| - // drop out the middle quad if we're stroked
|
| - int indexCnt = this->stroke() ? SK_ARRAY_COUNT(gRRectIndices) - 6 :
|
| - SK_ARRAY_COUNT(gRRectIndices);
|
| -
|
| - GrDrawTarget::DrawInfo drawInfo;
|
| - drawInfo.setPrimitiveType(kTriangles_GrPrimitiveType);
|
| - drawInfo.setStartVertex(0);
|
| - drawInfo.setStartIndex(0);
|
| - drawInfo.setVerticesPerInstance(kVertsPerRRect);
|
| - drawInfo.setIndicesPerInstance(indexCnt);
|
| - drawInfo.adjustStartVertex(firstVertex);
|
| - drawInfo.setVertexBuffer(vertexBuffer);
|
| - drawInfo.setIndexBuffer(indexBuffer);
|
| -
|
| - int maxInstancesPerDraw = kNumRRectsInIndexBuffer;
|
| -
|
| - while (instanceCount) {
|
| - drawInfo.setInstanceCount(SkTMin(instanceCount, maxInstancesPerDraw));
|
| - drawInfo.setVertexCount(drawInfo.instanceCount() * drawInfo.verticesPerInstance());
|
| - drawInfo.setIndexCount(drawInfo.instanceCount() * drawInfo.indicesPerInstance());
|
| -
|
| - batchTarget->draw(drawInfo);
|
| -
|
| - drawInfo.setStartVertex(drawInfo.startVertex() + drawInfo.vertexCount());
|
| - instanceCount -= drawInfo.instanceCount();
|
| - }
|
| + helper.issueDraws(batchTarget);
|
| }
|
|
|
| SkSTArray<1, Geometry, true>* geoData() { return &fGeoData; }
|
| @@ -1933,27 +1794,23 @@ public:
|
| gp->initBatchTracker(batchTarget->currentBatchTracker(), init);
|
|
|
| int instanceCount = fGeoData.count();
|
| - int vertexCount = kVertsPerRRect * instanceCount;
|
| size_t vertexStride = gp->getVertexStride();
|
| SkASSERT(vertexStride == sizeof(EllipseVertex));
|
|
|
| - const GrVertexBuffer* vertexBuffer;
|
| + // drop out the middle quad if we're stroked
|
| + int indicesPerInstance = this->stroke() ? kIndicesPerStrokeRRect : kIndicesPerRRect;
|
| SkAutoTUnref<const GrIndexBuffer> indexBuffer(
|
| ref_rrect_index_buffer(this->stroke(), batchTarget->resourceProvider()));
|
| - int firstVertex;
|
| -
|
| - void *vertices = batchTarget->vertexPool()->makeSpace(vertexStride,
|
| - vertexCount,
|
| - &vertexBuffer,
|
| - &firstVertex);
|
|
|
| - if (!vertices || !indexBuffer) {
|
| + InstancedHelper helper;
|
| + EllipseVertex* verts = reinterpret_cast<EllipseVertex*>(
|
| + helper.init(batchTarget, kTriangles_GrPrimitiveType, vertexStride, indexBuffer,
|
| + kVertsPerRRect, indicesPerInstance, instanceCount));
|
| + if (!verts || !indexBuffer) {
|
| SkDebugf("Could not allocate vertices\n");
|
| return;
|
| }
|
|
|
| - EllipseVertex* verts = reinterpret_cast<EllipseVertex*>(vertices);
|
| -
|
| for (int i = 0; i < instanceCount; i++) {
|
| Geometry& args = fGeoData[i];
|
|
|
| @@ -2008,33 +1865,7 @@ public:
|
| verts++;
|
| }
|
| }
|
| -
|
| - // drop out the middle quad if we're stroked
|
| - int indexCnt = this->stroke() ? SK_ARRAY_COUNT(gRRectIndices) - 6 :
|
| - SK_ARRAY_COUNT(gRRectIndices);
|
| -
|
| - GrDrawTarget::DrawInfo drawInfo;
|
| - drawInfo.setPrimitiveType(kTriangles_GrPrimitiveType);
|
| - drawInfo.setStartVertex(0);
|
| - drawInfo.setStartIndex(0);
|
| - drawInfo.setVerticesPerInstance(kVertsPerRRect);
|
| - drawInfo.setIndicesPerInstance(indexCnt);
|
| - drawInfo.adjustStartVertex(firstVertex);
|
| - drawInfo.setVertexBuffer(vertexBuffer);
|
| - drawInfo.setIndexBuffer(indexBuffer);
|
| -
|
| - int maxInstancesPerDraw = kNumRRectsInIndexBuffer;
|
| -
|
| - while (instanceCount) {
|
| - drawInfo.setInstanceCount(SkTMin(instanceCount, maxInstancesPerDraw));
|
| - drawInfo.setVertexCount(drawInfo.instanceCount() * drawInfo.verticesPerInstance());
|
| - drawInfo.setIndexCount(drawInfo.instanceCount() * drawInfo.indicesPerInstance());
|
| -
|
| - batchTarget->draw(drawInfo);
|
| -
|
| - drawInfo.setStartVertex(drawInfo.startVertex() + drawInfo.vertexCount());
|
| - instanceCount -= drawInfo.instanceCount();
|
| - }
|
| + helper.issueDraws(batchTarget);
|
| }
|
|
|
| SkSTArray<1, Geometry, true>* geoData() { return &fGeoData; }
|
|
|