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