| Index: include/gpu/effects/GrPorterDuffXferProcessor.h
|
| diff --git a/include/gpu/effects/GrPorterDuffXferProcessor.h b/include/gpu/effects/GrPorterDuffXferProcessor.h
|
| index 0ddfcdcd2a9594056bb12d469d5e85b5e0ca84bb..59499742d270a4bc7e878a270d2a50c4147a7e49 100644
|
| --- a/include/gpu/effects/GrPorterDuffXferProcessor.h
|
| +++ b/include/gpu/effects/GrPorterDuffXferProcessor.h
|
| @@ -26,20 +26,53 @@ public:
|
|
|
| virtual const char* name() const { return "Porter Duff"; }
|
|
|
| - virtual void getGLProcessorKey(const GrGLCaps& caps,
|
| - GrProcessorKeyBuilder* b) const SK_OVERRIDE;
|
| -
|
| - virtual GrGLFragmentProcessor* createGLInstance() const SK_OVERRIDE;
|
| -
|
| - virtual GrXferProcessor::OptFlags getOptimizations(const GrProcOptInfo& colorPOI,
|
| - const GrProcOptInfo& coveragePOI,
|
| - bool isCoverageDrawing,
|
| - bool colorWriteDisabled,
|
| - bool doesStencilWrite,
|
| - GrColor* color,
|
| - uint8_t* coverage) SK_OVERRIDE;
|
| -
|
| - virtual void getBlendInfo(GrXferProcessor::BlendInfo* blendInfo) const SK_OVERRIDE {
|
| + void getGLProcessorKey(const GrGLCaps& caps, GrProcessorKeyBuilder* b) const SK_OVERRIDE;
|
| +
|
| + GrGLXferProcessor* createGLInstance() const SK_OVERRIDE;
|
| +
|
| + virtual bool hasSecondaryOutput() const SK_OVERRIDE;
|
| +
|
| + ///////////////////////////////////////////////////////////////////////////
|
| + /// @name Stage Output Types
|
| + ////
|
| +
|
| + enum PrimaryOutputType {
|
| + // Modulate color and coverage, write result as the color output.
|
| + kModulate_PrimaryOutputType,
|
| + // Combines the coverage, dst, and color as coverage * color + (1 - coverage) * dst. This
|
| + // can only be set if fDstReadKey is non-zero.
|
| + kCombineWithDst_PrimaryOutputType,
|
| + };
|
| +
|
| + enum SecondaryOutputType {
|
| + // There is no secondary output
|
| + kNone_SecondaryOutputType,
|
| + // Writes coverage as the secondary output. Only set if dual source blending is supported
|
| + // and primary output is kModulate.
|
| + kCoverage_SecondaryOutputType,
|
| + // Writes coverage * (1 - colorA) as the secondary output. Only set if dual source blending
|
| + // is supported and primary output is kModulate.
|
| + kCoverageISA_SecondaryOutputType,
|
| + // Writes coverage * (1 - colorRGBA) as the secondary output. Only set if dual source
|
| + // blending is supported and primary output is kModulate.
|
| + kCoverageISC_SecondaryOutputType,
|
| +
|
| + kSecondaryOutputTypeCnt,
|
| + };
|
| +
|
| + PrimaryOutputType primaryOutputType() const { return fPrimaryOutputType; }
|
| + SecondaryOutputType secondaryOutputType() const { return fSecondaryOutputType; }
|
| +
|
| + GrXferProcessor::OptFlags getOptimizations(const GrProcOptInfo& colorPOI,
|
| + const GrProcOptInfo& coveragePOI,
|
| + bool isCoverageDrawing,
|
| + bool colorWriteDisabled,
|
| + bool doesStencilWrite,
|
| + GrColor* color,
|
| + uint8_t* coverage,
|
| + const GrDrawTargetCaps& caps) SK_OVERRIDE;
|
| +
|
| + void getBlendInfo(GrXferProcessor::BlendInfo* blendInfo) const SK_OVERRIDE {
|
| blendInfo->fSrcBlend = fSrcBlend;
|
| blendInfo->fDstBlend = fDstBlend;
|
| blendInfo->fBlendConstant = fBlendConstant;
|
| @@ -48,21 +81,36 @@ public:
|
| private:
|
| GrPorterDuffXferProcessor(GrBlendCoeff srcBlend, GrBlendCoeff dstBlend, GrColor constant);
|
|
|
| - virtual bool onIsEqual(const GrFragmentProcessor& fpBase) const SK_OVERRIDE {
|
| - const GrPorterDuffXferProcessor& xp = fpBase.cast<GrPorterDuffXferProcessor>();
|
| + bool onIsEqual(const GrXferProcessor& xpBase) const SK_OVERRIDE {
|
| + const GrPorterDuffXferProcessor& xp = xpBase.cast<GrPorterDuffXferProcessor>();
|
| if (fSrcBlend != xp.fSrcBlend ||
|
| fDstBlend != xp.fDstBlend ||
|
| - fBlendConstant != xp.fBlendConstant) {
|
| + fBlendConstant != xp.fBlendConstant ||
|
| + fPrimaryOutputType != xp.fPrimaryOutputType ||
|
| + fSecondaryOutputType != xp.fSecondaryOutputType) {
|
| return false;
|
| }
|
| return true;
|
| }
|
|
|
| - virtual void onComputeInvariantOutput(GrInvariantOutput* inout) const SK_OVERRIDE;
|
| + void onComputeInvariantOutput(GrInvariantOutput* inout) const SK_OVERRIDE;
|
| +
|
| + GrXferProcessor::OptFlags internalGetOptimizations(const GrProcOptInfo& colorPOI,
|
| + const GrProcOptInfo& coveragePOI,
|
| + bool isCoverageDrawing,
|
| + bool colorWriteDisabled,
|
| + bool doesStencilWrite,
|
| + GrColor* color,
|
| + uint8_t* coverage);
|
| +
|
| + void calcOutputTypes(GrXferProcessor::OptFlags blendOpts, const GrDrawTargetCaps& caps,
|
| + bool hasSolidCoverage, bool readDst);
|
|
|
| GrBlendCoeff fSrcBlend;
|
| GrBlendCoeff fDstBlend;
|
| GrColor fBlendConstant;
|
| + PrimaryOutputType fPrimaryOutputType;
|
| + SecondaryOutputType fSecondaryOutputType;
|
|
|
| typedef GrXferProcessor INHERITED;
|
| };
|
| @@ -107,6 +155,8 @@ private:
|
| return (fSrcCoeff == xpf.fSrcCoeff && fDstCoeff == xpf.fDstCoeff);
|
| }
|
|
|
| + GR_DECLARE_XP_FACTORY_TEST;
|
| +
|
| GrBlendCoeff fSrcCoeff;
|
| GrBlendCoeff fDstCoeff;
|
|
|
|
|