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 "GrProcOptInfo.h"
9 
10 #include "GrGeometryProcessor.h"
11 
12 #include "batches/GrDrawBatch.h"
13 
calcWithInitialValues(const GrFragmentProcessor * const processors[],int cnt,GrColor startColor,GrColorComponentFlags flags,bool areCoverageStages,bool isLCD)14 void GrProcOptInfo::calcWithInitialValues(const GrFragmentProcessor * const processors[],
15                                           int cnt,
16                                           GrColor startColor,
17                                           GrColorComponentFlags flags,
18                                           bool areCoverageStages,
19                                           bool isLCD) {
20     GrInitInvariantOutput out;
21     out.fIsSingleComponent = areCoverageStages;
22     out.fColor = startColor;
23     out.fValidFlags = flags;
24     out.fIsLCDCoverage = isLCD;
25     fInOut.reset(out);
26     this->internalCalc(processors, cnt, false);
27 }
28 
initUsingInvariantOutput(GrInitInvariantOutput invOutput)29 void GrProcOptInfo::initUsingInvariantOutput(GrInitInvariantOutput invOutput) {
30     fInOut.reset(invOutput);
31 }
32 
completeCalculations(const GrFragmentProcessor * const processors[],int cnt)33 void GrProcOptInfo::completeCalculations(const GrFragmentProcessor * const processors[], int cnt) {
34     this->internalCalc(processors, cnt, false);
35 }
36 
internalCalc(const GrFragmentProcessor * const processors[],int cnt,bool initWillReadFragmentPosition)37 void GrProcOptInfo::internalCalc(const GrFragmentProcessor* const processors[],
38                                  int cnt,
39                                  bool initWillReadFragmentPosition) {
40     fFirstEffectiveProcessorIndex = 0;
41     fInputColorIsUsed = true;
42     fInputColor = fInOut.color();
43     fReadsFragPosition = initWillReadFragmentPosition;
44 
45     for (int i = 0; i < cnt; ++i) {
46         const GrFragmentProcessor* processor = processors[i];
47         fInOut.resetWillUseInputColor();
48         processor->computeInvariantOutput(&fInOut);
49         SkDEBUGCODE(fInOut.validate());
50         if (!fInOut.willUseInputColor()) {
51             fFirstEffectiveProcessorIndex = i;
52             fInputColorIsUsed = false;
53             // Reset these since we don't care if previous stages read these values
54             fReadsFragPosition = initWillReadFragmentPosition;
55         }
56         if (processor->willReadFragmentPosition()) {
57             fReadsFragPosition = true;
58         }
59         if (kRGBA_GrColorComponentFlags == fInOut.validFlags()) {
60             fFirstEffectiveProcessorIndex = i + 1;
61             fInputColor = fInOut.color();
62             fInputColorIsUsed = true;
63             // Since we are clearing all previous color stages we are in a state where we have found
64             // zero stages that don't multiply the inputColor.
65             fInOut.resetNonMulStageFound();
66             // Reset these since we don't care if previous stages read these values
67             fReadsFragPosition = initWillReadFragmentPosition;
68         }
69     }
70 }
71