/*
* 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;
}
}
}
}