Use views where needed in CCPR.
Bug: skia:9556
Change-Id: Ib8c97a85ff76d3b2a9b501c2372f60e851cee46f
Reviewed-on: https://skia-review.googlesource.com/c/skia/+/269479
Commit-Queue: Greg Daniel <egdaniel@google.com>
Reviewed-by: Chris Dalton <csmartdalton@google.com>
diff --git a/src/gpu/ccpr/GrCCClipProcessor.cpp b/src/gpu/ccpr/GrCCClipProcessor.cpp
index badbaeb..77ee55d 100644
--- a/src/gpu/ccpr/GrCCClipProcessor.cpp
+++ b/src/gpu/ccpr/GrCCClipProcessor.cpp
@@ -13,20 +13,37 @@
#include "src/gpu/glsl/GrGLSLFragmentProcessor.h"
#include "src/gpu/glsl/GrGLSLFragmentShaderBuilder.h"
-GrCCClipProcessor::GrCCClipProcessor(const GrCCClipPath* clipPath, IsCoverageCount isCoverageCount,
+static GrSurfaceProxyView make_view(const GrCaps& caps, GrSurfaceProxy* proxy,
+ bool isCoverageCount) {
+ GrColorType ct = isCoverageCount ? GrColorType::kAlpha_F16 : GrColorType::kAlpha_8;
+ GrSwizzle swizzle = caps.getReadSwizzle(proxy->backendFormat(), ct);
+ return { sk_ref_sp(proxy), GrCCAtlas::kTextureOrigin, swizzle };
+}
+
+GrCCClipProcessor::GrCCClipProcessor(GrSurfaceProxyView view, const GrCCClipPath* clipPath,
+ IsCoverageCount isCoverageCount,
MustCheckBounds mustCheckBounds)
: INHERITED(kGrCCClipProcessor_ClassID, kCompatibleWithCoverageAsAlpha_OptimizationFlag)
, fClipPath(clipPath)
, fIsCoverageCount(IsCoverageCount::kYes == isCoverageCount)
, fMustCheckBounds(MustCheckBounds::kYes == mustCheckBounds)
- , fAtlasAccess(sk_ref_sp(fClipPath->atlasLazyProxy())) {
- SkASSERT(fAtlasAccess.view().proxy());
+ , fAtlasAccess(std::move(view)) {
+ SkASSERT(fAtlasAccess.view());
this->setTextureSamplerCnt(1);
}
+GrCCClipProcessor::GrCCClipProcessor(const GrCaps& caps, const GrCCClipPath* clipPath,
+ IsCoverageCount isCoverageCount,
+ MustCheckBounds mustCheckBounds)
+ : GrCCClipProcessor(make_view(caps, clipPath->atlasLazyProxy(),
+ IsCoverageCount::kYes == isCoverageCount),
+ clipPath, isCoverageCount, mustCheckBounds) {
+}
+
std::unique_ptr<GrFragmentProcessor> GrCCClipProcessor::clone() const {
return std::make_unique<GrCCClipProcessor>(
- fClipPath, IsCoverageCount(fIsCoverageCount), MustCheckBounds(fMustCheckBounds));
+ fAtlasAccess.view(), fClipPath, IsCoverageCount(fIsCoverageCount),
+ MustCheckBounds(fMustCheckBounds));
}
void GrCCClipProcessor::onGetGLSLProcessorKey(const GrShaderCaps&, GrProcessorKeyBuilder* b) const {
diff --git a/src/gpu/ccpr/GrCCClipProcessor.h b/src/gpu/ccpr/GrCCClipProcessor.h
index 0a719f8..d7eae5e 100644
--- a/src/gpu/ccpr/GrCCClipProcessor.h
+++ b/src/gpu/ccpr/GrCCClipProcessor.h
@@ -24,7 +24,8 @@
kYes = true
};
- GrCCClipProcessor(const GrCCClipPath*, IsCoverageCount, MustCheckBounds);
+ GrCCClipProcessor(GrSurfaceProxyView, const GrCCClipPath*, IsCoverageCount, MustCheckBounds);
+ GrCCClipProcessor(const GrCaps&, const GrCCClipPath*, IsCoverageCount, MustCheckBounds);
const char* name() const override { return "GrCCClipProcessor"; }
std::unique_ptr<GrFragmentProcessor> clone() const override;
diff --git a/src/gpu/ccpr/GrCCDrawPathsOp.cpp b/src/gpu/ccpr/GrCCDrawPathsOp.cpp
index 3ce17ae..4d4aa98 100644
--- a/src/gpu/ccpr/GrCCDrawPathsOp.cpp
+++ b/src/gpu/ccpr/GrCCDrawPathsOp.cpp
@@ -450,9 +450,10 @@
GrSurfaceProxy* atlas = range.fAtlasProxy;
if (atlas->isInstantiated()) { // Instantiation can fail in exceptional circumstances.
- GrCCPathProcessor pathProc(range.fCoverageMode, atlas->peekTexture(),
- atlas->textureSwizzle(), atlas->origin(),
- fViewMatrixIfUsingLocalCoords);
+ GrColorType ct = GrCCPathProcessor::GetColorTypeFromCoverageMode(range.fCoverageMode);
+ GrSwizzle swizzle = flushState->caps().getReadSwizzle(atlas->backendFormat(), ct);
+ GrCCPathProcessor pathProc(range.fCoverageMode, atlas->peekTexture(), swizzle,
+ GrCCAtlas::kTextureOrigin, fViewMatrixIfUsingLocalCoords);
fixedDynamicState.fPrimitiveProcessorTextures = &atlas;
pathProc.drawPaths(flushState, pipeline, &fixedDynamicState, *resources, baseInstance,
range.fEndInstanceIdx, this->bounds());
diff --git a/src/gpu/ccpr/GrCCPathProcessor.h b/src/gpu/ccpr/GrCCPathProcessor.h
index 5273607..f9361e9 100644
--- a/src/gpu/ccpr/GrCCPathProcessor.h
+++ b/src/gpu/ccpr/GrCCPathProcessor.h
@@ -53,6 +53,11 @@
kLiteral
};
+ static GrColorType GetColorTypeFromCoverageMode(CoverageMode mode) {
+ return mode == CoverageMode::kCoverageCount ? GrColorType::kAlpha_F16
+ : GrColorType::kAlpha_8;
+ }
+
GrCCPathProcessor(CoverageMode, const GrTexture* atlasTexture, const GrSwizzle&,
GrSurfaceOrigin atlasOrigin,
const SkMatrix& viewMatrixIfUsingLocalCoords = SkMatrix::I());
diff --git a/src/gpu/ccpr/GrCCPerFlushResources.cpp b/src/gpu/ccpr/GrCCPerFlushResources.cpp
index a7ebf66..dc57803 100644
--- a/src/gpu/ccpr/GrCCPerFlushResources.cpp
+++ b/src/gpu/ccpr/GrCCPerFlushResources.cpp
@@ -87,8 +87,10 @@
auto coverageMode = GrCCAtlas::CoverageTypeToPathCoverageMode(
fResources->renderedPathCoverageType());
- GrCCPathProcessor pathProc(coverageMode, srcProxy->peekTexture(),
- srcProxy->textureSwizzle(), srcProxy->origin());
+ GrColorType ct = GrCCAtlas::CoverageTypeToColorType(fResources->renderedPathCoverageType());
+ GrSwizzle swizzle = flushState->caps().getReadSwizzle(srcProxy->backendFormat(), ct);
+ GrCCPathProcessor pathProc(coverageMode, srcProxy->peekTexture(), swizzle,
+ GrCCAtlas::kTextureOrigin);
GrPipeline pipeline(GrScissorTest::kDisabled, SkBlendMode::kSrc,
flushState->drawOpArgs().outputSwizzle());
diff --git a/src/gpu/ccpr/GrCoverageCountingPathRenderer.cpp b/src/gpu/ccpr/GrCoverageCountingPathRenderer.cpp
index 9ed9c10..bede7b6 100644
--- a/src/gpu/ccpr/GrCoverageCountingPathRenderer.cpp
+++ b/src/gpu/ccpr/GrCoverageCountingPathRenderer.cpp
@@ -223,7 +223,7 @@
CoverageType::kFP16_CoverageCount == fCoverageType);
auto mustCheckBounds = GrCCClipProcessor::MustCheckBounds(
!clipPath.pathDevIBounds().contains(accessRect));
- return std::make_unique<GrCCClipProcessor>(&clipPath, isCoverageCount, mustCheckBounds);
+ return std::make_unique<GrCCClipProcessor>(caps, &clipPath, isCoverageCount, mustCheckBounds);
}
void GrCoverageCountingPathRenderer::preFlush(