Index: src/gpu/GrOvalRenderer.cpp |
diff --git a/src/gpu/GrOvalRenderer.cpp b/src/gpu/GrOvalRenderer.cpp |
index 02019c1d1e7e129f0955a78eea6e999617e04cdf..1c41f27b079752136ad108e6ec5f13410f8f7a65 100644 |
--- a/src/gpu/GrOvalRenderer.cpp |
+++ b/src/gpu/GrOvalRenderer.cpp |
@@ -9,19 +9,14 @@ |
#include "GrBatchFlushState.h" |
#include "GrBatchTest.h" |
-#include "GrDrawTarget.h" |
#include "GrGeometryProcessor.h" |
#include "GrInvariantOutput.h" |
#include "GrPipelineBuilder.h" |
#include "GrProcessor.h" |
#include "GrResourceProvider.h" |
-#include "GrVertexBuffer.h" |
#include "SkRRect.h" |
#include "SkStrokeRec.h" |
-#include "SkTLazy.h" |
-#include "batches/GrRectBatchFactory.h" |
#include "batches/GrVertexBatch.h" |
-#include "effects/GrRRectEffect.h" |
#include "glsl/GrGLSLFragmentShaderBuilder.h" |
#include "glsl/GrGLSLGeometryProcessor.h" |
#include "glsl/GrGLSLProgramDataManager.h" |
@@ -585,35 +580,34 @@ const GrGeometryProcessor* DIEllipseEdgeEffect::TestCreate(GrProcessorTestData* |
/////////////////////////////////////////////////////////////////////////////// |
-bool GrOvalRenderer::DrawOval(GrDrawTarget* target, |
- const GrPipelineBuilder& pipelineBuilder, |
- GrColor color, |
- const SkMatrix& viewMatrix, |
- bool useAA, |
- const SkRect& oval, |
- const SkStrokeRec& stroke) { |
+GrDrawBatch* GrOvalRenderer::CreateOvalBatch(const GrPipelineBuilder& pipelineBuilder, |
+ GrColor color, |
+ const SkMatrix& viewMatrix, |
+ bool useAA, |
+ const SkRect& oval, |
+ const SkStrokeRec& stroke, |
+ GrShaderCaps* shaderCaps) { |
bool useCoverageAA = useAA && !pipelineBuilder.getRenderTarget()->isUnifiedMultisampled(); |
- |
if (!useCoverageAA) { |
- return false; |
+ return nullptr; |
} |
// we can draw circles |
if (SkScalarNearlyEqual(oval.width(), oval.height()) && circle_stays_circle(viewMatrix)) { |
- DrawCircle(target, pipelineBuilder, color, viewMatrix, useCoverageAA, oval, stroke); |
+ return CreateCircleBatch(color, viewMatrix, oval, stroke); |
+ } |
+ |
// if we have shader derivative support, render as device-independent |
- } else if (target->caps()->shaderCaps()->shaderDerivativeSupport()) { |
- return DrawDIEllipse(target, pipelineBuilder, color, viewMatrix, useCoverageAA, oval, |
- stroke); |
+ if (shaderCaps->shaderDerivativeSupport()) { |
+ return CreateDIEllipseBatch(color, viewMatrix, oval, stroke); |
+ } |
+ |
// otherwise axis-aligned ellipses only |
- } else if (viewMatrix.rectStaysRect()) { |
- return DrawEllipse(target, pipelineBuilder, color, viewMatrix, useCoverageAA, oval, |
- stroke); |
- } else { |
- return false; |
+ if (viewMatrix.rectStaysRect()) { |
+ return CreateEllipseBatch(color, viewMatrix, oval, stroke); |
} |
- return true; |
+ return nullptr; |
} |
/////////////////////////////////////////////////////////////////////////////// |
@@ -788,7 +782,6 @@ private: |
static GrDrawBatch* create_circle_batch(GrColor color, |
const SkMatrix& viewMatrix, |
- bool useCoverageAA, |
const SkRect& circle, |
const SkStrokeRec& stroke) { |
SkPoint center = SkPoint::Make(circle.centerX(), circle.centerY()); |
@@ -836,16 +829,11 @@ static GrDrawBatch* create_circle_batch(GrColor color, |
return CircleBatch::Create(geometry); |
} |
-void GrOvalRenderer::DrawCircle(GrDrawTarget* target, |
- const GrPipelineBuilder& pipelineBuilder, |
- GrColor color, |
- const SkMatrix& viewMatrix, |
- bool useCoverageAA, |
- const SkRect& circle, |
- const SkStrokeRec& stroke) { |
- SkAutoTUnref<GrDrawBatch> batch(create_circle_batch(color, viewMatrix, useCoverageAA, circle, |
- stroke)); |
- target->drawBatch(pipelineBuilder, batch); |
+GrDrawBatch* GrOvalRenderer::CreateCircleBatch(GrColor color, |
+ const SkMatrix& viewMatrix, |
+ const SkRect& circle, |
+ const SkStrokeRec& stroke) { |
+ return create_circle_batch(color, viewMatrix, circle, stroke); |
} |
/////////////////////////////////////////////////////////////////////////////// |
@@ -1013,16 +1001,9 @@ private: |
static GrDrawBatch* create_ellipse_batch(GrColor color, |
const SkMatrix& viewMatrix, |
- bool useCoverageAA, |
const SkRect& ellipse, |
const SkStrokeRec& stroke) { |
-#ifdef SK_DEBUG |
- { |
- // we should have checked for this previously |
- bool isAxisAlignedEllipse = viewMatrix.rectStaysRect(); |
- SkASSERT(useCoverageAA && isAxisAlignedEllipse); |
- } |
-#endif |
+ SkASSERT(viewMatrix.rectStaysRect()); |
// do any matrix crunching before we reset the draw state for device coords |
SkPoint center = SkPoint::Make(ellipse.centerX(), ellipse.centerY()); |
@@ -1098,21 +1079,11 @@ static GrDrawBatch* create_ellipse_batch(GrColor color, |
return EllipseBatch::Create(geometry); |
} |
-bool GrOvalRenderer::DrawEllipse(GrDrawTarget* target, |
- const GrPipelineBuilder& pipelineBuilder, |
- GrColor color, |
- const SkMatrix& viewMatrix, |
- bool useCoverageAA, |
- const SkRect& ellipse, |
- const SkStrokeRec& stroke) { |
- SkAutoTUnref<GrDrawBatch> batch(create_ellipse_batch(color, viewMatrix, useCoverageAA, ellipse, |
- stroke)); |
- if (!batch) { |
- return false; |
- } |
- |
- target->drawBatch(pipelineBuilder, batch); |
- return true; |
+GrDrawBatch* GrOvalRenderer::CreateEllipseBatch(GrColor color, |
+ const SkMatrix& viewMatrix, |
+ const SkRect& ellipse, |
+ const SkStrokeRec& stroke) { |
+ return create_ellipse_batch(color, viewMatrix, ellipse, stroke); |
} |
///////////////////////////////////////////////////////////////////////////////////////////////// |
@@ -1275,7 +1246,6 @@ private: |
static GrDrawBatch* create_diellipse_batch(GrColor color, |
const SkMatrix& viewMatrix, |
- bool useCoverageAA, |
const SkRect& ellipse, |
const SkStrokeRec& stroke) { |
SkPoint center = SkPoint::Make(ellipse.centerX(), ellipse.centerY()); |
@@ -1351,20 +1321,11 @@ static GrDrawBatch* create_diellipse_batch(GrColor color, |
return DIEllipseBatch::Create(geometry, devBounds); |
} |
-bool GrOvalRenderer::DrawDIEllipse(GrDrawTarget* target, |
- const GrPipelineBuilder& pipelineBuilder, |
- GrColor color, |
- const SkMatrix& viewMatrix, |
- bool useCoverageAA, |
- const SkRect& ellipse, |
- const SkStrokeRec& stroke) { |
- SkAutoTUnref<GrDrawBatch> batch(create_diellipse_batch(color, viewMatrix, useCoverageAA, |
- ellipse, stroke)); |
- if (!batch) { |
- return false; |
- } |
- target->drawBatch(pipelineBuilder, batch); |
- return true; |
+GrDrawBatch* GrOvalRenderer::CreateDIEllipseBatch(GrColor color, |
+ const SkMatrix& viewMatrix, |
+ const SkRect& ellipse, |
+ const SkStrokeRec& stroke) { |
+ return create_diellipse_batch(color, viewMatrix, ellipse, stroke); |
} |
/////////////////////////////////////////////////////////////////////////////// |
@@ -1410,72 +1371,6 @@ static const GrIndexBuffer* ref_rrect_index_buffer(bool strokeOnly, |
} |
} |
-bool GrOvalRenderer::DrawDRRect(GrDrawTarget* target, |
- const GrPipelineBuilder& pipelineBuilder, |
- GrColor color, |
- const SkMatrix& viewMatrix, |
- bool useAA, |
- const SkRRect& origOuter, |
- const SkRRect& origInner) { |
- bool applyAA = useAA && !pipelineBuilder.getRenderTarget()->isUnifiedMultisampled(); |
- GrPipelineBuilder::AutoRestoreFragmentProcessorState arfps; |
- if (!origInner.isEmpty()) { |
- SkTCopyOnFirstWrite<SkRRect> inner(origInner); |
- if (!viewMatrix.isIdentity()) { |
- if (!origInner.transform(viewMatrix, inner.writable())) { |
- return false; |
- } |
- } |
- GrPrimitiveEdgeType edgeType = applyAA ? |
- kInverseFillAA_GrProcessorEdgeType : |
- kInverseFillBW_GrProcessorEdgeType; |
- // TODO this needs to be a geometry processor |
- GrFragmentProcessor* fp = GrRRectEffect::Create(edgeType, *inner); |
- if (nullptr == fp) { |
- return false; |
- } |
- arfps.set(&pipelineBuilder); |
- arfps.addCoverageFragmentProcessor(fp)->unref(); |
- } |
- |
- SkStrokeRec fillRec(SkStrokeRec::kFill_InitStyle); |
- if (DrawRRect(target, pipelineBuilder, color, viewMatrix, useAA, origOuter, fillRec)) { |
- return true; |
- } |
- |
- SkASSERT(!origOuter.isEmpty()); |
- SkTCopyOnFirstWrite<SkRRect> outer(origOuter); |
- if (!viewMatrix.isIdentity()) { |
- if (!origOuter.transform(viewMatrix, outer.writable())) { |
- return false; |
- } |
- } |
- GrPrimitiveEdgeType edgeType = applyAA ? kFillAA_GrProcessorEdgeType : |
- kFillBW_GrProcessorEdgeType; |
- GrFragmentProcessor* effect = GrRRectEffect::Create(edgeType, *outer); |
- if (nullptr == effect) { |
- return false; |
- } |
- if (!arfps.isSet()) { |
- arfps.set(&pipelineBuilder); |
- } |
- |
- SkMatrix invert; |
- if (!viewMatrix.invert(&invert)) { |
- return false; |
- } |
- |
- arfps.addCoverageFragmentProcessor(effect)->unref(); |
- SkRect bounds = outer->getBounds(); |
- if (applyAA) { |
- bounds.outset(SK_ScalarHalf, SK_ScalarHalf); |
- } |
- SkAutoTUnref<GrDrawBatch> batch(GrRectBatchFactory::CreateNonAAFill(color, SkMatrix::I(), |
- bounds, nullptr, &invert)); |
- target->drawBatch(pipelineBuilder, batch); |
- return true; |
-} |
- |
/////////////////////////////////////////////////////////////////////////////////////////////////// |
class RRectCircleRendererBatch : public GrVertexBatch { |
@@ -1995,36 +1890,30 @@ static GrDrawBatch* create_rrect_batch(GrColor color, |
} |
} |
-bool GrOvalRenderer::DrawRRect(GrDrawTarget* target, |
- const GrPipelineBuilder& pipelineBuilder, |
- GrColor color, |
- const SkMatrix& viewMatrix, |
- bool useAA, |
- const SkRRect& rrect, |
- const SkStrokeRec& stroke) { |
- if (rrect.isOval()) { |
- return DrawOval(target, pipelineBuilder, color, viewMatrix, useAA, rrect.getBounds(), |
- stroke); |
- } |
- |
+GrDrawBatch* GrOvalRenderer::CreateRRectBatch(const GrPipelineBuilder& pipelineBuilder, |
+ GrColor color, |
+ const SkMatrix& viewMatrix, |
+ bool useAA, |
+ const SkRRect& rrect, |
+ const SkStrokeRec& stroke, |
+ GrShaderCaps* shaderCaps) { |
bool useCoverageAA = useAA && !pipelineBuilder.getRenderTarget()->isUnifiedMultisampled(); |
// only anti-aliased rrects for now |
if (!useCoverageAA) { |
- return false; |
+ return nullptr; |
} |
- if (!viewMatrix.rectStaysRect() || !rrect.isSimple()) { |
- return false; |
+ if (rrect.isOval()) { |
+ return CreateOvalBatch(pipelineBuilder, color, viewMatrix, useAA, |
+ rrect.getBounds(), stroke, shaderCaps); |
} |
- SkAutoTUnref<GrDrawBatch> batch(create_rrect_batch(color, viewMatrix, rrect, stroke)); |
- if (!batch) { |
- return false; |
+ if (!viewMatrix.rectStaysRect() || !rrect.isSimple()) { |
+ return nullptr; |
} |
- target->drawBatch(pipelineBuilder, batch); |
- return true; |
+ return create_rrect_batch(color, viewMatrix, rrect, stroke); |
} |
/////////////////////////////////////////////////////////////////////////////////////////////////// |
@@ -2034,27 +1923,22 @@ bool GrOvalRenderer::DrawRRect(GrDrawTarget* target, |
DRAW_BATCH_TEST_DEFINE(CircleBatch) { |
SkMatrix viewMatrix = GrTest::TestMatrix(random); |
GrColor color = GrRandomColor(random); |
- bool useCoverageAA = random->nextBool(); |
SkRect circle = GrTest::TestSquare(random); |
- return create_circle_batch(color, viewMatrix, useCoverageAA, circle, |
- GrTest::TestStrokeRec(random)); |
+ return create_circle_batch(color, viewMatrix, circle, GrTest::TestStrokeRec(random)); |
} |
DRAW_BATCH_TEST_DEFINE(EllipseBatch) { |
SkMatrix viewMatrix = GrTest::TestMatrixRectStaysRect(random); |
GrColor color = GrRandomColor(random); |
SkRect ellipse = GrTest::TestSquare(random); |
- return create_ellipse_batch(color, viewMatrix, true, ellipse, |
- GrTest::TestStrokeRec(random)); |
+ return create_ellipse_batch(color, viewMatrix, ellipse, GrTest::TestStrokeRec(random)); |
} |
DRAW_BATCH_TEST_DEFINE(DIEllipseBatch) { |
SkMatrix viewMatrix = GrTest::TestMatrix(random); |
GrColor color = GrRandomColor(random); |
- bool useCoverageAA = random->nextBool(); |
SkRect ellipse = GrTest::TestSquare(random); |
- return create_diellipse_batch(color, viewMatrix, useCoverageAA, ellipse, |
- GrTest::TestStrokeRec(random)); |
+ return create_diellipse_batch(color, viewMatrix, ellipse, GrTest::TestStrokeRec(random)); |
} |
DRAW_BATCH_TEST_DEFINE(RRectBatch) { |