| Index: src/gpu/GrAARectRenderer.cpp
|
| diff --git a/src/gpu/GrAARectRenderer.cpp b/src/gpu/GrAARectRenderer.cpp
|
| index e82852485aafc793127954b50a3d81fdca9a3929..569466f23793d70d4cbef373705e2e3ff591dc31 100644
|
| --- a/src/gpu/GrAARectRenderer.cpp
|
| +++ b/src/gpu/GrAARectRenderer.cpp
|
| @@ -8,12 +8,15 @@
|
| #include "GrAARectRenderer.h"
|
| #include "GrBatch.h"
|
| #include "GrBatchTarget.h"
|
| +#include "GrBatchTest.h"
|
| #include "GrBufferAllocPool.h"
|
| +#include "GrContext.h"
|
| #include "GrDefaultGeoProcFactory.h"
|
| #include "GrGeometryProcessor.h"
|
| #include "GrGpu.h"
|
| #include "GrInvariantOutput.h"
|
| #include "GrVertexBuffer.h"
|
| +#include "GrTestUtils.h"
|
| #include "SkColorPriv.h"
|
| #include "gl/GrGLProcessor.h"
|
| #include "gl/GrGLGeometryProcessor.h"
|
| @@ -423,25 +426,28 @@ static int aa_stroke_rect_index_count(bool miterStroke) {
|
| SK_ARRAY_COUNT(gBevelStrokeAARectIdx);
|
| }
|
|
|
| -GrIndexBuffer* GrAARectRenderer::aaStrokeRectIndexBuffer(bool miterStroke) {
|
| +static GrIndexBuffer* setup_aa_stroke_rect_indexbuffer(GrIndexBuffer** aaMiterStrokeRectIndexBuffer,
|
| + GrIndexBuffer** aaBevelStrokeRectIndexBuffer,
|
| + GrGpu* gpu,
|
| + bool miterStroke) {
|
| if (miterStroke) {
|
| - if (NULL == fAAMiterStrokeRectIndexBuffer) {
|
| - fAAMiterStrokeRectIndexBuffer =
|
| - fGpu->createInstancedIndexBuffer(gMiterStrokeAARectIdx,
|
| - kIndicesPerMiterStrokeRect,
|
| - kNumMiterStrokeRectsInIndexBuffer,
|
| - kVertsPerMiterStrokeRect);
|
| + if (!*aaMiterStrokeRectIndexBuffer) {
|
| + *aaMiterStrokeRectIndexBuffer =
|
| + gpu->createInstancedIndexBuffer(gMiterStrokeAARectIdx,
|
| + kIndicesPerMiterStrokeRect,
|
| + kNumMiterStrokeRectsInIndexBuffer,
|
| + kVertsPerMiterStrokeRect);
|
| }
|
| - return fAAMiterStrokeRectIndexBuffer;
|
| + return *aaMiterStrokeRectIndexBuffer;
|
| } else {
|
| - if (NULL == fAABevelStrokeRectIndexBuffer) {
|
| - fAABevelStrokeRectIndexBuffer =
|
| - fGpu->createInstancedIndexBuffer(gBevelStrokeAARectIdx,
|
| - kIndicesPerBevelStrokeRect,
|
| - kNumBevelStrokeRectsInIndexBuffer,
|
| - kVertsPerBevelStrokeRect);
|
| + if (!*aaBevelStrokeRectIndexBuffer) {
|
| + *aaBevelStrokeRectIndexBuffer =
|
| + gpu->createInstancedIndexBuffer(gBevelStrokeAARectIdx,
|
| + kIndicesPerBevelStrokeRect,
|
| + kNumBevelStrokeRectsInIndexBuffer,
|
| + kVertsPerBevelStrokeRect);
|
| }
|
| - return fAABevelStrokeRectIndexBuffer;
|
| + return *aaBevelStrokeRectIndexBuffer;
|
| }
|
| }
|
|
|
| @@ -852,7 +858,6 @@ private:
|
| SkSTArray<1, Geometry, true> fGeoData;
|
| };
|
|
|
| -
|
| void GrAARectRenderer::geometryStrokeAARect(GrDrawTarget* target,
|
| GrPipelineBuilder* pipelineBuilder,
|
| GrColor color,
|
| @@ -861,7 +866,10 @@ void GrAARectRenderer::geometryStrokeAARect(GrDrawTarget* target,
|
| const SkRect& devOutsideAssist,
|
| const SkRect& devInside,
|
| bool miterStroke) {
|
| - GrIndexBuffer* indexBuffer = this->aaStrokeRectIndexBuffer(miterStroke);
|
| + GrIndexBuffer* indexBuffer = setup_aa_stroke_rect_indexbuffer(&fAAMiterStrokeRectIndexBuffer,
|
| + &fAABevelStrokeRectIndexBuffer,
|
| + fGpu,
|
| + miterStroke);
|
| if (!indexBuffer) {
|
| SkDebugf("Failed to create index buffer!\n");
|
| return;
|
| @@ -899,3 +907,58 @@ void GrAARectRenderer::fillAANestedRects(GrDrawTarget* target,
|
| this->geometryStrokeAARect(target, pipelineBuilder, color, viewMatrix, devOutside,
|
| devOutsideAssist, devInside, true);
|
| }
|
| +
|
| +///////////////////////////////////////////////////////////////////////////////////////////////////
|
| +
|
| +#ifdef GR_TEST_UTILS
|
| +
|
| +BATCH_TEST_DEFINE(AAFillRectBatch) {
|
| + AAFillRectBatch::Geometry geo;
|
| + geo.fColor = GrRandomColor(random);
|
| + 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);
|
| +}
|
| +
|
| +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());
|
| + SkScalar strokeWidth = minDim * 0.1f;
|
| + SkRect outsideAssist = outside;
|
| + outsideAssist.outset(strokeWidth, strokeWidth);
|
| + SkRect inside = outside;
|
| + inside.inset(strokeWidth, strokeWidth);
|
| +
|
| + AAStrokeRectBatch::Geometry geo;
|
| + geo.fColor = GrRandomColor(random);
|
| + geo.fDevOutside = outside;
|
| + geo.fDevOutsideAssist = outsideAssist;
|
| + geo.fDevInside = inside;
|
| + geo.fMiterStroke = miterStroke;
|
| +
|
| + return AAStrokeRectBatch::Create(geo, GrTest::TestMatrix(random), indexBuffer);
|
| +}
|
| +
|
| +#endif
|
|
|