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