1*c8dee2aaSAndroid Build Coastguard Worker /* 2*c8dee2aaSAndroid Build Coastguard Worker * Copyright 2021 Google LLC. 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 PathTessellateOp_DEFINED 9*c8dee2aaSAndroid Build Coastguard Worker #define PathTessellateOp_DEFINED 10*c8dee2aaSAndroid Build Coastguard Worker 11*c8dee2aaSAndroid Build Coastguard Worker #include "include/core/SkMatrix.h" 12*c8dee2aaSAndroid Build Coastguard Worker #include "include/core/SkPath.h" 13*c8dee2aaSAndroid Build Coastguard Worker #include "include/private/SkColorData.h" 14*c8dee2aaSAndroid Build Coastguard Worker #include "include/private/base/SkAssert.h" 15*c8dee2aaSAndroid Build Coastguard Worker #include "include/private/gpu/ganesh/GrTypesPriv.h" 16*c8dee2aaSAndroid Build Coastguard Worker #include "src/base/SkArenaAlloc.h" 17*c8dee2aaSAndroid Build Coastguard Worker #include "src/gpu/ganesh/GrCaps.h" 18*c8dee2aaSAndroid Build Coastguard Worker #include "src/gpu/ganesh/GrPaint.h" 19*c8dee2aaSAndroid Build Coastguard Worker #include "src/gpu/ganesh/GrProcessorSet.h" 20*c8dee2aaSAndroid Build Coastguard Worker #include "src/gpu/ganesh/GrUserStencilSettings.h" 21*c8dee2aaSAndroid Build Coastguard Worker #include "src/gpu/ganesh/ops/GrDrawOp.h" 22*c8dee2aaSAndroid Build Coastguard Worker #include "src/gpu/ganesh/ops/GrOp.h" 23*c8dee2aaSAndroid Build Coastguard Worker #include "src/gpu/ganesh/tessellate/GrTessellationShader.h" 24*c8dee2aaSAndroid Build Coastguard Worker #include "src/gpu/ganesh/tessellate/PathTessellator.h" 25*c8dee2aaSAndroid Build Coastguard Worker #include "src/gpu/tessellate/Tessellation.h" 26*c8dee2aaSAndroid Build Coastguard Worker 27*c8dee2aaSAndroid Build Coastguard Worker #include <utility> 28*c8dee2aaSAndroid Build Coastguard Worker 29*c8dee2aaSAndroid Build Coastguard Worker class GrAppliedClip; 30*c8dee2aaSAndroid Build Coastguard Worker class GrDstProxyView; 31*c8dee2aaSAndroid Build Coastguard Worker class GrOpFlushState; 32*c8dee2aaSAndroid Build Coastguard Worker class GrProgramInfo; 33*c8dee2aaSAndroid Build Coastguard Worker class GrRecordingContext; 34*c8dee2aaSAndroid Build Coastguard Worker class GrSurfaceProxyView; 35*c8dee2aaSAndroid Build Coastguard Worker enum class GrXferBarrierFlags; 36*c8dee2aaSAndroid Build Coastguard Worker struct SkRect; 37*c8dee2aaSAndroid Build Coastguard Worker 38*c8dee2aaSAndroid Build Coastguard Worker namespace skgpu::ganesh { 39*c8dee2aaSAndroid Build Coastguard Worker 40*c8dee2aaSAndroid Build Coastguard Worker // Tessellates a path directly to the color buffer, using one single render pass. This currently 41*c8dee2aaSAndroid Build Coastguard Worker // only works for convex paths. 42*c8dee2aaSAndroid Build Coastguard Worker class PathTessellateOp final : public GrDrawOp { 43*c8dee2aaSAndroid Build Coastguard Worker private: 44*c8dee2aaSAndroid Build Coastguard Worker DEFINE_OP_CLASS_ID 45*c8dee2aaSAndroid Build Coastguard Worker 46*c8dee2aaSAndroid Build Coastguard Worker using PatchAttribs = PathTessellator::PatchAttribs; 47*c8dee2aaSAndroid Build Coastguard Worker using PathDrawList = PathTessellator::PathDrawList; 48*c8dee2aaSAndroid Build Coastguard Worker PathTessellateOp(SkArenaAlloc * arena,GrAAType aaType,const GrUserStencilSettings * stencil,const SkMatrix & viewMatrix,const SkPath & path,GrPaint && paint,const SkRect & drawBounds)49*c8dee2aaSAndroid Build Coastguard Worker PathTessellateOp(SkArenaAlloc* arena, 50*c8dee2aaSAndroid Build Coastguard Worker GrAAType aaType, 51*c8dee2aaSAndroid Build Coastguard Worker const GrUserStencilSettings* stencil, 52*c8dee2aaSAndroid Build Coastguard Worker const SkMatrix& viewMatrix, 53*c8dee2aaSAndroid Build Coastguard Worker const SkPath& path, 54*c8dee2aaSAndroid Build Coastguard Worker GrPaint&& paint, 55*c8dee2aaSAndroid Build Coastguard Worker const SkRect& drawBounds) 56*c8dee2aaSAndroid Build Coastguard Worker : GrDrawOp(ClassID()) 57*c8dee2aaSAndroid Build Coastguard Worker , fAAType(aaType) 58*c8dee2aaSAndroid Build Coastguard Worker , fStencil(stencil) 59*c8dee2aaSAndroid Build Coastguard Worker , fTotalCombinedPathVerbCnt(path.countVerbs()) 60*c8dee2aaSAndroid Build Coastguard Worker , fPathDrawList(arena->make<PathDrawList>(SkMatrix::I(), path, paint.getColor4f())) 61*c8dee2aaSAndroid Build Coastguard Worker , fPathDrawTail(&fPathDrawList->fNext) 62*c8dee2aaSAndroid Build Coastguard Worker , fProcessors(std::move(paint)) 63*c8dee2aaSAndroid Build Coastguard Worker , fShaderMatrix(viewMatrix) { 64*c8dee2aaSAndroid Build Coastguard Worker SkASSERT(!path.isInverseFillType()); 65*c8dee2aaSAndroid Build Coastguard Worker if (!this->headDraw().fColor.fitsInBytes()) { 66*c8dee2aaSAndroid Build Coastguard Worker fPatchAttribs |= PatchAttribs::kWideColorIfEnabled; 67*c8dee2aaSAndroid Build Coastguard Worker } 68*c8dee2aaSAndroid Build Coastguard Worker this->setBounds(drawBounds, HasAABloat::kNo, IsHairline::kNo); 69*c8dee2aaSAndroid Build Coastguard Worker } 70*c8dee2aaSAndroid Build Coastguard Worker headDraw()71*c8dee2aaSAndroid Build Coastguard Worker PathDrawList& headDraw() { return *fPathDrawList; } 72*c8dee2aaSAndroid Build Coastguard Worker 73*c8dee2aaSAndroid Build Coastguard Worker void prepareTessellator(const GrTessellationShader::ProgramArgs&, GrAppliedClip&& clip); 74*c8dee2aaSAndroid Build Coastguard Worker 75*c8dee2aaSAndroid Build Coastguard Worker // GrDrawOp overrides. name()76*c8dee2aaSAndroid Build Coastguard Worker const char* name() const override { return "PathTessellateOp"; } usesMSAA()77*c8dee2aaSAndroid Build Coastguard Worker bool usesMSAA() const override { return fAAType == GrAAType::kMSAA; } 78*c8dee2aaSAndroid Build Coastguard Worker void visitProxies(const GrVisitProxyFunc&) const override; 79*c8dee2aaSAndroid Build Coastguard Worker GrProcessorSet::Analysis finalize(const GrCaps&, const GrAppliedClip*, GrClampType) override; usesStencil()80*c8dee2aaSAndroid Build Coastguard Worker bool usesStencil() const override { return !fStencil->isUnused(); } 81*c8dee2aaSAndroid Build Coastguard Worker CombineResult onCombineIfPossible(GrOp*, SkArenaAlloc*, const GrCaps&) override; 82*c8dee2aaSAndroid Build Coastguard Worker void onPrePrepare(GrRecordingContext*, const GrSurfaceProxyView&, GrAppliedClip*, 83*c8dee2aaSAndroid Build Coastguard Worker const GrDstProxyView&, GrXferBarrierFlags, GrLoadOp colorLoadOp) override; 84*c8dee2aaSAndroid Build Coastguard Worker void onPrepare(GrOpFlushState*) override; 85*c8dee2aaSAndroid Build Coastguard Worker void onExecute(GrOpFlushState*, const SkRect& chainBounds) override; 86*c8dee2aaSAndroid Build Coastguard Worker 87*c8dee2aaSAndroid Build Coastguard Worker const GrAAType fAAType; 88*c8dee2aaSAndroid Build Coastguard Worker const GrUserStencilSettings* const fStencil; 89*c8dee2aaSAndroid Build Coastguard Worker int fTotalCombinedPathVerbCnt; 90*c8dee2aaSAndroid Build Coastguard Worker PatchAttribs fPatchAttribs = PatchAttribs::kNone; 91*c8dee2aaSAndroid Build Coastguard Worker PathDrawList* const fPathDrawList; 92*c8dee2aaSAndroid Build Coastguard Worker PathDrawList** fPathDrawTail; 93*c8dee2aaSAndroid Build Coastguard Worker GrProcessorSet fProcessors; 94*c8dee2aaSAndroid Build Coastguard Worker SkMatrix fShaderMatrix; 95*c8dee2aaSAndroid Build Coastguard Worker 96*c8dee2aaSAndroid Build Coastguard Worker // Decided during prepareTessellator. 97*c8dee2aaSAndroid Build Coastguard Worker PathTessellator* fTessellator = nullptr; 98*c8dee2aaSAndroid Build Coastguard Worker const GrProgramInfo* fTessellationProgram = nullptr; 99*c8dee2aaSAndroid Build Coastguard Worker 100*c8dee2aaSAndroid Build Coastguard Worker friend class GrOp; // For ctor. 101*c8dee2aaSAndroid Build Coastguard Worker }; 102*c8dee2aaSAndroid Build Coastguard Worker 103*c8dee2aaSAndroid Build Coastguard Worker } // namespace skgpu::ganesh 104*c8dee2aaSAndroid Build Coastguard Worker 105*c8dee2aaSAndroid Build Coastguard Worker #endif // PathTessellateOp_DEFINED 106