| /* |
| * Copyright 2014 Google Inc. |
| * |
| * Use of this source code is governed by a BSD-style license that can be |
| * found in the LICENSE file. |
| */ |
| |
| #ifndef GrProcOptInfo_DEFINED |
| #define GrProcOptInfo_DEFINED |
| |
| #include "GrColor.h" |
| #include "GrInvariantOutput.h" |
| |
| class GrFragmentStage; |
| class GrGeometryProcessor; |
| |
| /** |
| * GrProcOptInfo gathers invariant data from a set of processor stages.It is used to recognize |
| * optimizations related to eliminating stages and vertex attributes that aren't necessary for a |
| * draw. |
| */ |
| class GrProcOptInfo { |
| public: |
| GrProcOptInfo() |
| : fInOut(0, static_cast<GrColorComponentFlags>(0), false) |
| , fFirstEffectStageIndex(0) |
| , fInputColorIsUsed(true) |
| , fInputColor(0) |
| , fRemoveVertexAttrib(false) |
| , fReadsDst(false) {} |
| |
| void calcWithInitialValues(const GrFragmentStage*, int stageCount, GrColor startColor, |
| GrColorComponentFlags flags, bool areCoverageStages, |
| const GrGeometryProcessor* gp = NULL); |
| |
| bool isSolidWhite() const { return fInOut.isSolidWhite(); } |
| bool isOpaque() const { return fInOut.isOpaque(); } |
| |
| GrColor color() const { return fInOut.color(); } |
| uint8_t validFlags() const { return fInOut.validFlags(); } |
| |
| /** |
| * Returns the index of the first effective color stage. If an intermediate stage doesn't read |
| * its input or has a known output, then we can ignore all earlier stages since they will not |
| * affect the final output. Thus the first effective stage index is the index to the first stage |
| * that will have an effect on the final output. |
| * |
| * If stages before the firstEffectiveStageIndex are removed, corresponding values from |
| * inputColorIsUsed(), inputColorToEffectiveStage(), removeVertexAttribs(), and readsDst() must |
| * be used when setting up the draw to ensure correct drawing. |
| */ |
| int firstEffectiveStageIndex() const { return fFirstEffectStageIndex; } |
| |
| /** |
| * True if the first effective stage reads its input, false otherwise. |
| */ |
| bool inputColorIsUsed() const { return fInputColorIsUsed; } |
| |
| /** |
| * If input color is used and per-vertex colors are not used, this is the input color to the |
| * first effective stage. |
| */ |
| GrColor inputColorToEffectiveStage() const { return fInputColor; } |
| |
| /** |
| * Given the set of optimizations determined by GrProcOptInfo, should the caller remove the |
| * color/coverage vertex attribute that was input to the first stage. |
| */ |
| bool removeVertexAttrib() const { return fRemoveVertexAttrib; } |
| |
| /** |
| * Returns true if any of the stages preserved by GrProcOptInfo read the dst color. |
| */ |
| bool readsDst() const { return fReadsDst; } |
| |
| private: |
| GrInvariantOutput fInOut; |
| int fFirstEffectStageIndex; |
| bool fInputColorIsUsed; |
| GrColor fInputColor; |
| bool fRemoveVertexAttrib; |
| bool fReadsDst; |
| }; |
| |
| #endif |