Index: src/gpu/GrPrimitiveProcessor.h |
diff --git a/src/gpu/GrPrimitiveProcessor.h b/src/gpu/GrPrimitiveProcessor.h |
index 4147b74963aaaf988f92398f94ec6eb643262b98..e5635a823bf4d7feb3710a127a6d6d2126c30d73 100644 |
--- a/src/gpu/GrPrimitiveProcessor.h |
+++ b/src/gpu/GrPrimitiveProcessor.h |
@@ -72,16 +72,65 @@ class GrGLPrimitiveProcessor; |
struct GrInitInvariantOutput; |
/* |
- * This struct allows the GrPipeline to communicate information about the pipeline. Most of this |
- * is overrides, but some of it is general information. Logically it should live in GrPipeline.h, |
- * but this is problematic due to circular dependencies. |
+ * This class allows the GrPipeline to communicate information about the pipeline to a |
+ * GrPrimitiveProcessor that will be used in conjunction with the GrPipeline. |
*/ |
-struct GrPipelineInfo { |
- bool fColorIgnored; |
- bool fCoverageIgnored; |
- GrColor fOverrideColor; |
- bool fUsesLocalCoords; |
- bool fCanTweakAlphaForCoverage; |
+class GrPipelineInfo { |
+public: |
+ /** Does the pipeline require the GrPrimitiveProcessor's color? */ |
+ bool readsColor() const { return SkToBool(kReadsColor_GrPipelineInfoFlag & fFlags); } |
+ |
+ /** Does the pipeline require the GrPrimitiveProcessor's coverage? */ |
+ bool readsCoverage() const { return SkToBool(kReadsCoverage_GrPipelineInfoFlag & fFlags); } |
+ |
+ /** Does the pipeline require access to (implicit or explicit) local coordinates? */ |
+ bool readsLocalCoords() const { |
+ return SkToBool(kReadsLocalCoords_GrPipelineInfoFlag & fFlags); |
+ } |
+ |
+ /** Does the pipeline allow the GrPrimitiveProcessor to combine color and coverage into one |
+ color output ? */ |
+ bool canTweakAlphaForCoverage() const { |
+ return SkToBool(kCanTweakAlphaForCoverage_GrPipelineInfoFlag & fFlags); |
+ } |
+ |
+ /** Does the pipeline require the GrPrimitiveProcessor to specify a specific color (and if |
+ so get the color)? */ |
+ bool getOverrideColorIfSet(GrColor* overrideColor) const { |
+ if (SkToBool(kUseOverrideColor_GrPipelineInfoFlag & fFlags)) { |
+ SkASSERT(SkToBool(kReadsColor_GrPipelineInfoFlag & fFlags)); |
+ if (overrideColor) { |
+ *overrideColor = fOverrideColor; |
+ } |
+ return true; |
+ } |
+ return false; |
+ } |
+ |
+private: |
+ enum { |
+ // If this is not set the primitive processor need not produce a color output |
+ kReadsColor_GrPipelineInfoFlag = 0x1, |
+ |
+ // If this is not set the primitive processor need not produce a coverage output |
+ kReadsCoverage_GrPipelineInfoFlag = 0x2, |
+ |
+ // If this is not set the primitive processor need not produce local coordinates |
+ kReadsLocalCoords_GrPipelineInfoFlag = 0x4, |
+ |
+ // If this flag is set then the primitive processor may produce color*coverage as |
+ // its color output (and not output a separate coverage). |
+ kCanTweakAlphaForCoverage_GrPipelineInfoFlag = 0x8, |
+ |
+ // If this flag is set the GrPrimitiveProcessor must produce fOverrideColor as its |
+ // output color. If not set fOverrideColor is to be ignored. |
+ kUseOverrideColor_GrPipelineInfoFlag = 0x10, |
+ }; |
+ |
+ uint32_t fFlags; |
+ GrColor fOverrideColor; |
+ |
+ friend class GrPipeline; // To initialize this |
}; |
/* |