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/GrCCConicShader.cpp b/src/gpu/ccpr/GrCCConicShader.cpp
index cfd4eec..82a1560 100644
--- a/src/gpu/ccpr/GrCCConicShader.cpp
+++ b/src/gpu/ccpr/GrCCConicShader.cpp
@@ -52,13 +52,18 @@
         const char* position, const char* coverage, const char* cornerCoverage, const char* wind) {
     code->appendf("float3 klm = float3(%s - %s, 1) * %s;",
                   position, fControlPoint.c_str(), fKLMMatrix.c_str());
-    fKLM_fWind.reset(kFloat4_GrSLType, scope);
-    varyingHandler->addVarying("klm_and_wind", &fKLM_fWind);
+    if (coverage) {
+        fKLM_fWind.reset(kFloat4_GrSLType, scope);
+        varyingHandler->addVarying("klm_and_wind", &fKLM_fWind);
+        code->appendf("%s.w = %s;", OutName(fKLM_fWind), wind);
+    } else {
+        fKLM_fWind.reset(kFloat3_GrSLType, scope);
+        varyingHandler->addVarying("klm", &fKLM_fWind);
+    }
     code->appendf("%s.xyz = klm;", OutName(fKLM_fWind));
-    code->appendf("%s.w = %s;", OutName(fKLM_fWind), wind);
 
     fGrad_fCorner.reset(cornerCoverage ? kFloat4_GrSLType : kFloat2_GrSLType, scope);
-    varyingHandler->addVarying(cornerCoverage ? "grad_and_corner" : "grad", &fGrad_fCorner);
+    varyingHandler->addVarying((cornerCoverage) ? "grad_and_corner" : "grad", &fGrad_fCorner);
     code->appendf("%s.xy = 2*bloat * (float3x2(%s) * float3(2*klm[0], -klm[2], -klm[1]));",
                   OutName(fGrad_fCorner), fKLMMatrix.c_str());
 
@@ -71,8 +76,8 @@
     }
 }
 
-void GrCCConicShader::onEmitFragmentCode(GrGLSLFPFragmentBuilder* f,
-                                         const char* outputCoverage) const {
+void GrCCConicShader::emitFragmentCoverageCode(
+        GrGLSLFPFragmentBuilder* f, const char* outputCoverage) const {
     this->calcHullCoverage(&AccessCodeString(f), fKLM_fWind.fsIn(), fGrad_fCorner.fsIn(),
                            outputCoverage);
     f->codeAppendf("%s *= half(%s.w);", outputCoverage, fKLM_fWind.fsIn());  // Wind.
@@ -95,3 +100,11 @@
     // Total hull coverage.
     code->appendf("%s = max(half(curve_coverage + edge_coverage), 0);", outputCoverage);
 }
+
+void GrCCConicShader::emitSampleMaskCode(GrGLSLFPFragmentBuilder* f) const {
+    f->codeAppendf("float k = %s.x, l = %s.y, m = %s.z;",
+                   fKLM_fWind.fsIn(), fKLM_fWind.fsIn(), fKLM_fWind.fsIn());
+    f->codeAppendf("float f = k*k - l*m;");
+    f->codeAppendf("float2 grad = %s;", fGrad_fCorner.fsIn());
+    f->applyFnToMultisampleMask("f", "grad", GrGLSLFPFragmentBuilder::ScopeFlags::kTopLevel);
+}