Index: src/gpu/GrRODrawState.h |
diff --git a/src/gpu/GrRODrawState.h b/src/gpu/GrRODrawState.h |
index 718f017de3896e224b4b6e42e9fba78827f16de5..d748e7d83aac72e6ee5afe9dff65e34eb8ebca19 100644 |
--- a/src/gpu/GrRODrawState.h |
+++ b/src/gpu/GrRODrawState.h |
@@ -13,6 +13,7 @@ |
#include "GrStencil.h" |
#include "SkMatrix.h" |
+class GrDrawState; |
class GrDrawTargetCaps; |
class GrPaint; |
class GrTexture; |
@@ -26,6 +27,10 @@ class GrRODrawState : public SkRefCnt { |
public: |
SK_DECLARE_INST_COUNT(GrRODrawState) |
+ GrRODrawState() {} |
+ |
+ GrRODrawState& operator= (const GrRODrawState& that); |
+ |
/////////////////////////////////////////////////////////////////////////// |
/// @name Vertex Attributes |
//// |
@@ -68,6 +73,10 @@ public: |
return -1 != fFixedFunctionVertexAttribIndices[kCoverage_GrVertexAttribBinding]; |
} |
+ const int* getFixedFunctionVertexAttribIndices() const { |
+ return fFixedFunctionVertexAttribIndices; |
+ } |
+ |
bool validateVertexAttribs() const; |
/// @} |
@@ -158,6 +167,12 @@ public: |
GrColor getBlendConstant() const { return fBlendConstant; } |
/** |
+ * We don't use supplied vertex color attributes if our blend mode is EmitCoverage or |
+ * EmitTransBlack |
+ */ |
+ bool canIgnoreColorAttribute() const; |
+ |
+ /** |
* Determines whether multiplying the computed per-pixel color by the pixel's fractional |
* coverage before the blend will give the correct final destination color. In general it |
* will not as coverage is applied after blending. |
@@ -198,6 +213,22 @@ public: |
}; |
GR_DECL_BITFIELD_OPS_FRIENDS(BlendOptFlags); |
+ /** |
+ * Determines what optimizations can be applied based on the blend. The coefficients may have |
+ * to be tweaked in order for the optimization to work. srcCoeff and dstCoeff are optional |
+ * params that receive the tweaked coefficients. Normally the function looks at the current |
+ * state to see if coverage is enabled. By setting forceCoverage the caller can speculatively |
+ * determine the blend optimizations that would be used if there was partial pixel coverage. |
+ * |
+ * Subclasses of GrDrawTarget that actually draw (as opposed to those that just buffer for |
+ * playback) must call this function and respect the flags that replace the output color. |
+ * |
+ * If the cached BlendOptFlags does not have the invalidate bit set, then getBlendOpts will |
+ * simply returned the cached flags and coefficients. Otherwise it will calculate the values. |
+ */ |
+ BlendOptFlags getBlendOpts(bool forceCoverage = false, |
+ GrBlendCoeff* srcCoeff = NULL, |
+ GrBlendCoeff* dstCoeff = NULL) const; |
/// @} |
/////////////////////////////////////////////////////////////////////////// |
@@ -301,6 +332,8 @@ public: |
kLastPublicStateBit = kDummyStateBit-1, |
}; |
+ uint32_t getFlagBits() const { return fFlagBits; } |
+ |
bool isStateFlagEnabled(uint32_t stateBit) const { return 0 != (stateBit & fFlagBits); } |
bool isDitherState() const { return 0 != (fFlagBits & kDither_StateBit); } |
@@ -333,6 +366,17 @@ public: |
/// @} |
/////////////////////////////////////////////////////////////////////////// |
+ /// @name Hints |
+ /// Hints that when provided can enable optimizations. |
+ //// |
+ |
+ enum Hints { kVertexColorsAreOpaque_Hint = 0x1, }; |
+ |
+ bool vertexColorsAreOpaque() const { return kVertexColorsAreOpaque_Hint & fHints; } |
+ |
+ /// @} |
+ |
+ /////////////////////////////////////////////////////////////////////////// |
/** Return type for CombineIfPossible. */ |
enum CombinedState { |
@@ -359,6 +403,8 @@ protected: |
friend class GrDrawTarget; |
+ explicit GrRODrawState(const GrRODrawState& drawState); |
+ |
bool isEqual(const GrRODrawState& that) const; |
// These fields are roughly sorted by decreasing likelihood of being different in op== |
@@ -381,6 +427,8 @@ protected: |
EffectStageArray fColorStages; |
EffectStageArray fCoverageStages; |
+ uint32_t fHints; |
+ |
mutable GrBlendCoeff fOptSrcBlend; |
mutable GrBlendCoeff fOptDstBlend; |
mutable BlendOptFlags fBlendOptFlags; |
@@ -390,6 +438,18 @@ protected: |
int fFixedFunctionVertexAttribIndices[kGrFixedFunctionVertexAttribBindingCnt]; |
private: |
+ /** |
+ * Determines whether src alpha is guaranteed to be one for all src pixels |
+ */ |
+ bool srcAlphaWillBeOne() const; |
+ |
+ /** |
+ * Helper function for getBlendOpts. |
+ */ |
+ BlendOptFlags calcBlendOpts(bool forceCoverage = false, |
+ GrBlendCoeff* srcCoeff = NULL, |
+ GrBlendCoeff* dstCoeff = NULL) const; |
+ |
typedef SkRefCnt INHERITED; |
}; |