ccpr: Add an MSAA atlas mode
Adds the option to use a multisampled (or mixed sampled) atlas, and
uses the sample mask and stencil buffer instead of coverage counts.
Bug: skia:
Change-Id: I9fb76d17895ae25208124f6c27e37977ac31b5eb
Reviewed-on: https://skia-review.googlesource.com/c/skia/+/227428
Commit-Queue: Chris Dalton <csmartdalton@google.com>
Reviewed-by: Brian Salomon <bsalomon@google.com>
diff --git a/src/gpu/ccpr/GrCCQuadraticShader.cpp b/src/gpu/ccpr/GrCCQuadraticShader.cpp
index 5ad7d55..5012e3c 100644
--- a/src/gpu/ccpr/GrCCQuadraticShader.cpp
+++ b/src/gpu/ccpr/GrCCQuadraticShader.cpp
@@ -42,11 +42,14 @@
code->appendf("%s.zw = 2*bloat * float2(2 * %s.x, -1) * %s;", // Gradient.
OutName(fCoord_fGrad), OutName(fCoord_fGrad), fQCoordMatrix.c_str());
- // Coverages need full precision since distance to the opposite edge can be large.
- fEdge_fWind_fCorner.reset(cornerCoverage ? kFloat4_GrSLType : kFloat2_GrSLType, scope);
- varyingHandler->addVarying("edge_and_wind_and_corner", &fEdge_fWind_fCorner);
- code->appendf("%s.x = %s;", OutName(fEdge_fWind_fCorner), coverage);
- code->appendf("%s.y = %s;", OutName(fEdge_fWind_fCorner), wind);
+ if (coverage) {
+ // Coverages need full precision since distance to the opposite edge can be large.
+ fEdge_fWind_fCorner.reset((cornerCoverage) ? kFloat4_GrSLType : kFloat2_GrSLType, scope);
+ varyingHandler->addVarying((cornerCoverage) ? "edge_and_wind_and_corner" : "edge_and_wind",
+ &fEdge_fWind_fCorner);
+ code->appendf("%s.x = %s;", OutName(fEdge_fWind_fCorner), coverage);
+ code->appendf("%s.y = %s;", OutName(fEdge_fWind_fCorner), wind);
+ }
if (cornerCoverage) {
SkASSERT(coverage);
@@ -57,7 +60,7 @@
}
}
-void GrCCQuadraticShader::onEmitFragmentCode(
+void GrCCQuadraticShader::emitFragmentCoverageCode(
GrGLSLFPFragmentBuilder* f, const char* outputCoverage) const {
this->calcHullCoverage(&AccessCodeString(f), fCoord_fGrad.fsIn(),
SkStringPrintf("%s.x", fEdge_fWind_fCorner.fsIn()).c_str(),
@@ -83,3 +86,10 @@
// Total hull coverage.
code->appendf("%s = max(half(curve_coverage + edge_coverage), 0);", outputCoverage);
}
+
+void GrCCQuadraticShader::emitSampleMaskCode(GrGLSLFPFragmentBuilder* f) const {
+ f->codeAppendf("float x = %s.x, y = %s.y;", fCoord_fGrad.fsIn(), fCoord_fGrad.fsIn());
+ f->codeAppendf("float f = x*x - y;");
+ f->codeAppendf("float2 grad = %s.zw;", fCoord_fGrad.fsIn());
+ f->applyFnToMultisampleMask("f", "grad", GrGLSLFPFragmentBuilder::ScopeFlags::kTopLevel);
+}