1b6cbc38702dc4a1540a17181cbdab71060c92ce7egdaniel/*
2b6cbc38702dc4a1540a17181cbdab71060c92ce7egdaniel * Copyright 2014 Google Inc.
3b6cbc38702dc4a1540a17181cbdab71060c92ce7egdaniel *
4b6cbc38702dc4a1540a17181cbdab71060c92ce7egdaniel * Use of this source code is governed by a BSD-style license that can be
5b6cbc38702dc4a1540a17181cbdab71060c92ce7egdaniel * found in the LICENSE file.
6b6cbc38702dc4a1540a17181cbdab71060c92ce7egdaniel */
7b6cbc38702dc4a1540a17181cbdab71060c92ce7egdaniel
8a811b1200cc0b5e3819c89f62def23ec203d4b5aBrian Salomon#include "GrProcessorAnalysis.h"
99513143efa734bef0c1a0c7f945022572dbc8518egdaniel#include "GrGeometryProcessor.h"
10895274391db8df7357334aec260edca2e1735626Brian Salomon#include "ops/GrDrawOp.h"
1174417824cd988f7d6114858e09720ba00416ce11joshualitt
12650ced07d9660e74eb34ddff79293583f7b70837Brian SalomonGrColorFragmentProcessorAnalysis::GrColorFragmentProcessorAnalysis(
13650ced07d9660e74eb34ddff79293583f7b70837Brian Salomon        const GrProcessorAnalysisColor& input,
14650ced07d9660e74eb34ddff79293583f7b70837Brian Salomon        const GrFragmentProcessor* const* processors,
15650ced07d9660e74eb34ddff79293583f7b70837Brian Salomon        int cnt) {
16650ced07d9660e74eb34ddff79293583f7b70837Brian Salomon    fCompatibleWithCoverageAsAlpha = true;
17650ced07d9660e74eb34ddff79293583f7b70837Brian Salomon    fIsOpaque = input.isOpaque();
18650ced07d9660e74eb34ddff79293583f7b70837Brian Salomon    fUsesLocalCoords = false;
19650ced07d9660e74eb34ddff79293583f7b70837Brian Salomon    fProcessorsToEliminate = 0;
20650ced07d9660e74eb34ddff79293583f7b70837Brian Salomon    GrColor color;
21650ced07d9660e74eb34ddff79293583f7b70837Brian Salomon    if ((fKnowOutputColor = input.isConstant(&color))) {
22650ced07d9660e74eb34ddff79293583f7b70837Brian Salomon        fLastKnownOutputColor = GrColor4f::FromGrColor(color);
23650ced07d9660e74eb34ddff79293583f7b70837Brian Salomon    }
24ac856c97acc84dcb54d9cdb068ec8a02b8869647bsalomon    for (int i = 0; i < cnt; ++i) {
25650ced07d9660e74eb34ddff79293583f7b70837Brian Salomon        if (fUsesLocalCoords && !fKnowOutputColor && !fCompatibleWithCoverageAsAlpha &&
26650ced07d9660e74eb34ddff79293583f7b70837Brian Salomon            !fIsOpaque) {
27650ced07d9660e74eb34ddff79293583f7b70837Brian Salomon            break;
28b6cbc38702dc4a1540a17181cbdab71060c92ce7egdaniel        }
29eec6f7be5461e588210f383b8af18f324a2bdb46Brian Salomon        const GrFragmentProcessor* fp = processors[i];
30650ced07d9660e74eb34ddff79293583f7b70837Brian Salomon        if (fKnowOutputColor &&
31c0b642ca48d58416409e555549434066f09692b7Brian Salomon            fp->hasConstantOutputForConstantInput(fLastKnownOutputColor, &fLastKnownOutputColor)) {
32650ced07d9660e74eb34ddff79293583f7b70837Brian Salomon            ++fProcessorsToEliminate;
33eec6f7be5461e588210f383b8af18f324a2bdb46Brian Salomon            fIsOpaque = fLastKnownOutputColor.isOpaque();
34bfafcba05a54e1bc9c3074353a155d61119d095cBrian Salomon            // We reset these since the caller is expected to not use the earlier fragment
35bfafcba05a54e1bc9c3074353a155d61119d095cBrian Salomon            // processors.
36650ced07d9660e74eb34ddff79293583f7b70837Brian Salomon            fCompatibleWithCoverageAsAlpha = true;
37bfafcba05a54e1bc9c3074353a155d61119d095cBrian Salomon            fUsesLocalCoords = false;
3828207df02b3dee83141520adf23df2c6aa087860Brian Salomon        } else {
39650ced07d9660e74eb34ddff79293583f7b70837Brian Salomon            fKnowOutputColor = false;
4028207df02b3dee83141520adf23df2c6aa087860Brian Salomon            if (fIsOpaque && !fp->preservesOpaqueInput()) {
4128207df02b3dee83141520adf23df2c6aa087860Brian Salomon                fIsOpaque = false;
4228207df02b3dee83141520adf23df2c6aa087860Brian Salomon            }
43650ced07d9660e74eb34ddff79293583f7b70837Brian Salomon            if (fCompatibleWithCoverageAsAlpha && !fp->compatibleWithCoverageAsAlpha()) {
44650ced07d9660e74eb34ddff79293583f7b70837Brian Salomon                fCompatibleWithCoverageAsAlpha = false;
4528207df02b3dee83141520adf23df2c6aa087860Brian Salomon            }
4628207df02b3dee83141520adf23df2c6aa087860Brian Salomon            if (fp->usesLocalCoords()) {
4728207df02b3dee83141520adf23df2c6aa087860Brian Salomon                fUsesLocalCoords = true;
4828207df02b3dee83141520adf23df2c6aa087860Brian Salomon            }
49bfafcba05a54e1bc9c3074353a155d61119d095cBrian Salomon        }
50b6cbc38702dc4a1540a17181cbdab71060c92ce7egdaniel    }
51b6cbc38702dc4a1540a17181cbdab71060c92ce7egdaniel}
52