• Home
  • History
  • Annotate
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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 GrClearOp_DEFINED
9 #define GrClearOp_DEFINED
10 
11 #include "GrFixedClip.h"
12 #include "GrGpu.h"
13 #include "GrGpuCommandBuffer.h"
14 #include "GrOp.h"
15 #include "GrOpFlushState.h"
16 #include "GrRenderTarget.h"
17 
18 class GrClearOp final : public GrOp {
19 public:
20     DEFINE_OP_CLASS_ID
21 
Make(const GrFixedClip & clip,GrColor color,GrRenderTarget * rt)22     static std::unique_ptr<GrClearOp> Make(const GrFixedClip& clip, GrColor color,
23                                            GrRenderTarget* rt) {
24         std::unique_ptr<GrClearOp> op(new GrClearOp(clip, color, rt));
25         if (!op->fRenderTarget) {
26             return nullptr; // The clip did not contain any pixels within the render target.
27         }
28         return op;
29     }
30 
Make(const SkIRect & rect,GrColor color,GrRenderTarget * rt,bool fullScreen)31     static std::unique_ptr<GrClearOp> Make(const SkIRect& rect, GrColor color, GrRenderTarget* rt,
32                                            bool fullScreen) {
33         return std::unique_ptr<GrClearOp>(new GrClearOp(rect, color, rt, fullScreen));
34     }
35 
name()36     const char* name() const override { return "Clear"; }
37 
dumpInfo()38     SkString dumpInfo() const override {
39         SkString string("Scissor [");
40         if (fClip.scissorEnabled()) {
41             const SkIRect& r = fClip.scissorRect();
42             string.appendf("L: %d, T: %d, R: %d, B: %d", r.fLeft, r.fTop, r.fRight, r.fBottom);
43         }
44         string.appendf("], Color: 0x%08x, RT: %d", fColor,
45                                                    fRenderTarget.get()->uniqueID().asUInt());
46         string.append(INHERITED::dumpInfo());
47         return string;
48     }
49 
setColor(GrColor color)50     void setColor(GrColor color) { fColor = color; }
51 
52 private:
GrClearOp(const GrFixedClip & clip,GrColor color,GrRenderTarget * rt)53     GrClearOp(const GrFixedClip& clip, GrColor color, GrRenderTarget* rt)
54         : INHERITED(ClassID())
55         , fClip(clip)
56         , fColor(color) {
57         SkIRect rtRect = SkIRect::MakeWH(rt->width(), rt->height());
58         if (fClip.scissorEnabled()) {
59             // Don't let scissors extend outside the RT. This may improve op combining.
60             if (!fClip.intersect(rtRect)) {
61                 return;
62             }
63             if (fClip.scissorRect() == rtRect) {
64                 fClip.disableScissor();
65             }
66         }
67         this->setBounds(SkRect::Make(fClip.scissorEnabled() ? fClip.scissorRect() : rtRect),
68                         HasAABloat::kNo, IsZeroArea::kNo);
69         fRenderTarget.reset(rt);
70     }
71 
GrClearOp(const SkIRect & rect,GrColor color,GrRenderTarget * rt,bool fullScreen)72     GrClearOp(const SkIRect& rect, GrColor color, GrRenderTarget* rt, bool fullScreen)
73         : INHERITED(ClassID())
74         , fClip(GrFixedClip(rect))
75         , fColor(color)
76         , fRenderTarget(rt) {
77         if (fullScreen) {
78             fClip.disableScissor();
79         }
80         this->setBounds(SkRect::Make(rect), HasAABloat::kNo, IsZeroArea::kNo);
81     }
82 
onCombineIfPossible(GrOp * t,const GrCaps & caps)83     bool onCombineIfPossible(GrOp* t, const GrCaps& caps) override {
84         // This could be much more complicated. Currently we look at cases where the new clear
85         // contains the old clear, or when the new clear is a subset of the old clear and is the
86         // same color.
87         GrClearOp* cb = t->cast<GrClearOp>();
88         SkASSERT(cb->fRenderTarget == fRenderTarget);
89         if (fClip.windowRectsState() != cb->fClip.windowRectsState()) {
90             return false;
91         }
92         if (cb->contains(this)) {
93             fClip = cb->fClip;
94             this->replaceBounds(*t);
95             fColor = cb->fColor;
96             return true;
97         } else if (cb->fColor == fColor && this->contains(cb)) {
98             return true;
99         }
100         return false;
101     }
102 
contains(const GrClearOp * that)103     bool contains(const GrClearOp* that) const {
104         // The constructor ensures that scissor gets disabled on any clip that fills the entire RT.
105         return !fClip.scissorEnabled() ||
106                (that->fClip.scissorEnabled() &&
107                 fClip.scissorRect().contains(that->fClip.scissorRect()));
108     }
109 
onPrepare(GrOpFlushState *)110     void onPrepare(GrOpFlushState*) override {}
111 
onExecute(GrOpFlushState * state)112     void onExecute(GrOpFlushState* state) override {
113         state->commandBuffer()->clear(fRenderTarget.get(), fClip, fColor);
114     }
115 
116     GrFixedClip                                             fClip;
117     GrColor                                                 fColor;
118     GrPendingIOResource<GrRenderTarget, kWrite_GrIOType>    fRenderTarget;
119 
120     typedef GrOp INHERITED;
121 };
122 
123 #endif
124