/* * 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 "GrProcessorAnalysis.h" #include "GrGeometryProcessor.h" #include "ops/GrDrawOp.h" GrColorFragmentProcessorAnalysis::GrColorFragmentProcessorAnalysis( const GrProcessorAnalysisColor& input, const GrFragmentProcessor* const* processors, int cnt) { fCompatibleWithCoverageAsAlpha = true; fIsOpaque = input.isOpaque(); fUsesLocalCoords = false; fProcessorsToEliminate = 0; GrColor color; if ((fKnowOutputColor = input.isConstant(&color))) { fLastKnownOutputColor = GrColor4f::FromGrColor(color); } for (int i = 0; i < cnt; ++i) { if (fUsesLocalCoords && !fKnowOutputColor && !fCompatibleWithCoverageAsAlpha && !fIsOpaque) { break; } const GrFragmentProcessor* fp = processors[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->usesLocalCoords()) { fUsesLocalCoords = true; } } } }