1/*
2 * Copyright 2014 Google Inc.
3 *
4 * Use of this source code is governed by a BSD-style license that can be
5 * found in the LICENSE file.
6 */
7
8#include "GrProcessorAnalysis.h"
9#include "GrGeometryProcessor.h"
10#include "ops/GrDrawOp.h"
11
12GrColorFragmentProcessorAnalysis::GrColorFragmentProcessorAnalysis(
13        const GrProcessorAnalysisColor& input,
14        const GrFragmentProcessor* const* processors,
15        int cnt) {
16    fCompatibleWithCoverageAsAlpha = true;
17    fIsOpaque = input.isOpaque();
18    fUsesLocalCoords = false;
19    fProcessorsToEliminate = 0;
20    GrColor color;
21    if ((fKnowOutputColor = input.isConstant(&color))) {
22        fLastKnownOutputColor = GrColor4f::FromGrColor(color);
23    }
24    for (int i = 0; i < cnt; ++i) {
25        if (fUsesLocalCoords && !fKnowOutputColor && !fCompatibleWithCoverageAsAlpha &&
26            !fIsOpaque) {
27            break;
28        }
29        const GrFragmentProcessor* fp = processors[i];
30        if (fKnowOutputColor &&
31            fp->hasConstantOutputForConstantInput(fLastKnownOutputColor, &fLastKnownOutputColor)) {
32            ++fProcessorsToEliminate;
33            fIsOpaque = fLastKnownOutputColor.isOpaque();
34            // We reset these since the caller is expected to not use the earlier fragment
35            // processors.
36            fCompatibleWithCoverageAsAlpha = true;
37            fUsesLocalCoords = false;
38        } else {
39            fKnowOutputColor = false;
40            if (fIsOpaque && !fp->preservesOpaqueInput()) {
41                fIsOpaque = false;
42            }
43            if (fCompatibleWithCoverageAsAlpha && !fp->compatibleWithCoverageAsAlpha()) {
44                fCompatibleWithCoverageAsAlpha = false;
45            }
46            if (fp->usesLocalCoords()) {
47                fUsesLocalCoords = true;
48            }
49        }
50    }
51}
52