xref: /aosp_15_r20/external/skia/src/gpu/ganesh/Device.h (revision c8dee2aa9b3f27cf6c858bd81872bdeb2c07ed17)
1*c8dee2aaSAndroid Build Coastguard Worker /*
2*c8dee2aaSAndroid Build Coastguard Worker  * Copyright 2010 Google Inc.
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_v1_Device_DEFINED
9*c8dee2aaSAndroid Build Coastguard Worker #define skgpu_v1_Device_DEFINED
10*c8dee2aaSAndroid Build Coastguard Worker 
11*c8dee2aaSAndroid Build Coastguard Worker #include "include/core/SkCanvas.h"
12*c8dee2aaSAndroid Build Coastguard Worker #include "include/core/SkClipOp.h"
13*c8dee2aaSAndroid Build Coastguard Worker #include "include/core/SkColor.h"
14*c8dee2aaSAndroid Build Coastguard Worker #include "include/core/SkImage.h"
15*c8dee2aaSAndroid Build Coastguard Worker #include "include/core/SkImageInfo.h"
16*c8dee2aaSAndroid Build Coastguard Worker #include "include/core/SkRect.h"
17*c8dee2aaSAndroid Build Coastguard Worker #include "include/core/SkRefCnt.h"
18*c8dee2aaSAndroid Build Coastguard Worker #include "include/core/SkSamplingOptions.h"
19*c8dee2aaSAndroid Build Coastguard Worker #include "include/core/SkShader.h"
20*c8dee2aaSAndroid Build Coastguard Worker #include "include/core/SkSurface.h"
21*c8dee2aaSAndroid Build Coastguard Worker #include "include/gpu/ganesh/GrTypes.h"
22*c8dee2aaSAndroid Build Coastguard Worker #include "include/private/base/SkAssert.h"
23*c8dee2aaSAndroid Build Coastguard Worker #include "include/private/base/SkMacros.h"
24*c8dee2aaSAndroid Build Coastguard Worker #include "src/core/SkDevice.h"
25*c8dee2aaSAndroid Build Coastguard Worker #include "src/core/SkMatrixPriv.h"
26*c8dee2aaSAndroid Build Coastguard Worker #include "src/gpu/ganesh/ClipStack.h"
27*c8dee2aaSAndroid Build Coastguard Worker #include "src/gpu/ganesh/GrColorInfo.h"
28*c8dee2aaSAndroid Build Coastguard Worker #include "src/gpu/ganesh/GrSurfaceProxyView.h"
29*c8dee2aaSAndroid Build Coastguard Worker #include "src/text/gpu/SubRunControl.h"
30*c8dee2aaSAndroid Build Coastguard Worker 
31*c8dee2aaSAndroid Build Coastguard Worker #include <cstddef>
32*c8dee2aaSAndroid Build Coastguard Worker #include <memory>
33*c8dee2aaSAndroid Build Coastguard Worker #include <utility>
34*c8dee2aaSAndroid Build Coastguard Worker 
35*c8dee2aaSAndroid Build Coastguard Worker class GrBackendSemaphore;
36*c8dee2aaSAndroid Build Coastguard Worker class GrClip;
37*c8dee2aaSAndroid Build Coastguard Worker class GrRecordingContext;
38*c8dee2aaSAndroid Build Coastguard Worker class GrRenderTargetProxy;
39*c8dee2aaSAndroid Build Coastguard Worker class GrSurfaceProxy;
40*c8dee2aaSAndroid Build Coastguard Worker class SkBitmap;
41*c8dee2aaSAndroid Build Coastguard Worker class SkBlender;
42*c8dee2aaSAndroid Build Coastguard Worker class SkColorSpace;
43*c8dee2aaSAndroid Build Coastguard Worker class SkDrawable;
44*c8dee2aaSAndroid Build Coastguard Worker class SkLatticeIter;
45*c8dee2aaSAndroid Build Coastguard Worker class SkMatrix;
46*c8dee2aaSAndroid Build Coastguard Worker class SkMesh;
47*c8dee2aaSAndroid Build Coastguard Worker class SkPaint;
48*c8dee2aaSAndroid Build Coastguard Worker class SkPath;
49*c8dee2aaSAndroid Build Coastguard Worker class SkPixmap;
50*c8dee2aaSAndroid Build Coastguard Worker class SkRRect;
51*c8dee2aaSAndroid Build Coastguard Worker class SkRegion;
52*c8dee2aaSAndroid Build Coastguard Worker class SkSpecialImage;
53*c8dee2aaSAndroid Build Coastguard Worker class SkSurfaceProps;
54*c8dee2aaSAndroid Build Coastguard Worker class SkSurface_Ganesh;
55*c8dee2aaSAndroid Build Coastguard Worker class SkVertices;
56*c8dee2aaSAndroid Build Coastguard Worker enum SkAlphaType : int;
57*c8dee2aaSAndroid Build Coastguard Worker enum SkColorType : int;
58*c8dee2aaSAndroid Build Coastguard Worker enum class GrAA : bool;
59*c8dee2aaSAndroid Build Coastguard Worker enum class GrColorType;
60*c8dee2aaSAndroid Build Coastguard Worker enum class SkBackingFit;
61*c8dee2aaSAndroid Build Coastguard Worker enum class SkBlendMode;
62*c8dee2aaSAndroid Build Coastguard Worker enum class SkTileMode;
63*c8dee2aaSAndroid Build Coastguard Worker struct SkArc;
64*c8dee2aaSAndroid Build Coastguard Worker struct SkDrawShadowRec;
65*c8dee2aaSAndroid Build Coastguard Worker struct SkISize;
66*c8dee2aaSAndroid Build Coastguard Worker struct SkPoint;
67*c8dee2aaSAndroid Build Coastguard Worker struct SkRSXform;
68*c8dee2aaSAndroid Build Coastguard Worker namespace skgpu {
69*c8dee2aaSAndroid Build Coastguard Worker enum class Budgeted : bool;
70*c8dee2aaSAndroid Build Coastguard Worker enum class Mipmapped : bool;
71*c8dee2aaSAndroid Build Coastguard Worker class TiledTextureUtils;
72*c8dee2aaSAndroid Build Coastguard Worker }
73*c8dee2aaSAndroid Build Coastguard Worker namespace skif {
74*c8dee2aaSAndroid Build Coastguard Worker class Backend;
75*c8dee2aaSAndroid Build Coastguard Worker }
76*c8dee2aaSAndroid Build Coastguard Worker namespace sktext {
77*c8dee2aaSAndroid Build Coastguard Worker class GlyphRunList;
78*c8dee2aaSAndroid Build Coastguard Worker namespace gpu {
79*c8dee2aaSAndroid Build Coastguard Worker     class Slug;
80*c8dee2aaSAndroid Build Coastguard Worker }}
81*c8dee2aaSAndroid Build Coastguard Worker 
82*c8dee2aaSAndroid Build Coastguard Worker 
83*c8dee2aaSAndroid Build Coastguard Worker namespace skgpu::ganesh {
84*c8dee2aaSAndroid Build Coastguard Worker 
85*c8dee2aaSAndroid Build Coastguard Worker class SurfaceContext;
86*c8dee2aaSAndroid Build Coastguard Worker class SurfaceFillContext;
87*c8dee2aaSAndroid Build Coastguard Worker class SurfaceDrawContext;
88*c8dee2aaSAndroid Build Coastguard Worker 
89*c8dee2aaSAndroid Build Coastguard Worker /**
90*c8dee2aaSAndroid Build Coastguard Worker  *  Subclass of SkDevice, which directs all drawing to the GrGpu owned by the canvas.
91*c8dee2aaSAndroid Build Coastguard Worker  */
92*c8dee2aaSAndroid Build Coastguard Worker class Device final : public SkDevice {
93*c8dee2aaSAndroid Build Coastguard Worker public:
94*c8dee2aaSAndroid Build Coastguard Worker     enum class InitContents {
95*c8dee2aaSAndroid Build Coastguard Worker         kClear,
96*c8dee2aaSAndroid Build Coastguard Worker         kUninit
97*c8dee2aaSAndroid Build Coastguard Worker     };
98*c8dee2aaSAndroid Build Coastguard Worker 
99*c8dee2aaSAndroid Build Coastguard Worker     GrSurfaceProxyView readSurfaceView();
100*c8dee2aaSAndroid Build Coastguard Worker     GrRenderTargetProxy* targetProxy();
101*c8dee2aaSAndroid Build Coastguard Worker 
recordingContext()102*c8dee2aaSAndroid Build Coastguard Worker     GrRecordingContext* recordingContext() const override { return fContext.get(); }
103*c8dee2aaSAndroid Build Coastguard Worker 
104*c8dee2aaSAndroid Build Coastguard Worker     bool wait(int numSemaphores,
105*c8dee2aaSAndroid Build Coastguard Worker               const GrBackendSemaphore* waitSemaphores,
106*c8dee2aaSAndroid Build Coastguard Worker               bool deleteSemaphoresAfterWait);
107*c8dee2aaSAndroid Build Coastguard Worker 
108*c8dee2aaSAndroid Build Coastguard Worker     void discard();
109*c8dee2aaSAndroid Build Coastguard Worker     void resolveMSAA();
110*c8dee2aaSAndroid Build Coastguard Worker 
111*c8dee2aaSAndroid Build Coastguard Worker     bool replaceBackingProxy(SkSurface::ContentChangeMode,
112*c8dee2aaSAndroid Build Coastguard Worker                              sk_sp<GrRenderTargetProxy>,
113*c8dee2aaSAndroid Build Coastguard Worker                              GrColorType,
114*c8dee2aaSAndroid Build Coastguard Worker                              sk_sp<SkColorSpace>,
115*c8dee2aaSAndroid Build Coastguard Worker                              GrSurfaceOrigin,
116*c8dee2aaSAndroid Build Coastguard Worker                              const SkSurfaceProps&);
117*c8dee2aaSAndroid Build Coastguard Worker     bool replaceBackingProxy(SkSurface::ContentChangeMode);
118*c8dee2aaSAndroid Build Coastguard Worker 
119*c8dee2aaSAndroid Build Coastguard Worker     using RescaleGamma       = SkImage::RescaleGamma;
120*c8dee2aaSAndroid Build Coastguard Worker     using RescaleMode        = SkImage::RescaleMode;
121*c8dee2aaSAndroid Build Coastguard Worker     using ReadPixelsCallback = SkImage::ReadPixelsCallback;
122*c8dee2aaSAndroid Build Coastguard Worker     using ReadPixelsContext  = SkImage::ReadPixelsContext;
123*c8dee2aaSAndroid Build Coastguard Worker 
124*c8dee2aaSAndroid Build Coastguard Worker     void asyncRescaleAndReadPixels(const SkImageInfo& info,
125*c8dee2aaSAndroid Build Coastguard Worker                                    const SkIRect& srcRect,
126*c8dee2aaSAndroid Build Coastguard Worker                                    RescaleGamma rescaleGamma,
127*c8dee2aaSAndroid Build Coastguard Worker                                    RescaleMode rescaleMode,
128*c8dee2aaSAndroid Build Coastguard Worker                                    ReadPixelsCallback callback,
129*c8dee2aaSAndroid Build Coastguard Worker                                    ReadPixelsContext context);
130*c8dee2aaSAndroid Build Coastguard Worker 
131*c8dee2aaSAndroid Build Coastguard Worker     void asyncRescaleAndReadPixelsYUV420(SkYUVColorSpace yuvColorSpace,
132*c8dee2aaSAndroid Build Coastguard Worker                                          bool readAlpha,
133*c8dee2aaSAndroid Build Coastguard Worker                                          sk_sp<SkColorSpace> dstColorSpace,
134*c8dee2aaSAndroid Build Coastguard Worker                                          const SkIRect& srcRect,
135*c8dee2aaSAndroid Build Coastguard Worker                                          SkISize dstSize,
136*c8dee2aaSAndroid Build Coastguard Worker                                          RescaleGamma rescaleGamma,
137*c8dee2aaSAndroid Build Coastguard Worker                                          RescaleMode,
138*c8dee2aaSAndroid Build Coastguard Worker                                          ReadPixelsCallback callback,
139*c8dee2aaSAndroid Build Coastguard Worker                                          ReadPixelsContext context);
140*c8dee2aaSAndroid Build Coastguard Worker 
141*c8dee2aaSAndroid Build Coastguard Worker     /**
142*c8dee2aaSAndroid Build Coastguard Worker      * This factory uses the color space, origin, surface properties, and initialization
143*c8dee2aaSAndroid Build Coastguard Worker      * method along with the provided proxy to create the gpu device.
144*c8dee2aaSAndroid Build Coastguard Worker      */
145*c8dee2aaSAndroid Build Coastguard Worker     static sk_sp<Device> Make(GrRecordingContext*,
146*c8dee2aaSAndroid Build Coastguard Worker                               GrColorType,
147*c8dee2aaSAndroid Build Coastguard Worker                               sk_sp<GrSurfaceProxy>,
148*c8dee2aaSAndroid Build Coastguard Worker                               sk_sp<SkColorSpace>,
149*c8dee2aaSAndroid Build Coastguard Worker                               GrSurfaceOrigin,
150*c8dee2aaSAndroid Build Coastguard Worker                               const SkSurfaceProps&,
151*c8dee2aaSAndroid Build Coastguard Worker                               InitContents);
152*c8dee2aaSAndroid Build Coastguard Worker 
153*c8dee2aaSAndroid Build Coastguard Worker     /**
154*c8dee2aaSAndroid Build Coastguard Worker      * This factory uses the budgeted, imageInfo, fit, sampleCount, mipmapped, and isProtected
155*c8dee2aaSAndroid Build Coastguard Worker      * parameters to create a proxy to back the gpu device. The color space (from the image info),
156*c8dee2aaSAndroid Build Coastguard Worker      * origin, surface properties, and initialization method are then used (with the created proxy)
157*c8dee2aaSAndroid Build Coastguard Worker      * to create the device.
158*c8dee2aaSAndroid Build Coastguard Worker      */
159*c8dee2aaSAndroid Build Coastguard Worker     static sk_sp<Device> Make(GrRecordingContext*,
160*c8dee2aaSAndroid Build Coastguard Worker                               skgpu::Budgeted,
161*c8dee2aaSAndroid Build Coastguard Worker                               const SkImageInfo&,
162*c8dee2aaSAndroid Build Coastguard Worker                               SkBackingFit,
163*c8dee2aaSAndroid Build Coastguard Worker                               int sampleCount,
164*c8dee2aaSAndroid Build Coastguard Worker                               skgpu::Mipmapped,
165*c8dee2aaSAndroid Build Coastguard Worker                               GrProtected,
166*c8dee2aaSAndroid Build Coastguard Worker                               GrSurfaceOrigin,
167*c8dee2aaSAndroid Build Coastguard Worker                               const SkSurfaceProps&,
168*c8dee2aaSAndroid Build Coastguard Worker                               InitContents);
169*c8dee2aaSAndroid Build Coastguard Worker 
170*c8dee2aaSAndroid Build Coastguard Worker     ~Device() override;
171*c8dee2aaSAndroid Build Coastguard Worker 
172*c8dee2aaSAndroid Build Coastguard Worker     SurfaceDrawContext* surfaceDrawContext();
173*c8dee2aaSAndroid Build Coastguard Worker     const SurfaceDrawContext* surfaceDrawContext() const;
174*c8dee2aaSAndroid Build Coastguard Worker     SurfaceFillContext* surfaceFillContext();
175*c8dee2aaSAndroid Build Coastguard Worker 
176*c8dee2aaSAndroid Build Coastguard Worker     SkStrikeDeviceInfo strikeDeviceInfo() const override;
177*c8dee2aaSAndroid Build Coastguard Worker 
178*c8dee2aaSAndroid Build Coastguard Worker     // set all pixels to 0
179*c8dee2aaSAndroid Build Coastguard Worker     void clearAll();
180*c8dee2aaSAndroid Build Coastguard Worker 
181*c8dee2aaSAndroid Build Coastguard Worker     void drawPaint(const SkPaint& paint) override;
182*c8dee2aaSAndroid Build Coastguard Worker     void drawPoints(SkCanvas::PointMode mode, size_t count, const SkPoint[],
183*c8dee2aaSAndroid Build Coastguard Worker                     const SkPaint& paint) override;
184*c8dee2aaSAndroid Build Coastguard Worker     void drawRect(const SkRect& r, const SkPaint& paint) override;
185*c8dee2aaSAndroid Build Coastguard Worker     void drawRRect(const SkRRect& r, const SkPaint& paint) override;
186*c8dee2aaSAndroid Build Coastguard Worker     void drawDRRect(const SkRRect& outer, const SkRRect& inner, const SkPaint& paint) override;
187*c8dee2aaSAndroid Build Coastguard Worker     void drawRegion(const SkRegion& r, const SkPaint& paint) override;
188*c8dee2aaSAndroid Build Coastguard Worker     void drawOval(const SkRect& oval, const SkPaint& paint) override;
189*c8dee2aaSAndroid Build Coastguard Worker     void drawArc(const SkArc& arc, const SkPaint& paint) override;
190*c8dee2aaSAndroid Build Coastguard Worker     void drawPath(const SkPath& path, const SkPaint& paint, bool pathIsMutable) override;
191*c8dee2aaSAndroid Build Coastguard Worker 
192*c8dee2aaSAndroid Build Coastguard Worker     void drawVertices(const SkVertices*, sk_sp<SkBlender>, const SkPaint&, bool) override;
193*c8dee2aaSAndroid Build Coastguard Worker     void drawMesh(const SkMesh&, sk_sp<SkBlender>, const SkPaint&) override;
194*c8dee2aaSAndroid Build Coastguard Worker #if !defined(SK_ENABLE_OPTIMIZE_SIZE)
195*c8dee2aaSAndroid Build Coastguard Worker     void drawShadow(const SkPath&, const SkDrawShadowRec&) override;
196*c8dee2aaSAndroid Build Coastguard Worker #endif
197*c8dee2aaSAndroid Build Coastguard Worker     void drawAtlas(const SkRSXform[], const SkRect[], const SkColor[], int count, sk_sp<SkBlender>,
198*c8dee2aaSAndroid Build Coastguard Worker                    const SkPaint&) override;
199*c8dee2aaSAndroid Build Coastguard Worker 
200*c8dee2aaSAndroid Build Coastguard Worker     void drawImageRect(const SkImage*, const SkRect* src, const SkRect& dst,
201*c8dee2aaSAndroid Build Coastguard Worker                        const SkSamplingOptions&, const SkPaint&,
202*c8dee2aaSAndroid Build Coastguard Worker                        SkCanvas::SrcRectConstraint) override;
shouldDrawAsTiledImageRect()203*c8dee2aaSAndroid Build Coastguard Worker     bool shouldDrawAsTiledImageRect() const override { return true; }
204*c8dee2aaSAndroid Build Coastguard Worker     bool drawAsTiledImageRect(SkCanvas*,
205*c8dee2aaSAndroid Build Coastguard Worker                               const SkImage*,
206*c8dee2aaSAndroid Build Coastguard Worker                               const SkRect* src,
207*c8dee2aaSAndroid Build Coastguard Worker                               const SkRect& dst,
208*c8dee2aaSAndroid Build Coastguard Worker                               const SkSamplingOptions&,
209*c8dee2aaSAndroid Build Coastguard Worker                               const SkPaint&,
210*c8dee2aaSAndroid Build Coastguard Worker                               SkCanvas::SrcRectConstraint) override;
211*c8dee2aaSAndroid Build Coastguard Worker     void drawImageLattice(const SkImage*, const SkCanvas::Lattice&,
212*c8dee2aaSAndroid Build Coastguard Worker                           const SkRect& dst, SkFilterMode, const SkPaint&) override;
213*c8dee2aaSAndroid Build Coastguard Worker 
214*c8dee2aaSAndroid Build Coastguard Worker     void drawDrawable(SkCanvas*, SkDrawable*, const SkMatrix*) override;
215*c8dee2aaSAndroid Build Coastguard Worker 
216*c8dee2aaSAndroid Build Coastguard Worker     void drawDevice(SkDevice*, const SkSamplingOptions&, const SkPaint&) override;
217*c8dee2aaSAndroid Build Coastguard Worker     void drawSpecial(SkSpecialImage*, const SkMatrix& localToDevice, const SkSamplingOptions&,
218*c8dee2aaSAndroid Build Coastguard Worker                      const SkPaint&, SkCanvas::SrcRectConstraint) override;
219*c8dee2aaSAndroid Build Coastguard Worker 
220*c8dee2aaSAndroid Build Coastguard Worker     void drawEdgeAAQuad(const SkRect& rect, const SkPoint clip[4], SkCanvas::QuadAAFlags aaFlags,
221*c8dee2aaSAndroid Build Coastguard Worker                         const SkColor4f& color, SkBlendMode mode) override;
222*c8dee2aaSAndroid Build Coastguard Worker     void drawEdgeAAImageSet(const SkCanvas::ImageSetEntry[], int count, const SkPoint dstClips[],
223*c8dee2aaSAndroid Build Coastguard Worker                             const SkMatrix preViewMatrices[], const SkSamplingOptions&,
224*c8dee2aaSAndroid Build Coastguard Worker                             const SkPaint&, SkCanvas::SrcRectConstraint) override;
225*c8dee2aaSAndroid Build Coastguard Worker 
226*c8dee2aaSAndroid Build Coastguard Worker     // Assumes the src and dst rects have already been optimized to fit the proxy.
227*c8dee2aaSAndroid Build Coastguard Worker     // Only implemented by the gpu devices.
228*c8dee2aaSAndroid Build Coastguard Worker     // This method is the lowest level draw used for tiled bitmap draws. It doesn't attempt to
229*c8dee2aaSAndroid Build Coastguard Worker     // modify its parameters (e.g., adjust src & dst) but just draws the image however it can. It
230*c8dee2aaSAndroid Build Coastguard Worker     // could, almost, be replaced with a drawEdgeAAImageSet call for the tiled bitmap draw use
231*c8dee2aaSAndroid Build Coastguard Worker     // case but the extra tilemode requirement and the intermediate parameter processing (e.g.,
232*c8dee2aaSAndroid Build Coastguard Worker     // trying to alter the SrcRectConstraint) currently block that.
233*c8dee2aaSAndroid Build Coastguard Worker     void drawEdgeAAImage(const SkImage*,
234*c8dee2aaSAndroid Build Coastguard Worker                          const SkRect& src,
235*c8dee2aaSAndroid Build Coastguard Worker                          const SkRect& dst,
236*c8dee2aaSAndroid Build Coastguard Worker                          const SkPoint dstClip[4],
237*c8dee2aaSAndroid Build Coastguard Worker                          SkCanvas::QuadAAFlags,
238*c8dee2aaSAndroid Build Coastguard Worker                          const SkMatrix& localToDevice,
239*c8dee2aaSAndroid Build Coastguard Worker                          const SkSamplingOptions&,
240*c8dee2aaSAndroid Build Coastguard Worker                          const SkPaint&,
241*c8dee2aaSAndroid Build Coastguard Worker                          SkCanvas::SrcRectConstraint,
242*c8dee2aaSAndroid Build Coastguard Worker                          const SkMatrix& srcToDst,
243*c8dee2aaSAndroid Build Coastguard Worker                          SkTileMode);
244*c8dee2aaSAndroid Build Coastguard Worker 
245*c8dee2aaSAndroid Build Coastguard Worker     sk_sp<sktext::gpu::Slug> convertGlyphRunListToSlug(const sktext::GlyphRunList& glyphRunList,
246*c8dee2aaSAndroid Build Coastguard Worker                                                        const SkPaint& paint) override;
247*c8dee2aaSAndroid Build Coastguard Worker 
248*c8dee2aaSAndroid Build Coastguard Worker     void drawSlug(SkCanvas*, const sktext::gpu::Slug* slug, const SkPaint& paint) override;
249*c8dee2aaSAndroid Build Coastguard Worker 
250*c8dee2aaSAndroid Build Coastguard Worker     sk_sp<SkSpecialImage> makeSpecial(const SkBitmap&) override;
251*c8dee2aaSAndroid Build Coastguard Worker     sk_sp<SkSpecialImage> makeSpecial(const SkImage*) override;
252*c8dee2aaSAndroid Build Coastguard Worker     sk_sp<SkSpecialImage> snapSpecial(const SkIRect& subset, bool forceCopy = false) override;
253*c8dee2aaSAndroid Build Coastguard Worker     sk_sp<SkSpecialImage> snapSpecialScaled(const SkIRect& subset, const SkISize& dstDims) override;
254*c8dee2aaSAndroid Build Coastguard Worker 
255*c8dee2aaSAndroid Build Coastguard Worker     sk_sp<SkDevice> createDevice(const CreateInfo&, const SkPaint*) override;
256*c8dee2aaSAndroid Build Coastguard Worker 
257*c8dee2aaSAndroid Build Coastguard Worker     sk_sp<SkSurface> makeSurface(const SkImageInfo&, const SkSurfaceProps&) override;
258*c8dee2aaSAndroid Build Coastguard Worker 
asGaneshDevice()259*c8dee2aaSAndroid Build Coastguard Worker     Device* asGaneshDevice() override { return this; }
260*c8dee2aaSAndroid Build Coastguard Worker 
devClipBounds()261*c8dee2aaSAndroid Build Coastguard Worker     SkIRect devClipBounds() const override { return fClip.getConservativeBounds(); }
262*c8dee2aaSAndroid Build Coastguard Worker 
pushClipStack()263*c8dee2aaSAndroid Build Coastguard Worker     void pushClipStack() override { fClip.save(); }
popClipStack()264*c8dee2aaSAndroid Build Coastguard Worker     void popClipStack() override { fClip.restore(); }
265*c8dee2aaSAndroid Build Coastguard Worker 
clipRect(const SkRect & rect,SkClipOp op,bool aa)266*c8dee2aaSAndroid Build Coastguard Worker     void clipRect(const SkRect& rect, SkClipOp op, bool aa) override {
267*c8dee2aaSAndroid Build Coastguard Worker         SkASSERT(op == SkClipOp::kIntersect || op == SkClipOp::kDifference);
268*c8dee2aaSAndroid Build Coastguard Worker         fClip.clipRect(this->localToDevice(), rect, GrAA(aa), op);
269*c8dee2aaSAndroid Build Coastguard Worker     }
clipRRect(const SkRRect & rrect,SkClipOp op,bool aa)270*c8dee2aaSAndroid Build Coastguard Worker     void clipRRect(const SkRRect& rrect, SkClipOp op, bool aa) override {
271*c8dee2aaSAndroid Build Coastguard Worker         SkASSERT(op == SkClipOp::kIntersect || op == SkClipOp::kDifference);
272*c8dee2aaSAndroid Build Coastguard Worker         fClip.clipRRect(this->localToDevice(), rrect, GrAA(aa), op);
273*c8dee2aaSAndroid Build Coastguard Worker     }
274*c8dee2aaSAndroid Build Coastguard Worker     void clipPath(const SkPath& path, SkClipOp op, bool aa) override;
275*c8dee2aaSAndroid Build Coastguard Worker 
replaceClip(const SkIRect & rect)276*c8dee2aaSAndroid Build Coastguard Worker     void replaceClip(const SkIRect& rect) override {
277*c8dee2aaSAndroid Build Coastguard Worker         // Transform from "global/canvas" coordinates to relative to this device
278*c8dee2aaSAndroid Build Coastguard Worker         SkRect deviceRect = SkMatrixPriv::MapRect(this->globalToDevice(), SkRect::Make(rect));
279*c8dee2aaSAndroid Build Coastguard Worker         fClip.replaceClip(deviceRect.round());
280*c8dee2aaSAndroid Build Coastguard Worker     }
281*c8dee2aaSAndroid Build Coastguard Worker     void clipRegion(const SkRegion& globalRgn, SkClipOp op) override;
282*c8dee2aaSAndroid Build Coastguard Worker 
283*c8dee2aaSAndroid Build Coastguard Worker     bool isClipAntiAliased() const override;
284*c8dee2aaSAndroid Build Coastguard Worker 
isClipEmpty()285*c8dee2aaSAndroid Build Coastguard Worker     bool isClipEmpty() const override {
286*c8dee2aaSAndroid Build Coastguard Worker         return fClip.clipState() == ClipStack::ClipState::kEmpty;
287*c8dee2aaSAndroid Build Coastguard Worker     }
288*c8dee2aaSAndroid Build Coastguard Worker 
isClipRect()289*c8dee2aaSAndroid Build Coastguard Worker     bool isClipRect() const override {
290*c8dee2aaSAndroid Build Coastguard Worker         return fClip.clipState() == ClipStack::ClipState::kDeviceRect ||
291*c8dee2aaSAndroid Build Coastguard Worker                fClip.clipState() == ClipStack::ClipState::kWideOpen;
292*c8dee2aaSAndroid Build Coastguard Worker     }
293*c8dee2aaSAndroid Build Coastguard Worker 
isClipWideOpen()294*c8dee2aaSAndroid Build Coastguard Worker     bool isClipWideOpen() const override {
295*c8dee2aaSAndroid Build Coastguard Worker         return fClip.clipState() == ClipStack::ClipState::kWideOpen;
296*c8dee2aaSAndroid Build Coastguard Worker     }
297*c8dee2aaSAndroid Build Coastguard Worker 
298*c8dee2aaSAndroid Build Coastguard Worker     void android_utils_clipAsRgn(SkRegion*) const override;
299*c8dee2aaSAndroid Build Coastguard Worker     bool android_utils_clipWithStencil() override;
300*c8dee2aaSAndroid Build Coastguard Worker 
301*c8dee2aaSAndroid Build Coastguard Worker private:
302*c8dee2aaSAndroid Build Coastguard Worker     enum class DeviceFlags {
303*c8dee2aaSAndroid Build Coastguard Worker         kNone      = 0,
304*c8dee2aaSAndroid Build Coastguard Worker         kNeedClear = 1 << 0,  //!< Surface requires an initial clear
305*c8dee2aaSAndroid Build Coastguard Worker         kIsOpaque  = 1 << 1,  //!< Hint from client that rendering to this device will be
306*c8dee2aaSAndroid Build Coastguard Worker         //   opaque even if the config supports alpha.
307*c8dee2aaSAndroid Build Coastguard Worker     };
308*c8dee2aaSAndroid Build Coastguard Worker     SK_DECL_BITFIELD_CLASS_OPS_FRIENDS(DeviceFlags);
309*c8dee2aaSAndroid Build Coastguard Worker 
310*c8dee2aaSAndroid Build Coastguard Worker     static SkImageInfo MakeInfo(SurfaceContext*,  DeviceFlags);
311*c8dee2aaSAndroid Build Coastguard Worker     static bool CheckAlphaTypeAndGetFlags(SkAlphaType, InitContents, DeviceFlags*);
312*c8dee2aaSAndroid Build Coastguard Worker 
313*c8dee2aaSAndroid Build Coastguard Worker     sk_sp<GrRecordingContext> fContext;
314*c8dee2aaSAndroid Build Coastguard Worker 
315*c8dee2aaSAndroid Build Coastguard Worker     const sktext::gpu::SubRunControl fSubRunControl;
316*c8dee2aaSAndroid Build Coastguard Worker 
317*c8dee2aaSAndroid Build Coastguard Worker     std::unique_ptr<SurfaceDrawContext> fSurfaceDrawContext;
318*c8dee2aaSAndroid Build Coastguard Worker 
319*c8dee2aaSAndroid Build Coastguard Worker     ClipStack fClip;
320*c8dee2aaSAndroid Build Coastguard Worker 
321*c8dee2aaSAndroid Build Coastguard Worker     static sk_sp<Device> Make(std::unique_ptr<SurfaceDrawContext>,
322*c8dee2aaSAndroid Build Coastguard Worker                               SkAlphaType,
323*c8dee2aaSAndroid Build Coastguard Worker                               InitContents);
324*c8dee2aaSAndroid Build Coastguard Worker 
325*c8dee2aaSAndroid Build Coastguard Worker     Device(std::unique_ptr<SurfaceDrawContext>, DeviceFlags);
326*c8dee2aaSAndroid Build Coastguard Worker 
327*c8dee2aaSAndroid Build Coastguard Worker     void onDrawGlyphRunList(SkCanvas*, const sktext::GlyphRunList&, const SkPaint& paint) override;
328*c8dee2aaSAndroid Build Coastguard Worker 
329*c8dee2aaSAndroid Build Coastguard Worker     bool onReadPixels(const SkPixmap&, int, int) override;
330*c8dee2aaSAndroid Build Coastguard Worker     bool onWritePixels(const SkPixmap&, int, int) override;
331*c8dee2aaSAndroid Build Coastguard Worker     bool onAccessPixels(SkPixmap*) override;
332*c8dee2aaSAndroid Build Coastguard Worker 
333*c8dee2aaSAndroid Build Coastguard Worker     sk_sp<skif::Backend> createImageFilteringBackend(const SkSurfaceProps& surfaceProps,
334*c8dee2aaSAndroid Build Coastguard Worker                                                      SkColorType colorType) const override;
335*c8dee2aaSAndroid Build Coastguard Worker 
onClipShader(sk_sp<SkShader> shader)336*c8dee2aaSAndroid Build Coastguard Worker     void onClipShader(sk_sp<SkShader> shader) override {
337*c8dee2aaSAndroid Build Coastguard Worker         fClip.clipShader(std::move(shader));
338*c8dee2aaSAndroid Build Coastguard Worker     }
339*c8dee2aaSAndroid Build Coastguard Worker 
clip()340*c8dee2aaSAndroid Build Coastguard Worker     const GrClip* clip() const { return &fClip; }
341*c8dee2aaSAndroid Build Coastguard Worker 
342*c8dee2aaSAndroid Build Coastguard Worker     // If not null, dstClip must be contained inside dst and will also respect the edge AA flags.
343*c8dee2aaSAndroid Build Coastguard Worker     // If 'preViewMatrix' is not null, final CTM will be this->ctm() * preViewMatrix.
344*c8dee2aaSAndroid Build Coastguard Worker     void drawImageQuadDirect(const SkImage*,
345*c8dee2aaSAndroid Build Coastguard Worker                              const SkRect& src,
346*c8dee2aaSAndroid Build Coastguard Worker                              const SkRect& dst,
347*c8dee2aaSAndroid Build Coastguard Worker                              const SkPoint dstClip[4],
348*c8dee2aaSAndroid Build Coastguard Worker                              SkCanvas::QuadAAFlags,
349*c8dee2aaSAndroid Build Coastguard Worker                              const SkMatrix* preViewMatrix,
350*c8dee2aaSAndroid Build Coastguard Worker                              const SkSamplingOptions&,
351*c8dee2aaSAndroid Build Coastguard Worker                              const SkPaint&,
352*c8dee2aaSAndroid Build Coastguard Worker                              SkCanvas::SrcRectConstraint);
353*c8dee2aaSAndroid Build Coastguard Worker 
354*c8dee2aaSAndroid Build Coastguard Worker     // FIXME(michaelludwig) - Should be removed in favor of using drawImageQuad with edge flags to
355*c8dee2aaSAndroid Build Coastguard Worker     // for every element in the SkLatticeIter.
356*c8dee2aaSAndroid Build Coastguard Worker     void drawViewLattice(GrSurfaceProxyView,
357*c8dee2aaSAndroid Build Coastguard Worker                          const GrColorInfo& colorInfo,
358*c8dee2aaSAndroid Build Coastguard Worker                          std::unique_ptr<SkLatticeIter>,
359*c8dee2aaSAndroid Build Coastguard Worker                          const SkRect& dst,
360*c8dee2aaSAndroid Build Coastguard Worker                          SkFilterMode,
361*c8dee2aaSAndroid Build Coastguard Worker                          const SkPaint&);
362*c8dee2aaSAndroid Build Coastguard Worker 
363*c8dee2aaSAndroid Build Coastguard Worker     friend class ::SkSurface_Ganesh;  // for access to surfaceProps
364*c8dee2aaSAndroid Build Coastguard Worker     friend class skgpu::TiledTextureUtils;   // for access to clip()
365*c8dee2aaSAndroid Build Coastguard Worker };
366*c8dee2aaSAndroid Build Coastguard Worker 
367*c8dee2aaSAndroid Build Coastguard Worker SK_MAKE_BITFIELD_CLASS_OPS(Device::DeviceFlags)
368*c8dee2aaSAndroid Build Coastguard Worker 
369*c8dee2aaSAndroid Build Coastguard Worker }  // namespace skgpu::ganesh
370*c8dee2aaSAndroid Build Coastguard Worker 
371*c8dee2aaSAndroid Build Coastguard Worker #endif // skgpu_v1_Device_DEFINED
372