Home | History | Annotate | Download | only in batches
      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 
     33     const char* name() const override { return "CopySurface"; }
     34 
     35     uint32_t renderTargetUniqueID() const override {
     36         GrRenderTarget* rt = fDst.get()->asRenderTarget();
     37         return rt ? rt->getUniqueID() : 0;
     38     }
     39     GrRenderTarget* renderTarget() const override { return fDst.get()->asRenderTarget(); }
     40 
     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:
     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 
     62     bool onCombineIfPossible(GrBatch* that, const GrCaps& caps) override { return false; }
     63 
     64     void onPrepare(GrBatchFlushState*) override {}
     65 
     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