Index: src/gpu/GrAARectRenderer.cpp |
diff --git a/src/gpu/GrAARectRenderer.cpp b/src/gpu/GrAARectRenderer.cpp |
index d1c377aa532757ec1b392064026cca09787a067a..778205f3bbe5f07b38909bc636c040dfd1dbd14f 100644 |
--- a/src/gpu/GrAARectRenderer.cpp |
+++ b/src/gpu/GrAARectRenderer.cpp |
@@ -13,11 +13,10 @@ |
#include "GrContext.h" |
#include "GrDefaultGeoProcFactory.h" |
#include "GrGeometryProcessor.h" |
+#include "GrGpu.h" |
#include "GrInvariantOutput.h" |
-#include "GrResourceKey.h" |
-#include "GrResourceProvider.h" |
+#include "GrVertexBuffer.h" |
#include "GrTestUtils.h" |
-#include "GrVertexBuffer.h" |
#include "SkColorPriv.h" |
#include "gl/GrGLProcessor.h" |
#include "gl/GrGLGeometryProcessor.h" |
@@ -30,6 +29,18 @@ |
pts->setRectFan(r.fLeft + dx, r.fTop + dy, |
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) { |
@@ -46,8 +57,6 @@ |
return gp; |
} |
-GR_DECLARE_STATIC_UNIQUE_KEY(gAAFillRectIndexBufferKey); |
- |
class AAFillRectBatch : public GrBatch { |
public: |
struct Geometry { |
@@ -57,8 +66,8 @@ |
SkRect fDevRect; |
}; |
- static GrBatch* Create(const Geometry& geometry) { |
- return SkNEW_ARGS(AAFillRectBatch, (geometry)); |
+ static GrBatch* Create(const Geometry& geometry, const GrIndexBuffer* indexBuffer) { |
+ return SkNEW_ARGS(AAFillRectBatch, (geometry, indexBuffer)); |
} |
const char* name() const override { return "AAFillRectBatch"; } |
@@ -112,23 +121,24 @@ |
init.fUsesLocalCoords = this->usesLocalCoords(); |
gp->initBatchTracker(batchTarget->currentBatchTracker(), init); |
- 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 || !indexBuffer) { |
+ if (!vertices) { |
SkDebugf("Could not allocate vertices\n"); |
return; |
} |
@@ -153,7 +163,7 @@ |
drawInfo.setIndicesPerInstance(kIndicesPerAAFillRect); |
drawInfo.adjustStartVertex(firstVertex); |
drawInfo.setVertexBuffer(vertexBuffer); |
- drawInfo.setIndexBuffer(indexBuffer); |
+ drawInfo.setIndexBuffer(fIndexBuffer); |
int maxInstancesPerDraw = kNumAAFillRectsInIndexBuffer; |
@@ -172,31 +182,12 @@ |
SkSTArray<1, Geometry, true>* geoData() { return &fGeoData; } |
private: |
- AAFillRectBatch(const Geometry& geometry) { |
+ AAFillRectBatch(const Geometry& geometry, const GrIndexBuffer* indexBuffer) |
+ : fIndexBuffer(indexBuffer) { |
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; } |
@@ -333,6 +324,7 @@ |
}; |
BatchTracker fBatch; |
+ const GrIndexBuffer* fIndexBuffer; |
SkSTArray<1, Geometry, true> fGeoData; |
}; |
@@ -344,20 +336,149 @@ |
}; |
} |
+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)); |
+ SkAutoTUnref<GrBatch> batch(AAFillRectBatch::Create(geometry, fAAFillRectIndexBuffer)); |
target->drawBatch(pipelineBuilder, batch); |
} |
@@ -423,9 +544,6 @@ |
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 |
@@ -437,8 +555,9 @@ |
bool fMiterStroke; |
}; |
- static GrBatch* Create(const Geometry& geometry, const SkMatrix& viewMatrix) { |
- return SkNEW_ARGS(AAStrokeRectBatch, (geometry, viewMatrix)); |
+ static GrBatch* Create(const Geometry& geometry, const SkMatrix& viewMatrix, |
+ const GrIndexBuffer* indexBuffer) { |
+ return SkNEW_ARGS(AAStrokeRectBatch, (geometry, viewMatrix, indexBuffer)); |
} |
const char* name() const override { return "AAStrokeRect"; } |
@@ -484,9 +603,6 @@ |
localMatrix)); |
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 |
@@ -503,6 +619,7 @@ |
SkASSERT(canTweakAlphaForCoverage ? |
vertexStride == sizeof(GrDefaultGeoProcFactory::PositionColorAttr) : |
vertexStride == sizeof(GrDefaultGeoProcFactory::PositionColorCoverageAttr)); |
+ |
int innerVertexNum = 4; |
int outerVertexNum = this->miterStroke() ? 4 : 8; |
int totalVertexNum = (outerVertexNum + innerVertexNum) * 2; |
@@ -518,7 +635,7 @@ |
&vertexBuffer, |
&firstVertex); |
- if (!vertices || !indexBuffer) { |
+ if (!vertices) { |
SkDebugf("Could not allocate vertices\n"); |
return; |
} |
@@ -537,19 +654,18 @@ |
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(indicesPerInstance); |
+ drawInfo.setIndicesPerInstance(aa_stroke_rect_index_count(this->miterStroke())); |
drawInfo.adjustStartVertex(firstVertex); |
drawInfo.setVertexBuffer(vertexBuffer); |
- drawInfo.setIndexBuffer(indexBuffer); |
- |
- int maxInstancesPerDraw = this->miterStroke() ? kNumMiterRectsInIndexBuffer : |
- kNumBevelRectsInIndexBuffer; |
+ drawInfo.setIndexBuffer(fIndexBuffer); |
+ |
+ int maxInstancesPerDraw = kNumBevelStrokeRectsInIndexBuffer; |
while (instanceCount) { |
drawInfo.setInstanceCount(SkTMin(instanceCount, maxInstancesPerDraw)); |
@@ -566,7 +682,9 @@ |
SkSTArray<1, Geometry, true>* geoData() { return &fGeoData; } |
private: |
- AAStrokeRectBatch(const Geometry& geometry, const SkMatrix& viewMatrix) { |
+ AAStrokeRectBatch(const Geometry& geometry, const SkMatrix& viewMatrix, |
+ const GrIndexBuffer* indexBuffer) |
+ : fIndexBuffer(indexBuffer) { |
this->initClassID<AAStrokeRectBatch>(); |
fBatch.fViewMatrix = viewMatrix; |
fGeoData.push_back(geometry); |
@@ -575,106 +693,6 @@ |
// the join for proper bounds |
fBounds = geometry.fDevOutside; |
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; } |
@@ -837,6 +855,7 @@ |
}; |
BatchTracker fBatch; |
+ const GrIndexBuffer* fIndexBuffer; |
SkSTArray<1, Geometry, true> fGeoData; |
}; |
@@ -848,6 +867,15 @@ |
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; |
@@ -855,7 +883,7 @@ |
geometry.fDevInside = devInside; |
geometry.fMiterStroke = miterStroke; |
- SkAutoTUnref<GrBatch> batch(AAStrokeRectBatch::Create(geometry, viewMatrix)); |
+ SkAutoTUnref<GrBatch> batch(AAStrokeRectBatch::Create(geometry, viewMatrix, indexBuffer)); |
target->drawBatch(pipelineBuilder, batch); |
} |
@@ -891,11 +919,29 @@ |
geo.fViewMatrix = GrTest::TestMatrix(random); |
geo.fRect = GrTest::TestRect(random); |
geo.fDevRect = GrTest::TestRect(random); |
- return AAFillRectBatch::Create(geo); |
+ |
+ static GrIndexBuffer* aaFillRectIndexBuffer = NULL; |
+ if (!aaFillRectIndexBuffer) { |
+ aaFillRectIndexBuffer = |
+ context->getGpu()->createInstancedIndexBuffer(gFillAARectIdx, |
+ kIndicesPerAAFillRect, |
+ kNumAAFillRectsInIndexBuffer, |
+ kVertsPerAAFillRect); |
+ } |
+ |
+ return AAFillRectBatch::Create(geo, aaFillRectIndexBuffer); |
} |
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); |
@@ -913,7 +959,7 @@ |
geo.fDevInside = inside; |
geo.fMiterStroke = miterStroke; |
- return AAStrokeRectBatch::Create(geo, GrTest::TestMatrix(random)); |
+ return AAStrokeRectBatch::Create(geo, GrTest::TestMatrix(random), indexBuffer); |
} |
#endif |