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 #ifndef GrProcOptInfo_DEFINED 9 #define GrProcOptInfo_DEFINED 10 11 #include "GrColor.h" 12 #include "GrInvariantOutput.h" 13 14 class GrDrawBatch; 15 class GrFragmentProcessor; 16 class GrPrimitiveProcessor; 17 class GrProcessor; 18 19 /** 20 * GrProcOptInfo gathers invariant data from a set of processor stages.It is used to recognize 21 * optimizations related to eliminating stages and vertex attributes that aren't necessary for a 22 * draw. 23 */ 24 class GrProcOptInfo { 25 public: 26 GrProcOptInfo() 27 : fInOut(0, static_cast<GrColorComponentFlags>(0), false) 28 , fFirstEffectiveProcessorIndex(0) 29 , fInputColorIsUsed(true) 30 , fInputColor(0) 31 , fReadsFragPosition(false) {} 32 33 void calcWithInitialValues(const GrFragmentProcessor* const *, int cnt, GrColor startColor, 34 GrColorComponentFlags, bool areCoverageStages, bool isLCD = false); 35 void initUsingInvariantOutput(GrInitInvariantOutput invOutput); 36 void completeCalculations(const GrFragmentProcessor * const processors[], int cnt); 37 38 bool isSolidWhite() const { return fInOut.isSolidWhite(); } 39 bool isOpaque() const { return fInOut.isOpaque(); } 40 bool isSingleComponent() const { return fInOut.isSingleComponent(); } 41 bool allStagesMultiplyInput() const { return fInOut.allStagesMulInput(); } 42 43 // TODO: Once texture pixel configs quaries are updated, we no longer need this function. 44 // For now this function will correctly tell us if we are using LCD text or not and should only 45 // be called when looking at the coverage output. 46 bool isFourChannelOutput() const { return !fInOut.isSingleComponent() && 47 fInOut.isLCDCoverage(); } 48 49 GrColor color() const { return fInOut.color(); } 50 51 GrColorComponentFlags validFlags() const { 52 return fInOut.validFlags(); 53 } 54 55 /** 56 * Returns the index of the first effective color processor. If an intermediate processor 57 * doesn't read its input or has a known output, then we can ignore all earlier processors 58 * since they will not affect the final output. Thus the first effective processors index is 59 * the index to the first processor that will have an effect on the final output. 60 * 61 * If processors before the firstEffectiveProcessorIndex() are removed, corresponding values 62 * from inputColorIsUsed(), inputColorToEffectiveProcessor(), removeVertexAttribs(), and 63 * readsDst() must be used when setting up the draw to ensure correct drawing. 64 */ 65 int firstEffectiveProcessorIndex() const { return fFirstEffectiveProcessorIndex; } 66 67 /** 68 * True if the first effective processor reads its input, false otherwise. 69 */ 70 bool inputColorIsUsed() const { return fInputColorIsUsed; } 71 72 /** 73 * If input color is used and per-vertex colors are not used, this is the input color to the 74 * first effective processor. 75 */ 76 GrColor inputColorToFirstEffectiveProccesor() const { return fInputColor; } 77 78 /** 79 * Returns true if any of the processor preserved by GrProcOptInfo read the frag position. 80 */ 81 bool readsFragPosition() const { return fReadsFragPosition; } 82 83 private: 84 void internalCalc(const GrFragmentProcessor* const[], int cnt, bool initWillReadFragPosition); 85 86 GrInvariantOutput fInOut; 87 int fFirstEffectiveProcessorIndex; 88 bool fInputColorIsUsed; 89 GrColor fInputColor; 90 bool fReadsFragPosition; 91 }; 92 93 #endif 94