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);
+}