From f28381c6866cad92af8ebe5b9d2db074613b1963 Mon Sep 17 00:00:00 2001 From: bsalomon Date: Mon, 4 May 2015 11:27:45 -0700 Subject: Start on simplifying generateGeometry() overrides Review URL: https://codereview.chromium.org/1122673002 --- src/gpu/GrAADistanceFieldPathRenderer.cpp | 122 +++++++++++++----------------- 1 file changed, 52 insertions(+), 70 deletions(-) (limited to 'src/gpu/GrAADistanceFieldPathRenderer.cpp') diff --git a/src/gpu/GrAADistanceFieldPathRenderer.cpp b/src/gpu/GrAADistanceFieldPathRenderer.cpp index ca8c52fa34..312b731fd7 100755 --- a/src/gpu/GrAADistanceFieldPathRenderer.cpp +++ b/src/gpu/GrAADistanceFieldPathRenderer.cpp @@ -13,9 +13,9 @@ #include "GrBufferAllocPool.h" #include "GrContext.h" #include "GrPipelineBuilder.h" +#include "GrResourceProvider.h" #include "GrSurfacePriv.h" #include "GrSWMaskHelper.h" -#include "GrResourceProvider.h" #include "GrTexturePriv.h" #include "GrVertexBuffer.h" #include "effects/GrDistanceFieldGeoProc.h" @@ -169,6 +169,13 @@ public: fBatch.fCoverageIgnored = init.fCoverageIgnored; } + struct FlushInfo { + SkAutoTUnref fVertexBuffer; + SkAutoTUnref fIndexBuffer; + int fVertexOffset; + int fInstancesToFlush; + }; + void generateGeometry(GrBatchTarget* batchTarget, const GrPipeline* pipeline) override { int instanceCount = fGeoData.count(); @@ -195,43 +202,25 @@ public: this->initDraw(batchTarget, dfProcessor, pipeline); - static const int kVertsPerQuad = 4; - static const int kIndicesPerQuad = 6; - - SkAutoTUnref indexBuffer( - batchTarget->resourceProvider()->refQuadIndexBuffer()); + FlushInfo flushInfo; // allocate vertices size_t vertexStride = dfProcessor->getVertexStride(); SkASSERT(vertexStride == 2 * sizeof(SkPoint)); - const GrVertexBuffer* vertexBuffer; - int vertexCount = kVertsPerQuad * instanceCount; - int firstVertex; + const GrVertexBuffer* vertexBuffer; void* vertices = batchTarget->vertexPool()->makeSpace(vertexStride, - vertexCount, + kVerticesPerQuad * instanceCount, &vertexBuffer, - &firstVertex); - - if (!vertices || !indexBuffer) { + &flushInfo.fVertexOffset); + flushInfo.fVertexBuffer.reset(SkRef(vertexBuffer)); + flushInfo.fIndexBuffer.reset(batchTarget->resourceProvider()->refQuadIndexBuffer()); + if (!vertices || !flushInfo.fIndexBuffer) { SkDebugf("Could not allocate vertices\n"); return; } - // We may have to flush while uploading path data to the atlas, so we set up the draw here - int maxInstancesPerDraw = indexBuffer->maxQuads(); - - GrDrawTarget::DrawInfo drawInfo; - drawInfo.setPrimitiveType(kTriangles_GrPrimitiveType); - drawInfo.setStartVertex(0); - drawInfo.setStartIndex(0); - drawInfo.setVerticesPerInstance(kVertsPerQuad); - drawInfo.setIndicesPerInstance(kIndicesPerQuad); - drawInfo.adjustStartVertex(firstVertex); - drawInfo.setVertexBuffer(vertexBuffer); - drawInfo.setIndexBuffer(indexBuffer); - - int instancesToFlush = 0; + flushInfo.fInstancesToFlush = 0; for (int i = 0; i < instanceCount; i++) { Geometry& args = fGeoData[i]; @@ -265,9 +254,7 @@ public: if (!this->addPathToAtlas(batchTarget, dfProcessor, pipeline, - &drawInfo, - &instancesToFlush, - maxInstancesPerDraw, + &flushInfo, atlas, args.fPathData, args.fPath, @@ -284,21 +271,21 @@ public: // Now set vertices intptr_t offset = reinterpret_cast(vertices); - offset += i * kVertsPerQuad * vertexStride; + offset += i * kVerticesPerQuad * vertexStride; SkPoint* positions = reinterpret_cast(offset); - this->drawPath(batchTarget, - atlas, - pipeline, - dfProcessor, - positions, - vertexStride, - this->viewMatrix(), - args.fPath, - args.fPathData); - instancesToFlush++; + this->writePathVertices(batchTarget, + atlas, + pipeline, + dfProcessor, + positions, + vertexStride, + this->viewMatrix(), + args.fPath, + args.fPathData); + flushInfo.fInstancesToFlush++; } - this->flush(batchTarget, &drawInfo, instancesToFlush, maxInstancesPerDraw); + this->flush(batchTarget, &flushInfo); } SkSTArray<1, Geometry, true>* geoData() { return &fGeoData; } @@ -325,9 +312,7 @@ private: bool addPathToAtlas(GrBatchTarget* batchTarget, const GrGeometryProcessor* dfProcessor, const GrPipeline* pipeline, - GrDrawTarget::DrawInfo* drawInfo, - int* instancesToFlush, - int maxInstancesPerDraw, + FlushInfo* flushInfo, GrBatchAtlas* atlas, PathData* pathData, const SkPath& path, @@ -429,9 +414,8 @@ private: bool success = atlas->addToAtlas(&id, batchTarget, width, height, dfStorage.get(), &atlasLocation); if (!success) { - this->flush(batchTarget, drawInfo, *instancesToFlush, maxInstancesPerDraw); + this->flush(batchTarget, flushInfo); this->initDraw(batchTarget, dfProcessor, pipeline); - *instancesToFlush = 0; SkDEBUGCODE(success =) atlas->addToAtlas(&id, batchTarget, width, height, dfStorage.get(), &atlasLocation); @@ -467,15 +451,15 @@ private: return true; } - void drawPath(GrBatchTarget* target, - GrBatchAtlas* atlas, - const GrPipeline* pipeline, - const GrGeometryProcessor* gp, - SkPoint* positions, - size_t vertexStride, - const SkMatrix& viewMatrix, - const SkPath& path, - const PathData* pathData) { + void writePathVertices(GrBatchTarget* target, + GrBatchAtlas* atlas, + const GrPipeline* pipeline, + const GrGeometryProcessor* gp, + SkPoint* positions, + size_t vertexStride, + const SkMatrix& viewMatrix, + const SkPath& path, + const PathData* pathData) { GrTexture* texture = atlas->getTexture(); SkScalar dx = pathData->fBounds.fLeft; @@ -522,20 +506,18 @@ private: dfProcessor->initBatchTracker(batchTarget->currentBatchTracker(), init); } - void flush(GrBatchTarget* batchTarget, - GrDrawTarget::DrawInfo* drawInfo, - int instanceCount, - int maxInstancesPerDraw) { - 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(); - } + void flush(GrBatchTarget* batchTarget, FlushInfo* flushInfo) { + GrDrawTarget::DrawInfo drawInfo; + int instancesToFlush = flushInfo->fInstancesToFlush; + int maxInstancesPerDraw = flushInfo->fIndexBuffer->maxQuads(); + drawInfo.initInstanced(kTriangles_GrPrimitiveType, flushInfo->fVertexBuffer, + flushInfo->fIndexBuffer, flushInfo->fVertexOffset, kVerticesPerQuad, + kIndicesPerQuad, &instancesToFlush, maxInstancesPerDraw); + do { + batchTarget->draw(drawInfo); + } while (drawInfo.nextInstances(&instancesToFlush, maxInstancesPerDraw)); + flushInfo->fVertexOffset += kVerticesPerQuad * flushInfo->fInstancesToFlush; + flushInfo->fInstancesToFlush = 0; } GrColor color() const { return fBatch.fColor; } -- cgit v1.2.3