| /* | |
| * Copyright 2014 Google Inc. | |
| * | |
| * Use of this source code is governed by a BSD-style license that can be | |
| * found in the LICENSE file. | |
| */ | |
| #include "src/gpu/ganesh/GrProcessorAnalysis.h" | |
| #include "src/gpu/ganesh/GrCaps.h" | |
| #include "src/gpu/ganesh/GrFragmentProcessor.h" | |
| #include "src/gpu/ganesh/GrShaderCaps.h" | |
| GrColorFragmentProcessorAnalysis::GrColorFragmentProcessorAnalysis( | |
| const GrProcessorAnalysisColor& input, | |
| std::unique_ptr<GrFragmentProcessor> const fps[], | |
| int count) { | |
| fCompatibleWithCoverageAsAlpha = true; | |
| fIsOpaque = input.isOpaque(); | |
| fUsesLocalCoords = false; | |
| fWillReadDstColor = false; | |
| fProcessorsToEliminate = 0; | |
| fOutputColorKnown = input.isConstant(&fLastKnownOutputColor); | |
| for (int i = 0; i < count; ++i) { | |
| const GrFragmentProcessor* fp = fps[i].get(); | |
| if (fOutputColorKnown && fp->hasConstantOutputForConstantInput(fLastKnownOutputColor, | |
| &fLastKnownOutputColor)) { | |
| ++fProcessorsToEliminate; | |
| fIsOpaque = fLastKnownOutputColor.isOpaque(); | |
| // We reset these flags since the earlier fragment processors are being eliminated. | |
| fCompatibleWithCoverageAsAlpha = true; | |
| fUsesLocalCoords = false; | |
| fWillReadDstColor = false; | |
| continue; | |
| } | |
| fOutputColorKnown = false; | |
| if (fIsOpaque && !fp->preservesOpaqueInput()) { | |
| fIsOpaque = false; | |
| } | |
| if (fCompatibleWithCoverageAsAlpha && !fp->compatibleWithCoverageAsAlpha()) { | |
| fCompatibleWithCoverageAsAlpha = false; | |
| } | |
| if (fp->usesSampleCoords()) { | |
| fUsesLocalCoords = true; | |
| } | |
| if (fp->willReadDstColor()) { | |
| fWillReadDstColor = true; | |
| } | |
| } | |
| } | |
| bool GrColorFragmentProcessorAnalysis::requiresDstTexture(const GrCaps& caps) const { | |
| return this->willReadDstColor() && !caps.shaderCaps()->fDstReadInShaderSupport; | |
| } |