Index: src/gpu/effects/GrDashingEffect.cpp |
diff --git a/src/gpu/effects/GrDashingEffect.cpp b/src/gpu/effects/GrDashingEffect.cpp |
index 8a38ebe5733e4a69362b07f5397330fa63b9af19..8a7cb5edc4b0ca03afa4aceea0cb6278be99b594 100644 |
--- a/src/gpu/effects/GrDashingEffect.cpp |
+++ b/src/gpu/effects/GrDashingEffect.cpp |
@@ -26,6 +26,8 @@ |
#include "glsl/GrGLSLVarying.h" |
#include "glsl/GrGLSLVertexShaderBuilder.h" |
+using AAMode = GrDashingEffect::AAMode; |
+ |
/////////////////////////////////////////////////////////////////////////////// |
// Returns whether or not the gpu can fast path the dash line effect. |
@@ -74,14 +76,6 @@ struct DashCircleVertex { |
SkScalar fRadius; |
SkScalar fCenterX; |
}; |
- |
-enum DashAAMode { |
- kBW_DashAAMode, |
- kEdgeAA_DashAAMode, |
- kMSAA_DashAAMode, |
- |
- kDashAAModeCount, |
-}; |
}; |
static void calc_dash_scaling(SkScalar* parallelScale, SkScalar* perpScale, |
@@ -239,7 +233,7 @@ static void setup_dashed_rect_pos(const SkRect& rect, int idx, const SkMatrix& m |
* position relative to the dashed line. |
*/ |
static GrGeometryProcessor* create_dash_gp(GrColor, |
- DashAAMode aaMode, |
+ AAMode aaMode, |
DashCap cap, |
const SkMatrix& localMatrix, |
bool usesLocalCoords); |
@@ -247,7 +241,6 @@ static GrGeometryProcessor* create_dash_gp(GrColor, |
class DashBatch : public GrVertexBatch { |
public: |
DEFINE_BATCH_CLASS_ID |
- |
struct Geometry { |
SkMatrix fViewMatrix; |
SkMatrix fSrcRotInv; |
@@ -260,7 +253,7 @@ public: |
GrColor fColor; |
}; |
- static GrDrawBatch* Create(const Geometry& geometry, SkPaint::Cap cap, DashAAMode aaMode, |
+ static GrDrawBatch* Create(const Geometry& geometry, SkPaint::Cap cap, AAMode aaMode, |
bool fullDash) { |
return new DashBatch(geometry, cap, aaMode, fullDash); |
} |
@@ -278,7 +271,7 @@ public: |
SkSTArray<1, Geometry, true>* geoData() { return &fGeoData; } |
private: |
- DashBatch(const Geometry& geometry, SkPaint::Cap cap, DashAAMode aaMode, bool fullDash) |
+ DashBatch(const Geometry& geometry, SkPaint::Cap cap, AAMode aaMode, bool fullDash) |
: INHERITED(ClassID()) { |
fGeoData.push_back(geometry); |
@@ -359,7 +352,7 @@ private: |
} |
// useAA here means Edge AA or MSAA |
- bool useAA = this->aaMode() != kBW_DashAAMode; |
+ bool useAA = this->aaMode() != AAMode::kNone; |
bool fullDash = this->fullDash(); |
// We do two passes over all of the dashes. First we setup the start, end, and bounds, |
@@ -486,9 +479,13 @@ private: |
// For EdgeAA, we bloat in X & Y for both square and round caps. |
// For MSAA, we don't bloat at all for square caps, and bloat in Y only for round caps. |
- SkScalar devBloatX = this->aaMode() == kEdgeAA_DashAAMode ? 0.5f : 0.0f; |
- SkScalar devBloatY = (SkPaint::kRound_Cap == cap && this->aaMode() == kMSAA_DashAAMode) |
- ? 0.5f : devBloatX; |
+ SkScalar devBloatX = this->aaMode() == AAMode::kCoverage ? 0.5f : 0.0f; |
+ SkScalar devBloatY; |
+ if (SkPaint::kRound_Cap == cap && this->aaMode() == AAMode::kCoverageWithMSAA) { |
+ devBloatY = 0.5f; |
+ } else { |
+ devBloatY = devBloatX; |
+ } |
SkScalar bloatX = devBloatX / args.fParallelScale; |
SkScalar bloatY = devBloatY / args.fPerpendicularScale; |
@@ -665,7 +662,7 @@ private: |
GrColor color() const { return fBatch.fColor; } |
bool usesLocalCoords() const { return fBatch.fUsesLocalCoords; } |
const SkMatrix& viewMatrix() const { return fGeoData[0].fViewMatrix; } |
- DashAAMode aaMode() const { return fBatch.fAAMode; } |
+ AAMode aaMode() const { return fBatch.fAAMode; } |
bool fullDash() const { return fBatch.fFullDash; } |
SkPaint::Cap cap() const { return fBatch.fCap; } |
bool coverageIgnored() const { return fBatch.fCoverageIgnored; } |
@@ -676,7 +673,7 @@ private: |
bool fColorIgnored; |
bool fCoverageIgnored; |
SkPaint::Cap fCap; |
- DashAAMode fAAMode; |
+ AAMode fAAMode; |
bool fFullDash; |
}; |
@@ -689,8 +686,11 @@ private: |
typedef GrVertexBatch INHERITED; |
}; |
-static GrDrawBatch* create_batch(GrColor color, const SkMatrix& viewMatrix, const SkPoint pts[2], |
- bool useAA, const GrStyle& style, bool msaaRT) { |
+GrDrawBatch* GrDashingEffect::CreateDashLineBatch(GrColor color, |
+ const SkMatrix& viewMatrix, |
+ const SkPoint pts[2], |
+ AAMode aaMode, |
+ const GrStyle& style) { |
SkASSERT(GrDashingEffect::CanDrawDashLine(pts, style, viewMatrix)); |
const SkScalar* intervals = style.dashIntervals(); |
SkScalar phase = style.dashPhase(); |
@@ -728,11 +728,8 @@ static GrDrawBatch* create_batch(GrColor color, const SkMatrix& viewMatrix, cons |
offInterval -= strokeWidth; |
} |
- DashAAMode aaMode = msaaRT ? kMSAA_DashAAMode : |
- useAA ? kEdgeAA_DashAAMode : kBW_DashAAMode; |
- |
// TODO we can do a real rect call if not using fulldash(ie no off interval, not using AA) |
- bool fullDash = offInterval > 0.f || aaMode != kBW_DashAAMode; |
+ bool fullDash = offInterval > 0.f || aaMode != AAMode::kNone; |
geometry.fColor = color; |
geometry.fViewMatrix = viewMatrix; |
@@ -743,15 +740,6 @@ static GrDrawBatch* create_batch(GrColor color, const SkMatrix& viewMatrix, cons |
return DashBatch::Create(geometry, cap, aaMode, fullDash); |
} |
-GrDrawBatch* GrDashingEffect::CreateDashLineBatch(GrColor color, |
- const SkMatrix& viewMatrix, |
- const SkPoint pts[2], |
- bool useAA, |
- bool msaaIsEnabled, |
- const GrStyle& style) { |
- return create_batch(color, viewMatrix, pts, useAA, style, msaaIsEnabled); |
-} |
- |
////////////////////////////////////////////////////////////////////////////// |
class GLDashingCircleEffect; |
@@ -770,7 +758,7 @@ public: |
typedef SkPathEffect::DashInfo DashInfo; |
static GrGeometryProcessor* Create(GrColor, |
- DashAAMode aaMode, |
+ AAMode aaMode, |
const SkMatrix& localMatrix, |
bool usesLocalCoords); |
@@ -782,7 +770,7 @@ public: |
const Attribute* inCircleParams() const { return fInCircleParams; } |
- DashAAMode aaMode() const { return fAAMode; } |
+ AAMode aaMode() const { return fAAMode; } |
GrColor color() const { return fColor; } |
@@ -797,13 +785,13 @@ public: |
GrGLSLPrimitiveProcessor* createGLSLInstance(const GrGLSLCaps&) const override; |
private: |
- DashingCircleEffect(GrColor, DashAAMode aaMode, const SkMatrix& localMatrix, |
+ DashingCircleEffect(GrColor, AAMode aaMode, const SkMatrix& localMatrix, |
bool usesLocalCoords); |
GrColor fColor; |
SkMatrix fLocalMatrix; |
bool fUsesLocalCoords; |
- DashAAMode fAAMode; |
+ AAMode fAAMode; |
const Attribute* fInPosition; |
const Attribute* fInDashParams; |
const Attribute* fInCircleParams; |
@@ -896,7 +884,7 @@ void GLDashingCircleEffect::onEmitCode(EmitArgs& args, GrGPArgs* gpArgs) { |
fragBuilder->codeAppendf("vec2 fragPosShifted = vec2(xShifted, %s.y);", dashParams.fsIn()); |
fragBuilder->codeAppendf("vec2 center = vec2(%s.y, 0.0);", circleParams.fsIn()); |
fragBuilder->codeAppend("float dist = length(center - fragPosShifted);"); |
- if (dce.aaMode() != kBW_DashAAMode) { |
+ if (dce.aaMode() != AAMode::kNone) { |
fragBuilder->codeAppendf("float diff = dist - %s.x;", circleParams.fsIn()); |
fragBuilder->codeAppend("diff = 1.0 - diff;"); |
fragBuilder->codeAppend("float alpha = clamp(diff, 0.0, 1.0);"); |
@@ -925,14 +913,14 @@ void GLDashingCircleEffect::GenKey(const GrGeometryProcessor& gp, |
uint32_t key = 0; |
key |= dce.usesLocalCoords() && dce.localMatrix().hasPerspective() ? 0x1 : 0x0; |
key |= dce.colorIgnored() ? 0x2 : 0x0; |
- key |= dce.aaMode() << 8; |
+ key |= static_cast<uint32_t>(dce.aaMode()) << 8; |
b->add32(key); |
} |
////////////////////////////////////////////////////////////////////////////// |
GrGeometryProcessor* DashingCircleEffect::Create(GrColor color, |
- DashAAMode aaMode, |
+ AAMode aaMode, |
const SkMatrix& localMatrix, |
bool usesLocalCoords) { |
return new DashingCircleEffect(color, aaMode, localMatrix, usesLocalCoords); |
@@ -948,7 +936,7 @@ GrGLSLPrimitiveProcessor* DashingCircleEffect::createGLSLInstance(const GrGLSLCa |
} |
DashingCircleEffect::DashingCircleEffect(GrColor color, |
- DashAAMode aaMode, |
+ AAMode aaMode, |
const SkMatrix& localMatrix, |
bool usesLocalCoords) |
: fColor(color) |
@@ -965,7 +953,7 @@ DashingCircleEffect::DashingCircleEffect(GrColor color, |
GR_DEFINE_GEOMETRY_PROCESSOR_TEST(DashingCircleEffect); |
const GrGeometryProcessor* DashingCircleEffect::TestCreate(GrProcessorTestData* d) { |
- DashAAMode aaMode = static_cast<DashAAMode>(d->fRandom->nextULessThan(kDashAAModeCount)); |
+ AAMode aaMode = static_cast<AAMode>(d->fRandom->nextULessThan(GrDashingEffect::kAAModeCnt)); |
return DashingCircleEffect::Create(GrRandomColor(d->fRandom), |
aaMode, GrTest::TestMatrix(d->fRandom), |
d->fRandom->nextBool()); |
@@ -989,7 +977,7 @@ public: |
typedef SkPathEffect::DashInfo DashInfo; |
static GrGeometryProcessor* Create(GrColor, |
- DashAAMode aaMode, |
+ AAMode aaMode, |
const SkMatrix& localMatrix, |
bool usesLocalCoords); |
@@ -1001,7 +989,7 @@ public: |
const Attribute* inRectParams() const { return fInRectParams; } |
- DashAAMode aaMode() const { return fAAMode; } |
+ AAMode aaMode() const { return fAAMode; } |
GrColor color() const { return fColor; } |
@@ -1016,13 +1004,13 @@ public: |
GrGLSLPrimitiveProcessor* createGLSLInstance(const GrGLSLCaps&) const override; |
private: |
- DashingLineEffect(GrColor, DashAAMode aaMode, const SkMatrix& localMatrix, |
+ DashingLineEffect(GrColor, AAMode aaMode, const SkMatrix& localMatrix, |
bool usesLocalCoords); |
GrColor fColor; |
SkMatrix fLocalMatrix; |
bool fUsesLocalCoords; |
- DashAAMode fAAMode; |
+ AAMode fAAMode; |
const Attribute* fInPosition; |
const Attribute* fInDashParams; |
const Attribute* fInRectParams; |
@@ -1108,7 +1096,7 @@ void GLDashingLineEffect::onEmitCode(EmitArgs& args, GrGPArgs* gpArgs) { |
inDashParams.fsIn(), inDashParams.fsIn(), inDashParams.fsIn(), |
inDashParams.fsIn()); |
fragBuilder->codeAppendf("vec2 fragPosShifted = vec2(xShifted, %s.y);", inDashParams.fsIn()); |
- if (de.aaMode() == kEdgeAA_DashAAMode) { |
+ if (de.aaMode() == AAMode::kCoverage) { |
// The amount of coverage removed in x and y by the edges is computed as a pair of negative |
// numbers, xSub and ySub. |
fragBuilder->codeAppend("float xSub, ySub;"); |
@@ -1120,7 +1108,7 @@ void GLDashingLineEffect::onEmitCode(EmitArgs& args, GrGPArgs* gpArgs) { |
// covered. |
fragBuilder->codeAppendf( |
"float alpha = (1.0 + max(xSub, -1.0)) * (1.0 + max(ySub, -1.0));"); |
- } else if (de.aaMode() == kMSAA_DashAAMode) { |
+ } else if (de.aaMode() == AAMode::kCoverageWithMSAA) { |
// For MSAA, we don't modulate the alpha by the Y distance, since MSAA coverage will handle |
// AA on the the top and bottom edges. The shader is only responsible for intra-dash alpha. |
fragBuilder->codeAppend("float xSub;"); |
@@ -1157,14 +1145,14 @@ void GLDashingLineEffect::GenKey(const GrGeometryProcessor& gp, |
uint32_t key = 0; |
key |= de.usesLocalCoords() && de.localMatrix().hasPerspective() ? 0x1 : 0x0; |
key |= de.colorIgnored() ? 0x2 : 0x0; |
- key |= de.aaMode() << 8; |
+ key |= static_cast<int>(de.aaMode()) << 8; |
b->add32(key); |
} |
////////////////////////////////////////////////////////////////////////////// |
GrGeometryProcessor* DashingLineEffect::Create(GrColor color, |
- DashAAMode aaMode, |
+ AAMode aaMode, |
const SkMatrix& localMatrix, |
bool usesLocalCoords) { |
return new DashingLineEffect(color, aaMode, localMatrix, usesLocalCoords); |
@@ -1180,7 +1168,7 @@ GrGLSLPrimitiveProcessor* DashingLineEffect::createGLSLInstance(const GrGLSLCaps |
} |
DashingLineEffect::DashingLineEffect(GrColor color, |
- DashAAMode aaMode, |
+ AAMode aaMode, |
const SkMatrix& localMatrix, |
bool usesLocalCoords) |
: fColor(color) |
@@ -1196,7 +1184,7 @@ DashingLineEffect::DashingLineEffect(GrColor color, |
GR_DEFINE_GEOMETRY_PROCESSOR_TEST(DashingLineEffect); |
const GrGeometryProcessor* DashingLineEffect::TestCreate(GrProcessorTestData* d) { |
- DashAAMode aaMode = static_cast<DashAAMode>(d->fRandom->nextULessThan(kDashAAModeCount)); |
+ AAMode aaMode = static_cast<AAMode>(d->fRandom->nextULessThan(GrDashingEffect::kAAModeCnt)); |
return DashingLineEffect::Create(GrRandomColor(d->fRandom), |
aaMode, GrTest::TestMatrix(d->fRandom), |
d->fRandom->nextBool()); |
@@ -1205,7 +1193,7 @@ const GrGeometryProcessor* DashingLineEffect::TestCreate(GrProcessorTestData* d) |
////////////////////////////////////////////////////////////////////////////// |
static GrGeometryProcessor* create_dash_gp(GrColor color, |
- DashAAMode dashAAMode, |
+ AAMode aaMode, |
DashCap cap, |
const SkMatrix& viewMatrix, |
bool usesLocalCoords) { |
@@ -1217,9 +1205,9 @@ static GrGeometryProcessor* create_dash_gp(GrColor color, |
switch (cap) { |
case kRound_DashCap: |
- return DashingCircleEffect::Create(color, dashAAMode, invert, usesLocalCoords); |
+ return DashingCircleEffect::Create(color, aaMode, invert, usesLocalCoords); |
case kNonRound_DashCap: |
- return DashingLineEffect::Create(color, dashAAMode, invert, usesLocalCoords); |
+ return DashingLineEffect::Create(color, aaMode, invert, usesLocalCoords); |
} |
return nullptr; |
} |
@@ -1231,8 +1219,7 @@ static GrGeometryProcessor* create_dash_gp(GrColor color, |
DRAW_BATCH_TEST_DEFINE(DashBatch) { |
GrColor color = GrRandomColor(random); |
SkMatrix viewMatrix = GrTest::TestMatrixPreservesRightAngles(random); |
- bool useAA = random->nextBool(); |
- bool msaaRT = random->nextBool(); |
+ AAMode aaMode = static_cast<AAMode>(random->nextULessThan(GrDashingEffect::kAAModeCnt)); |
// We can only dash either horizontal or vertical lines |
SkPoint pts[2]; |
@@ -1294,7 +1281,7 @@ DRAW_BATCH_TEST_DEFINE(DashBatch) { |
GrStyle style(p); |
- return create_batch(color, viewMatrix, pts, useAA, style, msaaRT); |
+ return GrDashingEffect::CreateDashLineBatch(color, viewMatrix, pts, aaMode, style); |
} |
#endif |