aboutsummaryrefslogtreecommitdiffhomepage
path: root/src/gpu/GrRenderTargetContext.cpp
diff options
context:
space:
mode:
authorGravatar Brian Salomon <bsalomon@google.com>2018-01-12 12:06:06 -0500
committerGravatar Skia Commit-Bot <skia-commit-bot@chromium.org>2018-01-12 19:31:03 +0000
commit7cdabedc8b73b70e4aa70c5621a4bdc8e00ede44 (patch)
tree3068170ce9076b048fc322546be948a6f2eb9381 /src/gpu/GrRenderTargetContext.cpp
parent1001f843a45e95f6df1d44242b6b06c77898e870 (diff)
Use GrOvalOpFactory ops to draw non-AA rrects, ovals, and arcs.
This improves performance. Bug: skia: Change-Id: Ie01170ec084be66ea166b2baffcdb415583aa523 Reviewed-on: https://skia-review.googlesource.com/93321 Commit-Queue: Brian Salomon <bsalomon@google.com> Reviewed-by: Greg Daniel <egdaniel@google.com>
Diffstat (limited to 'src/gpu/GrRenderTargetContext.cpp')
-rw-r--r--src/gpu/GrRenderTargetContext.cpp75
1 files changed, 55 insertions, 20 deletions
diff --git a/src/gpu/GrRenderTargetContext.cpp b/src/gpu/GrRenderTargetContext.cpp
index b0b117f914..16d8e1bbbd 100644
--- a/src/gpu/GrRenderTargetContext.cpp
+++ b/src/gpu/GrRenderTargetContext.cpp
@@ -99,6 +99,7 @@ private:
//////////////////////////////////////////////////////////////////////////////
GrAAType GrChooseAAType(GrAA aa, GrFSAAType fsaaType, GrAllowMixedSamples allowMixedSamples,
+ GrAllowNonAABinaryCoverage allowNonAABinaryCoverage, const GrPaint* paint,
const GrCaps& caps) {
if (GrAA::kNo == aa) {
// On some devices we cannot disable MSAA if it is enabled so we make the AA type reflect
@@ -106,6 +107,34 @@ GrAAType GrChooseAAType(GrAA aa, GrFSAAType fsaaType, GrAllowMixedSamples allowM
if (fsaaType == GrFSAAType::kUnifiedMSAA && !caps.multisampleDisableSupport()) {
return GrAAType::kMSAA;
}
+ if (GrAllowNonAABinaryCoverage::kYes == allowNonAABinaryCoverage) {
+ SkASSERT(paint);
+ // If we already have a coverage FP then we won't make anything worse.
+ if (paint->numCoverageFragmentProcessors()) {
+ return GrAAType::kCoverage;
+ }
+ // Shader based blending isn't so expensive with these extensions.
+ if (caps.shaderCaps()->fbFetchSupport() || caps.textureBarrierSupport()) {
+ return GrAAType::kCoverage;
+ }
+ SkBlendMode mode;
+ if (GrXPFactory::AsBlendMode(paint->getXPFactory(), &mode)) {
+ // If we have dual source blending then all Porter-Duff modes can use HW blending
+ // with coverage.
+ if (mode <= SkBlendMode::kLastCoeffMode &&
+ caps.shaderCaps()->dualSourceBlendingSupport()) {
+ return GrAAType::kCoverage;
+ }
+ if (SkBlendMode_SupportsCoverageAsAlpha(mode)) {
+ return GrAAType::kCoverage;
+ }
+ // If the mode is "advanced" then either we will already be doing dst copies or we
+ // have advanced blending support and it is ok to conflate coverage with alpha.
+ if (mode > SkBlendMode::kLastCoeffMode) {
+ return GrAAType::kCoverage;
+ }
+ }
+ }
return GrAAType::kNone;
}
switch (fsaaType) {
@@ -915,14 +944,16 @@ void GrRenderTargetContext::drawRRect(const GrClip& origClip,
AutoCheckFlush acf(this->drawingManager());
const SkStrokeRec stroke = style.strokeRec();
- GrAAType aaType = this->chooseAAType(aa, GrAllowMixedSamples::kNo);
+ GrAAType aaType = this->chooseAAType(aa, GrAllowMixedSamples::kNo,
+ GrAllowNonAABinaryCoverage::kYes, &paint);
if (GrAAType::kCoverage == aaType) {
const GrShaderCaps* shaderCaps = fContext->caps()->shaderCaps();
- std::unique_ptr<GrDrawOp> op = GrOvalOpFactory::MakeRRectOp(std::move(paint),
- viewMatrix,
- rrect,
- stroke,
- shaderCaps);
+ std::unique_ptr<GrDrawOp> op = GrOvalOpFactory::MakeCoverageRRectOp(std::move(paint),
+ aa,
+ viewMatrix,
+ rrect,
+ stroke,
+ shaderCaps);
if (op) {
this->addDrawOp(*clip, std::move(op));
return;
@@ -1186,8 +1217,9 @@ bool GrRenderTargetContext::drawFilledDRRect(const GrClip& clip,
auto circleBounds = SkRect::MakeLTRB(cx - avgR, cy - avgR, cx + avgR, cy + avgR);
SkStrokeRec stroke(SkStrokeRec::kFill_InitStyle);
stroke.setStrokeStyle(outerR - innerR);
- auto op = GrOvalOpFactory::MakeOvalOp(std::move(paint), viewMatrix, circleBounds,
- stroke, this->caps()->shaderCaps());
+ auto op = GrOvalOpFactory::MakeCoverageOvalOp(std::move(paint), aa, viewMatrix,
+ circleBounds, stroke,
+ this->caps()->shaderCaps());
if (op) {
this->addDrawOp(clip, std::move(op));
return true;
@@ -1328,11 +1360,12 @@ void GrRenderTargetContext::drawOval(const GrClip& clip,
AutoCheckFlush acf(this->drawingManager());
const SkStrokeRec& stroke = style.strokeRec();
- GrAAType aaType = this->chooseAAType(aa, GrAllowMixedSamples::kNo);
+ GrAAType aaType = this->chooseAAType(aa, GrAllowMixedSamples::kNo,
+ GrAllowNonAABinaryCoverage::kYes, &paint);
if (GrAAType::kCoverage == aaType) {
const GrShaderCaps* shaderCaps = fContext->caps()->shaderCaps();
- std::unique_ptr<GrDrawOp> op =
- GrOvalOpFactory::MakeOvalOp(std::move(paint), viewMatrix, oval, stroke, shaderCaps);
+ std::unique_ptr<GrDrawOp> op = GrOvalOpFactory::MakeCoverageOvalOp(
+ std::move(paint), aa, viewMatrix, oval, stroke, shaderCaps);
if (op) {
this->addDrawOp(clip, std::move(op));
return;
@@ -1359,17 +1392,19 @@ void GrRenderTargetContext::drawArc(const GrClip& clip,
AutoCheckFlush acf(this->drawingManager());
- GrAAType aaType = this->chooseAAType(aa, GrAllowMixedSamples::kNo);
+ GrAAType aaType = this->chooseAAType(aa, GrAllowMixedSamples::kNo,
+ GrAllowNonAABinaryCoverage::kYes, &paint);
if (GrAAType::kCoverage == aaType) {
const GrShaderCaps* shaderCaps = fContext->caps()->shaderCaps();
- std::unique_ptr<GrDrawOp> op = GrOvalOpFactory::MakeArcOp(std::move(paint),
- viewMatrix,
- oval,
- startAngle,
- sweepAngle,
- useCenter,
- style,
- shaderCaps);
+ std::unique_ptr<GrDrawOp> op = GrOvalOpFactory::MakeCoverageArcOp(std::move(paint),
+ aa,
+ viewMatrix,
+ oval,
+ startAngle,
+ sweepAngle,
+ useCenter,
+ style,
+ shaderCaps);
if (op) {
this->addDrawOp(clip, std::move(op));
return;