blob: cfecd47abca56c3b964ba008a2b5f4d9f5347026 [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,
25 GrAAType aaType, GrTessellationPathRenderer::OpFlags opFlags)
Chris Dalton70a0d2c2021-01-26 12:01:21 -070026 : GrDrawOp(ClassID())
27 , fOpFlags(opFlags)
28 , fViewMatrix(viewMatrix)
29 , fPath(path)
30 , fAAType(aaType)
31 , fColor(paint.getColor4f())
32 , fProcessors(std::move(paint)) {
33 SkRect devBounds;
34 fViewMatrix.mapRect(&devBounds, path.getBounds());
Chris Dalton57ab06c2021-04-22 12:57:28 -060035 this->setBounds(devBounds, HasAABloat::kNo, IsHairline::kNo);
Chris Dalton70a0d2c2021-01-26 12:01:21 -070036 }
37
Chris Dalton2ed22fa2021-05-06 16:08:30 -060038 const char* name() const override { return "GrPathStencilFillOp"; }
Chris Dalton70a0d2c2021-01-26 12:01:21 -070039 void visitProxies(const VisitProxyFunc& fn) const override;
40 FixedFunctionFlags fixedFunctionFlags() const override;
Chris Dalton57ab06c2021-04-22 12:57:28 -060041 GrProcessorSet::Analysis finalize(const GrCaps&, const GrAppliedClip*, GrClampType) override;
Chris Dalton70a0d2c2021-01-26 12:01:21 -070042
43 // Chooses the rendering method we will use and creates the corresponding tessellator and
44 // stencil/fill programs.
45 void prePreparePrograms(const GrPathShader::ProgramArgs&, GrAppliedClip&& clip);
46
47 void onPrePrepare(GrRecordingContext*, const GrSurfaceProxyView&, GrAppliedClip*,
48 const GrXferProcessor::DstProxyView&, GrXferBarrierFlags,
49 GrLoadOp colorLoadOp) override;
50 void onPrepare(GrOpFlushState*) override;
51 void onExecute(GrOpFlushState*, const SkRect& chainBounds) override;
52
53 const GrTessellationPathRenderer::OpFlags fOpFlags;
54 const SkMatrix fViewMatrix;
55 const SkPath fPath;
56 const GrAAType fAAType;
57 SkPMColor4f fColor;
58 GrProcessorSet fProcessors;
59
60 // Decided during prePreparePrograms.
61 GrPathTessellator* fTessellator = nullptr;
62 const GrProgramInfo* fStencilFanProgram = nullptr;
63 const GrProgramInfo* fStencilPathProgram = nullptr;
64 const GrProgramInfo* fFillBBoxProgram = nullptr;
65
66 // Filled during onPrepare.
67 sk_sp<const GrBuffer> fFanBuffer;
68 int fFanBaseVertex = 0;
69 int fFanVertexCount = 0;
70
71 friend class GrOp; // For ctor.
72};
73
74#endif