GrProcessorAnalysis.cpp revision 9513143efa734bef0c1a0c7f945022572dbc8518
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
8b6cbc38702dc4a1540a17181cbdab71060c92ce7egdaniel#include "GrProcOptInfo.h"
9b6cbc38702dc4a1540a17181cbdab71060c92ce7egdaniel
109513143efa734bef0c1a0c7f945022572dbc8518egdaniel#include "GrFragmentProcessor.h"
118d95ffa497091d0c9c7cda099684c7bca6714a17egdaniel#include "GrFragmentStage.h"
129513143efa734bef0c1a0c7f945022572dbc8518egdaniel#include "GrGeometryProcessor.h"
13b6cbc38702dc4a1540a17181cbdab71060c92ce7egdaniel
14b6cbc38702dc4a1540a17181cbdab71060c92ce7egdanielvoid GrProcOptInfo::calcWithInitialValues(const GrFragmentStage* stages,
15b6cbc38702dc4a1540a17181cbdab71060c92ce7egdaniel                                          int stageCount,
16b6cbc38702dc4a1540a17181cbdab71060c92ce7egdaniel                                          GrColor startColor,
17b6cbc38702dc4a1540a17181cbdab71060c92ce7egdaniel                                          GrColorComponentFlags flags,
18b6cbc38702dc4a1540a17181cbdab71060c92ce7egdaniel                                          bool areCoverageStages,
19b6cbc38702dc4a1540a17181cbdab71060c92ce7egdaniel                                          const GrGeometryProcessor* gp) {
20b6cbc38702dc4a1540a17181cbdab71060c92ce7egdaniel    fInOut.reset(startColor, flags, areCoverageStages);
21b6cbc38702dc4a1540a17181cbdab71060c92ce7egdaniel    fFirstEffectStageIndex = 0;
22b6cbc38702dc4a1540a17181cbdab71060c92ce7egdaniel    fInputColorIsUsed = true;
23b6cbc38702dc4a1540a17181cbdab71060c92ce7egdaniel    fInputColor = startColor;
24b6cbc38702dc4a1540a17181cbdab71060c92ce7egdaniel    fRemoveVertexAttrib = false;
25b6cbc38702dc4a1540a17181cbdab71060c92ce7egdaniel    fReadsDst = false;
269513143efa734bef0c1a0c7f945022572dbc8518egdaniel    fReadsFragPosition = false;
27b6cbc38702dc4a1540a17181cbdab71060c92ce7egdaniel
28b6cbc38702dc4a1540a17181cbdab71060c92ce7egdaniel    if (areCoverageStages && gp) {
29b6cbc38702dc4a1540a17181cbdab71060c92ce7egdaniel        gp->computeInvariantOutput(&fInOut);
30b6cbc38702dc4a1540a17181cbdab71060c92ce7egdaniel    }
31b6cbc38702dc4a1540a17181cbdab71060c92ce7egdaniel
32b6cbc38702dc4a1540a17181cbdab71060c92ce7egdaniel    for (int i = 0; i < stageCount; ++i) {
33b6cbc38702dc4a1540a17181cbdab71060c92ce7egdaniel        const GrFragmentProcessor* processor = stages[i].getProcessor();
34b6cbc38702dc4a1540a17181cbdab71060c92ce7egdaniel        fInOut.resetWillUseInputColor();
35b6cbc38702dc4a1540a17181cbdab71060c92ce7egdaniel        processor->computeInvariantOutput(&fInOut);
369513143efa734bef0c1a0c7f945022572dbc8518egdaniel#ifdef SK_DEBUG
37b6cbc38702dc4a1540a17181cbdab71060c92ce7egdaniel        fInOut.validate();
389513143efa734bef0c1a0c7f945022572dbc8518egdaniel#endif
39b6cbc38702dc4a1540a17181cbdab71060c92ce7egdaniel        if (!fInOut.willUseInputColor()) {
40b6cbc38702dc4a1540a17181cbdab71060c92ce7egdaniel            fFirstEffectStageIndex = i;
41b6cbc38702dc4a1540a17181cbdab71060c92ce7egdaniel            fInputColorIsUsed = false;
429513143efa734bef0c1a0c7f945022572dbc8518egdaniel            // Reset these since we don't care if previous stages read these values
439513143efa734bef0c1a0c7f945022572dbc8518egdaniel            fReadsDst = false;
449513143efa734bef0c1a0c7f945022572dbc8518egdaniel            fReadsFragPosition = false;
45b6cbc38702dc4a1540a17181cbdab71060c92ce7egdaniel        }
46b6cbc38702dc4a1540a17181cbdab71060c92ce7egdaniel        if (processor->willReadDstColor()) {
47b6cbc38702dc4a1540a17181cbdab71060c92ce7egdaniel            fReadsDst = true;
48b6cbc38702dc4a1540a17181cbdab71060c92ce7egdaniel        }
499513143efa734bef0c1a0c7f945022572dbc8518egdaniel        if (processor->willReadFragmentPosition()) {
509513143efa734bef0c1a0c7f945022572dbc8518egdaniel            fReadsFragPosition = true;
519513143efa734bef0c1a0c7f945022572dbc8518egdaniel        }
52b6cbc38702dc4a1540a17181cbdab71060c92ce7egdaniel        if (kRGBA_GrColorComponentFlags == fInOut.validFlags()) {
53b6cbc38702dc4a1540a17181cbdab71060c92ce7egdaniel            fFirstEffectStageIndex = i + 1;
54b6cbc38702dc4a1540a17181cbdab71060c92ce7egdaniel            fInputColor = fInOut.color();
55b6cbc38702dc4a1540a17181cbdab71060c92ce7egdaniel            fInputColorIsUsed = true;
56b6cbc38702dc4a1540a17181cbdab71060c92ce7egdaniel            fRemoveVertexAttrib = true;
57b6cbc38702dc4a1540a17181cbdab71060c92ce7egdaniel            // Since we are clearing all previous color stages we are in a state where we have found
58b6cbc38702dc4a1540a17181cbdab71060c92ce7egdaniel            // zero stages that don't multiply the inputColor.
59b6cbc38702dc4a1540a17181cbdab71060c92ce7egdaniel            fInOut.resetNonMulStageFound();
609513143efa734bef0c1a0c7f945022572dbc8518egdaniel            // Reset these since we don't care if previous stages read these values
619513143efa734bef0c1a0c7f945022572dbc8518egdaniel            fReadsDst = false;
629513143efa734bef0c1a0c7f945022572dbc8518egdaniel            fReadsFragPosition = false;
63b6cbc38702dc4a1540a17181cbdab71060c92ce7egdaniel        }
64b6cbc38702dc4a1540a17181cbdab71060c92ce7egdaniel    }
65b6cbc38702dc4a1540a17181cbdab71060c92ce7egdaniel}
669513143efa734bef0c1a0c7f945022572dbc8518egdaniel
67