1*c8dee2aaSAndroid Build Coastguard Worker /* 2*c8dee2aaSAndroid Build Coastguard Worker * Copyright 2020 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 DrawAtlasPathOp_DEFINED 9*c8dee2aaSAndroid Build Coastguard Worker #define DrawAtlasPathOp_DEFINED 10*c8dee2aaSAndroid Build Coastguard Worker 11*c8dee2aaSAndroid Build Coastguard Worker #include "include/core/SkMatrix.h" 12*c8dee2aaSAndroid Build Coastguard Worker #include "include/core/SkRect.h" 13*c8dee2aaSAndroid Build Coastguard Worker #include "include/core/SkRefCnt.h" 14*c8dee2aaSAndroid Build Coastguard Worker #include "include/gpu/GpuTypes.h" 15*c8dee2aaSAndroid Build Coastguard Worker #include "include/private/SkColorData.h" 16*c8dee2aaSAndroid Build Coastguard Worker #include "include/private/gpu/ganesh/GrTypesPriv.h" 17*c8dee2aaSAndroid Build Coastguard Worker #include "src/base/SkArenaAlloc.h" 18*c8dee2aaSAndroid Build Coastguard Worker #include "src/core/SkIPoint16.h" 19*c8dee2aaSAndroid Build Coastguard Worker #include "src/gpu/ganesh/GrBuffer.h" 20*c8dee2aaSAndroid Build Coastguard Worker #include "src/gpu/ganesh/GrCaps.h" 21*c8dee2aaSAndroid Build Coastguard Worker #include "src/gpu/ganesh/GrGpuBuffer.h" 22*c8dee2aaSAndroid Build Coastguard Worker #include "src/gpu/ganesh/GrPaint.h" 23*c8dee2aaSAndroid Build Coastguard Worker #include "src/gpu/ganesh/GrProcessorSet.h" 24*c8dee2aaSAndroid Build Coastguard Worker #include "src/gpu/ganesh/GrSurfaceProxyView.h" 25*c8dee2aaSAndroid Build Coastguard Worker #include "src/gpu/ganesh/ops/AtlasInstancedHelper.h" 26*c8dee2aaSAndroid Build Coastguard Worker #include "src/gpu/ganesh/ops/GrDrawOp.h" 27*c8dee2aaSAndroid Build Coastguard Worker #include "src/gpu/ganesh/ops/GrOp.h" 28*c8dee2aaSAndroid Build Coastguard Worker 29*c8dee2aaSAndroid Build Coastguard Worker #include <array> 30*c8dee2aaSAndroid Build Coastguard Worker #include <utility> 31*c8dee2aaSAndroid Build Coastguard Worker 32*c8dee2aaSAndroid Build Coastguard Worker class GrAppliedClip; 33*c8dee2aaSAndroid Build Coastguard Worker class GrDstProxyView; 34*c8dee2aaSAndroid Build Coastguard Worker class GrOpFlushState; 35*c8dee2aaSAndroid Build Coastguard Worker class GrProgramInfo; 36*c8dee2aaSAndroid Build Coastguard Worker class GrRecordingContext; 37*c8dee2aaSAndroid Build Coastguard Worker enum class GrXferBarrierFlags; 38*c8dee2aaSAndroid Build Coastguard Worker 39*c8dee2aaSAndroid Build Coastguard Worker namespace skgpu::ganesh { 40*c8dee2aaSAndroid Build Coastguard Worker 41*c8dee2aaSAndroid Build Coastguard Worker // Fills a rectangle of pixels with a clip against coverage values from an atlas. 42*c8dee2aaSAndroid Build Coastguard Worker class DrawAtlasPathOp final : public GrDrawOp { 43*c8dee2aaSAndroid Build Coastguard Worker public: 44*c8dee2aaSAndroid Build Coastguard Worker DEFINE_OP_CLASS_ID 45*c8dee2aaSAndroid Build Coastguard Worker DrawAtlasPathOp(SkArenaAlloc * arena,const SkIRect & fillBounds,const SkMatrix & localToDevice,GrPaint && paint,SkIPoint16 locationInAtlas,const SkIRect & pathDevIBounds,bool transposedInAtlas,GrSurfaceProxyView atlasView,bool isInverseFill)46*c8dee2aaSAndroid Build Coastguard Worker DrawAtlasPathOp(SkArenaAlloc* arena, const SkIRect& fillBounds, const SkMatrix& localToDevice, 47*c8dee2aaSAndroid Build Coastguard Worker GrPaint&& paint, SkIPoint16 locationInAtlas, const SkIRect& pathDevIBounds, 48*c8dee2aaSAndroid Build Coastguard Worker bool transposedInAtlas, GrSurfaceProxyView atlasView, bool isInverseFill) 49*c8dee2aaSAndroid Build Coastguard Worker : GrDrawOp(ClassID()) 50*c8dee2aaSAndroid Build Coastguard Worker , fHeadInstance(arena->make<Instance>(fillBounds, localToDevice, paint.getColor4f(), 51*c8dee2aaSAndroid Build Coastguard Worker locationInAtlas, pathDevIBounds, 52*c8dee2aaSAndroid Build Coastguard Worker transposedInAtlas)) 53*c8dee2aaSAndroid Build Coastguard Worker , fTailInstance(&fHeadInstance->fNext) 54*c8dee2aaSAndroid Build Coastguard Worker , fAtlasHelper(std::move(atlasView), 55*c8dee2aaSAndroid Build Coastguard Worker isInverseFill ? AtlasInstancedHelper::ShaderFlags::kCheckBounds | 56*c8dee2aaSAndroid Build Coastguard Worker AtlasInstancedHelper::ShaderFlags::kInvertCoverage 57*c8dee2aaSAndroid Build Coastguard Worker : AtlasInstancedHelper::ShaderFlags::kNone) 58*c8dee2aaSAndroid Build Coastguard Worker , fProcessors(std::move(paint)) { 59*c8dee2aaSAndroid Build Coastguard Worker this->setBounds(SkRect::Make(fillBounds), HasAABloat::kYes, IsHairline::kNo); 60*c8dee2aaSAndroid Build Coastguard Worker } 61*c8dee2aaSAndroid Build Coastguard Worker name()62*c8dee2aaSAndroid Build Coastguard Worker const char* name() const override { return "DrawAtlasPathOp"; } fixedFunctionFlags()63*c8dee2aaSAndroid Build Coastguard Worker FixedFunctionFlags fixedFunctionFlags() const override { return FixedFunctionFlags::kNone; } visitProxies(const GrVisitProxyFunc & func)64*c8dee2aaSAndroid Build Coastguard Worker void visitProxies(const GrVisitProxyFunc& func) const override { 65*c8dee2aaSAndroid Build Coastguard Worker func(fAtlasHelper.proxy(), skgpu::Mipmapped::kNo); 66*c8dee2aaSAndroid Build Coastguard Worker fProcessors.visitProxies(func); 67*c8dee2aaSAndroid Build Coastguard Worker } 68*c8dee2aaSAndroid Build Coastguard Worker GrProcessorSet::Analysis finalize(const GrCaps&, const GrAppliedClip*, GrClampType) override; 69*c8dee2aaSAndroid Build Coastguard Worker CombineResult onCombineIfPossible(GrOp*, SkArenaAlloc*, const GrCaps&) override; 70*c8dee2aaSAndroid Build Coastguard Worker 71*c8dee2aaSAndroid Build Coastguard Worker void onPrePrepare(GrRecordingContext*, const GrSurfaceProxyView& writeView, GrAppliedClip*, 72*c8dee2aaSAndroid Build Coastguard Worker const GrDstProxyView&, GrXferBarrierFlags, GrLoadOp colorLoadOp) override; 73*c8dee2aaSAndroid Build Coastguard Worker void onPrepare(GrOpFlushState*) override; 74*c8dee2aaSAndroid Build Coastguard Worker void onExecute(GrOpFlushState*, const SkRect& chainBounds) override; 75*c8dee2aaSAndroid Build Coastguard Worker 76*c8dee2aaSAndroid Build Coastguard Worker private: 77*c8dee2aaSAndroid Build Coastguard Worker void prepareProgram(const GrCaps&, SkArenaAlloc*, const GrSurfaceProxyView& writeView, 78*c8dee2aaSAndroid Build Coastguard Worker bool usesMSAASurface, GrAppliedClip&&, const GrDstProxyView&, 79*c8dee2aaSAndroid Build Coastguard Worker GrXferBarrierFlags, GrLoadOp colorLoadOp); 80*c8dee2aaSAndroid Build Coastguard Worker 81*c8dee2aaSAndroid Build Coastguard Worker struct Instance { InstanceInstance82*c8dee2aaSAndroid Build Coastguard Worker Instance(const SkIRect& fillIBounds, const SkMatrix& m, 83*c8dee2aaSAndroid Build Coastguard Worker const SkPMColor4f& color, SkIPoint16 locationInAtlas, 84*c8dee2aaSAndroid Build Coastguard Worker const SkIRect& pathDevIBounds, bool transposedInAtlas) 85*c8dee2aaSAndroid Build Coastguard Worker : fFillBounds(fillIBounds) 86*c8dee2aaSAndroid Build Coastguard Worker , fLocalToDeviceIfUsingLocalCoords{m.getScaleX(), m.getSkewY(), 87*c8dee2aaSAndroid Build Coastguard Worker m.getSkewX(), m.getScaleY(), 88*c8dee2aaSAndroid Build Coastguard Worker m.getTranslateX(), m.getTranslateY()} 89*c8dee2aaSAndroid Build Coastguard Worker , fColor(color) 90*c8dee2aaSAndroid Build Coastguard Worker , fAtlasInstance(locationInAtlas, pathDevIBounds, transposedInAtlas) { 91*c8dee2aaSAndroid Build Coastguard Worker } 92*c8dee2aaSAndroid Build Coastguard Worker SkIRect fFillBounds; 93*c8dee2aaSAndroid Build Coastguard Worker std::array<float, 6> fLocalToDeviceIfUsingLocalCoords; 94*c8dee2aaSAndroid Build Coastguard Worker SkPMColor4f fColor; 95*c8dee2aaSAndroid Build Coastguard Worker AtlasInstancedHelper::Instance fAtlasInstance; 96*c8dee2aaSAndroid Build Coastguard Worker Instance* fNext = nullptr; 97*c8dee2aaSAndroid Build Coastguard Worker }; 98*c8dee2aaSAndroid Build Coastguard Worker 99*c8dee2aaSAndroid Build Coastguard Worker Instance* fHeadInstance; 100*c8dee2aaSAndroid Build Coastguard Worker Instance** fTailInstance; 101*c8dee2aaSAndroid Build Coastguard Worker 102*c8dee2aaSAndroid Build Coastguard Worker AtlasInstancedHelper fAtlasHelper; 103*c8dee2aaSAndroid Build Coastguard Worker bool fUsesLocalCoords = false; 104*c8dee2aaSAndroid Build Coastguard Worker 105*c8dee2aaSAndroid Build Coastguard Worker int fInstanceCount = 1; 106*c8dee2aaSAndroid Build Coastguard Worker 107*c8dee2aaSAndroid Build Coastguard Worker GrProgramInfo* fProgram = nullptr; 108*c8dee2aaSAndroid Build Coastguard Worker 109*c8dee2aaSAndroid Build Coastguard Worker sk_sp<const GrBuffer> fInstanceBuffer; 110*c8dee2aaSAndroid Build Coastguard Worker int fBaseInstance; 111*c8dee2aaSAndroid Build Coastguard Worker 112*c8dee2aaSAndroid Build Coastguard Worker // Only used if sk_VertexID is not supported. 113*c8dee2aaSAndroid Build Coastguard Worker sk_sp<const GrGpuBuffer> fVertexBufferIfNoIDSupport; 114*c8dee2aaSAndroid Build Coastguard Worker 115*c8dee2aaSAndroid Build Coastguard Worker GrProcessorSet fProcessors; 116*c8dee2aaSAndroid Build Coastguard Worker }; 117*c8dee2aaSAndroid Build Coastguard Worker 118*c8dee2aaSAndroid Build Coastguard Worker } // namespace skgpu::ganesh 119*c8dee2aaSAndroid Build Coastguard Worker 120*c8dee2aaSAndroid Build Coastguard Worker #endif // DrawAtlasPathOp_DEFINED 121