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 GrDrawOp_DEFINED 9*c8dee2aaSAndroid Build Coastguard Worker #define GrDrawOp_DEFINED 10*c8dee2aaSAndroid Build Coastguard Worker 11*c8dee2aaSAndroid Build Coastguard Worker #include "include/core/SkTypes.h" 12*c8dee2aaSAndroid Build Coastguard Worker #include "include/private/base/SkMacros.h" 13*c8dee2aaSAndroid Build Coastguard Worker #include "src/gpu/ganesh/GrCaps.h" 14*c8dee2aaSAndroid Build Coastguard Worker #include "src/gpu/ganesh/GrProcessorSet.h" 15*c8dee2aaSAndroid Build Coastguard Worker #include "src/gpu/ganesh/ops/GrOp.h" 16*c8dee2aaSAndroid Build Coastguard Worker 17*c8dee2aaSAndroid Build Coastguard Worker #include <cstdint> 18*c8dee2aaSAndroid Build Coastguard Worker 19*c8dee2aaSAndroid Build Coastguard Worker class GrAppliedClip; 20*c8dee2aaSAndroid Build Coastguard Worker class GrShape; 21*c8dee2aaSAndroid Build Coastguard Worker class SkMatrix; 22*c8dee2aaSAndroid Build Coastguard Worker enum class GrAA : bool; 23*c8dee2aaSAndroid Build Coastguard Worker enum class GrClampType; 24*c8dee2aaSAndroid Build Coastguard Worker enum class SkClipOp; 25*c8dee2aaSAndroid Build Coastguard Worker namespace skgpu::ganesh { class SurfaceDrawContext; } 26*c8dee2aaSAndroid Build Coastguard Worker 27*c8dee2aaSAndroid Build Coastguard Worker /** 28*c8dee2aaSAndroid Build Coastguard Worker * Base class for GrOps that draw. These ops can draw into an op list's GrRenderTarget. 29*c8dee2aaSAndroid Build Coastguard Worker */ 30*c8dee2aaSAndroid Build Coastguard Worker class GrDrawOp : public GrOp { 31*c8dee2aaSAndroid Build Coastguard Worker public: GrDrawOp(uint32_t classID)32*c8dee2aaSAndroid Build Coastguard Worker GrDrawOp(uint32_t classID) : INHERITED(classID) {} 33*c8dee2aaSAndroid Build Coastguard Worker 34*c8dee2aaSAndroid Build Coastguard Worker /** 35*c8dee2aaSAndroid Build Coastguard Worker * Called before setting up the GrAppliedClip and before finalize. This information is required 36*c8dee2aaSAndroid Build Coastguard Worker * to determine how to compute a GrAppliedClip from a GrClip for this op. 37*c8dee2aaSAndroid Build Coastguard Worker */ usesMSAA()38*c8dee2aaSAndroid Build Coastguard Worker virtual bool usesMSAA() const { 39*c8dee2aaSAndroid Build Coastguard Worker return this->fixedFunctionFlags() & FixedFunctionFlags::kUsesHWAA; 40*c8dee2aaSAndroid Build Coastguard Worker } 41*c8dee2aaSAndroid Build Coastguard Worker 42*c8dee2aaSAndroid Build Coastguard Worker /** 43*c8dee2aaSAndroid Build Coastguard Worker * Specifies the effect of clipToShape(). 44*c8dee2aaSAndroid Build Coastguard Worker */ 45*c8dee2aaSAndroid Build Coastguard Worker enum class ClipResult { 46*c8dee2aaSAndroid Build Coastguard Worker // No clip was applied. 47*c8dee2aaSAndroid Build Coastguard Worker kFail, 48*c8dee2aaSAndroid Build Coastguard Worker // The clip was applied to the op's actual geometry. The clip stack is free to disable the 49*c8dee2aaSAndroid Build Coastguard Worker // scissor test. 50*c8dee2aaSAndroid Build Coastguard Worker kClippedGeometrically, 51*c8dee2aaSAndroid Build Coastguard Worker // The clip was applied via shader coverage. The clip stack will still use a scissor test 52*c8dee2aaSAndroid Build Coastguard Worker // in order to reduce overdraw of transparent pixels. 53*c8dee2aaSAndroid Build Coastguard Worker kClippedInShader, 54*c8dee2aaSAndroid Build Coastguard Worker // The op can be thrown out entirely. 55*c8dee2aaSAndroid Build Coastguard Worker kClippedOut 56*c8dee2aaSAndroid Build Coastguard Worker }; 57*c8dee2aaSAndroid Build Coastguard Worker 58*c8dee2aaSAndroid Build Coastguard Worker /** 59*c8dee2aaSAndroid Build Coastguard Worker * This is called while the clip is being computed, before finalize(), and before any attempts 60*c8dee2aaSAndroid Build Coastguard Worker * to combine with other ops. If the op knows how to clip its own geometry then it will 61*c8dee2aaSAndroid Build Coastguard Worker * generally be much faster than a generalized clip method. 62*c8dee2aaSAndroid Build Coastguard Worker */ clipToShape(skgpu::ganesh::SurfaceDrawContext *,SkClipOp,const SkMatrix &,const GrShape &,GrAA)63*c8dee2aaSAndroid Build Coastguard Worker virtual ClipResult clipToShape(skgpu::ganesh::SurfaceDrawContext*, 64*c8dee2aaSAndroid Build Coastguard Worker SkClipOp, 65*c8dee2aaSAndroid Build Coastguard Worker const SkMatrix& /* clipMatrix */, 66*c8dee2aaSAndroid Build Coastguard Worker const GrShape&, 67*c8dee2aaSAndroid Build Coastguard Worker GrAA) { 68*c8dee2aaSAndroid Build Coastguard Worker return ClipResult::kFail; 69*c8dee2aaSAndroid Build Coastguard Worker } 70*c8dee2aaSAndroid Build Coastguard Worker 71*c8dee2aaSAndroid Build Coastguard Worker /** 72*c8dee2aaSAndroid Build Coastguard Worker * This is called after the GrAppliedClip has been computed and just prior to recording the op 73*c8dee2aaSAndroid Build Coastguard Worker * or combining it with a previously recorded op. The op should convert any proxies or resources 74*c8dee2aaSAndroid Build Coastguard Worker * it owns to "pending io" status so that resource allocation can be more optimal. Additionally, 75*c8dee2aaSAndroid Build Coastguard Worker * at this time the op must report whether a copy of the destination (or destination texture 76*c8dee2aaSAndroid Build Coastguard Worker * itself) needs to be provided to the GrXferProcessor when this op executes. 77*c8dee2aaSAndroid Build Coastguard Worker */ 78*c8dee2aaSAndroid Build Coastguard Worker virtual GrProcessorSet::Analysis finalize(const GrCaps&, const GrAppliedClip*, GrClampType) = 0; 79*c8dee2aaSAndroid Build Coastguard Worker 80*c8dee2aaSAndroid Build Coastguard Worker /** 81*c8dee2aaSAndroid Build Coastguard Worker * Called after finalize, at which point every op should know whether it will need stencil. 82*c8dee2aaSAndroid Build Coastguard Worker */ usesStencil()83*c8dee2aaSAndroid Build Coastguard Worker virtual bool usesStencil() const { 84*c8dee2aaSAndroid Build Coastguard Worker return this->fixedFunctionFlags() & FixedFunctionFlags::kUsesStencil; 85*c8dee2aaSAndroid Build Coastguard Worker } 86*c8dee2aaSAndroid Build Coastguard Worker 87*c8dee2aaSAndroid Build Coastguard Worker #ifdef SK_DEBUG 88*c8dee2aaSAndroid Build Coastguard Worker bool fAddDrawOpCalled = false; 89*c8dee2aaSAndroid Build Coastguard Worker validate()90*c8dee2aaSAndroid Build Coastguard Worker void validate() const override { 91*c8dee2aaSAndroid Build Coastguard Worker SkASSERT(fAddDrawOpCalled); 92*c8dee2aaSAndroid Build Coastguard Worker } 93*c8dee2aaSAndroid Build Coastguard Worker #endif 94*c8dee2aaSAndroid Build Coastguard Worker 95*c8dee2aaSAndroid Build Coastguard Worker #if defined(GPU_TEST_UTILS) 96*c8dee2aaSAndroid Build Coastguard Worker // This is really only intended for TextureOp and FillRectOp to override numQuads()97*c8dee2aaSAndroid Build Coastguard Worker virtual int numQuads() const { return -1; } 98*c8dee2aaSAndroid Build Coastguard Worker #endif 99*c8dee2aaSAndroid Build Coastguard Worker 100*c8dee2aaSAndroid Build Coastguard Worker protected: 101*c8dee2aaSAndroid Build Coastguard Worker /** 102*c8dee2aaSAndroid Build Coastguard Worker * DEPRECATED: This is a legacy implementation for usesMSAA() and usesStencil(). Newer ops 103*c8dee2aaSAndroid Build Coastguard Worker * should override those methods directly. 104*c8dee2aaSAndroid Build Coastguard Worker */ 105*c8dee2aaSAndroid Build Coastguard Worker enum class FixedFunctionFlags : uint32_t { 106*c8dee2aaSAndroid Build Coastguard Worker kNone = 0x0, 107*c8dee2aaSAndroid Build Coastguard Worker /** Indices that the op will enable MSAA. */ 108*c8dee2aaSAndroid Build Coastguard Worker kUsesHWAA = 0x1, 109*c8dee2aaSAndroid Build Coastguard Worker /** Indices that the op reads and/or writes the stencil buffer */ 110*c8dee2aaSAndroid Build Coastguard Worker kUsesStencil = 0x2, 111*c8dee2aaSAndroid Build Coastguard Worker }; 112*c8dee2aaSAndroid Build Coastguard Worker SK_DECL_BITFIELD_CLASS_OPS_FRIENDS(FixedFunctionFlags); fixedFunctionFlags()113*c8dee2aaSAndroid Build Coastguard Worker virtual FixedFunctionFlags fixedFunctionFlags() const { 114*c8dee2aaSAndroid Build Coastguard Worker // Override usesMSAA() and usesStencil() instead. 115*c8dee2aaSAndroid Build Coastguard Worker SK_ABORT("fixedFunctionFlags() not implemented."); 116*c8dee2aaSAndroid Build Coastguard Worker } 117*c8dee2aaSAndroid Build Coastguard Worker 118*c8dee2aaSAndroid Build Coastguard Worker private: 119*c8dee2aaSAndroid Build Coastguard Worker friend class GrSimpleMeshDrawOpHelper; // For FixedFunctionFlags. 120*c8dee2aaSAndroid Build Coastguard Worker friend class GrSimpleMeshDrawOpHelperWithStencil; // For FixedFunctionFlags. 121*c8dee2aaSAndroid Build Coastguard Worker 122*c8dee2aaSAndroid Build Coastguard Worker using INHERITED = GrOp; 123*c8dee2aaSAndroid Build Coastguard Worker }; 124*c8dee2aaSAndroid Build Coastguard Worker 125*c8dee2aaSAndroid Build Coastguard Worker SK_MAKE_BITFIELD_CLASS_OPS(GrDrawOp::FixedFunctionFlags) 126*c8dee2aaSAndroid Build Coastguard Worker 127*c8dee2aaSAndroid Build Coastguard Worker #endif 128