blob: ee5e0af94c82d2cc0972d536f345053b6ee9ca00 [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"
12#include "src/gpu/tessellate/GrPathShader.h"
13#include "src/gpu/tessellate/GrTessellationPathRenderer.h"
14
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.
44 void prePreparePrograms(const GrPathShader::ProgramArgs&, GrAppliedClip&& clip);
45
46 void onPrePrepare(GrRecordingContext*, const GrSurfaceProxyView&, GrAppliedClip*,
47 const GrXferProcessor::DstProxyView&, GrXferBarrierFlags,
48 GrLoadOp colorLoadOp) override;
49 void onPrepare(GrOpFlushState*) override;
50 void onExecute(GrOpFlushState*, const SkRect& chainBounds) override;
51
52 const GrTessellationPathRenderer::OpFlags fOpFlags;
53 const SkMatrix fViewMatrix;
54 const SkPath fPath;
55 const GrAAType fAAType;
56 SkPMColor4f fColor;
57 GrProcessorSet fProcessors;
58
59 // Decided during prePreparePrograms.
60 GrPathTessellator* fTessellator = nullptr;
61 const GrProgramInfo* fStencilFanProgram = nullptr;
62 const GrProgramInfo* fStencilPathProgram = nullptr;
63 const GrProgramInfo* fFillBBoxProgram = nullptr;
64
65 // Filled during onPrepare.
66 sk_sp<const GrBuffer> fFanBuffer;
67 int fFanBaseVertex = 0;
68 int fFanVertexCount = 0;
69
Chris Daltonc91dd692021-05-24 15:04:47 -060070 sk_sp<const GrBuffer> fBBoxBuffer;
71 int fBBoxBaseInstance = 0;
72
Chris Dalton70a0d2c2021-01-26 12:01:21 -070073 friend class GrOp; // For ctor.
74};
75
76#endif