1 /* 2 * Copyright 2015 Google Inc. 3 * 4 * Use of this source code is governed by a BSD-style license that can be 5 * found in the LICENSE file. 6 */ 7 8 #ifndef GrCopySurfaceBatch_DEFINED 9 #define GrCopySurfaceBatch_DEFINED 10 11 #include "GrBatch.h" 12 #include "GrBatchFlushState.h" 13 #include "GrGpu.h" 14 #include "GrRenderTarget.h" 15 16 class GrCopySurfaceBatch final : public GrBatch { 17 public: 18 DEFINE_BATCH_CLASS_ID 19 20 /** This should not really be exposed as Create() will apply this clipping, but there is 21 * currently a workaround in GrContext::copySurface() for non-render target dsts that relies 22 * on it. */ 23 static bool ClipSrcRectAndDstPoint(const GrSurface* dst, 24 const GrSurface* src, 25 const SkIRect& srcRect, 26 const SkIPoint& dstPoint, 27 SkIRect* clippedSrcRect, 28 SkIPoint* clippedDstPoint); 29 30 static GrBatch* Create(GrSurface* dst, GrSurface* src, const SkIRect& srcRect, 31 const SkIPoint& dstPoint); 32 name()33 const char* name() const override { return "CopySurface"; } 34 renderTargetUniqueID()35 uint32_t renderTargetUniqueID() const override { 36 GrRenderTarget* rt = fDst.get()->asRenderTarget(); 37 return rt ? rt->getUniqueID() : 0; 38 } renderTarget()39 GrRenderTarget* renderTarget() const override { return fDst.get()->asRenderTarget(); } 40 dumpInfo()41 SkString dumpInfo() const override { 42 SkString string; 43 string.printf("SRC: 0x%p, DST: 0x%p, SRECT: [L: %d, T: %d, R: %d, B: %d], " 44 "DPT:[X: %d, Y: %d]", 45 fDst.get(), fSrc.get(), fSrcRect.fLeft, fSrcRect.fTop, fSrcRect.fRight, 46 fSrcRect.fBottom, fDstPoint.fX, fDstPoint.fY); 47 return string; 48 } 49 50 private: GrCopySurfaceBatch(GrSurface * dst,GrSurface * src,const SkIRect & srcRect,const SkIPoint & dstPoint)51 GrCopySurfaceBatch(GrSurface* dst, GrSurface* src, const SkIRect& srcRect, 52 const SkIPoint& dstPoint) 53 : INHERITED(ClassID()) 54 , fDst(dst) 55 , fSrc(src) 56 , fSrcRect(srcRect) 57 , fDstPoint(dstPoint) { 58 fBounds = SkRect::MakeXYWH(SkIntToScalar(dstPoint.fX), SkIntToScalar(dstPoint.fY), 59 SkIntToScalar(srcRect.width()), SkIntToScalar(srcRect.height())); 60 } 61 onCombineIfPossible(GrBatch * that,const GrCaps & caps)62 bool onCombineIfPossible(GrBatch* that, const GrCaps& caps) override { return false; } 63 onPrepare(GrBatchFlushState *)64 void onPrepare(GrBatchFlushState*) override {} 65 onDraw(GrBatchFlushState * state)66 void onDraw(GrBatchFlushState* state) override { 67 state->gpu()->copySurface(fDst.get(), fSrc.get(), fSrcRect, fDstPoint); 68 } 69 70 GrPendingIOResource<GrSurface, kWrite_GrIOType> fDst; 71 GrPendingIOResource<GrSurface, kRead_GrIOType> fSrc; 72 SkIRect fSrcRect; 73 SkIPoint fDstPoint; 74 75 typedef GrBatch INHERITED; 76 }; 77 78 #endif 79