| Index: include/gpu/GrXferProcessor.h
 | 
| diff --git a/include/gpu/GrXferProcessor.h b/include/gpu/GrXferProcessor.h
 | 
| index 8458a620feb07805de18c474d7c679408cbad972..a9faad016c1d8ef8890e2d2200033fd044a34a0d 100644
 | 
| --- a/include/gpu/GrXferProcessor.h
 | 
| +++ b/include/gpu/GrXferProcessor.h
 | 
| @@ -108,6 +108,47 @@ enum GrXferBarrierType {
 | 
|  class GrXferProcessor : public GrProcessor {
 | 
|  public:
 | 
|      /**
 | 
| +     * A texture that contains the dst pixel values and an integer coord offset from device space
 | 
| +     * to the space of the texture. Depending on GPU capabilities a DstTexture may be used by a
 | 
| +     * GrXferProcessor for blending in the fragment shader.
 | 
| +     */
 | 
| +    class DstTexture {
 | 
| +    public:
 | 
| +        DstTexture() { fOffset.set(0, 0); }
 | 
| +
 | 
| +        DstTexture(const DstTexture& other) {
 | 
| +            *this = other;
 | 
| +        }
 | 
| +
 | 
| +        DstTexture(GrTexture* texture, const SkIPoint& offset)
 | 
| +            : fTexture(SkSafeRef(texture))
 | 
| +            , fOffset(offset) {
 | 
| +        }
 | 
| +
 | 
| +        DstTexture& operator=(const DstTexture& other) {
 | 
| +            fTexture.reset(SkSafeRef(other.fTexture.get()));
 | 
| +            fOffset = other.fOffset;
 | 
| +            return *this;
 | 
| +        }
 | 
| +
 | 
| +        const SkIPoint& offset() const { return fOffset; }
 | 
| +
 | 
| +        void setOffset(const SkIPoint& offset) { fOffset = offset; }
 | 
| +        void setOffset(int ox, int oy) { fOffset.set(ox, oy); }
 | 
| +
 | 
| +        GrTexture* texture() const { return fTexture.get(); }
 | 
| +
 | 
| +        GrTexture* setTexture(GrTexture* texture) {
 | 
| +            fTexture.reset(SkSafeRef(texture));
 | 
| +            return texture;
 | 
| +        }
 | 
| +
 | 
| +    private:
 | 
| +        SkAutoTUnref<GrTexture> fTexture;
 | 
| +        SkIPoint                fOffset;
 | 
| +    };
 | 
| +
 | 
| +    /**
 | 
|       * Sets a unique key on the GrProcessorKeyBuilder calls onGetGLProcessorKey(...) to get the
 | 
|       * specific subclass's key.
 | 
|       */ 
 | 
| @@ -207,15 +248,15 @@ public:
 | 
|       * 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(); }
 | 
| +    const GrTexture* getDstTexture() const { return fDstTexture.getTexture(); }
 | 
|  
 | 
|      /**
 | 
| -     * Returns the offset into the DstCopyTexture to use when reading it in the shader. This value
 | 
| -     * is only valid if getDstCopyTexture() != NULL.
 | 
| +     * Returns the offset in device coords to use when accessing the dst texture to get the dst
 | 
| +     * pixel color in the shader. This value is only valid if getDstTexture() != NULL.
 | 
|       */
 | 
| -    const SkIPoint& dstCopyTextureOffset() const {
 | 
| -        SkASSERT(this->getDstCopyTexture());
 | 
| -        return fDstCopyTextureOffset;
 | 
| +    const SkIPoint& dstTextureOffset() const {
 | 
| +        SkASSERT(this->getDstTexture());
 | 
| +        return fDstTextureOffset;
 | 
|      }
 | 
|  
 | 
|      /**
 | 
| @@ -246,10 +287,10 @@ public:
 | 
|          if (this->fReadsCoverage != that.fReadsCoverage) {
 | 
|              return false;
 | 
|          }
 | 
| -        if (this->fDstCopy.getTexture() != that.fDstCopy.getTexture()) {
 | 
| +        if (this->fDstTexture.getTexture() != that.fDstTexture.getTexture()) {
 | 
|              return false;
 | 
|          }
 | 
| -        if (this->fDstCopyTextureOffset != that.fDstCopyTextureOffset) {
 | 
| +        if (this->fDstTextureOffset != that.fDstTextureOffset) {
 | 
|              return false;
 | 
|          }
 | 
|          return this->onIsEqual(that);
 | 
| @@ -257,7 +298,7 @@ public:
 | 
|     
 | 
|  protected:
 | 
|      GrXferProcessor();
 | 
| -    GrXferProcessor(const GrDeviceCoordTexture* dstCopy, bool willReadDstColor);
 | 
| +    GrXferProcessor(const DstTexture*, bool willReadDstColor);
 | 
|  
 | 
|  private:
 | 
|      virtual OptFlags onGetOptimizations(const GrProcOptInfo& colorPOI,
 | 
| @@ -294,8 +335,8 @@ private:
 | 
|  
 | 
|      bool                    fWillReadDstColor;
 | 
|      bool                    fReadsCoverage;
 | 
| -    SkIPoint                fDstCopyTextureOffset;
 | 
| -    GrTextureAccess         fDstCopy;
 | 
| +    SkIPoint                fDstTextureOffset;
 | 
| +    GrTextureAccess         fDstTexture;
 | 
|  
 | 
|      typedef GrFragmentProcessor INHERITED;
 | 
|  };
 | 
| @@ -317,9 +358,10 @@ GR_MAKE_BITFIELD_OPS(GrXferProcessor::OptFlags);
 | 
|   */
 | 
|  class GrXPFactory : public SkRefCnt {
 | 
|  public:
 | 
| +    typedef GrXferProcessor::DstTexture DstTexture;
 | 
|      GrXferProcessor* createXferProcessor(const GrProcOptInfo& colorPOI,
 | 
|                                           const GrProcOptInfo& coveragePOI,
 | 
| -                                         const GrDeviceCoordTexture* dstCopy,
 | 
| +                                         const DstTexture*,
 | 
|                                           const GrCaps& caps) const;
 | 
|  
 | 
|      /**
 | 
| @@ -343,8 +385,8 @@ public:
 | 
|      virtual void getInvariantOutput(const GrProcOptInfo& colorPOI, const GrProcOptInfo& coveragePOI,
 | 
|                                      InvariantOutput*) const = 0;
 | 
|  
 | 
| -    bool willNeedDstCopy(const GrCaps& caps, const GrProcOptInfo& colorPOI,
 | 
| -                         const GrProcOptInfo& coveragePOI) const;
 | 
| +    bool willNeedDstTexture(const GrCaps& caps, const GrProcOptInfo& colorPOI,
 | 
| +                            const GrProcOptInfo& coveragePOI) const;
 | 
|  
 | 
|      bool isEqual(const GrXPFactory& that) const {
 | 
|          if (this->classID() != that.classID()) {
 | 
| @@ -374,7 +416,7 @@ private:
 | 
|      virtual GrXferProcessor* onCreateXferProcessor(const GrCaps& caps,
 | 
|                                                     const GrProcOptInfo& colorPOI,
 | 
|                                                     const GrProcOptInfo& coveragePOI,
 | 
| -                                                   const GrDeviceCoordTexture* dstCopy) const = 0;
 | 
| +                                                   const DstTexture*) const = 0;
 | 
|      /**
 | 
|       *  Returns true if the XP generated by this factory will explicitly read dst in the fragment
 | 
|       *  shader.
 | 
| 
 |