| Index: include/gpu/GrXferProcessor.h
|
| diff --git a/include/gpu/GrXferProcessor.h b/include/gpu/GrXferProcessor.h
|
| index 13e4d2633ff30045b816db20b999744953a20ee7..929eb6b5da298f4956bb71c2531477a14639c049 100644
|
| --- a/include/gpu/GrXferProcessor.h
|
| +++ b/include/gpu/GrXferProcessor.h
|
| @@ -10,6 +10,7 @@
|
|
|
| #include "GrColor.h"
|
| #include "GrProcessor.h"
|
| +#include "GrTexture.h"
|
| #include "GrTypes.h"
|
| #include "SkXfermode.h"
|
|
|
| @@ -34,11 +35,10 @@ class GrProcOptInfo;
|
| class GrXferProcessor : public GrProcessor {
|
| public:
|
| /**
|
| - * Sets a unique key on the GrProcessorKeyBuilder that is directly associated with this xfer
|
| - * processor's GL backend implementation.
|
| - */
|
| - virtual void getGLProcessorKey(const GrGLCaps& caps,
|
| - GrProcessorKeyBuilder* b) const = 0;
|
| + * Sets a unique key on the GrProcessorKeyBuilder calls onGetGLProcessorKey(...) to get the
|
| + * specific subclass's key.
|
| + */
|
| + void getGLProcessorKey(const GrGLCaps& caps, GrProcessorKeyBuilder* b) const;
|
|
|
| /** Returns a new instance of the appropriate *GL* implementation class
|
| for the given GrXferProcessor; caller is responsible for deleting
|
| @@ -103,9 +103,21 @@ public:
|
|
|
| virtual void getBlendInfo(BlendInfo* blendInfo) const = 0;
|
|
|
| - /** Will this prceossor read the destination pixel value? */
|
| bool willReadDstColor() const { return fWillReadDstColor; }
|
|
|
| + /**
|
| + * Returns the texture to be used as the destination when reading the dst in the fragment
|
| + * shader. If the returned texture is NULL then the XP is either not reading the dst or we have
|
| + * extentions that support framebuffer fetching and thus don't need a copy of the dst texture.
|
| + */
|
| + const GrTexture* getDstCopyTexture() const { return fDstCopy.getTexture(); }
|
| +
|
| + /**
|
| + * Returns the offset into the DstCopyTexture to use when reading it in the shader. This value
|
| + * is only valid if getDstCopyTexture() != NULL.
|
| + */
|
| + const SkIPoint& dstCopyTextureOffset() const { return fDstCopyTextureOffset; }
|
| +
|
| /**
|
| * Returns whether or not this xferProcossor will set a secondary output to be used with dual
|
| * source blending.
|
| @@ -123,29 +135,43 @@ public:
|
| if (this->classID() != that.classID()) {
|
| return false;
|
| }
|
| + if (this->fWillReadDstColor != that.fWillReadDstColor) {
|
| + return false;
|
| + }
|
| + if (this->fDstCopy.getTexture() != that.fDstCopy.getTexture()) {
|
| + return false;
|
| + }
|
| + if (this->fDstCopyTextureOffset != that.fDstCopyTextureOffset) {
|
| + return false;
|
| + }
|
| return this->onIsEqual(that);
|
| }
|
|
|
| protected:
|
| - GrXferProcessor() : fWillReadDstColor(false) {}
|
| + GrXferProcessor();
|
| + GrXferProcessor(const GrDeviceCoordTexture* dstCopy, bool willReadDstColor);
|
|
|
| +private:
|
| /**
|
| - * 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.
|
| + * Sets a unique key on the GrProcessorKeyBuilder that is directly associated with this xfer
|
| + * processor's GL backend implementation.
|
| */
|
| - void setWillReadDstColor() { fWillReadDstColor = true; }
|
| + virtual void onGetGLProcessorKey(const GrGLCaps& caps,
|
| + GrProcessorKeyBuilder* b) const = 0;
|
|
|
| -private:
|
| virtual bool onIsEqual(const GrXferProcessor&) const = 0;
|
|
|
| - bool fWillReadDstColor;
|
| + bool fWillReadDstColor;
|
| + SkIPoint fDstCopyTextureOffset;
|
| + GrTextureAccess fDstCopy;
|
|
|
| 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
|
| @@ -159,8 +185,10 @@ GR_MAKE_BITFIELD_OPS(GrXferProcessor::OptFlags);
|
| */
|
| class GrXPFactory : public SkRefCnt {
|
| public:
|
| - virtual GrXferProcessor* createXferProcessor(const GrProcOptInfo& colorPOI,
|
| - const GrProcOptInfo& coveragePOI) const = 0;
|
| + GrXferProcessor* createXferProcessor(const GrProcOptInfo& colorPOI,
|
| + const GrProcOptInfo& coveragePOI,
|
| + const GrDeviceCoordTexture* dstCopy,
|
| + const GrDrawTargetCaps& caps) const;
|
|
|
| /**
|
| * This function returns true if the GrXferProcessor generated from this factory will be able to
|
| @@ -202,10 +230,7 @@ public:
|
| */
|
| virtual bool canTweakAlphaForCoverage() const = 0;
|
|
|
| - /**
|
| - * Returns true if the XP generated by this factory will read dst.
|
| - */
|
| - virtual bool willReadDst() const = 0;
|
| + bool willNeedDstCopy(const GrDrawTargetCaps& caps) const;
|
|
|
| bool isEqual(const GrXPFactory& that) const {
|
| if (this->classID() != that.classID()) {
|
| @@ -232,6 +257,15 @@ protected:
|
| uint32_t fClassID;
|
|
|
| private:
|
| + virtual GrXferProcessor* onCreateXferProcessor(const GrProcOptInfo& colorPOI,
|
| + const GrProcOptInfo& coveragePOI,
|
| + const GrDeviceCoordTexture* dstCopy) const = 0;
|
| + /**
|
| + * Returns true if the XP generated by this factory will explicitly read dst in the fragment
|
| + * shader.
|
| + */
|
| + virtual bool willReadDstColor() const = 0;
|
| +
|
| virtual bool onIsEqual(const GrXPFactory&) const = 0;
|
|
|
| static uint32_t GenClassID() {
|
|
|