Flutter Engine
The Flutter Engine
Loading...
Searching...
No Matches
RendererProvider.cpp
Go to the documentation of this file.
1/*
2 * Copyright 2022 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
9
26#include "src/sksl/SkSLUtil.h"
27
28#ifdef SK_ENABLE_VELLO_SHADERS
30#endif
31
32namespace skgpu::graphite {
33
35#ifdef SK_ENABLE_VELLO_SHADERS
36 return caps->computeSupport();
37#else
38 return false;
39#endif
40}
41
42// The destructor is intentionally defined here and not in the header file to allow forward
43// declared types (such as `VelloRenderer`) to be defined as a `std::unique_ptr` parameter type
44// in members.
46
47RendererProvider::RendererProvider(const Caps* caps, StaticBufferManager* bufferManager) {
48 // This constructor requires all Renderers be densely packed so that it can simply iterate over
49 // the fields directly and fill 'fRenderers' with every one that was initialized with a
50 // non-empty renderer. While this is a little magical, it simplifies the rest of the logic
51 // and can be enforced statically.
52 static constexpr size_t kRendererSize = offsetof(RendererProvider, fRenderers) -
53 offsetof(RendererProvider, fStencilTessellatedCurves);
54 static_assert(kRendererSize % sizeof(Renderer) == 0, "Renderer declarations are not dense");
55
56 const bool infinitySupport = caps->shaderCaps()->fInfinitySupport;
57
58 // Single-step renderers don't share RenderSteps
59 auto makeFromStep = [&](std::unique_ptr<RenderStep> singleStep, DrawTypeFlags drawTypes) {
60 std::string name = "SingleStep[";
61 name += singleStep->name();
62 name += "]";
63 fRenderSteps.push_back(std::move(singleStep));
64 return Renderer(name, drawTypes, fRenderSteps.back().get());
65 };
66
67 fConvexTessellatedWedges =
68 makeFromStep(std::make_unique<TessellateWedgesRenderStep>(
69 "convex", infinitySupport, kDirectDepthGreaterPass, bufferManager),
71 fTessellatedStrokes = makeFromStep(
72 std::make_unique<TessellateStrokesRenderStep>(infinitySupport), DrawTypeFlags::kShape);
73 fCoverageMask = makeFromStep(std::make_unique<CoverageMaskRenderStep>(), DrawTypeFlags::kShape);
74 for (bool lcd : {false, true}) {
75 fBitmapText[lcd] = makeFromStep(std::make_unique<BitmapTextRenderStep>(lcd),
77 fSDFText[lcd] = makeFromStep(std::make_unique<SDFTextRenderStep>(lcd),
79 }
80 fAnalyticRRect = makeFromStep(std::make_unique<AnalyticRRectRenderStep>(bufferManager),
82 fPerEdgeAAQuad = makeFromStep(std::make_unique<PerEdgeAAQuadRenderStep>(bufferManager),
84 fAnalyticBlur = makeFromStep(std::make_unique<AnalyticBlurRenderStep>(),
87 for (bool color : {false, true}) {
88 for (bool texCoords : {false, true}) {
89 int index = 4*(primType == PrimitiveType::kTriangleStrip) + 2*color + texCoords;
90 fVertices[index] = makeFromStep(
91 std::make_unique<VerticesRenderStep>(primType, color, texCoords),
93 }
94 }
95 }
96
97 // The tessellating path renderers that use stencil can share the cover steps.
98 auto coverFill = std::make_unique<CoverBoundsRenderStep>(false);
99 auto coverInverse = std::make_unique<CoverBoundsRenderStep>(true);
100
101 for (bool evenOdd : {false, true}) {
102 // These steps can be shared by regular and inverse fills
103 auto stencilFan = std::make_unique<MiddleOutFanRenderStep>(evenOdd);
104 auto stencilCurve = std::make_unique<TessellateCurvesRenderStep>(
105 evenOdd, infinitySupport, bufferManager);
106 auto stencilWedge =
107 evenOdd ? std::make_unique<TessellateWedgesRenderStep>(
108 "evenodd", infinitySupport, kEvenOddStencilPass, bufferManager)
109 : std::make_unique<TessellateWedgesRenderStep>(
110 "winding", infinitySupport, kWindingStencilPass, bufferManager);
111
112 for (bool inverse : {false, true}) {
113 static const char* kTessVariants[4] =
114 {"[winding]", "[evenodd]", "[inverse-winding]", "[inverse-evenodd]"};
115
116 int index = 2*inverse + evenOdd; // matches SkPathFillType
117 std::string variant = kTessVariants[index];
118
119 constexpr DrawTypeFlags kTextAndShape =
121
122 const RenderStep* coverStep = inverse ? coverInverse.get() : coverFill.get();
123 fStencilTessellatedCurves[index] = Renderer("StencilTessellatedCurvesAndTris" + variant,
124 kTextAndShape,
125 stencilFan.get(),
126 stencilCurve.get(),
127 coverStep);
128
129 fStencilTessellatedWedges[index] = Renderer("StencilTessellatedWedges" + variant,
130 kTextAndShape,
131 stencilWedge.get(),
132 coverStep);
133 }
134
135 fRenderSteps.push_back(std::move(stencilFan));
136 fRenderSteps.push_back(std::move(stencilCurve));
137 fRenderSteps.push_back(std::move(stencilWedge));
138 }
139
140 fRenderSteps.push_back(std::move(coverInverse));
141 fRenderSteps.push_back(std::move(coverFill));
142
143 // Fill out 'fRenderers' by iterating the "span" from fStencilTessellatedCurves to fRenderers
144 // and checking if they've been skipped or not.
145 SkSpan<Renderer> allRenderers = {fStencilTessellatedCurves, kRendererSize / sizeof(Renderer)};
146 for (const Renderer& r : allRenderers) {
147 if (r.numRenderSteps() > 0) {
148 fRenderers.push_back(&r);
149 }
150 }
151
152#ifdef SK_ENABLE_VELLO_SHADERS
153 fVelloRenderer = std::make_unique<VelloRenderer>(caps);
154#endif
155}
156
157const RenderStep* RendererProvider::lookup(uint32_t uniqueID) const {
158 for (auto&& rs : fRenderSteps) {
159 if (rs->uniqueID() == uniqueID) {
160 return rs.get();
161 }
162 }
163 return nullptr;
164}
165
166} // namespace skgpu::graphite
SkColor4f color
bool computeSupport() const
Definition Caps.h:250
const SkSL::ShaderCaps * shaderCaps() const
Definition Caps.h:74
const RenderStep * lookup(uint32_t uniqueID) const
static bool IsVelloRendererSupported(const Caps *)
const char * name
Definition fuchsia.cc:50
constexpr DepthStencilSettings kWindingStencilPass
static constexpr DepthStencilSettings kDirectDepthGreaterPass
constexpr DepthStencilSettings kEvenOddStencilPass
Definition ref_ptr.h:256
bool fInfinitySupport
Definition SkSLUtil.h:103