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 "src/gpu/GrCaps.h"
9#include "src/gpu/GrFragmentProcessor.h"
10#include "src/gpu/GrGeometryProcessor.h"
11#include "src/gpu/GrProcessorAnalysis.h"
12
13GrColorFragmentProcessorAnalysis::GrColorFragmentProcessorAnalysis(
14        const GrProcessorAnalysisColor& input,
15        std::unique_ptr<GrFragmentProcessor> const fps[],
16        int count) {
17    fCompatibleWithCoverageAsAlpha = true;
18    fIsOpaque = input.isOpaque();
19    fUsesLocalCoords = false;
20    fWillReadDstColor = false;
21    fProcessorsToEliminate = 0;
22    fOutputColorKnown = input.isConstant(&fLastKnownOutputColor);
23    for (int i = 0; i < count; ++i) {
24        const GrFragmentProcessor* fp = fps[i].get();
25        if (fOutputColorKnown && fp->hasConstantOutputForConstantInput(fLastKnownOutputColor,
26                                                                       &fLastKnownOutputColor)) {
27            ++fProcessorsToEliminate;
28            fIsOpaque = fLastKnownOutputColor.isOpaque();
29            // We reset these flags since the earlier fragment processors are being eliminated.
30            fCompatibleWithCoverageAsAlpha = true;
31            fUsesLocalCoords = false;
32            fWillReadDstColor = false;
33            continue;
34        }
35
36        fOutputColorKnown = false;
37        if (fIsOpaque && !fp->preservesOpaqueInput()) {
38            fIsOpaque = false;
39        }
40        if (fCompatibleWithCoverageAsAlpha && !fp->compatibleWithCoverageAsAlpha()) {
41            fCompatibleWithCoverageAsAlpha = false;
42        }
43        if (fp->usesSampleCoords()) {
44            fUsesLocalCoords = true;
45        }
46        if (fp->willReadDstColor()) {
47            fWillReadDstColor = true;
48        }
49    }
50}
51
52bool GrColorFragmentProcessorAnalysis::requiresDstTexture(const GrCaps& caps) const {
53    return this->willReadDstColor() && !caps.shaderCaps()->dstReadInShaderSupport();
54}
55