| Index: src/gpu/GrOvalRenderer.cpp
|
| diff --git a/src/gpu/GrOvalRenderer.cpp b/src/gpu/GrOvalRenderer.cpp
|
| index 8723d70a58ba30944b1d036ecdb557f0c797db5a..38efefa8570071157bbcb72a763ff3c7f5e9fa01 100644
|
| --- a/src/gpu/GrOvalRenderer.cpp
|
| +++ b/src/gpu/GrOvalRenderer.cpp
|
| @@ -13,10 +13,10 @@
|
| #include "GrBufferAllocPool.h"
|
| #include "GrDrawTarget.h"
|
| #include "GrGeometryProcessor.h"
|
| -#include "GrGpu.h"
|
| #include "GrInvariantOutput.h"
|
| #include "GrPipelineBuilder.h"
|
| #include "GrProcessor.h"
|
| +#include "GrResourceProvider.h"
|
| #include "GrVertexBuffer.h"
|
| #include "SkRRect.h"
|
| #include "SkStrokeRec.h"
|
| @@ -646,11 +646,6 @@ GrGeometryProcessor* DIEllipseEdgeEffect::TestCreate(SkRandom* random,
|
|
|
| ///////////////////////////////////////////////////////////////////////////////
|
|
|
| -void GrOvalRenderer::reset() {
|
| - SkSafeSetNull(fRRectIndexBuffer);
|
| - SkSafeSetNull(fStrokeRRectIndexBuffer);
|
| -}
|
| -
|
| bool GrOvalRenderer::drawOval(GrDrawTarget* target,
|
| GrPipelineBuilder* pipelineBuilder,
|
| GrColor color,
|
| @@ -659,8 +654,7 @@ bool GrOvalRenderer::drawOval(GrDrawTarget* target,
|
| const SkRect& oval,
|
| const SkStrokeRec& stroke)
|
| {
|
| - bool useCoverageAA = useAA &&
|
| - !pipelineBuilder->getRenderTarget()->isMultisampled();
|
| + bool useCoverageAA = useAA && !pipelineBuilder->getRenderTarget()->isMultisampled();
|
|
|
| if (!useCoverageAA) {
|
| return false;
|
| @@ -697,9 +691,7 @@ public:
|
| SkRect fDevBounds;
|
| };
|
|
|
| - static GrBatch* Create(const Geometry& geometry) {
|
| - return SkNEW_ARGS(CircleBatch, (geometry));
|
| - }
|
| + static GrBatch* Create(const Geometry& geometry) { return SkNEW_ARGS(CircleBatch, (geometry)); }
|
|
|
| const char* name() const override { return "CircleBatch"; }
|
|
|
| @@ -756,6 +748,8 @@ public:
|
| size_t vertexStride = gp->getVertexStride();
|
| SkASSERT(vertexStride == sizeof(CircleVertex));
|
|
|
| + SkAutoTUnref<const GrIndexBuffer> indexBuffer(
|
| + batchTarget->resourceProvider()->refQuadIndexBuffer());
|
| const GrVertexBuffer* vertexBuffer;
|
| int firstVertex;
|
|
|
| @@ -764,7 +758,7 @@ public:
|
| &vertexBuffer,
|
| &firstVertex);
|
|
|
| - if (!vertices || !batchTarget->quadIndexBuffer()) {
|
| + if (!vertices || !indexBuffer) {
|
| SkDebugf("Could not allocate buffers\n");
|
| return;
|
| }
|
| @@ -804,8 +798,6 @@ public:
|
| verts += kVertsPerCircle;
|
| }
|
|
|
| - const GrIndexBuffer* quadIndexBuffer = batchTarget->quadIndexBuffer();
|
| -
|
| GrDrawTarget::DrawInfo drawInfo;
|
| drawInfo.setPrimitiveType(kTriangles_GrPrimitiveType);
|
| drawInfo.setStartVertex(0);
|
| @@ -814,9 +806,9 @@ public:
|
| drawInfo.setIndicesPerInstance(kIndicesPerCircle);
|
| drawInfo.adjustStartVertex(firstVertex);
|
| drawInfo.setVertexBuffer(vertexBuffer);
|
| - drawInfo.setIndexBuffer(quadIndexBuffer);
|
| + drawInfo.setIndexBuffer(indexBuffer);
|
|
|
| - int maxInstancesPerDraw = quadIndexBuffer->maxQuads();
|
| + int maxInstancesPerDraw = indexBuffer->maxQuads();
|
|
|
| while (instanceCount) {
|
| drawInfo.setInstanceCount(SkTMin(instanceCount, maxInstancesPerDraw));
|
| @@ -1022,6 +1014,8 @@ public:
|
| SkASSERT(vertexStride == sizeof(EllipseVertex));
|
|
|
| const GrVertexBuffer* vertexBuffer;
|
| + SkAutoTUnref<const GrIndexBuffer> indexBuffer(
|
| + batchTarget->resourceProvider()->refQuadIndexBuffer());
|
| int firstVertex;
|
|
|
| void *vertices = batchTarget->vertexPool()->makeSpace(vertexStride,
|
| @@ -1029,7 +1023,7 @@ public:
|
| &vertexBuffer,
|
| &firstVertex);
|
|
|
| - if (!vertices || !batchTarget->quadIndexBuffer()) {
|
| + if (!vertices || !indexBuffer) {
|
| SkDebugf("Could not allocate buffers\n");
|
| return;
|
| }
|
| @@ -1074,8 +1068,6 @@ public:
|
| verts += kVertsPerEllipse;
|
| }
|
|
|
| - const GrIndexBuffer* quadIndexBuffer = batchTarget->quadIndexBuffer();
|
| -
|
| GrDrawTarget::DrawInfo drawInfo;
|
| drawInfo.setPrimitiveType(kTriangles_GrPrimitiveType);
|
| drawInfo.setStartVertex(0);
|
| @@ -1084,9 +1076,9 @@ public:
|
| drawInfo.setIndicesPerInstance(kIndicesPerEllipse);
|
| drawInfo.adjustStartVertex(firstVertex);
|
| drawInfo.setVertexBuffer(vertexBuffer);
|
| - drawInfo.setIndexBuffer(quadIndexBuffer);
|
| + drawInfo.setIndexBuffer(indexBuffer);
|
|
|
| - int maxInstancesPerDraw = quadIndexBuffer->maxQuads();
|
| + int maxInstancesPerDraw = indexBuffer->maxQuads();
|
|
|
| while (instanceCount) {
|
| drawInfo.setInstanceCount(SkTMin(instanceCount, maxInstancesPerDraw));
|
| @@ -1325,20 +1317,21 @@ 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 || !batchTarget->quadIndexBuffer()) {
|
| + if (!vertices || !indexBuffer) {
|
| SkDebugf("Could not allocate buffers\n");
|
| return;
|
| }
|
| @@ -1379,8 +1372,6 @@ public:
|
| verts += kVertsPerEllipse;
|
| }
|
|
|
| - const GrIndexBuffer* quadIndexBuffer = batchTarget->quadIndexBuffer();
|
| -
|
| GrDrawTarget::DrawInfo drawInfo;
|
| drawInfo.setPrimitiveType(kTriangles_GrPrimitiveType);
|
| drawInfo.setStartVertex(0);
|
| @@ -1389,9 +1380,9 @@ public:
|
| drawInfo.setIndicesPerInstance(kIndicesPerEllipse);
|
| drawInfo.adjustStartVertex(firstVertex);
|
| drawInfo.setVertexBuffer(vertexBuffer);
|
| - drawInfo.setIndexBuffer(quadIndexBuffer);
|
| + drawInfo.setIndexBuffer(indexBuffer);
|
|
|
| - int maxInstancesPerDraw = quadIndexBuffer->maxQuads();
|
| + int maxInstancesPerDraw = indexBuffer->maxQuads();
|
|
|
| while (instanceCount) {
|
| drawInfo.setInstanceCount(SkTMin(instanceCount, maxInstancesPerDraw));
|
| @@ -1579,6 +1570,24 @@ static const int kIndicesPerRRect = SK_ARRAY_COUNT(gRRectIndices);
|
| static const int kVertsPerRRect = 16;
|
| static const int kNumRRectsInIndexBuffer = 256;
|
|
|
| +GR_DECLARE_STATIC_UNIQUE_KEY(gStrokeRRectOnlyIndexBufferKey);
|
| +GR_DECLARE_STATIC_UNIQUE_KEY(gRRectOnlyIndexBufferKey);
|
| +static const GrIndexBuffer* ref_rrect_index_buffer(bool strokeOnly,
|
| + GrResourceProvider* resourceProvider) {
|
| + GR_DEFINE_STATIC_UNIQUE_KEY(gStrokeRRectOnlyIndexBufferKey);
|
| + GR_DEFINE_STATIC_UNIQUE_KEY(gRRectOnlyIndexBufferKey);
|
| + if (strokeOnly) {
|
| + return resourceProvider->refOrCreateInstancedIndexBuffer(
|
| + gRRectIndices, kIndicesPerStrokeRRect, kNumRRectsInIndexBuffer, kVertsPerRRect,
|
| + gStrokeRRectOnlyIndexBufferKey);
|
| + } else {
|
| + return resourceProvider->refOrCreateInstancedIndexBuffer(
|
| + gRRectIndices, kIndicesPerRRect, kNumRRectsInIndexBuffer, kVertsPerRRect,
|
| + gRRectOnlyIndexBufferKey);
|
| +
|
| + }
|
| +}
|
| +
|
| bool GrOvalRenderer::drawDRRect(GrDrawTarget* target,
|
| GrPipelineBuilder* pipelineBuilder,
|
| GrColor color,
|
| @@ -1657,8 +1666,8 @@ public:
|
| SkRect fDevBounds;
|
| };
|
|
|
| - static GrBatch* Create(const Geometry& geometry, const GrIndexBuffer* indexBuffer) {
|
| - return SkNEW_ARGS(RRectCircleRendererBatch, (geometry, indexBuffer));
|
| + static GrBatch* Create(const Geometry& geometry) {
|
| + return SkNEW_ARGS(RRectCircleRendererBatch, (geometry));
|
| }
|
|
|
| const char* name() const override { return "RRectCircleBatch"; }
|
| @@ -1718,6 +1727,8 @@ public:
|
| SkASSERT(vertexStride == sizeof(CircleVertex));
|
|
|
| const GrVertexBuffer* vertexBuffer;
|
| + SkAutoTUnref<const GrIndexBuffer> indexBuffer(
|
| + ref_rrect_index_buffer(this->stroke(), batchTarget->resourceProvider()));
|
| int firstVertex;
|
|
|
| void *vertices = batchTarget->vertexPool()->makeSpace(vertexStride,
|
| @@ -1725,7 +1736,7 @@ public:
|
| &vertexBuffer,
|
| &firstVertex);
|
|
|
| - if (!vertices) {
|
| + if (!vertices || !indexBuffer) {
|
| SkDebugf("Could not allocate vertices\n");
|
| return;
|
| }
|
| @@ -1780,7 +1791,6 @@ public:
|
| int indexCnt = this->stroke() ? SK_ARRAY_COUNT(gRRectIndices) - 6 :
|
| SK_ARRAY_COUNT(gRRectIndices);
|
|
|
| -
|
| GrDrawTarget::DrawInfo drawInfo;
|
| drawInfo.setPrimitiveType(kTriangles_GrPrimitiveType);
|
| drawInfo.setStartVertex(0);
|
| @@ -1789,7 +1799,7 @@ public:
|
| drawInfo.setIndicesPerInstance(indexCnt);
|
| drawInfo.adjustStartVertex(firstVertex);
|
| drawInfo.setVertexBuffer(vertexBuffer);
|
| - drawInfo.setIndexBuffer(fIndexBuffer);
|
| + drawInfo.setIndexBuffer(indexBuffer);
|
|
|
| int maxInstancesPerDraw = kNumRRectsInIndexBuffer;
|
|
|
| @@ -1808,8 +1818,7 @@ public:
|
| SkSTArray<1, Geometry, true>* geoData() { return &fGeoData; }
|
|
|
| private:
|
| - RRectCircleRendererBatch(const Geometry& geometry, const GrIndexBuffer* indexBuffer)
|
| - : fIndexBuffer(indexBuffer) {
|
| + RRectCircleRendererBatch(const Geometry& geometry) {
|
| this->initClassID<RRectCircleRendererBatch>();
|
| fGeoData.push_back(geometry);
|
|
|
| @@ -1853,7 +1862,6 @@ private:
|
|
|
| BatchTracker fBatch;
|
| SkSTArray<1, Geometry, true> fGeoData;
|
| - const GrIndexBuffer* fIndexBuffer;
|
| };
|
|
|
| class RRectEllipseRendererBatch : public GrBatch {
|
| @@ -1869,8 +1877,8 @@ public:
|
| SkRect fDevBounds;
|
| };
|
|
|
| - static GrBatch* Create(const Geometry& geometry, const GrIndexBuffer* indexBuffer) {
|
| - return SkNEW_ARGS(RRectEllipseRendererBatch, (geometry, indexBuffer));
|
| + static GrBatch* Create(const Geometry& geometry) {
|
| + return SkNEW_ARGS(RRectEllipseRendererBatch, (geometry));
|
| }
|
|
|
| const char* name() const override { return "RRectEllipseRendererBatch"; }
|
| @@ -1930,6 +1938,8 @@ public:
|
| SkASSERT(vertexStride == sizeof(EllipseVertex));
|
|
|
| const GrVertexBuffer* vertexBuffer;
|
| + SkAutoTUnref<const GrIndexBuffer> indexBuffer(
|
| + ref_rrect_index_buffer(this->stroke(), batchTarget->resourceProvider()));
|
| int firstVertex;
|
|
|
| void *vertices = batchTarget->vertexPool()->makeSpace(vertexStride,
|
| @@ -1937,7 +1947,7 @@ public:
|
| &vertexBuffer,
|
| &firstVertex);
|
|
|
| - if (!vertices) {
|
| + if (!vertices || !indexBuffer) {
|
| SkDebugf("Could not allocate vertices\n");
|
| return;
|
| }
|
| @@ -2011,7 +2021,7 @@ public:
|
| drawInfo.setIndicesPerInstance(indexCnt);
|
| drawInfo.adjustStartVertex(firstVertex);
|
| drawInfo.setVertexBuffer(vertexBuffer);
|
| - drawInfo.setIndexBuffer(fIndexBuffer);
|
| + drawInfo.setIndexBuffer(indexBuffer);
|
|
|
| int maxInstancesPerDraw = kNumRRectsInIndexBuffer;
|
|
|
| @@ -2030,8 +2040,7 @@ public:
|
| SkSTArray<1, Geometry, true>* geoData() { return &fGeoData; }
|
|
|
| private:
|
| - RRectEllipseRendererBatch(const Geometry& geometry, const GrIndexBuffer* indexBuffer)
|
| - : fIndexBuffer(indexBuffer) {
|
| + RRectEllipseRendererBatch(const Geometry& geometry) {
|
| this->initClassID<RRectEllipseRendererBatch>();
|
| fGeoData.push_back(geometry);
|
|
|
| @@ -2075,40 +2084,13 @@ private:
|
|
|
| BatchTracker fBatch;
|
| SkSTArray<1, Geometry, true> fGeoData;
|
| - const GrIndexBuffer* fIndexBuffer;
|
| };
|
|
|
| -static GrIndexBuffer* create_rrect_indexbuffer(GrIndexBuffer** strokeRRectIndexBuffer,
|
| - GrIndexBuffer** rrectIndexBuffer,
|
| - bool isStrokeOnly,
|
| - GrGpu* gpu) {
|
| - if (isStrokeOnly) {
|
| - if (NULL == *strokeRRectIndexBuffer) {
|
| - *strokeRRectIndexBuffer = gpu->createInstancedIndexBuffer(gRRectIndices,
|
| - kIndicesPerStrokeRRect,
|
| - kNumRRectsInIndexBuffer,
|
| - kVertsPerRRect);
|
| - }
|
| - return *strokeRRectIndexBuffer;
|
| - } else {
|
| - if (NULL == *rrectIndexBuffer) {
|
| - *rrectIndexBuffer = gpu->createInstancedIndexBuffer(gRRectIndices,
|
| - kIndicesPerRRect,
|
| - kNumRRectsInIndexBuffer,
|
| - kVertsPerRRect);
|
| - }
|
| - return *rrectIndexBuffer;
|
| - }
|
| -}
|
| -
|
| static GrBatch* create_rrect_batch(GrColor color,
|
| const SkMatrix& viewMatrix,
|
| const SkRRect& rrect,
|
| const SkStrokeRec& stroke,
|
| - SkRect* bounds,
|
| - GrIndexBuffer** strokeRRectIndexBuffer,
|
| - GrIndexBuffer** rrectIndexBuffer,
|
| - GrGpu* gpu) {
|
| + SkRect* bounds) {
|
| SkASSERT(viewMatrix.rectStaysRect());
|
| SkASSERT(rrect.isSimple());
|
| SkASSERT(!rrect.isOval());
|
| @@ -2159,15 +2141,6 @@ static GrBatch* create_rrect_batch(GrColor color,
|
| return NULL;
|
| }
|
|
|
| - GrIndexBuffer* indexBuffer = create_rrect_indexbuffer(strokeRRectIndexBuffer,
|
| - rrectIndexBuffer,
|
| - isStrokeOnly,
|
| - gpu);
|
| - if (NULL == indexBuffer) {
|
| - SkDebugf("Failed to create index buffer!\n");
|
| - return NULL;
|
| - }
|
| -
|
| // if the corners are circles, use the circle renderer
|
| if ((!hasStroke || scaledStroke.fX == scaledStroke.fY) && xRadius == yRadius) {
|
| SkScalar innerRadius = 0.0f;
|
| @@ -2208,8 +2181,7 @@ static GrBatch* create_rrect_batch(GrColor color,
|
| geometry.fStroke = isStrokeOnly;
|
| geometry.fDevBounds = *bounds;
|
|
|
| - return RRectCircleRendererBatch::Create(geometry, indexBuffer);
|
| -
|
| + return RRectCircleRendererBatch::Create(geometry);
|
| // otherwise we use the ellipse renderer
|
| } else {
|
| SkScalar innerXRadius = 0.0f;
|
| @@ -2259,7 +2231,7 @@ static GrBatch* create_rrect_batch(GrColor color,
|
| geometry.fStroke = isStrokeOnly;
|
| geometry.fDevBounds = *bounds;
|
|
|
| - return RRectEllipseRendererBatch::Create(geometry, indexBuffer);
|
| + return RRectEllipseRendererBatch::Create(geometry);
|
| }
|
| }
|
|
|
| @@ -2287,9 +2259,7 @@ bool GrOvalRenderer::drawRRect(GrDrawTarget* target,
|
| }
|
|
|
| SkRect bounds;
|
| - SkAutoTUnref<GrBatch> batch(create_rrect_batch(color, viewMatrix, rrect, stroke, &bounds,
|
| - &fStrokeRRectIndexBuffer, &fRRectIndexBuffer,
|
| - fGpu));
|
| + SkAutoTUnref<GrBatch> batch(create_rrect_batch(color, viewMatrix, rrect, stroke, &bounds));
|
| if (!batch) {
|
| return false;
|
| }
|
| @@ -2347,11 +2317,8 @@ BATCH_TEST_DEFINE(RRectBatch) {
|
| GrColor color = GrRandomColor(random);
|
| const SkRRect& rrect = GrTest::TestRRectSimple(random);
|
|
|
| - static GrIndexBuffer* gStrokeRRectIndexBuffer;
|
| - static GrIndexBuffer* gRRectIndexBuffer;
|
| SkRect bounds;
|
| - return create_rrect_batch(color, viewMatrix, rrect, random_strokerec(random), &bounds,
|
| - &gStrokeRRectIndexBuffer, &gRRectIndexBuffer, context->getGpu());
|
| + return create_rrect_batch(color, viewMatrix, rrect, random_strokerec(random), &bounds);
|
| }
|
|
|
| #endif
|
|
|