diff options
Diffstat (limited to 'include/gpu/GrXferProcessor.h')
-rw-r--r-- | include/gpu/GrXferProcessor.h | 111 |
1 files changed, 110 insertions, 1 deletions
diff --git a/include/gpu/GrXferProcessor.h b/include/gpu/GrXferProcessor.h index 10ecf54c75..b7d0bdd9fa 100644 --- a/include/gpu/GrXferProcessor.h +++ b/include/gpu/GrXferProcessor.h @@ -13,6 +13,8 @@ #include "GrTypes.h" #include "SkXfermode.h" +class GrProcOptInfo; + /** * GrXferProcessor is responsible for implementing the xfer mode that blends the src color and dst * color. It does this by emitting fragment shader code and controlling the fixed-function blend @@ -27,11 +29,83 @@ * GrXPFactory once we have finalized the state of our draw. */ class GrXferProcessor : public GrFragmentProcessor { +public: + /** + * Optimizations for blending / coverage that an OptDrawState should apply to itself. + */ + enum OptFlags { + /** + * No optimizations needed + */ + kNone_Opt = 0, + /** + * The draw can be skipped completely. + */ + kSkipDraw_OptFlag = 0x1, + /** + * Clear color stages, remove color vertex attribs, and use input color + */ + kClearColorStages_OptFlag = 0x2, + /** + * Clear coverage stages, remove coverage vertex attribs, and use input coverage + */ + kClearCoverageStages_OptFlag = 0x4, + /** + * Set CoverageDrawing_StateBit + */ + kSetCoverageDrawing_OptFlag = 0x8, + }; + + GR_DECL_BITFIELD_OPS_FRIENDS(OptFlags); + + /** + * Determines which optimizations (as described by the ptFlags above) can be performed by + * the draw with this xfer processor. If this function is called, the xfer processor may change + * its state to reflected the given blend optimizations. It will also set the output parameters, + * color and coverage, to specific values if it decides to remove all color or coverage stages. + * A caller who calls this function on a XP is required to honor the returned OptFlags + * and color/coverage values for its draw. + */ + // TODO: remove need for isCoverageDrawing once coverageDrawing is its own XP. + // TODO: remove need for colorWriteDisabled once colorWriteDisabled is its own XP. + virtual OptFlags getOptimizations(const GrProcOptInfo& colorPOI, + const GrProcOptInfo& coveragePOI, + bool isCoverageDrawing, + bool colorWriteDisabled, + bool doesStencilWrite, + GrColor* color, + uint8_t* coverage) = 0; + + struct BlendInfo { + GrBlendCoeff fSrcBlend; + GrBlendCoeff fDstBlend; + GrColor fBlendConstant; + }; + + virtual void getBlendInfo(BlendInfo* blendInfo) const = 0; + + /** Will this prceossor read the destination pixel value? */ + bool willReadDstColor() const { return fWillReadDstColor; } + +protected: + GrXferProcessor() : fWillReadDstColor(false) {} + + /** + * If the prceossor subclass will read the destination pixel value then it must call this + * function from its constructor. Otherwise, when its generated backend-specific prceossor class + * attempts to generate code that reads the destination pixel it will fail. + */ + void setWillReadDstColor() { fWillReadDstColor = true; } + private: + bool fWillReadDstColor; + typedef GrFragmentProcessor INHERITED; }; +GR_MAKE_BITFIELD_OPS(GrXferProcessor::OptFlags); + /** * We install a GrXPFactory (XPF) early on in the pipeline before all the final draw information is * known (e.g. whether there is fractional pixel coverage, will coverage be 1 or 4 channel, is the @@ -45,7 +119,8 @@ private: */ class GrXPFactory : public SkRefCnt { public: - virtual const GrXferProcessor* createXferProcessor() const = 0; + virtual GrXferProcessor* createXferProcessor(const GrProcOptInfo& colorPOI, + const GrProcOptInfo& coveragePOI) const = 0; /** * This function returns true if the GrXferProcessor generated from this factory will be able to @@ -54,6 +129,40 @@ public: */ virtual bool supportsRGBCoverage(GrColor knownColor, uint32_t knownColorFlags) const = 0; + /** + * Depending on color blend mode requested it may or may not be possible to correctly blend with + * fractional pixel coverage generated by the fragment shader. + * + * This function considers the known color and coverage input into the xfer processor and + * certain state information (isCoverageDrawing and colorWriteDisabled) to determine whether + * coverage can be handled correctly. + */ + // TODO: remove need for isCoverageDrawing once coverageDrawing is its own XP. + // TODO: remove need for colorWriteDisabled once colorWriteDisabled is its own XP. + virtual bool canApplyCoverage(const GrProcOptInfo& colorPOI, const GrProcOptInfo& coveragePOI, + bool isCoverageDrawing, bool colorWriteDisabled) const = 0; + + /** + * This function returns true if the destination pixel values will be read for blending during + * draw. + */ + // TODO: remove need for isCoverageDrawing once coverageDrawing is its own XP. + // TODO: remove need for colorWriteDisabled once only XP can read dst. + virtual bool willBlendWithDst(const GrProcOptInfo& colorPOI, const GrProcOptInfo& coveragePOI, + bool isCoverageDrawing, bool colorWriteDisabled) const = 0; + + /** + * 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. + */ + // TODO: remove need for isCoverageDrawing once coverageDrawing is its own XP. + virtual bool canTweakAlphaForCoverage(bool isCoverageDrawing) const = 0; + + virtual bool getOpaqueAndKnownColor(const GrProcOptInfo& colorPOI, + const GrProcOptInfo& coveragePOI, GrColor* solidColor, + uint32_t* solidColorKnownComponents) const = 0; + bool isEqual(const GrXPFactory& that) const { if (this->classID() != that.classID()) { return false; |