|  | /* | 
|  | * 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/GrGeometryProcessor.h" | 
|  | #include "src/gpu/GrProcessorAnalysis.h" | 
|  | #include "src/gpu/ops/GrDrawOp.h" | 
|  |  | 
|  | GrColorFragmentProcessorAnalysis::GrColorFragmentProcessorAnalysis( | 
|  | const GrProcessorAnalysisColor& input, | 
|  | std::unique_ptr<GrFragmentProcessor> const fps[], | 
|  | int cnt) { | 
|  | fCompatibleWithCoverageAsAlpha = true; | 
|  | fIsOpaque = input.isOpaque(); | 
|  | fUsesLocalCoords = false; | 
|  | fProcessorsToEliminate = 0; | 
|  | fKnowOutputColor = input.isConstant(&fLastKnownOutputColor); | 
|  | for (int i = 0; i < cnt; ++i) { | 
|  | if (fUsesLocalCoords && !fKnowOutputColor && !fCompatibleWithCoverageAsAlpha && | 
|  | !fIsOpaque) { | 
|  | break; | 
|  | } | 
|  | const auto& fp = fps[i]; | 
|  | if (fKnowOutputColor && | 
|  | fp->hasConstantOutputForConstantInput(fLastKnownOutputColor, &fLastKnownOutputColor)) { | 
|  | ++fProcessorsToEliminate; | 
|  | fIsOpaque = fLastKnownOutputColor.isOpaque(); | 
|  | // We reset these since the caller is expected to not use the earlier fragment | 
|  | // processors. | 
|  | fCompatibleWithCoverageAsAlpha = true; | 
|  | fUsesLocalCoords = false; | 
|  | } else { | 
|  | fKnowOutputColor = false; | 
|  | if (fIsOpaque && !fp->preservesOpaqueInput()) { | 
|  | fIsOpaque = false; | 
|  | } | 
|  | if (fCompatibleWithCoverageAsAlpha && !fp->compatibleWithCoverageAsAlpha()) { | 
|  | fCompatibleWithCoverageAsAlpha = false; | 
|  | } | 
|  | if (fp->usesVaryingCoords()) { | 
|  | fUsesLocalCoords = true; | 
|  | } | 
|  | } | 
|  | } | 
|  | } |