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 GrClearBatch_DEFINED
      9 #define GrClearBatch_DEFINED
     10 
     11 #include "GrBatch.h"
     12 #include "GrBatchFlushState.h"
     13 #include "GrGpu.h"
     14 #include "GrRenderTarget.h"
     15 
     16 class GrClearBatch final : public GrBatch {
     17 public:
     18     DEFINE_BATCH_CLASS_ID
     19 
     20     GrClearBatch(const SkIRect& rect,  GrColor color, GrRenderTarget* rt)
     21         : INHERITED(ClassID())
     22         , fRect(rect)
     23         , fColor(color)
     24         , fRenderTarget(rt) {
     25         fBounds = SkRect::Make(rect);
     26     }
     27 
     28     const char* name() const override { return "Clear"; }
     29 
     30     uint32_t renderTargetUniqueID() const override { return fRenderTarget.get()->getUniqueID(); }
     31     GrRenderTarget* renderTarget() const override { return fRenderTarget.get(); }
     32 
     33     SkString dumpInfo() const override {
     34         SkString string;
     35         string.printf("Color: 0x%08x, Rect [L: %d, T: %d, R: %d, B: %d], RT: %d",
     36                       fColor, fRect.fLeft, fRect.fTop, fRect.fRight, fRect.fBottom,
     37                       fRenderTarget.get()->getUniqueID());
     38         return string;
     39     }
     40 
     41 private:
     42     bool onCombineIfPossible(GrBatch* t, const GrCaps& caps) override {
     43         // This could be much more complicated. Currently we look at cases where the new clear
     44         // contains the old clear, or when the new clear is a subset of the old clear and is the
     45         // same color.
     46         GrClearBatch* cb = t->cast<GrClearBatch>();
     47         SkASSERT(cb->fRenderTarget == fRenderTarget);
     48         if (cb->fRect.contains(fRect)) {
     49             fRect = cb->fRect;
     50             fBounds = cb->fBounds;
     51             fColor = cb->fColor;
     52             return true;
     53         } else if (cb->fColor == fColor && fRect.contains(cb->fRect)) {
     54             return true;
     55         }
     56         return false;
     57     }
     58 
     59     void onPrepare(GrBatchFlushState*) override {}
     60 
     61     void onDraw(GrBatchFlushState* state) override {
     62         state->gpu()->clear(fRect, fColor, fRenderTarget.get());
     63     }
     64 
     65     SkIRect                                                 fRect;
     66     GrColor                                                 fColor;
     67     GrPendingIOResource<GrRenderTarget, kWrite_GrIOType>    fRenderTarget;
     68 
     69     typedef GrBatch INHERITED;
     70 };
     71 
     72 class GrClearStencilClipBatch final : public GrBatch {
     73 public:
     74     DEFINE_BATCH_CLASS_ID
     75 
     76     GrClearStencilClipBatch(const SkIRect& rect, bool insideClip, GrRenderTarget* rt)
     77         : INHERITED(ClassID())
     78         , fRect(rect)
     79         , fInsideClip(insideClip)
     80         , fRenderTarget(rt) {
     81         fBounds = SkRect::Make(rect);
     82     }
     83 
     84     const char* name() const override { return "ClearStencilClip"; }
     85 
     86     uint32_t renderTargetUniqueID() const override { return fRenderTarget.get()->getUniqueID(); }
     87     GrRenderTarget* renderTarget() const override { return fRenderTarget.get(); }
     88 
     89     SkString dumpInfo() const override {
     90         SkString string;
     91         string.printf("Rect [L: %d, T: %d, R: %d, B: %d], IC: %d, RT: 0x%p",
     92                       fRect.fLeft, fRect.fTop, fRect.fRight, fRect.fBottom, fInsideClip,
     93                       fRenderTarget.get());
     94         return string;
     95     }
     96 
     97 private:
     98     bool onCombineIfPossible(GrBatch* t, const GrCaps& caps) override { return false; }
     99 
    100     void onPrepare(GrBatchFlushState*) override {}
    101 
    102     void onDraw(GrBatchFlushState* state) override {
    103         state->gpu()->clearStencilClip(fRect, fInsideClip, fRenderTarget.get());
    104     }
    105 
    106     SkIRect                                                 fRect;
    107     bool                                                    fInsideClip;
    108     GrPendingIOResource<GrRenderTarget, kWrite_GrIOType>    fRenderTarget;
    109 
    110     typedef GrBatch INHERITED;
    111 };
    112 
    113 #endif
    114