/* * 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 "GrProcOptInfo.h" #include "GrGeometryProcessor.h" #include "ops/GrDrawOp.h" void GrProcOptInfo::analyzeProcessors(const GrFragmentProcessor* const* processors, int cnt) { for (int i = 0; i < cnt; ++i) { bool knowCurrentOutput = fProcessorsVisitedWithKnownOutput == fTotalProcessorsVisited; if (fUsesLocalCoords && !knowCurrentOutput && !fAllProcessorsCompatibleWithCoverageAsAlpha && !fIsOpaque) { fTotalProcessorsVisited += cnt - i; return; } const GrFragmentProcessor* fp = processors[i]; if (knowCurrentOutput && fp->hasConstantOutputForConstantInput(fLastKnownOutputColor, &fLastKnownOutputColor)) { ++fProcessorsVisitedWithKnownOutput; fIsOpaque = fLastKnownOutputColor.isOpaque(); // We reset these since the caller is expected to not use the earlier fragment // processors. fAllProcessorsCompatibleWithCoverageAsAlpha = true; fUsesLocalCoords = false; } else if (fIsOpaque && !fp->preservesOpaqueInput()) { fIsOpaque = false; } if (fAllProcessorsCompatibleWithCoverageAsAlpha && !fp->compatibleWithCoverageAsAlpha()) { fAllProcessorsCompatibleWithCoverageAsAlpha = false; } if (fp->usesLocalCoords()) { fUsesLocalCoords = true; } ++fTotalProcessorsVisited; } }