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