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