| 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.
|
|
|