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 
GrClearBatch(const SkIRect & rect,GrColor color,GrRenderTarget * rt)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 
name()28     const char* name() const override { return "Clear"; }
29 
renderTargetUniqueID()30     uint32_t renderTargetUniqueID() const override { return fRenderTarget.get()->getUniqueID(); }
renderTarget()31     GrRenderTarget* renderTarget() const override { return fRenderTarget.get(); }
32 
dumpInfo()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:
onCombineIfPossible(GrBatch * t,const GrCaps & caps)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 
onPrepare(GrBatchFlushState *)59     void onPrepare(GrBatchFlushState*) override {}
60 
onDraw(GrBatchFlushState * state)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 
GrClearStencilClipBatch(const SkIRect & rect,bool insideClip,GrRenderTarget * rt)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 
name()84     const char* name() const override { return "ClearStencilClip"; }
85 
renderTargetUniqueID()86     uint32_t renderTargetUniqueID() const override { return fRenderTarget.get()->getUniqueID(); }
renderTarget()87     GrRenderTarget* renderTarget() const override { return fRenderTarget.get(); }
88 
dumpInfo()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:
onCombineIfPossible(GrBatch * t,const GrCaps & caps)98     bool onCombineIfPossible(GrBatch* t, const GrCaps& caps) override { return false; }
99 
onPrepare(GrBatchFlushState *)100     void onPrepare(GrBatchFlushState*) override {}
101 
onDraw(GrBatchFlushState * state)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