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 "include/gpu/GrTypes.h"
12 #include "src/gpu/GrScissorState.h"
13 #include "src/gpu/ops/GrOp.h"
14 
15 class GrOpFlushState;
16 class GrRecordingContext;
17 
18 class GrClearOp final : public GrOp {
19 public:
20     DEFINE_OP_CLASS_ID
21 
22     // A fullscreen or scissored clear, depending on the clip and proxy dimensions
23     static GrOp::Owner MakeColor(GrRecordingContext* context,
24                                  const GrScissorState& scissor,
25                                  std::array<float, 4> color);
26 
27     static GrOp::Owner MakeStencilClip(GrRecordingContext* context,
28                                        const GrScissorState& scissor,
29                                        bool insideMask);
30 
name()31     const char* name() const override { return "Clear"; }
32 
color()33     const std::array<float, 4>& color() const { return fColor; }
stencilInsideMask()34     bool stencilInsideMask() const { return fStencilInsideMask; }
35 private:
36     friend class GrOp; // for ctors
37 
38     enum class Buffer {
39         kColor       = 0b01,
40         kStencilClip = 0b10,
41 
42         kBoth        = 0b11,
43     };
44     GR_DECL_BITFIELD_CLASS_OPS_FRIENDS(Buffer);
45 
46     GrClearOp(Buffer buffer,
47               const GrScissorState& scissor,
48               std::array<float, 4> color,
49               bool stencil);
50 
51     CombineResult onCombineIfPossible(GrOp* t, SkArenaAlloc*, const GrCaps& caps) override;
52 
onPrePrepare(GrRecordingContext *,const GrSurfaceProxyView & writeView,GrAppliedClip *,const GrXferProcessor::DstProxyView &,GrXferBarrierFlags renderPassXferBarriers,GrLoadOp colorLoadOp)53     void onPrePrepare(GrRecordingContext*, const GrSurfaceProxyView& writeView, GrAppliedClip*,
54                       const GrXferProcessor::DstProxyView&,
55                       GrXferBarrierFlags renderPassXferBarriers, GrLoadOp colorLoadOp) override {}
56 
onPrepare(GrOpFlushState *)57     void onPrepare(GrOpFlushState*) override {}
58 
59     void onExecute(GrOpFlushState* state, const SkRect& chainBounds) override;
60 #if GR_TEST_UTILS
onDumpInfo()61     SkString onDumpInfo() const override {
62         SkString string("Scissor [ ");
63         if (fScissor.enabled()) {
64             const SkIRect& r = fScissor.rect();
65             string.appendf("L: %d, T: %d, R: %d, B: %d", r.fLeft, r.fTop, r.fRight, r.fBottom);
66         } else {
67             string.append("disabled");
68         }
69         string.appendf("], Color: {%g, %g, %g, %g}\n", fColor[0], fColor[1], fColor[2], fColor[3]);
70         return string;
71     }
72 #endif
73 
74     GrScissorState       fScissor;
75     std::array<float, 4> fColor;
76     bool                 fStencilInsideMask;
77     Buffer               fBuffer;
78 
79     using INHERITED = GrOp;
80 };
81 
82 GR_MAKE_BITFIELD_CLASS_OPS(GrClearOp::Buffer)
83 
84 #endif
85