| Index: src/gpu/GrAARectRenderer.cpp
|
| diff --git a/src/gpu/GrAARectRenderer.cpp b/src/gpu/GrAARectRenderer.cpp
|
| index 778205f3bbe5f07b38909bc636c040dfd1dbd14f..d1c377aa532757ec1b392064026cca09787a067a 100644
|
| --- a/src/gpu/GrAARectRenderer.cpp
|
| +++ b/src/gpu/GrAARectRenderer.cpp
|
| @@ -13,10 +13,11 @@
|
| #include "GrContext.h"
|
| #include "GrDefaultGeoProcFactory.h"
|
| #include "GrGeometryProcessor.h"
|
| -#include "GrGpu.h"
|
| #include "GrInvariantOutput.h"
|
| -#include "GrVertexBuffer.h"
|
| +#include "GrResourceKey.h"
|
| +#include "GrResourceProvider.h"
|
| #include "GrTestUtils.h"
|
| +#include "GrVertexBuffer.h"
|
| #include "SkColorPriv.h"
|
| #include "gl/GrGLProcessor.h"
|
| #include "gl/GrGLGeometryProcessor.h"
|
| @@ -30,18 +31,6 @@ static void set_inset_fan(SkPoint* pts, size_t stride,
|
| r.fRight - dx, r.fBottom - dy, stride);
|
| }
|
|
|
| -static const uint16_t gFillAARectIdx[] = {
|
| - 0, 1, 5, 5, 4, 0,
|
| - 1, 2, 6, 6, 5, 1,
|
| - 2, 3, 7, 7, 6, 2,
|
| - 3, 0, 4, 4, 7, 3,
|
| - 4, 5, 6, 6, 7, 4,
|
| -};
|
| -
|
| -static const int kIndicesPerAAFillRect = SK_ARRAY_COUNT(gFillAARectIdx);
|
| -static const int kVertsPerAAFillRect = 8;
|
| -static const int kNumAAFillRectsInIndexBuffer = 256;
|
| -
|
| static const GrGeometryProcessor* create_fill_rect_gp(bool tweakAlphaForCoverage,
|
| const SkMatrix& localMatrix) {
|
| uint32_t flags = GrDefaultGeoProcFactory::kColor_GPType;
|
| @@ -57,6 +46,8 @@ static const GrGeometryProcessor* create_fill_rect_gp(bool tweakAlphaForCoverage
|
| return gp;
|
| }
|
|
|
| +GR_DECLARE_STATIC_UNIQUE_KEY(gAAFillRectIndexBufferKey);
|
| +
|
| class AAFillRectBatch : public GrBatch {
|
| public:
|
| struct Geometry {
|
| @@ -66,8 +57,8 @@ public:
|
| SkRect fDevRect;
|
| };
|
|
|
| - static GrBatch* Create(const Geometry& geometry, const GrIndexBuffer* indexBuffer) {
|
| - return SkNEW_ARGS(AAFillRectBatch, (geometry, indexBuffer));
|
| + static GrBatch* Create(const Geometry& geometry) {
|
| + return SkNEW_ARGS(AAFillRectBatch, (geometry));
|
| }
|
|
|
| const char* name() const override { return "AAFillRectBatch"; }
|
| @@ -121,24 +112,23 @@ public:
|
| init.fUsesLocalCoords = this->usesLocalCoords();
|
| gp->initBatchTracker(batchTarget->currentBatchTracker(), init);
|
|
|
| - size_t vertexStride = gp->getVertexStride();
|
| + SkAutoTUnref<const GrIndexBuffer> indexBuffer(this->getIndexBuffer(
|
| + batchTarget->resourceProvider()));
|
|
|
| + size_t vertexStride = gp->getVertexStride();
|
| SkASSERT(canTweakAlphaForCoverage ?
|
| vertexStride == sizeof(GrDefaultGeoProcFactory::PositionColorAttr) :
|
| vertexStride == sizeof(GrDefaultGeoProcFactory::PositionColorCoverageAttr));
|
| -
|
| int instanceCount = fGeoData.count();
|
| int vertexCount = kVertsPerAAFillRect * instanceCount;
|
| -
|
| const GrVertexBuffer* vertexBuffer;
|
| int firstVertex;
|
| -
|
| void* vertices = batchTarget->vertexPool()->makeSpace(vertexStride,
|
| vertexCount,
|
| &vertexBuffer,
|
| &firstVertex);
|
|
|
| - if (!vertices) {
|
| + if (!vertices || !indexBuffer) {
|
| SkDebugf("Could not allocate vertices\n");
|
| return;
|
| }
|
| @@ -163,7 +153,7 @@ public:
|
| drawInfo.setIndicesPerInstance(kIndicesPerAAFillRect);
|
| drawInfo.adjustStartVertex(firstVertex);
|
| drawInfo.setVertexBuffer(vertexBuffer);
|
| - drawInfo.setIndexBuffer(fIndexBuffer);
|
| + drawInfo.setIndexBuffer(indexBuffer);
|
|
|
| int maxInstancesPerDraw = kNumAAFillRectsInIndexBuffer;
|
|
|
| @@ -182,14 +172,33 @@ public:
|
| SkSTArray<1, Geometry, true>* geoData() { return &fGeoData; }
|
|
|
| private:
|
| - AAFillRectBatch(const Geometry& geometry, const GrIndexBuffer* indexBuffer)
|
| - : fIndexBuffer(indexBuffer) {
|
| + AAFillRectBatch(const Geometry& geometry) {
|
| this->initClassID<AAFillRectBatch>();
|
| fGeoData.push_back(geometry);
|
|
|
| this->setBounds(geometry.fDevRect);
|
| }
|
|
|
| + static const int kNumAAFillRectsInIndexBuffer = 256;
|
| + static const int kVertsPerAAFillRect = 8;
|
| + static const int kIndicesPerAAFillRect = 30;
|
| +
|
| + const GrIndexBuffer* getIndexBuffer(GrResourceProvider* resourceProvider) {
|
| + GR_DEFINE_STATIC_UNIQUE_KEY(gAAFillRectIndexBufferKey);
|
| +
|
| + static const uint16_t gFillAARectIdx[] = {
|
| + 0, 1, 5, 5, 4, 0,
|
| + 1, 2, 6, 6, 5, 1,
|
| + 2, 3, 7, 7, 6, 2,
|
| + 3, 0, 4, 4, 7, 3,
|
| + 4, 5, 6, 6, 7, 4,
|
| + };
|
| + GR_STATIC_ASSERT(SK_ARRAY_COUNT(gFillAARectIdx) == kIndicesPerAAFillRect);
|
| + return resourceProvider->refOrCreateInstancedIndexBuffer(gFillAARectIdx,
|
| + kIndicesPerAAFillRect, kNumAAFillRectsInIndexBuffer, kVertsPerAAFillRect,
|
| + gAAFillRectIndexBufferKey);
|
| + }
|
| +
|
| GrColor color() const { return fBatch.fColor; }
|
| bool usesLocalCoords() const { return fBatch.fUsesLocalCoords; }
|
| bool canTweakAlphaForCoverage() const { return fBatch.fCanTweakAlphaForCoverage; }
|
| @@ -324,7 +333,6 @@ private:
|
| };
|
|
|
| BatchTracker fBatch;
|
| - const GrIndexBuffer* fIndexBuffer;
|
| SkSTArray<1, Geometry, true> fGeoData;
|
| };
|
|
|
| @@ -336,149 +344,20 @@ enum CoverageAttribType {
|
| };
|
| }
|
|
|
| -void GrAARectRenderer::reset() {
|
| - SkSafeSetNull(fAAFillRectIndexBuffer);
|
| - SkSafeSetNull(fAAMiterStrokeRectIndexBuffer);
|
| - SkSafeSetNull(fAABevelStrokeRectIndexBuffer);
|
| -}
|
| -
|
| -static const uint16_t gMiterStrokeAARectIdx[] = {
|
| - 0 + 0, 1 + 0, 5 + 0, 5 + 0, 4 + 0, 0 + 0,
|
| - 1 + 0, 2 + 0, 6 + 0, 6 + 0, 5 + 0, 1 + 0,
|
| - 2 + 0, 3 + 0, 7 + 0, 7 + 0, 6 + 0, 2 + 0,
|
| - 3 + 0, 0 + 0, 4 + 0, 4 + 0, 7 + 0, 3 + 0,
|
| -
|
| - 0 + 4, 1 + 4, 5 + 4, 5 + 4, 4 + 4, 0 + 4,
|
| - 1 + 4, 2 + 4, 6 + 4, 6 + 4, 5 + 4, 1 + 4,
|
| - 2 + 4, 3 + 4, 7 + 4, 7 + 4, 6 + 4, 2 + 4,
|
| - 3 + 4, 0 + 4, 4 + 4, 4 + 4, 7 + 4, 3 + 4,
|
| -
|
| - 0 + 8, 1 + 8, 5 + 8, 5 + 8, 4 + 8, 0 + 8,
|
| - 1 + 8, 2 + 8, 6 + 8, 6 + 8, 5 + 8, 1 + 8,
|
| - 2 + 8, 3 + 8, 7 + 8, 7 + 8, 6 + 8, 2 + 8,
|
| - 3 + 8, 0 + 8, 4 + 8, 4 + 8, 7 + 8, 3 + 8,
|
| -};
|
| -
|
| -static const int kIndicesPerMiterStrokeRect = SK_ARRAY_COUNT(gMiterStrokeAARectIdx);
|
| -static const int kVertsPerMiterStrokeRect = 16;
|
| -static const int kNumMiterStrokeRectsInIndexBuffer = 256;
|
| -
|
| -/**
|
| - * As in miter-stroke, index = a + b, and a is the current index, b is the shift
|
| - * from the first index. The index layout:
|
| - * outer AA line: 0~3, 4~7
|
| - * outer edge: 8~11, 12~15
|
| - * inner edge: 16~19
|
| - * inner AA line: 20~23
|
| - * Following comes a bevel-stroke rect and its indices:
|
| - *
|
| - * 4 7
|
| - * *********************************
|
| - * * ______________________________ *
|
| - * * / 12 15 \ *
|
| - * * / \ *
|
| - * 0 * |8 16_____________________19 11 | * 3
|
| - * * | | | | *
|
| - * * | | **************** | | *
|
| - * * | | * 20 23 * | | *
|
| - * * | | * * | | *
|
| - * * | | * 21 22 * | | *
|
| - * * | | **************** | | *
|
| - * * | |____________________| | *
|
| - * 1 * |9 17 18 10| * 2
|
| - * * \ / *
|
| - * * \13 __________________________14/ *
|
| - * * *
|
| - * **********************************
|
| - * 5 6
|
| - */
|
| -static const uint16_t gBevelStrokeAARectIdx[] = {
|
| - // Draw outer AA, from outer AA line to outer edge, shift is 0.
|
| - 0 + 0, 1 + 0, 9 + 0, 9 + 0, 8 + 0, 0 + 0,
|
| - 1 + 0, 5 + 0, 13 + 0, 13 + 0, 9 + 0, 1 + 0,
|
| - 5 + 0, 6 + 0, 14 + 0, 14 + 0, 13 + 0, 5 + 0,
|
| - 6 + 0, 2 + 0, 10 + 0, 10 + 0, 14 + 0, 6 + 0,
|
| - 2 + 0, 3 + 0, 11 + 0, 11 + 0, 10 + 0, 2 + 0,
|
| - 3 + 0, 7 + 0, 15 + 0, 15 + 0, 11 + 0, 3 + 0,
|
| - 7 + 0, 4 + 0, 12 + 0, 12 + 0, 15 + 0, 7 + 0,
|
| - 4 + 0, 0 + 0, 8 + 0, 8 + 0, 12 + 0, 4 + 0,
|
| -
|
| - // Draw the stroke, from outer edge to inner edge, shift is 8.
|
| - 0 + 8, 1 + 8, 9 + 8, 9 + 8, 8 + 8, 0 + 8,
|
| - 1 + 8, 5 + 8, 9 + 8,
|
| - 5 + 8, 6 + 8, 10 + 8, 10 + 8, 9 + 8, 5 + 8,
|
| - 6 + 8, 2 + 8, 10 + 8,
|
| - 2 + 8, 3 + 8, 11 + 8, 11 + 8, 10 + 8, 2 + 8,
|
| - 3 + 8, 7 + 8, 11 + 8,
|
| - 7 + 8, 4 + 8, 8 + 8, 8 + 8, 11 + 8, 7 + 8,
|
| - 4 + 8, 0 + 8, 8 + 8,
|
| -
|
| - // Draw the inner AA, from inner edge to inner AA line, shift is 16.
|
| - 0 + 16, 1 + 16, 5 + 16, 5 + 16, 4 + 16, 0 + 16,
|
| - 1 + 16, 2 + 16, 6 + 16, 6 + 16, 5 + 16, 1 + 16,
|
| - 2 + 16, 3 + 16, 7 + 16, 7 + 16, 6 + 16, 2 + 16,
|
| - 3 + 16, 0 + 16, 4 + 16, 4 + 16, 7 + 16, 3 + 16,
|
| -};
|
| -
|
| -static const int kIndicesPerBevelStrokeRect = SK_ARRAY_COUNT(gBevelStrokeAARectIdx);
|
| -static const int kVertsPerBevelStrokeRect = 24;
|
| -static const int kNumBevelStrokeRectsInIndexBuffer = 256;
|
| -
|
| -static int aa_stroke_rect_index_count(bool miterStroke) {
|
| - return miterStroke ? SK_ARRAY_COUNT(gMiterStrokeAARectIdx) :
|
| - SK_ARRAY_COUNT(gBevelStrokeAARectIdx);
|
| -}
|
| -
|
| -static GrIndexBuffer* setup_aa_stroke_rect_indexbuffer(GrIndexBuffer** aaMiterStrokeRectIndexBuffer,
|
| - GrIndexBuffer** aaBevelStrokeRectIndexBuffer,
|
| - GrGpu* gpu,
|
| - bool miterStroke) {
|
| - if (miterStroke) {
|
| - if (!*aaMiterStrokeRectIndexBuffer) {
|
| - *aaMiterStrokeRectIndexBuffer =
|
| - gpu->createInstancedIndexBuffer(gMiterStrokeAARectIdx,
|
| - kIndicesPerMiterStrokeRect,
|
| - kNumMiterStrokeRectsInIndexBuffer,
|
| - kVertsPerMiterStrokeRect);
|
| - }
|
| - return *aaMiterStrokeRectIndexBuffer;
|
| - } else {
|
| - if (!*aaBevelStrokeRectIndexBuffer) {
|
| - *aaBevelStrokeRectIndexBuffer =
|
| - gpu->createInstancedIndexBuffer(gBevelStrokeAARectIdx,
|
| - kIndicesPerBevelStrokeRect,
|
| - kNumBevelStrokeRectsInIndexBuffer,
|
| - kVertsPerBevelStrokeRect);
|
| - }
|
| - return *aaBevelStrokeRectIndexBuffer;
|
| - }
|
| -}
|
| -
|
| void GrAARectRenderer::geometryFillAARect(GrDrawTarget* target,
|
| GrPipelineBuilder* pipelineBuilder,
|
| GrColor color,
|
| const SkMatrix& viewMatrix,
|
| const SkRect& rect,
|
| const SkRect& devRect) {
|
| - if (!fAAFillRectIndexBuffer) {
|
| - fAAFillRectIndexBuffer = fGpu->createInstancedIndexBuffer(gFillAARectIdx,
|
| - kIndicesPerAAFillRect,
|
| - kNumAAFillRectsInIndexBuffer,
|
| - kVertsPerAAFillRect);
|
| - }
|
| -
|
| - if (!fAAFillRectIndexBuffer) {
|
| - SkDebugf("Unable to create index buffer\n");
|
| - return;
|
| - }
|
| -
|
| AAFillRectBatch::Geometry geometry;
|
| geometry.fRect = rect;
|
| geometry.fViewMatrix = viewMatrix;
|
| geometry.fDevRect = devRect;
|
| geometry.fColor = color;
|
|
|
| - SkAutoTUnref<GrBatch> batch(AAFillRectBatch::Create(geometry, fAAFillRectIndexBuffer));
|
| +
|
| + SkAutoTUnref<GrBatch> batch(AAFillRectBatch::Create(geometry));
|
| target->drawBatch(pipelineBuilder, batch);
|
| }
|
|
|
| @@ -544,6 +423,9 @@ void GrAARectRenderer::strokeAARect(GrDrawTarget* target,
|
| devOutsideAssist, devInside, miterStroke);
|
| }
|
|
|
| +GR_DECLARE_STATIC_UNIQUE_KEY(gMiterIndexBufferKey);
|
| +GR_DECLARE_STATIC_UNIQUE_KEY(gBevelIndexBufferKey);
|
| +
|
| class AAStrokeRectBatch : public GrBatch {
|
| public:
|
| // TODO support AA rotated stroke rects by copying around view matrices
|
| @@ -555,9 +437,8 @@ public:
|
| bool fMiterStroke;
|
| };
|
|
|
| - static GrBatch* Create(const Geometry& geometry, const SkMatrix& viewMatrix,
|
| - const GrIndexBuffer* indexBuffer) {
|
| - return SkNEW_ARGS(AAStrokeRectBatch, (geometry, viewMatrix, indexBuffer));
|
| + static GrBatch* Create(const Geometry& geometry, const SkMatrix& viewMatrix) {
|
| + return SkNEW_ARGS(AAStrokeRectBatch, (geometry, viewMatrix));
|
| }
|
|
|
| const char* name() const override { return "AAStrokeRect"; }
|
| @@ -604,6 +485,9 @@ public:
|
|
|
| batchTarget->initDraw(gp, pipeline);
|
|
|
| + const SkAutoTUnref<const GrIndexBuffer> indexBuffer(
|
| + GetIndexBuffer(batchTarget->resourceProvider(), this->miterStroke()));
|
| +
|
| // TODO this is hacky, but the only way we have to initialize the GP is to use the
|
| // GrPipelineInfo struct so we can generate the correct shader. Once we have GrBatch
|
| // everywhere we can remove this nastiness
|
| @@ -619,7 +503,6 @@ public:
|
| SkASSERT(canTweakAlphaForCoverage ?
|
| vertexStride == sizeof(GrDefaultGeoProcFactory::PositionColorAttr) :
|
| vertexStride == sizeof(GrDefaultGeoProcFactory::PositionColorCoverageAttr));
|
| -
|
| int innerVertexNum = 4;
|
| int outerVertexNum = this->miterStroke() ? 4 : 8;
|
| int totalVertexNum = (outerVertexNum + innerVertexNum) * 2;
|
| @@ -635,7 +518,7 @@ public:
|
| &vertexBuffer,
|
| &firstVertex);
|
|
|
| - if (!vertices) {
|
| + if (!vertices || !indexBuffer) {
|
| SkDebugf("Could not allocate vertices\n");
|
| return;
|
| }
|
| @@ -654,18 +537,19 @@ public:
|
| args.fMiterStroke,
|
| canTweakAlphaForCoverage);
|
| }
|
| -
|
| + int indicesPerInstance = this->miterStroke() ? kMiterIndexCnt : kBevelIndexCnt;
|
| GrDrawTarget::DrawInfo drawInfo;
|
| drawInfo.setPrimitiveType(kTriangles_GrPrimitiveType);
|
| drawInfo.setStartVertex(0);
|
| drawInfo.setStartIndex(0);
|
| drawInfo.setVerticesPerInstance(totalVertexNum);
|
| - drawInfo.setIndicesPerInstance(aa_stroke_rect_index_count(this->miterStroke()));
|
| + drawInfo.setIndicesPerInstance(indicesPerInstance);
|
| drawInfo.adjustStartVertex(firstVertex);
|
| drawInfo.setVertexBuffer(vertexBuffer);
|
| - drawInfo.setIndexBuffer(fIndexBuffer);
|
| + drawInfo.setIndexBuffer(indexBuffer);
|
|
|
| - int maxInstancesPerDraw = kNumBevelStrokeRectsInIndexBuffer;
|
| + int maxInstancesPerDraw = this->miterStroke() ? kNumMiterRectsInIndexBuffer :
|
| + kNumBevelRectsInIndexBuffer;
|
|
|
| while (instanceCount) {
|
| drawInfo.setInstanceCount(SkTMin(instanceCount, maxInstancesPerDraw));
|
| @@ -682,9 +566,7 @@ public:
|
| SkSTArray<1, Geometry, true>* geoData() { return &fGeoData; }
|
|
|
| private:
|
| - AAStrokeRectBatch(const Geometry& geometry, const SkMatrix& viewMatrix,
|
| - const GrIndexBuffer* indexBuffer)
|
| - : fIndexBuffer(indexBuffer) {
|
| + AAStrokeRectBatch(const Geometry& geometry, const SkMatrix& viewMatrix) {
|
| this->initClassID<AAStrokeRectBatch>();
|
| fBatch.fViewMatrix = viewMatrix;
|
| fGeoData.push_back(geometry);
|
| @@ -695,6 +577,106 @@ private:
|
| fBounds.join(geometry.fDevOutsideAssist);
|
| }
|
|
|
| +
|
| + static const int kMiterIndexCnt = 3 * 24;
|
| + static const int kMiterVertexCnt = 16;
|
| + static const int kNumMiterRectsInIndexBuffer = 256;
|
| +
|
| + static const int kBevelIndexCnt = 48 + 36 + 24;
|
| + static const int kBevelVertexCnt = 24;
|
| + static const int kNumBevelRectsInIndexBuffer = 256;
|
| +
|
| + static const GrIndexBuffer* GetIndexBuffer(GrResourceProvider* resourceProvider,
|
| + bool miterStroke) {
|
| +
|
| + if (miterStroke) {
|
| + static const uint16_t gMiterIndices[] = {
|
| + 0 + 0, 1 + 0, 5 + 0, 5 + 0, 4 + 0, 0 + 0,
|
| + 1 + 0, 2 + 0, 6 + 0, 6 + 0, 5 + 0, 1 + 0,
|
| + 2 + 0, 3 + 0, 7 + 0, 7 + 0, 6 + 0, 2 + 0,
|
| + 3 + 0, 0 + 0, 4 + 0, 4 + 0, 7 + 0, 3 + 0,
|
| +
|
| + 0 + 4, 1 + 4, 5 + 4, 5 + 4, 4 + 4, 0 + 4,
|
| + 1 + 4, 2 + 4, 6 + 4, 6 + 4, 5 + 4, 1 + 4,
|
| + 2 + 4, 3 + 4, 7 + 4, 7 + 4, 6 + 4, 2 + 4,
|
| + 3 + 4, 0 + 4, 4 + 4, 4 + 4, 7 + 4, 3 + 4,
|
| +
|
| + 0 + 8, 1 + 8, 5 + 8, 5 + 8, 4 + 8, 0 + 8,
|
| + 1 + 8, 2 + 8, 6 + 8, 6 + 8, 5 + 8, 1 + 8,
|
| + 2 + 8, 3 + 8, 7 + 8, 7 + 8, 6 + 8, 2 + 8,
|
| + 3 + 8, 0 + 8, 4 + 8, 4 + 8, 7 + 8, 3 + 8,
|
| + };
|
| + GR_STATIC_ASSERT(SK_ARRAY_COUNT(gMiterIndices) == kMiterIndexCnt);
|
| + GR_DEFINE_STATIC_UNIQUE_KEY(gMiterIndexBufferKey);
|
| + return resourceProvider->refOrCreateInstancedIndexBuffer(gMiterIndices,
|
| + kMiterIndexCnt, kNumMiterRectsInIndexBuffer, kMiterVertexCnt,
|
| + gMiterIndexBufferKey);
|
| + } else {
|
| + /**
|
| + * As in miter-stroke, index = a + b, and a is the current index, b is the shift
|
| + * from the first index. The index layout:
|
| + * outer AA line: 0~3, 4~7
|
| + * outer edge: 8~11, 12~15
|
| + * inner edge: 16~19
|
| + * inner AA line: 20~23
|
| + * Following comes a bevel-stroke rect and its indices:
|
| + *
|
| + * 4 7
|
| + * *********************************
|
| + * * ______________________________ *
|
| + * * / 12 15 \ *
|
| + * * / \ *
|
| + * 0 * |8 16_____________________19 11 | * 3
|
| + * * | | | | *
|
| + * * | | **************** | | *
|
| + * * | | * 20 23 * | | *
|
| + * * | | * * | | *
|
| + * * | | * 21 22 * | | *
|
| + * * | | **************** | | *
|
| + * * | |____________________| | *
|
| + * 1 * |9 17 18 10| * 2
|
| + * * \ / *
|
| + * * \13 __________________________14/ *
|
| + * * *
|
| + * **********************************
|
| + * 5 6
|
| + */
|
| + static const uint16_t gBevelIndices[] = {
|
| + // Draw outer AA, from outer AA line to outer edge, shift is 0.
|
| + 0 + 0, 1 + 0, 9 + 0, 9 + 0, 8 + 0, 0 + 0,
|
| + 1 + 0, 5 + 0, 13 + 0, 13 + 0, 9 + 0, 1 + 0,
|
| + 5 + 0, 6 + 0, 14 + 0, 14 + 0, 13 + 0, 5 + 0,
|
| + 6 + 0, 2 + 0, 10 + 0, 10 + 0, 14 + 0, 6 + 0,
|
| + 2 + 0, 3 + 0, 11 + 0, 11 + 0, 10 + 0, 2 + 0,
|
| + 3 + 0, 7 + 0, 15 + 0, 15 + 0, 11 + 0, 3 + 0,
|
| + 7 + 0, 4 + 0, 12 + 0, 12 + 0, 15 + 0, 7 + 0,
|
| + 4 + 0, 0 + 0, 8 + 0, 8 + 0, 12 + 0, 4 + 0,
|
| +
|
| + // Draw the stroke, from outer edge to inner edge, shift is 8.
|
| + 0 + 8, 1 + 8, 9 + 8, 9 + 8, 8 + 8, 0 + 8,
|
| + 1 + 8, 5 + 8, 9 + 8,
|
| + 5 + 8, 6 + 8, 10 + 8, 10 + 8, 9 + 8, 5 + 8,
|
| + 6 + 8, 2 + 8, 10 + 8,
|
| + 2 + 8, 3 + 8, 11 + 8, 11 + 8, 10 + 8, 2 + 8,
|
| + 3 + 8, 7 + 8, 11 + 8,
|
| + 7 + 8, 4 + 8, 8 + 8, 8 + 8, 11 + 8, 7 + 8,
|
| + 4 + 8, 0 + 8, 8 + 8,
|
| +
|
| + // Draw the inner AA, from inner edge to inner AA line, shift is 16.
|
| + 0 + 16, 1 + 16, 5 + 16, 5 + 16, 4 + 16, 0 + 16,
|
| + 1 + 16, 2 + 16, 6 + 16, 6 + 16, 5 + 16, 1 + 16,
|
| + 2 + 16, 3 + 16, 7 + 16, 7 + 16, 6 + 16, 2 + 16,
|
| + 3 + 16, 0 + 16, 4 + 16, 4 + 16, 7 + 16, 3 + 16,
|
| + };
|
| + GR_STATIC_ASSERT(SK_ARRAY_COUNT(gBevelIndices) == kBevelIndexCnt);
|
| +
|
| + GR_DEFINE_STATIC_UNIQUE_KEY(gBevelIndexBufferKey);
|
| + return resourceProvider->refOrCreateInstancedIndexBuffer(gBevelIndices,
|
| + kBevelIndexCnt, kNumBevelRectsInIndexBuffer, kBevelVertexCnt,
|
| + gBevelIndexBufferKey);
|
| + }
|
| + }
|
| +
|
| GrColor color() const { return fBatch.fColor; }
|
| bool usesLocalCoords() const { return fBatch.fUsesLocalCoords; }
|
| bool canTweakAlphaForCoverage() const { return fBatch.fCanTweakAlphaForCoverage; }
|
| @@ -855,7 +837,6 @@ private:
|
| };
|
|
|
| BatchTracker fBatch;
|
| - const GrIndexBuffer* fIndexBuffer;
|
| SkSTArray<1, Geometry, true> fGeoData;
|
| };
|
|
|
| @@ -867,15 +848,6 @@ void GrAARectRenderer::geometryStrokeAARect(GrDrawTarget* target,
|
| const SkRect& devOutsideAssist,
|
| const SkRect& devInside,
|
| bool miterStroke) {
|
| - GrIndexBuffer* indexBuffer = setup_aa_stroke_rect_indexbuffer(&fAAMiterStrokeRectIndexBuffer,
|
| - &fAABevelStrokeRectIndexBuffer,
|
| - fGpu,
|
| - miterStroke);
|
| - if (!indexBuffer) {
|
| - SkDebugf("Failed to create index buffer!\n");
|
| - return;
|
| - }
|
| -
|
| AAStrokeRectBatch::Geometry geometry;
|
| geometry.fColor = color;
|
| geometry.fDevOutside = devOutside;
|
| @@ -883,7 +855,7 @@ void GrAARectRenderer::geometryStrokeAARect(GrDrawTarget* target,
|
| geometry.fDevInside = devInside;
|
| geometry.fMiterStroke = miterStroke;
|
|
|
| - SkAutoTUnref<GrBatch> batch(AAStrokeRectBatch::Create(geometry, viewMatrix, indexBuffer));
|
| + SkAutoTUnref<GrBatch> batch(AAStrokeRectBatch::Create(geometry, viewMatrix));
|
| target->drawBatch(pipelineBuilder, batch);
|
| }
|
|
|
| @@ -919,30 +891,12 @@ BATCH_TEST_DEFINE(AAFillRectBatch) {
|
| geo.fViewMatrix = GrTest::TestMatrix(random);
|
| geo.fRect = GrTest::TestRect(random);
|
| geo.fDevRect = GrTest::TestRect(random);
|
| -
|
| - static GrIndexBuffer* aaFillRectIndexBuffer = NULL;
|
| - if (!aaFillRectIndexBuffer) {
|
| - aaFillRectIndexBuffer =
|
| - context->getGpu()->createInstancedIndexBuffer(gFillAARectIdx,
|
| - kIndicesPerAAFillRect,
|
| - kNumAAFillRectsInIndexBuffer,
|
| - kVertsPerAAFillRect);
|
| - }
|
| -
|
| - return AAFillRectBatch::Create(geo, aaFillRectIndexBuffer);
|
| + return AAFillRectBatch::Create(geo);
|
| }
|
|
|
| BATCH_TEST_DEFINE(AAStrokeRectBatch) {
|
| - static GrIndexBuffer* aaMiterStrokeRectIndexBuffer = NULL;
|
| - static GrIndexBuffer* aaBevelStrokeRectIndexBuffer = NULL;
|
| -
|
| bool miterStroke = random->nextBool();
|
|
|
| - GrIndexBuffer* indexBuffer = setup_aa_stroke_rect_indexbuffer(&aaMiterStrokeRectIndexBuffer,
|
| - &aaBevelStrokeRectIndexBuffer,
|
| - context->getGpu(),
|
| - miterStroke);
|
| -
|
| // Create mock stroke rect
|
| SkRect outside = GrTest::TestRect(random);
|
| SkScalar minDim = SkMinScalar(outside.width(), outside.height());
|
| @@ -959,7 +913,7 @@ BATCH_TEST_DEFINE(AAStrokeRectBatch) {
|
| geo.fDevInside = inside;
|
| geo.fMiterStroke = miterStroke;
|
|
|
| - return AAStrokeRectBatch::Create(geo, GrTest::TestMatrix(random), indexBuffer);
|
| + return AAStrokeRectBatch::Create(geo, GrTest::TestMatrix(random));
|
| }
|
|
|
| #endif
|
|
|