Revert "Revert "Make it possible to query GrXPFactory for dst texture without GrPipelineAnalysis.""
This reverts commit 3329cceab5feca230df1caee16be045249228dc1.
Reason for revert: Bot failures are unrelated to the original change.
Change-Id: I21b5927dc4384a25930bdefe16e57bcc9276ffa4
Reviewed-on: https://skia-review.googlesource.com/7347
Commit-Queue: Brian Salomon <bsalomon@google.com>
Reviewed-by: Brian Salomon <bsalomon@google.com>
diff --git a/src/gpu/GrXferProcessor.cpp b/src/gpu/GrXferProcessor.cpp
index 7de0d77..d88259d 100644
--- a/src/gpu/GrXferProcessor.cpp
+++ b/src/gpu/GrXferProcessor.cpp
@@ -180,6 +180,40 @@
///////////////////////////////////////////////////////////////////////////////
+using ColorType = GrXPFactory::ColorType;
+using CoverageType = GrXPFactory::CoverageType;
+
+ColorType analysis_color_type(const GrPipelineAnalysis& analysis) {
+ if (analysis.fColorPOI.validFlags() == kRGBA_GrColorComponentFlags) {
+ return GrColorIsOpaque(analysis.fColorPOI.color()) ? ColorType::kOpaqueConstant
+ : ColorType::kConstant;
+ }
+ if ((analysis.fColorPOI.validFlags() & kA_GrColorComponentFlag) &&
+ GrColorIsOpaque(analysis.fColorPOI.color())) {
+ return ColorType::kOpaque;
+ }
+ return ColorType::kUnknown;
+}
+
+CoverageType analysis_coverage_type(const GrPipelineAnalysis& analysis) {
+ if (analysis.fCoveragePOI.isSolidWhite()) {
+ return CoverageType::kNone;
+ }
+ if (analysis.fCoveragePOI.isLCDCoverage()) {
+ return CoverageType::kLCD;
+ }
+ return CoverageType::kSingleChannel;
+}
+
+bool GrXPFactory::willReadDstColor(const GrCaps& caps, const GrPipelineAnalysis& analysis) const {
+ if (analysis.fUsesPLSDstRead) {
+ return true;
+ }
+ ColorType colorType = analysis_color_type(analysis);
+ CoverageType coverageType = analysis_coverage_type(analysis);
+ return this->willReadDstColor(caps, colorType, coverageType);
+}
+
GrXferProcessor* GrXPFactory::createXferProcessor(const GrPipelineAnalysis& analysis,
bool hasMixedSamples,
const DstTexture* dstTexture,
@@ -200,9 +234,6 @@
}
bool GrXPFactory::willNeedDstTexture(const GrCaps& caps, const GrPipelineAnalysis& analysis) const {
- return (this->willReadDstColor(caps, analysis) && !caps.shaderCaps()->dstReadInShaderSupport());
-}
-
-bool GrXPFactory::willReadDstColor(const GrCaps& caps, const GrPipelineAnalysis& analysis) const {
- return analysis.fUsesPLSDstRead || this->onWillReadDstColor(caps, analysis);
+ return !analysis.fUsesPLSDstRead && !caps.shaderCaps()->dstReadInShaderSupport() &&
+ this->willReadDstColor(caps, analysis);
}