blob: 358692b32e316b7e8248b1f994adb1415d2cd3af [file] [log] [blame]
Chris Dalton70a0d2c2021-01-26 12:01:21 -07001/*
2 * Copyright 2021 Google LLC.
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
Chris Dalton2ed22fa2021-05-06 16:08:30 -06008#ifndef GrPathStencilFillOp_DEFINED
9#define GrPathStencilFillOp_DEFINED
Chris Dalton70a0d2c2021-01-26 12:01:21 -070010
11#include "src/gpu/ops/GrDrawOp.h"
Chris Dalton70a0d2c2021-01-26 12:01:21 -070012#include "src/gpu/tessellate/GrTessellationPathRenderer.h"
Chris Dalton3b412782021-06-01 13:40:03 -060013#include "src/gpu/tessellate/shaders/GrTessellationShader.h"
Chris Dalton70a0d2c2021-01-26 12:01:21 -070014
15class GrPathTessellator;
16
17// Draws paths using a standard Redbook "stencil then fill" method. Curves get linearized by either
Chris Dalton57ab06c2021-04-22 12:57:28 -060018// GPU tessellation shaders or indirect draws. This Op doesn't apply analytic AA, so it requires
19// MSAA if AA is desired.
Chris Dalton2ed22fa2021-05-06 16:08:30 -060020class GrPathStencilFillOp : public GrDrawOp {
Chris Dalton70a0d2c2021-01-26 12:01:21 -070021private:
22 DEFINE_OP_CLASS_ID
23
Chris Dalton2ed22fa2021-05-06 16:08:30 -060024 GrPathStencilFillOp(const SkMatrix& viewMatrix, const SkPath& path, GrPaint&& paint,
Chris Dalton569c01b2021-05-25 10:11:46 -060025 GrAAType aaType, GrTessellationPathRenderer::OpFlags opFlags,
26 const SkRect& devBounds)
Chris Dalton70a0d2c2021-01-26 12:01:21 -070027 : GrDrawOp(ClassID())
28 , fOpFlags(opFlags)
29 , fViewMatrix(viewMatrix)
30 , fPath(path)
31 , fAAType(aaType)
32 , fColor(paint.getColor4f())
33 , fProcessors(std::move(paint)) {
Chris Dalton57ab06c2021-04-22 12:57:28 -060034 this->setBounds(devBounds, HasAABloat::kNo, IsHairline::kNo);
Chris Dalton70a0d2c2021-01-26 12:01:21 -070035 }
36
Chris Dalton2ed22fa2021-05-06 16:08:30 -060037 const char* name() const override { return "GrPathStencilFillOp"; }
Chris Dalton70a0d2c2021-01-26 12:01:21 -070038 void visitProxies(const VisitProxyFunc& fn) const override;
39 FixedFunctionFlags fixedFunctionFlags() const override;
Chris Dalton57ab06c2021-04-22 12:57:28 -060040 GrProcessorSet::Analysis finalize(const GrCaps&, const GrAppliedClip*, GrClampType) override;
Chris Dalton70a0d2c2021-01-26 12:01:21 -070041
42 // Chooses the rendering method we will use and creates the corresponding tessellator and
43 // stencil/fill programs.
Chris Dalton2f733ec2021-06-01 12:11:57 -060044 void prePreparePrograms(const GrTessellationShader::ProgramArgs&, GrAppliedClip&& clip);
Chris Dalton70a0d2c2021-01-26 12:01:21 -070045
46 void onPrePrepare(GrRecordingContext*, const GrSurfaceProxyView&, GrAppliedClip*,
John Stiles52cb1d02021-06-02 11:58:05 -040047 const GrDstProxyView&, GrXferBarrierFlags, GrLoadOp colorLoadOp) override;
Chris Dalton70a0d2c2021-01-26 12:01:21 -070048 void onPrepare(GrOpFlushState*) override;
49 void onExecute(GrOpFlushState*, const SkRect& chainBounds) override;
50
51 const GrTessellationPathRenderer::OpFlags fOpFlags;
52 const SkMatrix fViewMatrix;
53 const SkPath fPath;
54 const GrAAType fAAType;
55 SkPMColor4f fColor;
56 GrProcessorSet fProcessors;
57
58 // Decided during prePreparePrograms.
59 GrPathTessellator* fTessellator = nullptr;
60 const GrProgramInfo* fStencilFanProgram = nullptr;
61 const GrProgramInfo* fStencilPathProgram = nullptr;
62 const GrProgramInfo* fFillBBoxProgram = nullptr;
63
64 // Filled during onPrepare.
65 sk_sp<const GrBuffer> fFanBuffer;
66 int fFanBaseVertex = 0;
67 int fFanVertexCount = 0;
68
Chris Daltonc91dd692021-05-24 15:04:47 -060069 sk_sp<const GrBuffer> fBBoxBuffer;
70 int fBBoxBaseInstance = 0;
71
Chris Dalton70a0d2c2021-01-26 12:01:21 -070072 friend class GrOp; // For ctor.
73};
74
75#endif