diff options
Diffstat (limited to 'src/gpu/GrInOrderDrawBuffer.cpp')
-rw-r--r-- | src/gpu/GrInOrderDrawBuffer.cpp | 68 |
1 files changed, 51 insertions, 17 deletions
diff --git a/src/gpu/GrInOrderDrawBuffer.cpp b/src/gpu/GrInOrderDrawBuffer.cpp index a766af2c7e..bf78a90743 100644 --- a/src/gpu/GrInOrderDrawBuffer.cpp +++ b/src/gpu/GrInOrderDrawBuffer.cpp @@ -8,6 +8,7 @@ #include "GrInOrderDrawBuffer.h" #include "GrDefaultGeoProcFactory.h" +#include "GrResourceProvider.h" #include "GrTemplates.h" GrInOrderDrawBuffer::GrInOrderDrawBuffer(GrContext* context, @@ -131,49 +132,79 @@ public: init.fUsesLocalCoords = this->usesLocalCoords(); gp->initBatchTracker(batchTarget->currentBatchTracker(), init); - int instanceCount = fGeoData.count(); size_t vertexStride = gp->getVertexStride(); + SkASSERT(hasExplicitLocalCoords ? vertexStride == sizeof(GrDefaultGeoProcFactory::PositionColorLocalCoordAttr) : vertexStride == sizeof(GrDefaultGeoProcFactory::PositionColorAttr)); - QuadHelper helper; - void* vertices = helper.init(batchTarget, vertexStride, instanceCount); - if (!vertices) { + int instanceCount = fGeoData.count(); + SkAutoTUnref<const GrIndexBuffer> indexBuffer( + batchTarget->resourceProvider()->refQuadIndexBuffer()); + + int vertexCount = kVertsPerRect * instanceCount; + const GrVertexBuffer* vertexBuffer; + int firstVertex; + void* vertices = batchTarget->vertexPool()->makeSpace(vertexStride, + vertexCount, + &vertexBuffer, + &firstVertex); + + if (!vertices || !indexBuffer) { + SkDebugf("Could not allocate buffers\n"); return; } - for (int i = 0; i < instanceCount; i++) { - const Geometry& geom = fGeoData[i]; + const Geometry& args = fGeoData[i]; - intptr_t offset = GrTCast<intptr_t>(vertices) + kVerticesPerQuad * i * vertexStride; + intptr_t offset = GrTCast<intptr_t>(vertices) + kVertsPerRect * i * vertexStride; SkPoint* positions = GrTCast<SkPoint*>(offset); - positions->setRectFan(geom.fRect.fLeft, geom.fRect.fTop, - geom.fRect.fRight, geom.fRect.fBottom, vertexStride); - geom.fViewMatrix.mapPointsWithStride(positions, vertexStride, kVerticesPerQuad); + positions->setRectFan(args.fRect.fLeft, args.fRect.fTop, + args.fRect.fRight, args.fRect.fBottom, vertexStride); + args.fViewMatrix.mapPointsWithStride(positions, vertexStride, kVertsPerRect); - if (geom.fHasLocalRect) { + if (args.fHasLocalRect) { static const int kLocalOffset = sizeof(SkPoint) + sizeof(GrColor); SkPoint* coords = GrTCast<SkPoint*>(offset + kLocalOffset); - coords->setRectFan(geom.fLocalRect.fLeft, geom.fLocalRect.fTop, - geom.fLocalRect.fRight, geom.fLocalRect.fBottom, + coords->setRectFan(args.fLocalRect.fLeft, args.fLocalRect.fTop, + args.fLocalRect.fRight, args.fLocalRect.fBottom, vertexStride); - if (geom.fHasLocalMatrix) { - geom.fLocalMatrix.mapPointsWithStride(coords, vertexStride, kVerticesPerQuad); + if (args.fHasLocalMatrix) { + args.fLocalMatrix.mapPointsWithStride(coords, vertexStride, kVertsPerRect); } } static const int kColorOffset = sizeof(SkPoint); GrColor* vertColor = GrTCast<GrColor*>(offset + kColorOffset); for (int j = 0; j < 4; ++j) { - *vertColor = geom.fColor; + *vertColor = args.fColor; vertColor = (GrColor*) ((intptr_t) vertColor + vertexStride); } } - helper.issueDraws(batchTarget); + GrDrawTarget::DrawInfo drawInfo; + drawInfo.setPrimitiveType(kTriangles_GrPrimitiveType); + drawInfo.setStartVertex(0); + drawInfo.setStartIndex(0); + drawInfo.setVerticesPerInstance(kVertsPerRect); + drawInfo.setIndicesPerInstance(kIndicesPerRect); + 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(); + } } SkSTArray<1, Geometry, true>* geoData() { return &fGeoData; } @@ -232,6 +263,9 @@ private: bool fCoverageIgnored; }; + const static int kVertsPerRect = 4; + const static int kIndicesPerRect = 6; + BatchTracker fBatch; SkSTArray<1, Geometry, true> fGeoData; }; |