1cb93a386Sopenharmony_ci/*
2cb93a386Sopenharmony_ci * Copyright 2010 Google Inc.
3cb93a386Sopenharmony_ci *
4cb93a386Sopenharmony_ci * Use of this source code is governed by a BSD-style license that can be
5cb93a386Sopenharmony_ci * found in the LICENSE file.
6cb93a386Sopenharmony_ci */
7cb93a386Sopenharmony_ci
8cb93a386Sopenharmony_ci#ifndef SkGpuDevice_DEFINED
9cb93a386Sopenharmony_ci#define SkGpuDevice_DEFINED
10cb93a386Sopenharmony_ci
11cb93a386Sopenharmony_ci#include "include/core/SkBlurTypes.h"
12cb93a386Sopenharmony_ci#include "include/core/SkBitmap.h"
13cb93a386Sopenharmony_ci#include "include/core/SkPicture.h"
14cb93a386Sopenharmony_ci#include "include/core/SkRegion.h"
15cb93a386Sopenharmony_ci#include "include/core/SkSurface.h"
16cb93a386Sopenharmony_ci#include "include/gpu/GrTypes.h"
17cb93a386Sopenharmony_ci#include "src/gpu/BaseDevice.h"
18cb93a386Sopenharmony_ci#include "src/gpu/SkGr.h"
19cb93a386Sopenharmony_ci#include "src/gpu/v1/ClipStack.h"
20cb93a386Sopenharmony_ci#include "src/gpu/v1/SurfaceDrawContext_v1.h"
21cb93a386Sopenharmony_ci
22cb93a386Sopenharmony_ciclass SkSpecialImage;
23cb93a386Sopenharmony_ciclass SkSurface;
24cb93a386Sopenharmony_ciclass SkSurface_Gpu;
25cb93a386Sopenharmony_ciclass SkVertices;
26cb93a386Sopenharmony_ci
27cb93a386Sopenharmony_cinamespace skgpu::v1 {
28cb93a386Sopenharmony_ci
29cb93a386Sopenharmony_ci/**
30cb93a386Sopenharmony_ci *  Subclass of BaseDevice, which directs all drawing to the GrGpu owned by the canvas.
31cb93a386Sopenharmony_ci */
32cb93a386Sopenharmony_ciclass Device final : public BaseDevice  {
33cb93a386Sopenharmony_cipublic:
34cb93a386Sopenharmony_ci    bool wait(int numSemaphores,
35cb93a386Sopenharmony_ci              const GrBackendSemaphore* waitSemaphores,
36cb93a386Sopenharmony_ci              bool deleteSemaphoresAfterWait) override;
37cb93a386Sopenharmony_ci
38cb93a386Sopenharmony_ci    void discard() override {
39cb93a386Sopenharmony_ci        fSurfaceDrawContext->discard();
40cb93a386Sopenharmony_ci    }
41cb93a386Sopenharmony_ci
42cb93a386Sopenharmony_ci    bool replaceBackingProxy(SkSurface::ContentChangeMode,
43cb93a386Sopenharmony_ci                             sk_sp<GrRenderTargetProxy>,
44cb93a386Sopenharmony_ci                             GrColorType,
45cb93a386Sopenharmony_ci                             sk_sp<SkColorSpace>,
46cb93a386Sopenharmony_ci                             GrSurfaceOrigin,
47cb93a386Sopenharmony_ci                             const SkSurfaceProps&) override;
48cb93a386Sopenharmony_ci    using BaseDevice::replaceBackingProxy;
49cb93a386Sopenharmony_ci
50cb93a386Sopenharmony_ci    void asyncRescaleAndReadPixels(const SkImageInfo& info,
51cb93a386Sopenharmony_ci                                   const SkIRect& srcRect,
52cb93a386Sopenharmony_ci                                   RescaleGamma rescaleGamma,
53cb93a386Sopenharmony_ci                                   RescaleMode rescaleMode,
54cb93a386Sopenharmony_ci                                   ReadPixelsCallback callback,
55cb93a386Sopenharmony_ci                                   ReadPixelsContext context) override;
56cb93a386Sopenharmony_ci
57cb93a386Sopenharmony_ci    void asyncRescaleAndReadPixelsYUV420(SkYUVColorSpace yuvColorSpace,
58cb93a386Sopenharmony_ci                                         sk_sp<SkColorSpace> dstColorSpace,
59cb93a386Sopenharmony_ci                                         const SkIRect& srcRect,
60cb93a386Sopenharmony_ci                                         SkISize dstSize,
61cb93a386Sopenharmony_ci                                         RescaleGamma rescaleGamma,
62cb93a386Sopenharmony_ci                                         RescaleMode,
63cb93a386Sopenharmony_ci                                         ReadPixelsCallback callback,
64cb93a386Sopenharmony_ci                                         ReadPixelsContext context) override;
65cb93a386Sopenharmony_ci
66cb93a386Sopenharmony_ci    /**
67cb93a386Sopenharmony_ci     * This factory uses the color space, origin, surface properties, and initialization
68cb93a386Sopenharmony_ci     * method along with the provided proxy to create the gpu device.
69cb93a386Sopenharmony_ci     */
70cb93a386Sopenharmony_ci    static sk_sp<BaseDevice> Make(GrRecordingContext*,
71cb93a386Sopenharmony_ci                                  GrColorType,
72cb93a386Sopenharmony_ci                                  sk_sp<GrSurfaceProxy>,
73cb93a386Sopenharmony_ci                                  sk_sp<SkColorSpace>,
74cb93a386Sopenharmony_ci                                  GrSurfaceOrigin,
75cb93a386Sopenharmony_ci                                  const SkSurfaceProps&,
76cb93a386Sopenharmony_ci                                  InitContents);
77cb93a386Sopenharmony_ci
78cb93a386Sopenharmony_ci    /**
79cb93a386Sopenharmony_ci     * This factory uses the budgeted, imageInfo, fit, sampleCount, mipmapped, and isProtected
80cb93a386Sopenharmony_ci     * parameters to create a proxy to back the gpu device. The color space (from the image info),
81cb93a386Sopenharmony_ci     * origin, surface properties, and initialization method are then used (with the created proxy)
82cb93a386Sopenharmony_ci     * to create the device.
83cb93a386Sopenharmony_ci     */
84cb93a386Sopenharmony_ci    static sk_sp<BaseDevice> Make(GrRecordingContext*,
85cb93a386Sopenharmony_ci                                  SkBudgeted,
86cb93a386Sopenharmony_ci                                  const SkImageInfo&,
87cb93a386Sopenharmony_ci                                  SkBackingFit,
88cb93a386Sopenharmony_ci                                  int sampleCount,
89cb93a386Sopenharmony_ci                                  GrMipmapped,
90cb93a386Sopenharmony_ci                                  GrProtected,
91cb93a386Sopenharmony_ci                                  GrSurfaceOrigin,
92cb93a386Sopenharmony_ci                                  const SkSurfaceProps&,
93cb93a386Sopenharmony_ci                                  InitContents);
94cb93a386Sopenharmony_ci
95cb93a386Sopenharmony_ci    ~Device() override {}
96cb93a386Sopenharmony_ci
97cb93a386Sopenharmony_ci    SurfaceDrawContext* surfaceDrawContext() override;
98cb93a386Sopenharmony_ci    const SurfaceDrawContext* surfaceDrawContext() const;
99cb93a386Sopenharmony_ci    skgpu::SurfaceFillContext* surfaceFillContext() override;
100cb93a386Sopenharmony_ci
101cb93a386Sopenharmony_ci    // set all pixels to 0
102cb93a386Sopenharmony_ci    void clearAll();
103cb93a386Sopenharmony_ci
104cb93a386Sopenharmony_ci    void drawPaint(const SkPaint& paint) override;
105cb93a386Sopenharmony_ci    void drawPoints(SkCanvas::PointMode mode, size_t count, const SkPoint[],
106cb93a386Sopenharmony_ci                    const SkPaint& paint) override;
107cb93a386Sopenharmony_ci    void drawRect(const SkRect& r, const SkPaint& paint) override;
108cb93a386Sopenharmony_ci    void drawRRect(const SkRRect& r, const SkPaint& paint) override;
109cb93a386Sopenharmony_ci    void drawDRRect(const SkRRect& outer, const SkRRect& inner, const SkPaint& paint) override;
110cb93a386Sopenharmony_ci    void drawRegion(const SkRegion& r, const SkPaint& paint) override;
111cb93a386Sopenharmony_ci    void drawOval(const SkRect& oval, const SkPaint& paint) override;
112cb93a386Sopenharmony_ci    void drawArc(const SkRect& oval, SkScalar startAngle, SkScalar sweepAngle,
113cb93a386Sopenharmony_ci                 bool useCenter, const SkPaint& paint) override;
114cb93a386Sopenharmony_ci    void drawPath(const SkPath& path, const SkPaint& paint, bool pathIsMutable) override;
115cb93a386Sopenharmony_ci
116cb93a386Sopenharmony_ci    void onDrawGlyphRunList(const SkGlyphRunList& glyphRunList, const SkPaint& paint) override;
117cb93a386Sopenharmony_ci    void drawVertices(const SkVertices*, SkBlendMode, const SkPaint&) override;
118cb93a386Sopenharmony_ci    void drawShadow(const SkPath&, const SkDrawShadowRec&) override;
119cb93a386Sopenharmony_ci    void drawAtlas(const SkRSXform[], const SkRect[], const SkColor[], int count, SkBlendMode,
120cb93a386Sopenharmony_ci                   const SkPaint&) override;
121cb93a386Sopenharmony_ci
122cb93a386Sopenharmony_ci    void drawImageRect(const SkImage*, const SkRect* src, const SkRect& dst,
123cb93a386Sopenharmony_ci                       const SkSamplingOptions&, const SkPaint&,
124cb93a386Sopenharmony_ci                       SkCanvas::SrcRectConstraint) override;
125cb93a386Sopenharmony_ci    void drawImageLattice(const SkImage*, const SkCanvas::Lattice&,
126cb93a386Sopenharmony_ci                          const SkRect& dst, SkFilterMode, const SkPaint&) override;
127cb93a386Sopenharmony_ci
128cb93a386Sopenharmony_ci    void drawDrawable(SkDrawable*, const SkMatrix*, SkCanvas* canvas) override;
129cb93a386Sopenharmony_ci
130cb93a386Sopenharmony_ci    void drawDevice(SkBaseDevice*, const SkSamplingOptions&, const SkPaint&) override;
131cb93a386Sopenharmony_ci    void drawSpecial(SkSpecialImage*, const SkMatrix& localToDevice, const SkSamplingOptions&,
132cb93a386Sopenharmony_ci                     const SkPaint&) override;
133cb93a386Sopenharmony_ci
134cb93a386Sopenharmony_ci    void drawEdgeAAQuad(const SkRect& rect, const SkPoint clip[4], SkCanvas::QuadAAFlags aaFlags,
135cb93a386Sopenharmony_ci                        const SkColor4f& color, SkBlendMode mode) override;
136cb93a386Sopenharmony_ci    void drawEdgeAAImageSet(const SkCanvas::ImageSetEntry[], int count, const SkPoint dstClips[],
137cb93a386Sopenharmony_ci                            const SkMatrix[], const SkSamplingOptions&, const SkPaint&,
138cb93a386Sopenharmony_ci                            SkCanvas::SrcRectConstraint) override;
139cb93a386Sopenharmony_ci
140cb93a386Sopenharmony_ci    sk_sp<SkSpecialImage> makeSpecial(const SkBitmap&) override;
141cb93a386Sopenharmony_ci    sk_sp<SkSpecialImage> makeSpecial(const SkImage*) override;
142cb93a386Sopenharmony_ci    sk_sp<SkSpecialImage> snapSpecial(const SkIRect& subset, bool forceCopy = false) override;
143cb93a386Sopenharmony_ci
144cb93a386Sopenharmony_ci    bool onAccessPixels(SkPixmap*) override;
145cb93a386Sopenharmony_ci
146cb93a386Sopenharmony_ci    bool android_utils_clipWithStencil() override;
147cb93a386Sopenharmony_ci
148cb93a386Sopenharmony_ci    bool drawBlurImage(const SkImage* image, const SkBlurArg& blurArg) override;
149cb93a386Sopenharmony_ci
150cb93a386Sopenharmony_ciprotected:
151cb93a386Sopenharmony_ci    bool onReadPixels(const SkPixmap&, int, int) override;
152cb93a386Sopenharmony_ci    bool onWritePixels(const SkPixmap&, int, int) override;
153cb93a386Sopenharmony_ci
154cb93a386Sopenharmony_ci    void onSave() override { fClip.save(); }
155cb93a386Sopenharmony_ci    void onRestore() override { fClip.restore(); }
156cb93a386Sopenharmony_ci
157cb93a386Sopenharmony_ci    void onClipRect(const SkRect& rect, SkClipOp op, bool aa) override {
158cb93a386Sopenharmony_ci        SkASSERT(op == SkClipOp::kIntersect || op == SkClipOp::kDifference);
159cb93a386Sopenharmony_ci        fClip.clipRect(this->localToDevice(), rect, GrAA(aa), op);
160cb93a386Sopenharmony_ci    }
161cb93a386Sopenharmony_ci    void onClipRRect(const SkRRect& rrect, SkClipOp op, bool aa) override {
162cb93a386Sopenharmony_ci        SkASSERT(op == SkClipOp::kIntersect || op == SkClipOp::kDifference);
163cb93a386Sopenharmony_ci        fClip.clipRRect(this->localToDevice(), rrect, GrAA(aa), op);
164cb93a386Sopenharmony_ci    }
165cb93a386Sopenharmony_ci    void onClipPath(const SkPath& path, SkClipOp op, bool aa) override;
166cb93a386Sopenharmony_ci    void onClipShader(sk_sp<SkShader> shader) override {
167cb93a386Sopenharmony_ci        fClip.clipShader(std::move(shader));
168cb93a386Sopenharmony_ci    }
169cb93a386Sopenharmony_ci    void onReplaceClip(const SkIRect& rect) override {
170cb93a386Sopenharmony_ci        // Transform from "global/canvas" coordinates to relative to this device
171cb93a386Sopenharmony_ci        SkRect deviceRect = SkMatrixPriv::MapRect(this->globalToDevice(), SkRect::Make(rect));
172cb93a386Sopenharmony_ci        fClip.replaceClip(deviceRect.round());
173cb93a386Sopenharmony_ci    }
174cb93a386Sopenharmony_ci    void onClipRegion(const SkRegion& globalRgn, SkClipOp op) override;
175cb93a386Sopenharmony_ci    void onAsRgnClip(SkRegion*) const override;
176cb93a386Sopenharmony_ci    ClipType onGetClipType() const override;
177cb93a386Sopenharmony_ci    bool onClipIsAA() const override;
178cb93a386Sopenharmony_ci
179cb93a386Sopenharmony_ci    bool onClipIsWideOpen() const override {
180cb93a386Sopenharmony_ci        return fClip.clipState() == ClipStack::ClipState::kWideOpen;
181cb93a386Sopenharmony_ci    }
182cb93a386Sopenharmony_ci    SkIRect onDevClipBounds() const override { return fClip.getConservativeBounds(); }
183cb93a386Sopenharmony_ci
184cb93a386Sopenharmony_ciprivate:
185cb93a386Sopenharmony_ci    std::unique_ptr<SurfaceDrawContext> fSurfaceDrawContext;
186cb93a386Sopenharmony_ci
187cb93a386Sopenharmony_ci    ClipStack fClip;
188cb93a386Sopenharmony_ci
189cb93a386Sopenharmony_ci    static sk_sp<BaseDevice> Make(std::unique_ptr<SurfaceDrawContext>,
190cb93a386Sopenharmony_ci                                  SkAlphaType,
191cb93a386Sopenharmony_ci                                  InitContents);
192cb93a386Sopenharmony_ci
193cb93a386Sopenharmony_ci    Device(std::unique_ptr<SurfaceDrawContext>, DeviceFlags);
194cb93a386Sopenharmony_ci
195cb93a386Sopenharmony_ci    SkBaseDevice* onCreateDevice(const CreateInfo&, const SkPaint*) override;
196cb93a386Sopenharmony_ci
197cb93a386Sopenharmony_ci    sk_sp<SkSurface> makeSurface(const SkImageInfo&, const SkSurfaceProps&) override;
198cb93a386Sopenharmony_ci
199cb93a386Sopenharmony_ci    SkImageFilterCache* getImageFilterCache() override;
200cb93a386Sopenharmony_ci
201cb93a386Sopenharmony_ci    bool forceConservativeRasterClip() const override { return true; }
202cb93a386Sopenharmony_ci
203cb93a386Sopenharmony_ci    const GrClip* clip() const { return &fClip; }
204cb93a386Sopenharmony_ci
205cb93a386Sopenharmony_ci    // If not null, dstClip must be contained inside dst and will also respect the edge AA flags.
206cb93a386Sopenharmony_ci    // If 'preViewMatrix' is not null, final CTM will be this->ctm() * preViewMatrix.
207cb93a386Sopenharmony_ci    void drawImageQuad(const SkImage*, const SkRect* src, const SkRect* dst,
208cb93a386Sopenharmony_ci                       const SkPoint dstClip[4], GrAA aa, GrQuadAAFlags aaFlags,
209cb93a386Sopenharmony_ci                       const SkMatrix* preViewMatrix, const SkSamplingOptions&,
210cb93a386Sopenharmony_ci                       const SkPaint&, SkCanvas::SrcRectConstraint);
211cb93a386Sopenharmony_ci
212cb93a386Sopenharmony_ci    // FIXME(michaelludwig) - Should be removed in favor of using drawImageQuad with edge flags to
213cb93a386Sopenharmony_ci    // for every element in the SkLatticeIter.
214cb93a386Sopenharmony_ci    void drawViewLattice(GrSurfaceProxyView,
215cb93a386Sopenharmony_ci                         const GrColorInfo& colorInfo,
216cb93a386Sopenharmony_ci                         std::unique_ptr<SkLatticeIter>,
217cb93a386Sopenharmony_ci                         const SkRect& dst,
218cb93a386Sopenharmony_ci                         SkFilterMode,
219cb93a386Sopenharmony_ci                         const SkPaint&);
220cb93a386Sopenharmony_ci
221cb93a386Sopenharmony_ci    friend class ::SkSurface_Gpu;      // for access to surfaceProps
222cb93a386Sopenharmony_ci    using INHERITED = BaseDevice;
223cb93a386Sopenharmony_ci};
224cb93a386Sopenharmony_ci
225cb93a386Sopenharmony_ci} // namespace skgpu::v1
226cb93a386Sopenharmony_ci
227cb93a386Sopenharmony_ci#undef GR_CLIP_STACK
228cb93a386Sopenharmony_ci
229cb93a386Sopenharmony_ci#endif
230