xref: /aosp_15_r20/external/skia/src/gpu/graphite/Device.h (revision c8dee2aa9b3f27cf6c858bd81872bdeb2c07ed17)
1*c8dee2aaSAndroid Build Coastguard Worker /*
2*c8dee2aaSAndroid Build Coastguard Worker  * Copyright 2021 Google LLC
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 skgpu_graphite_Device_DEFINED
9*c8dee2aaSAndroid Build Coastguard Worker #define skgpu_graphite_Device_DEFINED
10*c8dee2aaSAndroid Build Coastguard Worker 
11*c8dee2aaSAndroid Build Coastguard Worker #include "include/core/SkImage.h"
12*c8dee2aaSAndroid Build Coastguard Worker #include "include/gpu/GpuTypes.h"
13*c8dee2aaSAndroid Build Coastguard Worker #include "src/base/SkEnumBitMask.h"
14*c8dee2aaSAndroid Build Coastguard Worker #include "src/core/SkDevice.h"
15*c8dee2aaSAndroid Build Coastguard Worker #include "src/gpu/graphite/ClipStack_graphite.h"
16*c8dee2aaSAndroid Build Coastguard Worker #include "src/gpu/graphite/DrawOrder.h"
17*c8dee2aaSAndroid Build Coastguard Worker #include "src/gpu/graphite/geom/Rect.h"
18*c8dee2aaSAndroid Build Coastguard Worker #include "src/gpu/graphite/geom/Transform_graphite.h"
19*c8dee2aaSAndroid Build Coastguard Worker #include "src/text/gpu/SubRunContainer.h"
20*c8dee2aaSAndroid Build Coastguard Worker #include "src/text/gpu/SubRunControl.h"
21*c8dee2aaSAndroid Build Coastguard Worker 
22*c8dee2aaSAndroid Build Coastguard Worker enum class SkBackingFit;
23*c8dee2aaSAndroid Build Coastguard Worker class SkStrokeRec;
24*c8dee2aaSAndroid Build Coastguard Worker 
25*c8dee2aaSAndroid Build Coastguard Worker namespace skgpu::graphite {
26*c8dee2aaSAndroid Build Coastguard Worker 
27*c8dee2aaSAndroid Build Coastguard Worker class PathAtlas;
28*c8dee2aaSAndroid Build Coastguard Worker class BoundsManager;
29*c8dee2aaSAndroid Build Coastguard Worker class Clip;
30*c8dee2aaSAndroid Build Coastguard Worker class Context;
31*c8dee2aaSAndroid Build Coastguard Worker class DrawContext;
32*c8dee2aaSAndroid Build Coastguard Worker enum class DstReadRequirement;
33*c8dee2aaSAndroid Build Coastguard Worker class Geometry;
34*c8dee2aaSAndroid Build Coastguard Worker class Image;
35*c8dee2aaSAndroid Build Coastguard Worker enum class LoadOp : uint8_t;
36*c8dee2aaSAndroid Build Coastguard Worker class PaintParams;
37*c8dee2aaSAndroid Build Coastguard Worker class Recorder;
38*c8dee2aaSAndroid Build Coastguard Worker class Renderer;
39*c8dee2aaSAndroid Build Coastguard Worker class Shape;
40*c8dee2aaSAndroid Build Coastguard Worker class StrokeStyle;
41*c8dee2aaSAndroid Build Coastguard Worker class Task;
42*c8dee2aaSAndroid Build Coastguard Worker class TextureProxy;
43*c8dee2aaSAndroid Build Coastguard Worker class TextureProxyView;
44*c8dee2aaSAndroid Build Coastguard Worker 
45*c8dee2aaSAndroid Build Coastguard Worker class Device final : public SkDevice {
46*c8dee2aaSAndroid Build Coastguard Worker public:
47*c8dee2aaSAndroid Build Coastguard Worker     ~Device() override;
48*c8dee2aaSAndroid Build Coastguard Worker 
49*c8dee2aaSAndroid Build Coastguard Worker     // If 'registerWithRecorder' is false, it is meant to be a short-lived Device that is managed
50*c8dee2aaSAndroid Build Coastguard Worker     // by the caller within a limited scope (such that it is guaranteed to go out of scope before
51*c8dee2aaSAndroid Build Coastguard Worker     // the Recorder can be snapped).
52*c8dee2aaSAndroid Build Coastguard Worker     static sk_sp<Device> Make(Recorder* recorder,
53*c8dee2aaSAndroid Build Coastguard Worker                               sk_sp<TextureProxy>,
54*c8dee2aaSAndroid Build Coastguard Worker                               SkISize deviceSize,
55*c8dee2aaSAndroid Build Coastguard Worker                               const SkColorInfo&,
56*c8dee2aaSAndroid Build Coastguard Worker                               const SkSurfaceProps&,
57*c8dee2aaSAndroid Build Coastguard Worker                               LoadOp initialLoadOp,
58*c8dee2aaSAndroid Build Coastguard Worker                               bool registerWithRecorder=true);
59*c8dee2aaSAndroid Build Coastguard Worker     // Convenience factory to create the underlying TextureProxy based on the configuration provided
60*c8dee2aaSAndroid Build Coastguard Worker     static sk_sp<Device> Make(Recorder*,
61*c8dee2aaSAndroid Build Coastguard Worker                               const SkImageInfo&,
62*c8dee2aaSAndroid Build Coastguard Worker                               Budgeted,
63*c8dee2aaSAndroid Build Coastguard Worker                               Mipmapped,
64*c8dee2aaSAndroid Build Coastguard Worker                               SkBackingFit,
65*c8dee2aaSAndroid Build Coastguard Worker                               const SkSurfaceProps&,
66*c8dee2aaSAndroid Build Coastguard Worker                               LoadOp initialLoadOp,
67*c8dee2aaSAndroid Build Coastguard Worker                               std::string_view label,
68*c8dee2aaSAndroid Build Coastguard Worker                               bool registerWithRecorder=true);
69*c8dee2aaSAndroid Build Coastguard Worker 
asGraphiteDevice()70*c8dee2aaSAndroid Build Coastguard Worker     Device* asGraphiteDevice() override { return this; }
71*c8dee2aaSAndroid Build Coastguard Worker 
recorder()72*c8dee2aaSAndroid Build Coastguard Worker     Recorder* recorder() const override { return fRecorder; }
73*c8dee2aaSAndroid Build Coastguard Worker     // This call is triggered from the Recorder on its registered Devices. It is typically called
74*c8dee2aaSAndroid Build Coastguard Worker     // when the Recorder is abandoned or deleted.
abandonRecorder()75*c8dee2aaSAndroid Build Coastguard Worker     void abandonRecorder() { fRecorder = nullptr; }
76*c8dee2aaSAndroid Build Coastguard Worker 
77*c8dee2aaSAndroid Build Coastguard Worker     // Ensures clip elements are drawn that will clip previous draw calls, snaps all pending work
78*c8dee2aaSAndroid Build Coastguard Worker     // from the DrawContext as a RenderPassTask and records it in the Device's recorder.
79*c8dee2aaSAndroid Build Coastguard Worker     void flushPendingWorkToRecorder();
80*c8dee2aaSAndroid Build Coastguard Worker 
81*c8dee2aaSAndroid Build Coastguard Worker     const Transform& localToDeviceTransform();
82*c8dee2aaSAndroid Build Coastguard Worker 
83*c8dee2aaSAndroid Build Coastguard Worker     // Flushes any pending work to the recorder and then deregisters and abandons the recorder.
84*c8dee2aaSAndroid Build Coastguard Worker     void setImmutable() override;
85*c8dee2aaSAndroid Build Coastguard Worker 
86*c8dee2aaSAndroid Build Coastguard Worker     SkStrikeDeviceInfo strikeDeviceInfo() const override;
87*c8dee2aaSAndroid Build Coastguard Worker 
88*c8dee2aaSAndroid Build Coastguard Worker     TextureProxy* target();
89*c8dee2aaSAndroid Build Coastguard Worker     // May be null if target is not sampleable.
90*c8dee2aaSAndroid Build Coastguard Worker     TextureProxyView readSurfaceView() const;
91*c8dee2aaSAndroid Build Coastguard Worker     // Can succeed if target is readable but not sampleable. Assumes 'subset' is contained in bounds
92*c8dee2aaSAndroid Build Coastguard Worker     sk_sp<Image> makeImageCopy(const SkIRect& subset, Budgeted, Mipmapped, SkBackingFit);
93*c8dee2aaSAndroid Build Coastguard Worker 
94*c8dee2aaSAndroid Build Coastguard Worker     // True if this Device represents an internal renderable surface that will go out of scope
95*c8dee2aaSAndroid Build Coastguard Worker     // before the next Recorder snap.
96*c8dee2aaSAndroid Build Coastguard Worker     // NOTE: Currently, there are two different notions of "scratch" that are being merged together.
97*c8dee2aaSAndroid Build Coastguard Worker     // 1. Devices whose targets are not instantiated (Device::Make).
98*c8dee2aaSAndroid Build Coastguard Worker     // 2. Devices that are not registered with the Recorder (Surface::MakeScratch).
99*c8dee2aaSAndroid Build Coastguard Worker     //
100*c8dee2aaSAndroid Build Coastguard Worker     // This function reflects notion #1, since the long-term plan will be that all Devices that are
101*c8dee2aaSAndroid Build Coastguard Worker     // not instantiated will also not be registered with the Recorder. For the time being, due to
102*c8dee2aaSAndroid Build Coastguard Worker     // shared atlas management, layer-backing Devices need to be registered with the Recorder but
103*c8dee2aaSAndroid Build Coastguard Worker     // are otherwise the canonical scratch device.
104*c8dee2aaSAndroid Build Coastguard Worker     //
105*c8dee2aaSAndroid Build Coastguard Worker     // Existing uses of Surface::MakeScratch() will migrate to using un-instantiated Devices with
106*c8dee2aaSAndroid Build Coastguard Worker     // the requirement that if the Device's target is being returned in a client-owned object
107*c8dee2aaSAndroid Build Coastguard Worker     // (e.g. SkImages::MakeWithFilter), that it should then be explicitly instantiated. Once scratch
108*c8dee2aaSAndroid Build Coastguard Worker     // tasks are fully organized in a graph and not automatically appended to the root task list,
109*c8dee2aaSAndroid Build Coastguard Worker     // this explicit instantiation will be responsible for moving the scratch tasks to the root list
110*c8dee2aaSAndroid Build Coastguard Worker     bool isScratchDevice() const;
111*c8dee2aaSAndroid Build Coastguard Worker 
112*c8dee2aaSAndroid Build Coastguard Worker     // Only used for scratch devices.
113*c8dee2aaSAndroid Build Coastguard Worker     sk_sp<Task> lastDrawTask() const;
114*c8dee2aaSAndroid Build Coastguard Worker 
useDrawCoverageMaskForMaskFilters()115*c8dee2aaSAndroid Build Coastguard Worker     bool useDrawCoverageMaskForMaskFilters() const override { return true; }
116*c8dee2aaSAndroid Build Coastguard Worker 
117*c8dee2aaSAndroid Build Coastguard Worker     // Clipping
pushClipStack()118*c8dee2aaSAndroid Build Coastguard Worker     void pushClipStack() override { fClip.save(); }
popClipStack()119*c8dee2aaSAndroid Build Coastguard Worker     void popClipStack() override { fClip.restore(); }
120*c8dee2aaSAndroid Build Coastguard Worker 
isClipWideOpen()121*c8dee2aaSAndroid Build Coastguard Worker     bool isClipWideOpen() const override {
122*c8dee2aaSAndroid Build Coastguard Worker         return fClip.clipState() == ClipStack::ClipState::kWideOpen;
123*c8dee2aaSAndroid Build Coastguard Worker     }
isClipEmpty()124*c8dee2aaSAndroid Build Coastguard Worker     bool isClipEmpty() const override {
125*c8dee2aaSAndroid Build Coastguard Worker         return fClip.clipState() == ClipStack::ClipState::kEmpty;
126*c8dee2aaSAndroid Build Coastguard Worker     }
isClipRect()127*c8dee2aaSAndroid Build Coastguard Worker     bool isClipRect() const override {
128*c8dee2aaSAndroid Build Coastguard Worker         return fClip.clipState() == ClipStack::ClipState::kDeviceRect ||
129*c8dee2aaSAndroid Build Coastguard Worker                fClip.clipState() == ClipStack::ClipState::kWideOpen;
130*c8dee2aaSAndroid Build Coastguard Worker     }
131*c8dee2aaSAndroid Build Coastguard Worker 
132*c8dee2aaSAndroid Build Coastguard Worker     bool isClipAntiAliased() const override;
133*c8dee2aaSAndroid Build Coastguard Worker     SkIRect devClipBounds() const override;
134*c8dee2aaSAndroid Build Coastguard Worker     void android_utils_clipAsRgn(SkRegion*) const override;
135*c8dee2aaSAndroid Build Coastguard Worker 
136*c8dee2aaSAndroid Build Coastguard Worker     void clipRect(const SkRect& rect, SkClipOp, bool aa) override;
137*c8dee2aaSAndroid Build Coastguard Worker     void clipRRect(const SkRRect& rrect, SkClipOp, bool aa) override;
138*c8dee2aaSAndroid Build Coastguard Worker     void clipPath(const SkPath& path, SkClipOp, bool aa) override;
139*c8dee2aaSAndroid Build Coastguard Worker 
140*c8dee2aaSAndroid Build Coastguard Worker     void clipRegion(const SkRegion& globalRgn, SkClipOp) override;
141*c8dee2aaSAndroid Build Coastguard Worker     void replaceClip(const SkIRect& rect) override;
142*c8dee2aaSAndroid Build Coastguard Worker 
143*c8dee2aaSAndroid Build Coastguard Worker     // Drawing
144*c8dee2aaSAndroid Build Coastguard Worker     void drawPaint(const SkPaint& paint) override;
145*c8dee2aaSAndroid Build Coastguard Worker     void drawRect(const SkRect& r, const SkPaint& paint) override;
146*c8dee2aaSAndroid Build Coastguard Worker     void drawOval(const SkRect& oval, const SkPaint& paint) override;
147*c8dee2aaSAndroid Build Coastguard Worker     void drawRRect(const SkRRect& rr, const SkPaint& paint) override;
148*c8dee2aaSAndroid Build Coastguard Worker     void drawArc(const SkArc& arc, const SkPaint& paint) override;
149*c8dee2aaSAndroid Build Coastguard Worker     void drawPoints(SkCanvas::PointMode mode, size_t count,
150*c8dee2aaSAndroid Build Coastguard Worker                     const SkPoint[], const SkPaint& paint) override;
151*c8dee2aaSAndroid Build Coastguard Worker     void drawPath(const SkPath& path, const SkPaint& paint, bool pathIsMutable = false) override;
152*c8dee2aaSAndroid Build Coastguard Worker 
153*c8dee2aaSAndroid Build Coastguard Worker     // No need to specialize drawDRRect, drawRegion, drawPatch as the default impls all
154*c8dee2aaSAndroid Build Coastguard Worker     // route to drawPath, drawRect, or drawVertices as desired.
155*c8dee2aaSAndroid Build Coastguard Worker 
156*c8dee2aaSAndroid Build Coastguard Worker     void drawEdgeAAQuad(const SkRect& rect, const SkPoint clip[4],
157*c8dee2aaSAndroid Build Coastguard Worker                         SkCanvas::QuadAAFlags aaFlags, const SkColor4f& color,
158*c8dee2aaSAndroid Build Coastguard Worker                         SkBlendMode mode) override;
159*c8dee2aaSAndroid Build Coastguard Worker 
160*c8dee2aaSAndroid Build Coastguard Worker     void drawEdgeAAImageSet(const SkCanvas::ImageSetEntry[], int count,
161*c8dee2aaSAndroid Build Coastguard Worker                             const SkPoint dstClips[], const SkMatrix preViewMatrices[],
162*c8dee2aaSAndroid Build Coastguard Worker                             const SkSamplingOptions&, const SkPaint&,
163*c8dee2aaSAndroid Build Coastguard Worker                             SkCanvas::SrcRectConstraint) override;
164*c8dee2aaSAndroid Build Coastguard Worker 
165*c8dee2aaSAndroid Build Coastguard Worker     void drawImageRect(const SkImage*, const SkRect* src, const SkRect& dst,
166*c8dee2aaSAndroid Build Coastguard Worker                        const SkSamplingOptions&, const SkPaint&,
167*c8dee2aaSAndroid Build Coastguard Worker                        SkCanvas::SrcRectConstraint) override;
168*c8dee2aaSAndroid Build Coastguard Worker 
169*c8dee2aaSAndroid Build Coastguard Worker     void drawVertices(const SkVertices*, sk_sp<SkBlender>, const SkPaint&, bool) override;
170*c8dee2aaSAndroid Build Coastguard Worker     bool drawAsTiledImageRect(SkCanvas*,
171*c8dee2aaSAndroid Build Coastguard Worker                               const SkImage*,
172*c8dee2aaSAndroid Build Coastguard Worker                               const SkRect* src,
173*c8dee2aaSAndroid Build Coastguard Worker                               const SkRect& dst,
174*c8dee2aaSAndroid Build Coastguard Worker                               const SkSamplingOptions&,
175*c8dee2aaSAndroid Build Coastguard Worker                               const SkPaint&,
176*c8dee2aaSAndroid Build Coastguard Worker                               SkCanvas::SrcRectConstraint) override;
177*c8dee2aaSAndroid Build Coastguard Worker     // TODO: Implement these using per-edge AA quads and an inlined image shader program.
drawImageLattice(const SkImage *,const SkCanvas::Lattice &,const SkRect & dst,SkFilterMode,const SkPaint &)178*c8dee2aaSAndroid Build Coastguard Worker     void drawImageLattice(const SkImage*, const SkCanvas::Lattice&,
179*c8dee2aaSAndroid Build Coastguard Worker                           const SkRect& dst, SkFilterMode, const SkPaint&) override {}
drawAtlas(const SkRSXform[],const SkRect[],const SkColor[],int count,sk_sp<SkBlender>,const SkPaint &)180*c8dee2aaSAndroid Build Coastguard Worker     void drawAtlas(const SkRSXform[], const SkRect[], const SkColor[], int count, sk_sp<SkBlender>,
181*c8dee2aaSAndroid Build Coastguard Worker                    const SkPaint&) override {}
182*c8dee2aaSAndroid Build Coastguard Worker 
drawDrawable(SkCanvas *,SkDrawable *,const SkMatrix *)183*c8dee2aaSAndroid Build Coastguard Worker     void drawDrawable(SkCanvas*, SkDrawable*, const SkMatrix*) override {}
drawMesh(const SkMesh &,sk_sp<SkBlender>,const SkPaint &)184*c8dee2aaSAndroid Build Coastguard Worker     void drawMesh(const SkMesh&, sk_sp<SkBlender>, const SkPaint&) override {}
185*c8dee2aaSAndroid Build Coastguard Worker 
186*c8dee2aaSAndroid Build Coastguard Worker     // Special images and layers
187*c8dee2aaSAndroid Build Coastguard Worker     sk_sp<SkSurface> makeSurface(const SkImageInfo&, const SkSurfaceProps&) override;
188*c8dee2aaSAndroid Build Coastguard Worker 
189*c8dee2aaSAndroid Build Coastguard Worker     sk_sp<SkDevice> createDevice(const CreateInfo&, const SkPaint*) override;
190*c8dee2aaSAndroid Build Coastguard Worker 
191*c8dee2aaSAndroid Build Coastguard Worker     sk_sp<SkSpecialImage> snapSpecial(const SkIRect& subset, bool forceCopy = false) override;
192*c8dee2aaSAndroid Build Coastguard Worker 
193*c8dee2aaSAndroid Build Coastguard Worker     void drawSpecial(SkSpecialImage*, const SkMatrix& localToDevice,
194*c8dee2aaSAndroid Build Coastguard Worker                      const SkSamplingOptions&, const SkPaint&,
195*c8dee2aaSAndroid Build Coastguard Worker                      SkCanvas::SrcRectConstraint) override;
196*c8dee2aaSAndroid Build Coastguard Worker     void drawCoverageMask(const SkSpecialImage*, const SkMatrix& localToDevice,
197*c8dee2aaSAndroid Build Coastguard Worker                           const SkSamplingOptions&, const SkPaint&) override;
198*c8dee2aaSAndroid Build Coastguard Worker 
199*c8dee2aaSAndroid Build Coastguard Worker     bool drawBlurredRRect(const SkRRect&, const SkPaint&, float deviceSigma) override;
200*c8dee2aaSAndroid Build Coastguard Worker 
201*c8dee2aaSAndroid Build Coastguard Worker private:
202*c8dee2aaSAndroid Build Coastguard Worker     class IntersectionTreeSet;
203*c8dee2aaSAndroid Build Coastguard Worker 
204*c8dee2aaSAndroid Build Coastguard Worker     Device(Recorder*, sk_sp<DrawContext>);
205*c8dee2aaSAndroid Build Coastguard Worker 
206*c8dee2aaSAndroid Build Coastguard Worker     sk_sp<SkSpecialImage> makeSpecial(const SkBitmap&) override;
207*c8dee2aaSAndroid Build Coastguard Worker     sk_sp<SkSpecialImage> makeSpecial(const SkImage*) override;
208*c8dee2aaSAndroid Build Coastguard Worker 
209*c8dee2aaSAndroid Build Coastguard Worker     bool onReadPixels(const SkPixmap&, int x, int y) override;
210*c8dee2aaSAndroid Build Coastguard Worker 
211*c8dee2aaSAndroid Build Coastguard Worker     bool onWritePixels(const SkPixmap&, int x, int y) override;
212*c8dee2aaSAndroid Build Coastguard Worker 
213*c8dee2aaSAndroid Build Coastguard Worker     void onDrawGlyphRunList(SkCanvas*, const sktext::GlyphRunList&, const SkPaint&) override;
214*c8dee2aaSAndroid Build Coastguard Worker 
215*c8dee2aaSAndroid Build Coastguard Worker     void onClipShader(sk_sp<SkShader> shader) override;
216*c8dee2aaSAndroid Build Coastguard Worker 
217*c8dee2aaSAndroid Build Coastguard Worker     sk_sp<skif::Backend> createImageFilteringBackend(const SkSurfaceProps& surfaceProps,
218*c8dee2aaSAndroid Build Coastguard Worker                                                      SkColorType colorType) const override;
219*c8dee2aaSAndroid Build Coastguard Worker 
220*c8dee2aaSAndroid Build Coastguard Worker     // DrawFlags alters the effects used by drawGeometry.
221*c8dee2aaSAndroid Build Coastguard Worker     //
222*c8dee2aaSAndroid Build Coastguard Worker     // There is no kIgnoreMaskFilter flag because the Device always ignores the mask filter -- the
223*c8dee2aaSAndroid Build Coastguard Worker     // mask filter should be handled by the SkCanvas, either with an auto mask filter layer or
224*c8dee2aaSAndroid Build Coastguard Worker     // being converted to an analytic blur draw.
225*c8dee2aaSAndroid Build Coastguard Worker     enum class DrawFlags : unsigned {
226*c8dee2aaSAndroid Build Coastguard Worker         kNone             = 0b000,
227*c8dee2aaSAndroid Build Coastguard Worker 
228*c8dee2aaSAndroid Build Coastguard Worker         // Any SkPathEffect on the SkPaint passed into drawGeometry() is ignored.
229*c8dee2aaSAndroid Build Coastguard Worker         // - drawPaint, drawImageLattice, drawImageRect, drawEdgeAAImageSet, drawVertices, drawAtlas
230*c8dee2aaSAndroid Build Coastguard Worker         // - drawGeometry after it's applied the path effect.
231*c8dee2aaSAndroid Build Coastguard Worker         kIgnorePathEffect = 0b001,
232*c8dee2aaSAndroid Build Coastguard Worker     };
233*c8dee2aaSAndroid Build Coastguard Worker     SK_DECL_BITMASK_OPS_FRIENDS(DrawFlags)
234*c8dee2aaSAndroid Build Coastguard Worker 
235*c8dee2aaSAndroid Build Coastguard Worker     // Handles applying path effects, mask filters, stroke-and-fill styles, and hairlines.
236*c8dee2aaSAndroid Build Coastguard Worker     // Ignores geometric style on the paint in favor of explicitly provided SkStrokeRec and flags.
237*c8dee2aaSAndroid Build Coastguard Worker     // All overridden SkDevice::draw() functions should bottom-out with calls to drawGeometry().
238*c8dee2aaSAndroid Build Coastguard Worker     void drawGeometry(const Transform&,
239*c8dee2aaSAndroid Build Coastguard Worker                       const Geometry&,
240*c8dee2aaSAndroid Build Coastguard Worker                       const SkPaint&,
241*c8dee2aaSAndroid Build Coastguard Worker                       const SkStrokeRec&,
242*c8dee2aaSAndroid Build Coastguard Worker                       SkEnumBitMask<DrawFlags> = DrawFlags::kNone,
243*c8dee2aaSAndroid Build Coastguard Worker                       sk_sp<SkBlender> primitiveBlender = nullptr,
244*c8dee2aaSAndroid Build Coastguard Worker                       bool skipColorXform = false);
245*c8dee2aaSAndroid Build Coastguard Worker 
246*c8dee2aaSAndroid Build Coastguard Worker     // Like drawGeometry() but is Shape-only, depth-only, fill-only, and lets the ClipStack define
247*c8dee2aaSAndroid Build Coastguard Worker     // the transform, clip, and DrawOrder (although Device still tracks stencil buffer usage).
248*c8dee2aaSAndroid Build Coastguard Worker     void drawClipShape(const Transform&, const Shape&, const Clip&, DrawOrder);
249*c8dee2aaSAndroid Build Coastguard Worker 
250*c8dee2aaSAndroid Build Coastguard Worker     sktext::gpu::AtlasDrawDelegate atlasDelegate();
251*c8dee2aaSAndroid Build Coastguard Worker     // Handles primitive processing for atlas-based text
252*c8dee2aaSAndroid Build Coastguard Worker     void drawAtlasSubRun(const sktext::gpu::AtlasSubRun*,
253*c8dee2aaSAndroid Build Coastguard Worker                          SkPoint drawOrigin,
254*c8dee2aaSAndroid Build Coastguard Worker                          const SkPaint& paint,
255*c8dee2aaSAndroid Build Coastguard Worker                          sk_sp<SkRefCnt> subRunStorage,
256*c8dee2aaSAndroid Build Coastguard Worker                          sktext::gpu::RendererData);
257*c8dee2aaSAndroid Build Coastguard Worker 
258*c8dee2aaSAndroid Build Coastguard Worker     sk_sp<sktext::gpu::Slug> convertGlyphRunListToSlug(const sktext::GlyphRunList& glyphRunList,
259*c8dee2aaSAndroid Build Coastguard Worker                                                        const SkPaint& paint) override;
260*c8dee2aaSAndroid Build Coastguard Worker 
261*c8dee2aaSAndroid Build Coastguard Worker     void drawSlug(SkCanvas*, const sktext::gpu::Slug* slug, const SkPaint& paint) override;
262*c8dee2aaSAndroid Build Coastguard Worker 
263*c8dee2aaSAndroid Build Coastguard Worker     // Returns the Renderer to draw the shape in the given style. If SkStrokeRec is a
264*c8dee2aaSAndroid Build Coastguard Worker     // stroke-and-fill, this returns the Renderer used for the fill portion and it can be assumed
265*c8dee2aaSAndroid Build Coastguard Worker     // that Renderer::TessellatedStrokes() will be used for the stroke portion.
266*c8dee2aaSAndroid Build Coastguard Worker     //
267*c8dee2aaSAndroid Build Coastguard Worker     // Depending on the preferred anti-aliasing quality and platform capabilities (such as compute
268*c8dee2aaSAndroid Build Coastguard Worker     // shader support), an atlas handler for path rendering may be returned alongside the chosen
269*c8dee2aaSAndroid Build Coastguard Worker     // Renderer. In that case, all fill, stroke, and stroke-and-fill styles should be rendered with
270*c8dee2aaSAndroid Build Coastguard Worker     // a single recorded CoverageMask draw and the shape data should be added to the provided atlas
271*c8dee2aaSAndroid Build Coastguard Worker     // handler to be scheduled for a coverage mask render.
272*c8dee2aaSAndroid Build Coastguard Worker     //
273*c8dee2aaSAndroid Build Coastguard Worker     // TODO: Renderers may have fallbacks (e.g. pre-chop large paths, or convert stroke to fill).
274*c8dee2aaSAndroid Build Coastguard Worker     // Are those handled inside ChooseRenderer() where it can modify the shape, stroke? or does it
275*c8dee2aaSAndroid Build Coastguard Worker     // return a retry error code? or does drawGeometry() handle all the fallbacks, knowing that
276*c8dee2aaSAndroid Build Coastguard Worker     // a particular shape type needs to be pre-chopped?
277*c8dee2aaSAndroid Build Coastguard Worker     // TODO: Move this into a RendererSelector object provided by the Context.
278*c8dee2aaSAndroid Build Coastguard Worker     std::pair<const Renderer*, PathAtlas*> chooseRenderer(const Transform& localToDevice,
279*c8dee2aaSAndroid Build Coastguard Worker                                                           const Geometry&,
280*c8dee2aaSAndroid Build Coastguard Worker                                                           const SkStrokeRec&,
281*c8dee2aaSAndroid Build Coastguard Worker                                                           bool requireMSAA) const;
282*c8dee2aaSAndroid Build Coastguard Worker 
283*c8dee2aaSAndroid Build Coastguard Worker     bool needsFlushBeforeDraw(int numNewRenderSteps, DstReadRequirement) const;
284*c8dee2aaSAndroid Build Coastguard Worker 
285*c8dee2aaSAndroid Build Coastguard Worker     // Flush internal work, such as pending clip draws and atlas uploads, into the Device's DrawTask
286*c8dee2aaSAndroid Build Coastguard Worker     void internalFlush();
287*c8dee2aaSAndroid Build Coastguard Worker 
288*c8dee2aaSAndroid Build Coastguard Worker     Recorder* fRecorder;
289*c8dee2aaSAndroid Build Coastguard Worker     sk_sp<DrawContext> fDC;
290*c8dee2aaSAndroid Build Coastguard Worker     // Scratch devices hold on to their last snapped DrawTask so that they can be directly
291*c8dee2aaSAndroid Build Coastguard Worker     // referenced when the device image is drawn into some other surface.
292*c8dee2aaSAndroid Build Coastguard Worker     // NOTE: For now, this task is still added to the root task list when the Device is flushed, but
293*c8dee2aaSAndroid Build Coastguard Worker     // in the long-term, these scratch draw tasks will only be executed if they are referenced by
294*c8dee2aaSAndroid Build Coastguard Worker     // some other task chain that makes it to the root list.
295*c8dee2aaSAndroid Build Coastguard Worker     sk_sp<Task> fLastTask;
296*c8dee2aaSAndroid Build Coastguard Worker 
297*c8dee2aaSAndroid Build Coastguard Worker     ClipStack fClip;
298*c8dee2aaSAndroid Build Coastguard Worker 
299*c8dee2aaSAndroid Build Coastguard Worker     // Tracks accumulated intersections for ordering dependent use of the color and depth attachment
300*c8dee2aaSAndroid Build Coastguard Worker     // (i.e. depth-based clipping, and transparent blending)
301*c8dee2aaSAndroid Build Coastguard Worker     std::unique_ptr<BoundsManager> fColorDepthBoundsManager;
302*c8dee2aaSAndroid Build Coastguard Worker     // Tracks disjoint stencil indices for all recordered draws
303*c8dee2aaSAndroid Build Coastguard Worker     std::unique_ptr<IntersectionTreeSet> fDisjointStencilSet;
304*c8dee2aaSAndroid Build Coastguard Worker 
305*c8dee2aaSAndroid Build Coastguard Worker     // Lazily updated Transform constructed from localToDevice()'s SkM44
306*c8dee2aaSAndroid Build Coastguard Worker     Transform fCachedLocalToDevice;
307*c8dee2aaSAndroid Build Coastguard Worker 
308*c8dee2aaSAndroid Build Coastguard Worker     // The max depth value sent to the DrawContext, incremented so each draw has a unique value.
309*c8dee2aaSAndroid Build Coastguard Worker     PaintersDepth fCurrentDepth;
310*c8dee2aaSAndroid Build Coastguard Worker 
311*c8dee2aaSAndroid Build Coastguard Worker     // The DrawContext's target supports MSAA
312*c8dee2aaSAndroid Build Coastguard Worker     bool fMSAASupported = false;
313*c8dee2aaSAndroid Build Coastguard Worker 
314*c8dee2aaSAndroid Build Coastguard Worker     // TODO(b/330864257): Clean up once flushPendingWorkToRecorder() doesn't have to be re-entrant
315*c8dee2aaSAndroid Build Coastguard Worker     bool fIsFlushing = false;
316*c8dee2aaSAndroid Build Coastguard Worker 
317*c8dee2aaSAndroid Build Coastguard Worker     const sktext::gpu::SubRunControl fSubRunControl;
318*c8dee2aaSAndroid Build Coastguard Worker 
319*c8dee2aaSAndroid Build Coastguard Worker #if defined(SK_DEBUG)
320*c8dee2aaSAndroid Build Coastguard Worker     // When not 0, this Device is an unregistered scratch device that is intended to go out of
321*c8dee2aaSAndroid Build Coastguard Worker     // scope before the Recorder is snapped. Assuming controlling code is valid, that means the
322*c8dee2aaSAndroid Build Coastguard Worker     // Device's recorder's next recording ID should still be the the recording ID at the time the
323*c8dee2aaSAndroid Build Coastguard Worker     // Device was created. If not, it means the Device lived too long and may not be flushing tasks
324*c8dee2aaSAndroid Build Coastguard Worker     // in the expected order.
325*c8dee2aaSAndroid Build Coastguard Worker     uint32_t fScopedRecordingID = 0;
326*c8dee2aaSAndroid Build Coastguard Worker #endif
327*c8dee2aaSAndroid Build Coastguard Worker 
328*c8dee2aaSAndroid Build Coastguard Worker     friend class ClipStack; // for recordDraw
329*c8dee2aaSAndroid Build Coastguard Worker };
330*c8dee2aaSAndroid Build Coastguard Worker 
331*c8dee2aaSAndroid Build Coastguard Worker SK_MAKE_BITMASK_OPS(Device::DrawFlags)
332*c8dee2aaSAndroid Build Coastguard Worker 
333*c8dee2aaSAndroid Build Coastguard Worker } // namespace skgpu::graphite
334*c8dee2aaSAndroid Build Coastguard Worker 
335*c8dee2aaSAndroid Build Coastguard Worker #endif // skgpu_graphite_Device_DEFINED
336