xref: /aosp_15_r20/external/skia/src/gpu/ganesh/SurfaceDrawContext.h (revision c8dee2aa9b3f27cf6c858bd81872bdeb2c07ed17)
1*c8dee2aaSAndroid Build Coastguard Worker /*
2*c8dee2aaSAndroid Build Coastguard Worker  * Copyright 2015 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 #ifndef SurfaceDrawContext_v1_DEFINED
8*c8dee2aaSAndroid Build Coastguard Worker #define SurfaceDrawContext_v1_DEFINED
9*c8dee2aaSAndroid Build Coastguard Worker 
10*c8dee2aaSAndroid Build Coastguard Worker #include "include/core/SkCanvas.h"
11*c8dee2aaSAndroid Build Coastguard Worker #include "include/core/SkColor.h"
12*c8dee2aaSAndroid Build Coastguard Worker #include "include/core/SkDrawable.h"
13*c8dee2aaSAndroid Build Coastguard Worker #include "include/core/SkMatrix.h"
14*c8dee2aaSAndroid Build Coastguard Worker #include "include/core/SkPaint.h"
15*c8dee2aaSAndroid Build Coastguard Worker #include "include/core/SkRect.h"
16*c8dee2aaSAndroid Build Coastguard Worker #include "include/core/SkRefCnt.h"
17*c8dee2aaSAndroid Build Coastguard Worker #include "include/core/SkRegion.h"
18*c8dee2aaSAndroid Build Coastguard Worker #include "include/core/SkStrokeRec.h"
19*c8dee2aaSAndroid Build Coastguard Worker #include "include/core/SkSurfaceProps.h"
20*c8dee2aaSAndroid Build Coastguard Worker #include "include/gpu/GpuTypes.h"
21*c8dee2aaSAndroid Build Coastguard Worker #include "include/gpu/ganesh/GrTypes.h"
22*c8dee2aaSAndroid Build Coastguard Worker #include "include/private/SkColorData.h"
23*c8dee2aaSAndroid Build Coastguard Worker #include "include/private/base/SkPoint_impl.h"
24*c8dee2aaSAndroid Build Coastguard Worker #include "include/private/base/SkTArray.h"
25*c8dee2aaSAndroid Build Coastguard Worker #include "include/private/gpu/ganesh/GrTypesPriv.h"
26*c8dee2aaSAndroid Build Coastguard Worker #include "src/gpu/ganesh/GrColorSpaceXform.h"
27*c8dee2aaSAndroid Build Coastguard Worker #include "src/gpu/ganesh/GrPaint.h"
28*c8dee2aaSAndroid Build Coastguard Worker #include "src/gpu/ganesh/GrRenderTargetProxy.h"
29*c8dee2aaSAndroid Build Coastguard Worker #include "src/gpu/ganesh/GrSamplerState.h"
30*c8dee2aaSAndroid Build Coastguard Worker #include "src/gpu/ganesh/GrSurfaceProxy.h"
31*c8dee2aaSAndroid Build Coastguard Worker #include "src/gpu/ganesh/GrSurfaceProxyView.h"
32*c8dee2aaSAndroid Build Coastguard Worker #include "src/gpu/ganesh/SurfaceFillContext.h"
33*c8dee2aaSAndroid Build Coastguard Worker #include "src/gpu/ganesh/geometry/GrQuad.h"
34*c8dee2aaSAndroid Build Coastguard Worker #include "src/gpu/ganesh/ops/GrOp.h"
35*c8dee2aaSAndroid Build Coastguard Worker #include "src/gpu/ganesh/ops/OpsTask.h"
36*c8dee2aaSAndroid Build Coastguard Worker 
37*c8dee2aaSAndroid Build Coastguard Worker #include <cstdint>
38*c8dee2aaSAndroid Build Coastguard Worker #include <functional>
39*c8dee2aaSAndroid Build Coastguard Worker #include <memory>
40*c8dee2aaSAndroid Build Coastguard Worker #include <string_view>
41*c8dee2aaSAndroid Build Coastguard Worker #include <utility>
42*c8dee2aaSAndroid Build Coastguard Worker 
43*c8dee2aaSAndroid Build Coastguard Worker class GrBackendFormat;
44*c8dee2aaSAndroid Build Coastguard Worker class GrBackendSemaphore;
45*c8dee2aaSAndroid Build Coastguard Worker class GrBackendTexture;
46*c8dee2aaSAndroid Build Coastguard Worker class GrClip;
47*c8dee2aaSAndroid Build Coastguard Worker class GrDstProxyView;
48*c8dee2aaSAndroid Build Coastguard Worker class GrFragmentProcessor;
49*c8dee2aaSAndroid Build Coastguard Worker class GrHardClip;
50*c8dee2aaSAndroid Build Coastguard Worker class GrRecordingContext;
51*c8dee2aaSAndroid Build Coastguard Worker class GrRenderTarget;
52*c8dee2aaSAndroid Build Coastguard Worker class GrStyle;
53*c8dee2aaSAndroid Build Coastguard Worker class GrStyledShape;
54*c8dee2aaSAndroid Build Coastguard Worker class SkColorSpace;
55*c8dee2aaSAndroid Build Coastguard Worker class SkLatticeIter;
56*c8dee2aaSAndroid Build Coastguard Worker class SkMesh;
57*c8dee2aaSAndroid Build Coastguard Worker class SkPath;
58*c8dee2aaSAndroid Build Coastguard Worker class SkRRect;
59*c8dee2aaSAndroid Build Coastguard Worker class SkVertices;
60*c8dee2aaSAndroid Build Coastguard Worker enum SkAlphaType : int;
61*c8dee2aaSAndroid Build Coastguard Worker enum class SkBackingFit;
62*c8dee2aaSAndroid Build Coastguard Worker enum class SkBlendMode;
63*c8dee2aaSAndroid Build Coastguard Worker struct GrQuadSetEntry;
64*c8dee2aaSAndroid Build Coastguard Worker struct GrTextureSetEntry;
65*c8dee2aaSAndroid Build Coastguard Worker struct GrUserStencilSettings;
66*c8dee2aaSAndroid Build Coastguard Worker struct SkArc;
67*c8dee2aaSAndroid Build Coastguard Worker struct SkDrawShadowRec;
68*c8dee2aaSAndroid Build Coastguard Worker struct SkISize;
69*c8dee2aaSAndroid Build Coastguard Worker struct SkRSXform;
70*c8dee2aaSAndroid Build Coastguard Worker struct SkStrikeDeviceInfo;
71*c8dee2aaSAndroid Build Coastguard Worker 
72*c8dee2aaSAndroid Build Coastguard Worker namespace skgpu {
73*c8dee2aaSAndroid Build Coastguard Worker class RefCntedCallback;
74*c8dee2aaSAndroid Build Coastguard Worker class Swizzle;
75*c8dee2aaSAndroid Build Coastguard Worker }  // namespace skgpu
76*c8dee2aaSAndroid Build Coastguard Worker 
77*c8dee2aaSAndroid Build Coastguard Worker namespace sktext {
78*c8dee2aaSAndroid Build Coastguard Worker class GlyphRunList;
79*c8dee2aaSAndroid Build Coastguard Worker }
80*c8dee2aaSAndroid Build Coastguard Worker 
81*c8dee2aaSAndroid Build Coastguard Worker namespace skgpu::ganesh {
82*c8dee2aaSAndroid Build Coastguard Worker 
83*c8dee2aaSAndroid Build Coastguard Worker /**
84*c8dee2aaSAndroid Build Coastguard Worker  * A helper object to orchestrate commands (draws, etc...) for GrSurfaces that are GrRenderTargets.
85*c8dee2aaSAndroid Build Coastguard Worker  */
86*c8dee2aaSAndroid Build Coastguard Worker class SurfaceDrawContext final : public SurfaceFillContext {
87*c8dee2aaSAndroid Build Coastguard Worker public:
88*c8dee2aaSAndroid Build Coastguard Worker     static std::unique_ptr<SurfaceDrawContext> Make(GrRecordingContext*,
89*c8dee2aaSAndroid Build Coastguard Worker                                                     GrColorType,
90*c8dee2aaSAndroid Build Coastguard Worker                                                     sk_sp<GrSurfaceProxy>,
91*c8dee2aaSAndroid Build Coastguard Worker                                                     sk_sp<SkColorSpace>,
92*c8dee2aaSAndroid Build Coastguard Worker                                                     GrSurfaceOrigin,
93*c8dee2aaSAndroid Build Coastguard Worker                                                     const SkSurfaceProps&);
94*c8dee2aaSAndroid Build Coastguard Worker 
95*c8dee2aaSAndroid Build Coastguard Worker     /* Uses the default texture format for the color type */
96*c8dee2aaSAndroid Build Coastguard Worker     static std::unique_ptr<SurfaceDrawContext> Make(GrRecordingContext*,
97*c8dee2aaSAndroid Build Coastguard Worker                                                     GrColorType,
98*c8dee2aaSAndroid Build Coastguard Worker                                                     sk_sp<SkColorSpace>,
99*c8dee2aaSAndroid Build Coastguard Worker                                                     SkBackingFit,
100*c8dee2aaSAndroid Build Coastguard Worker                                                     SkISize dimensions,
101*c8dee2aaSAndroid Build Coastguard Worker                                                     const SkSurfaceProps&,
102*c8dee2aaSAndroid Build Coastguard Worker                                                     std::string_view label,
103*c8dee2aaSAndroid Build Coastguard Worker                                                     int sampleCnt = 1,
104*c8dee2aaSAndroid Build Coastguard Worker                                                     skgpu::Mipmapped = skgpu::Mipmapped::kNo,
105*c8dee2aaSAndroid Build Coastguard Worker                                                     skgpu::Protected = skgpu::Protected::kNo,
106*c8dee2aaSAndroid Build Coastguard Worker                                                     GrSurfaceOrigin = kBottomLeft_GrSurfaceOrigin,
107*c8dee2aaSAndroid Build Coastguard Worker                                                     skgpu::Budgeted = skgpu::Budgeted::kYes);
108*c8dee2aaSAndroid Build Coastguard Worker 
109*c8dee2aaSAndroid Build Coastguard Worker     /**
110*c8dee2aaSAndroid Build Coastguard Worker      * Takes custom swizzles rather than determining swizzles from color type and format.
111*c8dee2aaSAndroid Build Coastguard Worker      * It will have color type kUnknown.
112*c8dee2aaSAndroid Build Coastguard Worker      */
113*c8dee2aaSAndroid Build Coastguard Worker     static std::unique_ptr<SurfaceDrawContext> Make(GrRecordingContext*,
114*c8dee2aaSAndroid Build Coastguard Worker                                                     sk_sp<SkColorSpace>,
115*c8dee2aaSAndroid Build Coastguard Worker                                                     SkBackingFit,
116*c8dee2aaSAndroid Build Coastguard Worker                                                     SkISize dimensions,
117*c8dee2aaSAndroid Build Coastguard Worker                                                     const GrBackendFormat&,
118*c8dee2aaSAndroid Build Coastguard Worker                                                     int sampleCnt,
119*c8dee2aaSAndroid Build Coastguard Worker                                                     skgpu::Mipmapped,
120*c8dee2aaSAndroid Build Coastguard Worker                                                     skgpu::Protected,
121*c8dee2aaSAndroid Build Coastguard Worker                                                     skgpu::Swizzle readSwizzle,
122*c8dee2aaSAndroid Build Coastguard Worker                                                     skgpu::Swizzle writeSwizzle,
123*c8dee2aaSAndroid Build Coastguard Worker                                                     GrSurfaceOrigin,
124*c8dee2aaSAndroid Build Coastguard Worker                                                     skgpu::Budgeted,
125*c8dee2aaSAndroid Build Coastguard Worker                                                     const SkSurfaceProps&,
126*c8dee2aaSAndroid Build Coastguard Worker                                                     std::string_view label);
127*c8dee2aaSAndroid Build Coastguard Worker 
128*c8dee2aaSAndroid Build Coastguard Worker     // Same as previous factory but will try to use fallback GrColorTypes if the one passed in
129*c8dee2aaSAndroid Build Coastguard Worker     // fails. The fallback GrColorType will have at least the number of channels and precision per
130*c8dee2aaSAndroid Build Coastguard Worker     // channel as the passed in GrColorType. It may also swizzle the changes (e.g., BGRA -> RGBA).
131*c8dee2aaSAndroid Build Coastguard Worker     // SRGB-ness will be preserved.
132*c8dee2aaSAndroid Build Coastguard Worker     static std::unique_ptr<SurfaceDrawContext> MakeWithFallback(
133*c8dee2aaSAndroid Build Coastguard Worker             GrRecordingContext*,
134*c8dee2aaSAndroid Build Coastguard Worker             GrColorType,
135*c8dee2aaSAndroid Build Coastguard Worker             sk_sp<SkColorSpace>,
136*c8dee2aaSAndroid Build Coastguard Worker             SkBackingFit,
137*c8dee2aaSAndroid Build Coastguard Worker             SkISize dimensions,
138*c8dee2aaSAndroid Build Coastguard Worker             const SkSurfaceProps&,
139*c8dee2aaSAndroid Build Coastguard Worker             int sampleCnt,
140*c8dee2aaSAndroid Build Coastguard Worker             skgpu::Mipmapped,
141*c8dee2aaSAndroid Build Coastguard Worker             skgpu::Protected,
142*c8dee2aaSAndroid Build Coastguard Worker             GrSurfaceOrigin = kBottomLeft_GrSurfaceOrigin,
143*c8dee2aaSAndroid Build Coastguard Worker             skgpu::Budgeted = skgpu::Budgeted::kYes);
144*c8dee2aaSAndroid Build Coastguard Worker 
145*c8dee2aaSAndroid Build Coastguard Worker     // Creates a SurfaceDrawContext that wraps the passed in GrBackendTexture.
146*c8dee2aaSAndroid Build Coastguard Worker     static std::unique_ptr<SurfaceDrawContext> MakeFromBackendTexture(
147*c8dee2aaSAndroid Build Coastguard Worker             GrRecordingContext*,
148*c8dee2aaSAndroid Build Coastguard Worker             GrColorType,
149*c8dee2aaSAndroid Build Coastguard Worker             sk_sp<SkColorSpace>,
150*c8dee2aaSAndroid Build Coastguard Worker             const GrBackendTexture&,
151*c8dee2aaSAndroid Build Coastguard Worker             int sampleCnt,
152*c8dee2aaSAndroid Build Coastguard Worker             GrSurfaceOrigin,
153*c8dee2aaSAndroid Build Coastguard Worker             const SkSurfaceProps&,
154*c8dee2aaSAndroid Build Coastguard Worker             sk_sp<skgpu::RefCntedCallback> releaseHelper);
155*c8dee2aaSAndroid Build Coastguard Worker 
156*c8dee2aaSAndroid Build Coastguard Worker     SurfaceDrawContext(GrRecordingContext*,
157*c8dee2aaSAndroid Build Coastguard Worker                        GrSurfaceProxyView readView,
158*c8dee2aaSAndroid Build Coastguard Worker                        GrSurfaceProxyView writeView,
159*c8dee2aaSAndroid Build Coastguard Worker                        GrColorType,
160*c8dee2aaSAndroid Build Coastguard Worker                        sk_sp<SkColorSpace>,
161*c8dee2aaSAndroid Build Coastguard Worker                        const SkSurfaceProps&);
162*c8dee2aaSAndroid Build Coastguard Worker 
163*c8dee2aaSAndroid Build Coastguard Worker     ~SurfaceDrawContext() override;
164*c8dee2aaSAndroid Build Coastguard Worker 
165*c8dee2aaSAndroid Build Coastguard Worker     /**
166*c8dee2aaSAndroid Build Coastguard Worker      *  Draw everywhere (respecting the clip) with the paint.
167*c8dee2aaSAndroid Build Coastguard Worker      */
168*c8dee2aaSAndroid Build Coastguard Worker     void drawPaint(const GrClip*, GrPaint&&, const SkMatrix& viewMatrix);
169*c8dee2aaSAndroid Build Coastguard Worker 
170*c8dee2aaSAndroid Build Coastguard Worker     /**
171*c8dee2aaSAndroid Build Coastguard Worker      * Draw the rect using a paint.
172*c8dee2aaSAndroid Build Coastguard Worker      * @param paint        describes how to color pixels.
173*c8dee2aaSAndroid Build Coastguard Worker      * @param GrAA         Controls whether rect is antialiased
174*c8dee2aaSAndroid Build Coastguard Worker      * @param viewMatrix   transformation matrix
175*c8dee2aaSAndroid Build Coastguard Worker      * @param style        The style to apply. Null means fill. Currently path effects are not
176*c8dee2aaSAndroid Build Coastguard Worker      *                     allowed.
177*c8dee2aaSAndroid Build Coastguard Worker      * The rects coords are used to access the paint (through texture matrix)
178*c8dee2aaSAndroid Build Coastguard Worker      */
179*c8dee2aaSAndroid Build Coastguard Worker     void drawRect(const GrClip*,
180*c8dee2aaSAndroid Build Coastguard Worker                   GrPaint&& paint,
181*c8dee2aaSAndroid Build Coastguard Worker                   GrAA,
182*c8dee2aaSAndroid Build Coastguard Worker                   const SkMatrix& viewMatrix,
183*c8dee2aaSAndroid Build Coastguard Worker                   const SkRect&,
184*c8dee2aaSAndroid Build Coastguard Worker                   const GrStyle* style = nullptr);
185*c8dee2aaSAndroid Build Coastguard Worker 
186*c8dee2aaSAndroid Build Coastguard Worker     /**
187*c8dee2aaSAndroid Build Coastguard Worker      * Maps a rectangle of shader coordinates to a rectangle and fills that rectangle.
188*c8dee2aaSAndroid Build Coastguard Worker      *
189*c8dee2aaSAndroid Build Coastguard Worker      * @param GrPaint      describes how to color pixels.
190*c8dee2aaSAndroid Build Coastguard Worker      * @param GrAA         Controls whether rect is antialiased
191*c8dee2aaSAndroid Build Coastguard Worker      * @param SkMatrix     transformation matrix which applies to rectToDraw
192*c8dee2aaSAndroid Build Coastguard Worker      * @param rectToDraw   the rectangle to draw
193*c8dee2aaSAndroid Build Coastguard Worker      * @param localRect    the rectangle of shader coordinates applied to rectToDraw
194*c8dee2aaSAndroid Build Coastguard Worker      */
195*c8dee2aaSAndroid Build Coastguard Worker     void fillRectToRect(const GrClip*,
196*c8dee2aaSAndroid Build Coastguard Worker                         GrPaint&&,
197*c8dee2aaSAndroid Build Coastguard Worker                         GrAA,
198*c8dee2aaSAndroid Build Coastguard Worker                         const SkMatrix&,
199*c8dee2aaSAndroid Build Coastguard Worker                         const SkRect& rectToDraw,
200*c8dee2aaSAndroid Build Coastguard Worker                         const SkRect& localRect);
201*c8dee2aaSAndroid Build Coastguard Worker 
202*c8dee2aaSAndroid Build Coastguard Worker     /**
203*c8dee2aaSAndroid Build Coastguard Worker      * Fills a block of pixels with a paint and a localMatrix, respecting the clip.
204*c8dee2aaSAndroid Build Coastguard Worker      */
fillPixelsWithLocalMatrix(const GrClip * clip,GrPaint && paint,const SkIRect & bounds,const SkMatrix & localMatrix)205*c8dee2aaSAndroid Build Coastguard Worker     void fillPixelsWithLocalMatrix(const GrClip* clip,
206*c8dee2aaSAndroid Build Coastguard Worker                                    GrPaint&& paint,
207*c8dee2aaSAndroid Build Coastguard Worker                                    const SkIRect& bounds,
208*c8dee2aaSAndroid Build Coastguard Worker                                    const SkMatrix& localMatrix) {
209*c8dee2aaSAndroid Build Coastguard Worker         SkRect rect = SkRect::Make(bounds);
210*c8dee2aaSAndroid Build Coastguard Worker         DrawQuad quad{GrQuad::MakeFromRect(rect, SkMatrix::I()),
211*c8dee2aaSAndroid Build Coastguard Worker                       GrQuad::MakeFromRect(rect, localMatrix), GrQuadAAFlags::kNone};
212*c8dee2aaSAndroid Build Coastguard Worker         this->drawFilledQuad(clip, std::move(paint), &quad);
213*c8dee2aaSAndroid Build Coastguard Worker     }
214*c8dee2aaSAndroid Build Coastguard Worker 
215*c8dee2aaSAndroid Build Coastguard Worker     /**
216*c8dee2aaSAndroid Build Coastguard Worker      * Creates an op that draws a fill rect with per-edge control over anti-aliasing.
217*c8dee2aaSAndroid Build Coastguard Worker      *
218*c8dee2aaSAndroid Build Coastguard Worker      * This is a specialized version of fillQuadWithEdgeAA, but is kept separate since knowing
219*c8dee2aaSAndroid Build Coastguard Worker      * the geometry is a rectangle affords more optimizations.
220*c8dee2aaSAndroid Build Coastguard Worker      */
221*c8dee2aaSAndroid Build Coastguard Worker     void fillRectWithEdgeAA(const GrClip* clip, GrPaint&& paint, GrQuadAAFlags edgeAA,
222*c8dee2aaSAndroid Build Coastguard Worker                             const SkMatrix& viewMatrix, const SkRect& rect,
223*c8dee2aaSAndroid Build Coastguard Worker                             const SkRect* optionalLocalRect = nullptr) {
224*c8dee2aaSAndroid Build Coastguard Worker         if (edgeAA == GrQuadAAFlags::kAll) {
225*c8dee2aaSAndroid Build Coastguard Worker             this->fillRectToRect(clip, std::move(paint), GrAA::kYes, viewMatrix, rect,
226*c8dee2aaSAndroid Build Coastguard Worker                                  (optionalLocalRect) ? *optionalLocalRect : rect);
227*c8dee2aaSAndroid Build Coastguard Worker             return;
228*c8dee2aaSAndroid Build Coastguard Worker         }
229*c8dee2aaSAndroid Build Coastguard Worker         const SkRect& localRect = optionalLocalRect ? *optionalLocalRect : rect;
230*c8dee2aaSAndroid Build Coastguard Worker         DrawQuad quad{GrQuad::MakeFromRect(rect, viewMatrix), GrQuad(localRect), edgeAA};
231*c8dee2aaSAndroid Build Coastguard Worker         this->drawFilledQuad(clip, std::move(paint), &quad);
232*c8dee2aaSAndroid Build Coastguard Worker     }
233*c8dee2aaSAndroid Build Coastguard Worker 
234*c8dee2aaSAndroid Build Coastguard Worker     /**
235*c8dee2aaSAndroid Build Coastguard Worker      * Similar to fillRectWithEdgeAA but draws an arbitrary 2D convex quadrilateral transformed
236*c8dee2aaSAndroid Build Coastguard Worker      * by 'viewMatrix', with per-edge control over anti-aliasing. The quad should follow the
237*c8dee2aaSAndroid Build Coastguard Worker      * ordering used by SkRect::toQuad(), which determines how the edge AA is applied:
238*c8dee2aaSAndroid Build Coastguard Worker      *  - "top" = points [0] and [1]
239*c8dee2aaSAndroid Build Coastguard Worker      *  - "right" = points[1] and [2]
240*c8dee2aaSAndroid Build Coastguard Worker      *  - "bottom" = points[2] and [3]
241*c8dee2aaSAndroid Build Coastguard Worker      *  - "left" = points[3] and [0]
242*c8dee2aaSAndroid Build Coastguard Worker      *
243*c8dee2aaSAndroid Build Coastguard Worker      * The last argument, 'optionalLocalQuad', can be null if no separate local coordinates are
244*c8dee2aaSAndroid Build Coastguard Worker      * necessary.
245*c8dee2aaSAndroid Build Coastguard Worker      */
fillQuadWithEdgeAA(const GrClip * clip,GrPaint && paint,GrQuadAAFlags edgeAA,const SkMatrix & viewMatrix,const SkPoint points[4],const SkPoint optionalLocalPoints[4])246*c8dee2aaSAndroid Build Coastguard Worker     void fillQuadWithEdgeAA(const GrClip* clip, GrPaint&& paint, GrQuadAAFlags edgeAA,
247*c8dee2aaSAndroid Build Coastguard Worker                             const SkMatrix& viewMatrix, const SkPoint points[4],
248*c8dee2aaSAndroid Build Coastguard Worker                             const SkPoint optionalLocalPoints[4]) {
249*c8dee2aaSAndroid Build Coastguard Worker         const SkPoint* localPoints = optionalLocalPoints ? optionalLocalPoints : points;
250*c8dee2aaSAndroid Build Coastguard Worker         DrawQuad quad{GrQuad::MakeFromSkQuad(points, viewMatrix),
251*c8dee2aaSAndroid Build Coastguard Worker                       GrQuad::MakeFromSkQuad(localPoints, SkMatrix::I()), edgeAA};
252*c8dee2aaSAndroid Build Coastguard Worker         this->drawFilledQuad(clip, std::move(paint), &quad);
253*c8dee2aaSAndroid Build Coastguard Worker     }
254*c8dee2aaSAndroid Build Coastguard Worker 
255*c8dee2aaSAndroid Build Coastguard Worker     // TODO(michaelludwig) - remove if the bulk API is not useful for SkiaRenderer
256*c8dee2aaSAndroid Build Coastguard Worker     void drawQuadSet(const GrClip* clip, GrPaint&& paint, const SkMatrix& viewMatrix,
257*c8dee2aaSAndroid Build Coastguard Worker                      const GrQuadSetEntry[], int cnt);
258*c8dee2aaSAndroid Build Coastguard Worker 
259*c8dee2aaSAndroid Build Coastguard Worker     /**
260*c8dee2aaSAndroid Build Coastguard Worker      * Creates an op that draws a subrectangle of a texture. The passed color is modulated by the
261*c8dee2aaSAndroid Build Coastguard Worker      * texture's color. 'srcRect' specifies the rectangle of the texture to draw. 'dstRect'
262*c8dee2aaSAndroid Build Coastguard Worker      * specifies the rectangle to draw in local coords which will be transformed by 'viewMatrix' to
263*c8dee2aaSAndroid Build Coastguard Worker      * device space.
264*c8dee2aaSAndroid Build Coastguard Worker      */
265*c8dee2aaSAndroid Build Coastguard Worker     void drawTexture(const GrClip*,
266*c8dee2aaSAndroid Build Coastguard Worker                      GrSurfaceProxyView,
267*c8dee2aaSAndroid Build Coastguard Worker                      SkAlphaType,
268*c8dee2aaSAndroid Build Coastguard Worker                      GrSamplerState::Filter,
269*c8dee2aaSAndroid Build Coastguard Worker                      GrSamplerState::MipmapMode,
270*c8dee2aaSAndroid Build Coastguard Worker                      SkBlendMode,
271*c8dee2aaSAndroid Build Coastguard Worker                      const SkPMColor4f&,
272*c8dee2aaSAndroid Build Coastguard Worker                      const SkRect& srcRect,
273*c8dee2aaSAndroid Build Coastguard Worker                      const SkRect& dstRect,
274*c8dee2aaSAndroid Build Coastguard Worker                      GrQuadAAFlags,
275*c8dee2aaSAndroid Build Coastguard Worker                      SkCanvas::SrcRectConstraint,
276*c8dee2aaSAndroid Build Coastguard Worker                      const SkMatrix&,
277*c8dee2aaSAndroid Build Coastguard Worker                      sk_sp<GrColorSpaceXform>);
278*c8dee2aaSAndroid Build Coastguard Worker 
279*c8dee2aaSAndroid Build Coastguard Worker     /**
280*c8dee2aaSAndroid Build Coastguard Worker      * Variant of drawTexture that instead draws the texture applied to 'dstQuad' transformed by
281*c8dee2aaSAndroid Build Coastguard Worker      * 'viewMatrix', using the 'srcQuad' texture coordinates clamped to the optional 'subset'. If
282*c8dee2aaSAndroid Build Coastguard Worker      * 'subset' is null, it's equivalent to using the fast src rect constraint. If 'subset' is
283*c8dee2aaSAndroid Build Coastguard Worker      * provided, the strict src rect constraint is applied using 'subset'.
284*c8dee2aaSAndroid Build Coastguard Worker      */
drawTextureQuad(const GrClip * clip,GrSurfaceProxyView view,GrColorType srcColorType,SkAlphaType srcAlphaType,GrSamplerState::Filter filter,GrSamplerState::MipmapMode mm,SkBlendMode mode,const SkPMColor4f & color,const SkPoint srcQuad[4],const SkPoint dstQuad[4],GrQuadAAFlags edgeAA,const SkRect * subset,const SkMatrix & viewMatrix,sk_sp<GrColorSpaceXform> texXform)285*c8dee2aaSAndroid Build Coastguard Worker     void drawTextureQuad(const GrClip* clip,
286*c8dee2aaSAndroid Build Coastguard Worker                          GrSurfaceProxyView view,
287*c8dee2aaSAndroid Build Coastguard Worker                          GrColorType srcColorType,
288*c8dee2aaSAndroid Build Coastguard Worker                          SkAlphaType srcAlphaType,
289*c8dee2aaSAndroid Build Coastguard Worker                          GrSamplerState::Filter filter,
290*c8dee2aaSAndroid Build Coastguard Worker                          GrSamplerState::MipmapMode mm,
291*c8dee2aaSAndroid Build Coastguard Worker                          SkBlendMode mode,
292*c8dee2aaSAndroid Build Coastguard Worker                          const SkPMColor4f& color,
293*c8dee2aaSAndroid Build Coastguard Worker                          const SkPoint srcQuad[4],
294*c8dee2aaSAndroid Build Coastguard Worker                          const SkPoint dstQuad[4],
295*c8dee2aaSAndroid Build Coastguard Worker                          GrQuadAAFlags edgeAA,
296*c8dee2aaSAndroid Build Coastguard Worker                          const SkRect* subset,
297*c8dee2aaSAndroid Build Coastguard Worker                          const SkMatrix& viewMatrix,
298*c8dee2aaSAndroid Build Coastguard Worker                          sk_sp<GrColorSpaceXform> texXform) {
299*c8dee2aaSAndroid Build Coastguard Worker         DrawQuad quad{GrQuad::MakeFromSkQuad(dstQuad, viewMatrix),
300*c8dee2aaSAndroid Build Coastguard Worker                       GrQuad::MakeFromSkQuad(srcQuad, SkMatrix::I()), edgeAA};
301*c8dee2aaSAndroid Build Coastguard Worker         this->drawTexturedQuad(clip, std::move(view), srcAlphaType, std::move(texXform), filter, mm,
302*c8dee2aaSAndroid Build Coastguard Worker                                color, mode, &quad, subset);
303*c8dee2aaSAndroid Build Coastguard Worker     }
304*c8dee2aaSAndroid Build Coastguard Worker 
305*c8dee2aaSAndroid Build Coastguard Worker     /**
306*c8dee2aaSAndroid Build Coastguard Worker      * Draws a set of textures with a shared filter, color, view matrix, color xform, and
307*c8dee2aaSAndroid Build Coastguard Worker      * texture color xform. The textures must all have the same GrTextureType and GrConfig.
308*c8dee2aaSAndroid Build Coastguard Worker      *
309*c8dee2aaSAndroid Build Coastguard Worker      * If any entries provide a non-null fDstClip array, it will be read from immediately based on
310*c8dee2aaSAndroid Build Coastguard Worker      * fDstClipCount, so the pointer can become invalid after this returns.
311*c8dee2aaSAndroid Build Coastguard Worker      *
312*c8dee2aaSAndroid Build Coastguard Worker      * 'proxRunCnt' is the number of proxy changes encountered in the entry array. Technically this
313*c8dee2aaSAndroid Build Coastguard Worker      * can be inferred from the array within this function, but the information is already known
314*c8dee2aaSAndroid Build Coastguard Worker      * by SkGpuDevice, so no need to incur another iteration over the array.
315*c8dee2aaSAndroid Build Coastguard Worker      */
316*c8dee2aaSAndroid Build Coastguard Worker     void drawTextureSet(const GrClip*,
317*c8dee2aaSAndroid Build Coastguard Worker                         GrTextureSetEntry[],
318*c8dee2aaSAndroid Build Coastguard Worker                         int cnt,
319*c8dee2aaSAndroid Build Coastguard Worker                         int proxyRunCnt,
320*c8dee2aaSAndroid Build Coastguard Worker                         GrSamplerState::Filter,
321*c8dee2aaSAndroid Build Coastguard Worker                         GrSamplerState::MipmapMode,
322*c8dee2aaSAndroid Build Coastguard Worker                         SkBlendMode mode,
323*c8dee2aaSAndroid Build Coastguard Worker                         SkCanvas::SrcRectConstraint,
324*c8dee2aaSAndroid Build Coastguard Worker                         const SkMatrix& viewMatrix,
325*c8dee2aaSAndroid Build Coastguard Worker                         sk_sp<GrColorSpaceXform> texXform);
326*c8dee2aaSAndroid Build Coastguard Worker 
327*c8dee2aaSAndroid Build Coastguard Worker     /**
328*c8dee2aaSAndroid Build Coastguard Worker      * Draw a roundrect using a paint.
329*c8dee2aaSAndroid Build Coastguard Worker      *
330*c8dee2aaSAndroid Build Coastguard Worker      * @param paint       describes how to color pixels.
331*c8dee2aaSAndroid Build Coastguard Worker      * @param GrAA        Controls whether rrect is antialiased.
332*c8dee2aaSAndroid Build Coastguard Worker      * @param viewMatrix  transformation matrix
333*c8dee2aaSAndroid Build Coastguard Worker      * @param rrect       the roundrect to draw
334*c8dee2aaSAndroid Build Coastguard Worker      * @param style       style to apply to the rrect. Currently path effects are not allowed.
335*c8dee2aaSAndroid Build Coastguard Worker      */
336*c8dee2aaSAndroid Build Coastguard Worker     void drawRRect(const GrClip*,
337*c8dee2aaSAndroid Build Coastguard Worker                    GrPaint&&,
338*c8dee2aaSAndroid Build Coastguard Worker                    GrAA,
339*c8dee2aaSAndroid Build Coastguard Worker                    const SkMatrix& viewMatrix,
340*c8dee2aaSAndroid Build Coastguard Worker                    const SkRRect& rrect,
341*c8dee2aaSAndroid Build Coastguard Worker                    const GrStyle& style);
342*c8dee2aaSAndroid Build Coastguard Worker 
343*c8dee2aaSAndroid Build Coastguard Worker     /**
344*c8dee2aaSAndroid Build Coastguard Worker      * Use a fast method to render the ambient and spot shadows for a path.
345*c8dee2aaSAndroid Build Coastguard Worker      * Will return false if not possible for the given path.
346*c8dee2aaSAndroid Build Coastguard Worker      *
347*c8dee2aaSAndroid Build Coastguard Worker      * @param viewMatrix   transformation matrix
348*c8dee2aaSAndroid Build Coastguard Worker      * @param path         the path to shadow
349*c8dee2aaSAndroid Build Coastguard Worker      * @param rec          parameters for shadow rendering
350*c8dee2aaSAndroid Build Coastguard Worker      */
351*c8dee2aaSAndroid Build Coastguard Worker     bool drawFastShadow(const GrClip*,
352*c8dee2aaSAndroid Build Coastguard Worker                         const SkMatrix& viewMatrix,
353*c8dee2aaSAndroid Build Coastguard Worker                         const SkPath& path,
354*c8dee2aaSAndroid Build Coastguard Worker                         const SkDrawShadowRec& rec);
355*c8dee2aaSAndroid Build Coastguard Worker 
356*c8dee2aaSAndroid Build Coastguard Worker     /**
357*c8dee2aaSAndroid Build Coastguard Worker      * Draws a path.
358*c8dee2aaSAndroid Build Coastguard Worker      *
359*c8dee2aaSAndroid Build Coastguard Worker      * @param paint         describes how to color pixels.
360*c8dee2aaSAndroid Build Coastguard Worker      * @param GrAA          Controls whether the path is antialiased.
361*c8dee2aaSAndroid Build Coastguard Worker      * @param viewMatrix    transformation matrix
362*c8dee2aaSAndroid Build Coastguard Worker      * @param path          the path to draw
363*c8dee2aaSAndroid Build Coastguard Worker      * @param style         style to apply to the path.
364*c8dee2aaSAndroid Build Coastguard Worker      */
365*c8dee2aaSAndroid Build Coastguard Worker     void drawPath(const GrClip*,
366*c8dee2aaSAndroid Build Coastguard Worker                   GrPaint&&,
367*c8dee2aaSAndroid Build Coastguard Worker                   GrAA,
368*c8dee2aaSAndroid Build Coastguard Worker                   const SkMatrix& viewMatrix,
369*c8dee2aaSAndroid Build Coastguard Worker                   const SkPath&,
370*c8dee2aaSAndroid Build Coastguard Worker                   const GrStyle&);
371*c8dee2aaSAndroid Build Coastguard Worker 
372*c8dee2aaSAndroid Build Coastguard Worker     /**
373*c8dee2aaSAndroid Build Coastguard Worker      * Draws a shape.
374*c8dee2aaSAndroid Build Coastguard Worker      *
375*c8dee2aaSAndroid Build Coastguard Worker      * @param paint         describes how to color pixels.
376*c8dee2aaSAndroid Build Coastguard Worker      * @param GrAA          Controls whether the path is antialiased.
377*c8dee2aaSAndroid Build Coastguard Worker      * @param viewMatrix    transformation matrix
378*c8dee2aaSAndroid Build Coastguard Worker      * @param shape         the shape to draw
379*c8dee2aaSAndroid Build Coastguard Worker      */
380*c8dee2aaSAndroid Build Coastguard Worker     void drawShape(const GrClip*,
381*c8dee2aaSAndroid Build Coastguard Worker                    GrPaint&&,
382*c8dee2aaSAndroid Build Coastguard Worker                    GrAA,
383*c8dee2aaSAndroid Build Coastguard Worker                    const SkMatrix& viewMatrix,
384*c8dee2aaSAndroid Build Coastguard Worker                    GrStyledShape&&);
385*c8dee2aaSAndroid Build Coastguard Worker 
386*c8dee2aaSAndroid Build Coastguard Worker     /**
387*c8dee2aaSAndroid Build Coastguard Worker      * Draws vertices with a paint.
388*c8dee2aaSAndroid Build Coastguard Worker      *
389*c8dee2aaSAndroid Build Coastguard Worker      * @param   paint            describes how to color pixels.
390*c8dee2aaSAndroid Build Coastguard Worker      * @param   viewMatrix       transformation matrix
391*c8dee2aaSAndroid Build Coastguard Worker      * @param   vertices         specifies the mesh to draw.
392*c8dee2aaSAndroid Build Coastguard Worker      * @param   overridePrimType primitive type to draw. If NULL, derive prim type from vertices.
393*c8dee2aaSAndroid Build Coastguard Worker      * @param   skipColorXform   if true, do not apply a color space transfer function
394*c8dee2aaSAndroid Build Coastguard Worker      */
395*c8dee2aaSAndroid Build Coastguard Worker     void drawVertices(const GrClip*,
396*c8dee2aaSAndroid Build Coastguard Worker                       GrPaint&& paint,
397*c8dee2aaSAndroid Build Coastguard Worker                       const SkMatrix& viewMatrix,
398*c8dee2aaSAndroid Build Coastguard Worker                       sk_sp<SkVertices> vertices,
399*c8dee2aaSAndroid Build Coastguard Worker                       GrPrimitiveType* overridePrimType = nullptr,
400*c8dee2aaSAndroid Build Coastguard Worker                       bool skipColorXform = false);
401*c8dee2aaSAndroid Build Coastguard Worker 
402*c8dee2aaSAndroid Build Coastguard Worker     /**
403*c8dee2aaSAndroid Build Coastguard Worker      * Draws a custom mesh with a paint.
404*c8dee2aaSAndroid Build Coastguard Worker      *
405*c8dee2aaSAndroid Build Coastguard Worker      * @param   paint      describes how to color pixels.
406*c8dee2aaSAndroid Build Coastguard Worker      * @param   viewMatrix transformation matrix
407*c8dee2aaSAndroid Build Coastguard Worker      * @param   mesh       the mesh to draw.
408*c8dee2aaSAndroid Build Coastguard Worker      * @param   children   child effects referenced by SkMesh shaders
409*c8dee2aaSAndroid Build Coastguard Worker      */
410*c8dee2aaSAndroid Build Coastguard Worker     void drawMesh(const GrClip*,
411*c8dee2aaSAndroid Build Coastguard Worker                   GrPaint&& paint,
412*c8dee2aaSAndroid Build Coastguard Worker                   const SkMatrix& viewMatrix,
413*c8dee2aaSAndroid Build Coastguard Worker                   const SkMesh& mesh,
414*c8dee2aaSAndroid Build Coastguard Worker                   skia_private::TArray<std::unique_ptr<GrFragmentProcessor>> children);
415*c8dee2aaSAndroid Build Coastguard Worker 
416*c8dee2aaSAndroid Build Coastguard Worker     /**
417*c8dee2aaSAndroid Build Coastguard Worker      * Draws textured sprites from an atlas with a paint. This currently does not support AA for the
418*c8dee2aaSAndroid Build Coastguard Worker      * sprite rectangle edges.
419*c8dee2aaSAndroid Build Coastguard Worker      *
420*c8dee2aaSAndroid Build Coastguard Worker      * @param   paint           describes how to color pixels.
421*c8dee2aaSAndroid Build Coastguard Worker      * @param   viewMatrix      transformation matrix
422*c8dee2aaSAndroid Build Coastguard Worker      * @param   spriteCount     number of sprites.
423*c8dee2aaSAndroid Build Coastguard Worker      * @param   xform           array of compressed transformation data, required.
424*c8dee2aaSAndroid Build Coastguard Worker      * @param   texRect         array of texture rectangles used to access the paint.
425*c8dee2aaSAndroid Build Coastguard Worker      * @param   colors          optional array of per-sprite colors, supercedes
426*c8dee2aaSAndroid Build Coastguard Worker      *                          the paint's color field.
427*c8dee2aaSAndroid Build Coastguard Worker      */
428*c8dee2aaSAndroid Build Coastguard Worker     void drawAtlas(const GrClip*,
429*c8dee2aaSAndroid Build Coastguard Worker                    GrPaint&& paint,
430*c8dee2aaSAndroid Build Coastguard Worker                    const SkMatrix& viewMatrix,
431*c8dee2aaSAndroid Build Coastguard Worker                    int spriteCount,
432*c8dee2aaSAndroid Build Coastguard Worker                    const SkRSXform xform[],
433*c8dee2aaSAndroid Build Coastguard Worker                    const SkRect texRect[],
434*c8dee2aaSAndroid Build Coastguard Worker                    const SkColor colors[]);
435*c8dee2aaSAndroid Build Coastguard Worker 
436*c8dee2aaSAndroid Build Coastguard Worker     /**
437*c8dee2aaSAndroid Build Coastguard Worker      * Draws a region.
438*c8dee2aaSAndroid Build Coastguard Worker      *
439*c8dee2aaSAndroid Build Coastguard Worker      * @param paint         describes how to color pixels
440*c8dee2aaSAndroid Build Coastguard Worker      * @param viewMatrix    transformation matrix
441*c8dee2aaSAndroid Build Coastguard Worker      * @param aa            should the rects of the region be antialiased.
442*c8dee2aaSAndroid Build Coastguard Worker      * @param region        the region to be drawn
443*c8dee2aaSAndroid Build Coastguard Worker      * @param style         style to apply to the region
444*c8dee2aaSAndroid Build Coastguard Worker      */
445*c8dee2aaSAndroid Build Coastguard Worker     void drawRegion(const GrClip*,
446*c8dee2aaSAndroid Build Coastguard Worker                     GrPaint&& paint,
447*c8dee2aaSAndroid Build Coastguard Worker                     GrAA aa,
448*c8dee2aaSAndroid Build Coastguard Worker                     const SkMatrix& viewMatrix,
449*c8dee2aaSAndroid Build Coastguard Worker                     const SkRegion& region,
450*c8dee2aaSAndroid Build Coastguard Worker                     const GrStyle& style,
451*c8dee2aaSAndroid Build Coastguard Worker                     const GrUserStencilSettings* ss = nullptr);
452*c8dee2aaSAndroid Build Coastguard Worker 
453*c8dee2aaSAndroid Build Coastguard Worker     /**
454*c8dee2aaSAndroid Build Coastguard Worker      * Draws an oval.
455*c8dee2aaSAndroid Build Coastguard Worker      *
456*c8dee2aaSAndroid Build Coastguard Worker      * @param paint         describes how to color pixels.
457*c8dee2aaSAndroid Build Coastguard Worker      * @param GrAA          Controls whether the oval is antialiased.
458*c8dee2aaSAndroid Build Coastguard Worker      * @param viewMatrix    transformation matrix
459*c8dee2aaSAndroid Build Coastguard Worker      * @param oval          the bounding rect of the oval.
460*c8dee2aaSAndroid Build Coastguard Worker      * @param style         style to apply to the oval. Currently path effects are not allowed.
461*c8dee2aaSAndroid Build Coastguard Worker      */
462*c8dee2aaSAndroid Build Coastguard Worker     void drawOval(const GrClip*,
463*c8dee2aaSAndroid Build Coastguard Worker                   GrPaint&& paint,
464*c8dee2aaSAndroid Build Coastguard Worker                   GrAA,
465*c8dee2aaSAndroid Build Coastguard Worker                   const SkMatrix& viewMatrix,
466*c8dee2aaSAndroid Build Coastguard Worker                   const SkRect& oval,
467*c8dee2aaSAndroid Build Coastguard Worker                   const GrStyle& style);
468*c8dee2aaSAndroid Build Coastguard Worker 
469*c8dee2aaSAndroid Build Coastguard Worker     /**
470*c8dee2aaSAndroid Build Coastguard Worker      * Draws a partial arc of an oval.
471*c8dee2aaSAndroid Build Coastguard Worker      *
472*c8dee2aaSAndroid Build Coastguard Worker      * @param paint         describes how to color pixels.
473*c8dee2aaSAndroid Build Coastguard Worker      * @param GrGrAA        Controls whether the arc is antialiased.
474*c8dee2aaSAndroid Build Coastguard Worker      * @param viewMatrix    transformation matrix.
475*c8dee2aaSAndroid Build Coastguard Worker      * @param oval          the bounding rect of the oval.
476*c8dee2aaSAndroid Build Coastguard Worker      * @param startAngle    starting angle in degrees.
477*c8dee2aaSAndroid Build Coastguard Worker      * @param sweepAngle    angle to sweep in degrees. Must be in (-360, 360)
478*c8dee2aaSAndroid Build Coastguard Worker      * @param useCenter     true means that the implied path begins at the oval center, connects as
479*c8dee2aaSAndroid Build Coastguard Worker      *                      a line to the point indicated by the start contains the arc indicated by
480*c8dee2aaSAndroid Build Coastguard Worker      *                      the sweep angle. If false the line beginning at the center point is
481*c8dee2aaSAndroid Build Coastguard Worker      *                      omitted.
482*c8dee2aaSAndroid Build Coastguard Worker      * @param style         style to apply to the oval.
483*c8dee2aaSAndroid Build Coastguard Worker      */
484*c8dee2aaSAndroid Build Coastguard Worker     void drawArc(const GrClip*,
485*c8dee2aaSAndroid Build Coastguard Worker                  GrPaint&& paint,
486*c8dee2aaSAndroid Build Coastguard Worker                  GrAA,
487*c8dee2aaSAndroid Build Coastguard Worker                  const SkMatrix& viewMatrix,
488*c8dee2aaSAndroid Build Coastguard Worker                  const SkArc& arc,
489*c8dee2aaSAndroid Build Coastguard Worker                  const GrStyle& style);
490*c8dee2aaSAndroid Build Coastguard Worker 
491*c8dee2aaSAndroid Build Coastguard Worker     /**
492*c8dee2aaSAndroid Build Coastguard Worker      * Draw the image as a set of rects, specified by |iter|.
493*c8dee2aaSAndroid Build Coastguard Worker      */
494*c8dee2aaSAndroid Build Coastguard Worker     void drawImageLattice(const GrClip*,
495*c8dee2aaSAndroid Build Coastguard Worker                           GrPaint&&,
496*c8dee2aaSAndroid Build Coastguard Worker                           const SkMatrix& viewMatrix,
497*c8dee2aaSAndroid Build Coastguard Worker                           GrSurfaceProxyView,
498*c8dee2aaSAndroid Build Coastguard Worker                           SkAlphaType alphaType,
499*c8dee2aaSAndroid Build Coastguard Worker                           sk_sp<GrColorSpaceXform>,
500*c8dee2aaSAndroid Build Coastguard Worker                           GrSamplerState::Filter,
501*c8dee2aaSAndroid Build Coastguard Worker                           std::unique_ptr<SkLatticeIter>,
502*c8dee2aaSAndroid Build Coastguard Worker                           const SkRect& dst);
503*c8dee2aaSAndroid Build Coastguard Worker 
504*c8dee2aaSAndroid Build Coastguard Worker     /**
505*c8dee2aaSAndroid Build Coastguard Worker      * Draw the text specified by the GlyphRunList.
506*c8dee2aaSAndroid Build Coastguard Worker      *
507*c8dee2aaSAndroid Build Coastguard Worker      * @param viewMatrix      transformation matrix
508*c8dee2aaSAndroid Build Coastguard Worker      * @param glyphRunList    text, text positions, and paint.
509*c8dee2aaSAndroid Build Coastguard Worker      */
510*c8dee2aaSAndroid Build Coastguard Worker     void drawGlyphRunList(SkCanvas*,
511*c8dee2aaSAndroid Build Coastguard Worker                           const GrClip*,
512*c8dee2aaSAndroid Build Coastguard Worker                           const SkMatrix& viewMatrix,
513*c8dee2aaSAndroid Build Coastguard Worker                           const sktext::GlyphRunList& glyphRunList,
514*c8dee2aaSAndroid Build Coastguard Worker                           SkStrikeDeviceInfo strikeDeviceInfo,
515*c8dee2aaSAndroid Build Coastguard Worker                           const SkPaint& paint);
516*c8dee2aaSAndroid Build Coastguard Worker 
517*c8dee2aaSAndroid Build Coastguard Worker     /**
518*c8dee2aaSAndroid Build Coastguard Worker      * Adds the necessary signal and wait semaphores and adds the passed in SkDrawable to the
519*c8dee2aaSAndroid Build Coastguard Worker      * command stream.
520*c8dee2aaSAndroid Build Coastguard Worker      */
521*c8dee2aaSAndroid Build Coastguard Worker     void drawDrawable(std::unique_ptr<SkDrawable::GpuDrawHandler>, const SkRect& bounds);
522*c8dee2aaSAndroid Build Coastguard Worker 
523*c8dee2aaSAndroid Build Coastguard Worker     // called to note the last clip drawn to the stencil buffer.
524*c8dee2aaSAndroid Build Coastguard Worker     // TODO: remove after clipping overhaul.
525*c8dee2aaSAndroid Build Coastguard Worker     void setLastClip(uint32_t clipStackGenID,
526*c8dee2aaSAndroid Build Coastguard Worker                      const SkIRect& devClipBounds,
527*c8dee2aaSAndroid Build Coastguard Worker                      int numClipAnalyticElements);
528*c8dee2aaSAndroid Build Coastguard Worker 
529*c8dee2aaSAndroid Build Coastguard Worker     // called to determine if we have to render the clip into SB.
530*c8dee2aaSAndroid Build Coastguard Worker     // TODO: remove after clipping overhaul.
531*c8dee2aaSAndroid Build Coastguard Worker     bool mustRenderClip(uint32_t clipStackGenID,
532*c8dee2aaSAndroid Build Coastguard Worker                         const SkIRect& devClipBounds,
533*c8dee2aaSAndroid Build Coastguard Worker                         int numClipAnalyticElements);
534*c8dee2aaSAndroid Build Coastguard Worker 
clearStencilClip(const SkIRect & scissor,bool insideStencilMask)535*c8dee2aaSAndroid Build Coastguard Worker     void clearStencilClip(const SkIRect& scissor, bool insideStencilMask) {
536*c8dee2aaSAndroid Build Coastguard Worker         this->internalStencilClear(&scissor, insideStencilMask);
537*c8dee2aaSAndroid Build Coastguard Worker     }
538*c8dee2aaSAndroid Build Coastguard Worker 
539*c8dee2aaSAndroid Build Coastguard Worker     // While this can take a general clip, since ClipStack relies on this function, it must take
540*c8dee2aaSAndroid Build Coastguard Worker     // care to only provide hard clips or we could get stuck in a loop. The general clip is needed
541*c8dee2aaSAndroid Build Coastguard Worker     // so that path renderers can use this function.
542*c8dee2aaSAndroid Build Coastguard Worker     void stencilRect(const GrClip* clip,
543*c8dee2aaSAndroid Build Coastguard Worker                      const GrUserStencilSettings* ss,
544*c8dee2aaSAndroid Build Coastguard Worker                      GrPaint&& paint,
545*c8dee2aaSAndroid Build Coastguard Worker                      GrAA doStencilMSAA,
546*c8dee2aaSAndroid Build Coastguard Worker                      const SkMatrix& viewMatrix,
547*c8dee2aaSAndroid Build Coastguard Worker                      const SkRect& rect,
548*c8dee2aaSAndroid Build Coastguard Worker                      const SkMatrix* localMatrix = nullptr) {
549*c8dee2aaSAndroid Build Coastguard Worker         // Since this provides stencil settings to drawFilledQuad, it performs a different AA type
550*c8dee2aaSAndroid Build Coastguard Worker         // resolution compared to regular rect draws, which is the main reason it remains separate.
551*c8dee2aaSAndroid Build Coastguard Worker         DrawQuad quad{GrQuad::MakeFromRect(rect, viewMatrix),
552*c8dee2aaSAndroid Build Coastguard Worker                       localMatrix ? GrQuad::MakeFromRect(rect, *localMatrix) : GrQuad(rect),
553*c8dee2aaSAndroid Build Coastguard Worker                       doStencilMSAA == GrAA::kYes ? GrQuadAAFlags::kAll : GrQuadAAFlags::kNone};
554*c8dee2aaSAndroid Build Coastguard Worker         this->drawFilledQuad(clip, std::move(paint), &quad, ss);
555*c8dee2aaSAndroid Build Coastguard Worker     }
556*c8dee2aaSAndroid Build Coastguard Worker 
557*c8dee2aaSAndroid Build Coastguard Worker     // Fills the user stencil bits with a non-zero value at every sample inside the path. This will
558*c8dee2aaSAndroid Build Coastguard Worker     // likely be implemented with a Redbook algorithm, but it is not guaranteed. The samples being
559*c8dee2aaSAndroid Build Coastguard Worker     // rendered to must be zero initially.
560*c8dee2aaSAndroid Build Coastguard Worker     bool stencilPath(const GrHardClip*,
561*c8dee2aaSAndroid Build Coastguard Worker                      GrAA doStencilMSAA,
562*c8dee2aaSAndroid Build Coastguard Worker                      const SkMatrix& viewMatrix,
563*c8dee2aaSAndroid Build Coastguard Worker                      const SkPath&);
564*c8dee2aaSAndroid Build Coastguard Worker 
565*c8dee2aaSAndroid Build Coastguard Worker     /**
566*c8dee2aaSAndroid Build Coastguard Worker      * Draws a path, either AA or not, and touches the stencil buffer with the user stencil settings
567*c8dee2aaSAndroid Build Coastguard Worker      * for each color sample written.
568*c8dee2aaSAndroid Build Coastguard Worker      */
569*c8dee2aaSAndroid Build Coastguard Worker     bool drawAndStencilPath(const GrHardClip*,
570*c8dee2aaSAndroid Build Coastguard Worker                             const GrUserStencilSettings*,
571*c8dee2aaSAndroid Build Coastguard Worker                             SkRegion::Op op,
572*c8dee2aaSAndroid Build Coastguard Worker                             bool invert,
573*c8dee2aaSAndroid Build Coastguard Worker                             GrAA doStencilMSAA,
574*c8dee2aaSAndroid Build Coastguard Worker                             const SkMatrix& viewMatrix,
575*c8dee2aaSAndroid Build Coastguard Worker                             const SkPath&);
576*c8dee2aaSAndroid Build Coastguard Worker 
577*c8dee2aaSAndroid Build Coastguard Worker     skgpu::Budgeted isBudgeted() const;
578*c8dee2aaSAndroid Build Coastguard Worker 
579*c8dee2aaSAndroid Build Coastguard Worker     int maxWindowRectangles() const;
580*c8dee2aaSAndroid Build Coastguard Worker 
581*c8dee2aaSAndroid Build Coastguard Worker     /*
582*c8dee2aaSAndroid Build Coastguard Worker      * This unique ID will not change for a given SurfaceDrawContext. However, it is _NOT_
583*c8dee2aaSAndroid Build Coastguard Worker      * guaranteed to match the uniqueID of the underlying GrRenderTarget - beware!
584*c8dee2aaSAndroid Build Coastguard Worker      */
uniqueID()585*c8dee2aaSAndroid Build Coastguard Worker     GrSurfaceProxy::UniqueID uniqueID() const { return this->asSurfaceProxy()->uniqueID(); }
586*c8dee2aaSAndroid Build Coastguard Worker 
587*c8dee2aaSAndroid Build Coastguard Worker     // Allows caller of addDrawOp to know which op list an op will be added to.
588*c8dee2aaSAndroid Build Coastguard Worker     using WillAddOpFn = void(GrOp*, uint32_t opsTaskID);
589*c8dee2aaSAndroid Build Coastguard Worker     // These perform processing specific to GrDrawOp-derived ops before recording them into an
590*c8dee2aaSAndroid Build Coastguard Worker     // op list. Before adding the op to an op list the WillAddOpFn is called. Note that it
591*c8dee2aaSAndroid Build Coastguard Worker     // will not be called in the event that the op is discarded. Moreover, the op may merge into
592*c8dee2aaSAndroid Build Coastguard Worker     // another op after the function is called (either before addDrawOp returns or some time later).
593*c8dee2aaSAndroid Build Coastguard Worker     //
594*c8dee2aaSAndroid Build Coastguard Worker     // If the clip pointer is null, no clipping will be performed.
595*c8dee2aaSAndroid Build Coastguard Worker     void addDrawOp(const GrClip*,
596*c8dee2aaSAndroid Build Coastguard Worker                    GrOp::Owner,
597*c8dee2aaSAndroid Build Coastguard Worker                    const std::function<WillAddOpFn>& = std::function<WillAddOpFn>());
addDrawOp(GrOp::Owner op)598*c8dee2aaSAndroid Build Coastguard Worker     void addDrawOp(GrOp::Owner op) { this->addDrawOp(nullptr, std::move(op)); }
599*c8dee2aaSAndroid Build Coastguard Worker 
refsWrappedObjects()600*c8dee2aaSAndroid Build Coastguard Worker     bool refsWrappedObjects() const { return this->asRenderTargetProxy()->refsWrappedObjects(); }
601*c8dee2aaSAndroid Build Coastguard Worker 
602*c8dee2aaSAndroid Build Coastguard Worker     /**
603*c8dee2aaSAndroid Build Coastguard Worker      *  The next time this SurfaceDrawContext is flushed, the gpu will wait on the passed in
604*c8dee2aaSAndroid Build Coastguard Worker      *  semaphores before executing any commands.
605*c8dee2aaSAndroid Build Coastguard Worker      */
606*c8dee2aaSAndroid Build Coastguard Worker     bool waitOnSemaphores(int numSemaphores, const GrBackendSemaphore waitSemaphores[],
607*c8dee2aaSAndroid Build Coastguard Worker                           bool deleteSemaphoresAfterWait);
608*c8dee2aaSAndroid Build Coastguard Worker 
numSamples()609*c8dee2aaSAndroid Build Coastguard Worker     int numSamples() const { return this->asRenderTargetProxy()->numSamples(); }
surfaceProps()610*c8dee2aaSAndroid Build Coastguard Worker     const SkSurfaceProps& surfaceProps() const { return fSurfaceProps; }
canUseDynamicMSAA()611*c8dee2aaSAndroid Build Coastguard Worker     bool canUseDynamicMSAA() const { return fCanUseDynamicMSAA; }
wrapsVkSecondaryCB()612*c8dee2aaSAndroid Build Coastguard Worker     bool wrapsVkSecondaryCB() const { return this->asRenderTargetProxy()->wrapsVkSecondaryCB(); }
613*c8dee2aaSAndroid Build Coastguard Worker 
alwaysAntialias()614*c8dee2aaSAndroid Build Coastguard Worker     bool alwaysAntialias() const {
615*c8dee2aaSAndroid Build Coastguard Worker         return fSurfaceProps.flags() & SkSurfaceProps::kDynamicMSAA_Flag;
616*c8dee2aaSAndroid Build Coastguard Worker     }
617*c8dee2aaSAndroid Build Coastguard Worker 
chooseAA(const SkPaint & paint)618*c8dee2aaSAndroid Build Coastguard Worker     GrAA chooseAA(const SkPaint& paint) {
619*c8dee2aaSAndroid Build Coastguard Worker         return GrAA(paint.isAntiAlias() || this->alwaysAntialias());
620*c8dee2aaSAndroid Build Coastguard Worker     }
621*c8dee2aaSAndroid Build Coastguard Worker 
chooseAAType(GrAA aa)622*c8dee2aaSAndroid Build Coastguard Worker     GrAAType chooseAAType(GrAA aa) {
623*c8dee2aaSAndroid Build Coastguard Worker         if (this->numSamples() > 1 || fCanUseDynamicMSAA) {
624*c8dee2aaSAndroid Build Coastguard Worker             // Always trigger DMSAA when it's available. The coverage ops that know how to handle
625*c8dee2aaSAndroid Build Coastguard Worker             // both single and multisample targets without popping will do so without calling
626*c8dee2aaSAndroid Build Coastguard Worker             // chooseAAType.
627*c8dee2aaSAndroid Build Coastguard Worker             return GrAAType::kMSAA;
628*c8dee2aaSAndroid Build Coastguard Worker         }
629*c8dee2aaSAndroid Build Coastguard Worker         return (aa == GrAA::kYes) ? GrAAType::kCoverage : GrAAType::kNone;
630*c8dee2aaSAndroid Build Coastguard Worker     }
631*c8dee2aaSAndroid Build Coastguard Worker 
632*c8dee2aaSAndroid Build Coastguard Worker     // This entry point should only be called if the backing GPU object is known to be
633*c8dee2aaSAndroid Build Coastguard Worker     // instantiated.
accessRenderTarget()634*c8dee2aaSAndroid Build Coastguard Worker     GrRenderTarget* accessRenderTarget() { return this->asSurfaceProxy()->peekRenderTarget(); }
635*c8dee2aaSAndroid Build Coastguard Worker 
636*c8dee2aaSAndroid Build Coastguard Worker #if defined(GPU_TEST_UTILS)
testingOnly_SetPreserveOpsOnFullClear()637*c8dee2aaSAndroid Build Coastguard Worker     void testingOnly_SetPreserveOpsOnFullClear() { fPreserveOpsOnFullClear_TestingOnly = true; }
638*c8dee2aaSAndroid Build Coastguard Worker #endif
639*c8dee2aaSAndroid Build Coastguard Worker 
640*c8dee2aaSAndroid Build Coastguard Worker     void drawStrokedLine(const GrClip*, GrPaint&&, GrAA, const SkMatrix&, const SkPoint[2],
641*c8dee2aaSAndroid Build Coastguard Worker                          const SkStrokeRec&);
642*c8dee2aaSAndroid Build Coastguard Worker 
643*c8dee2aaSAndroid Build Coastguard Worker private:
644*c8dee2aaSAndroid Build Coastguard Worker     enum class QuadOptimization;
645*c8dee2aaSAndroid Build Coastguard Worker 
646*c8dee2aaSAndroid Build Coastguard Worker     void willReplaceOpsTask(OpsTask* prevTask, OpsTask* nextTask) override;
647*c8dee2aaSAndroid Build Coastguard Worker 
648*c8dee2aaSAndroid Build Coastguard Worker     OpsTask::CanDiscardPreviousOps canDiscardPreviousOpsOnFullClear() const override;
649*c8dee2aaSAndroid Build Coastguard Worker     void setNeedsStencil();
650*c8dee2aaSAndroid Build Coastguard Worker 
651*c8dee2aaSAndroid Build Coastguard Worker     void internalStencilClear(const SkIRect* scissor, bool insideStencilMask);
652*c8dee2aaSAndroid Build Coastguard Worker 
653*c8dee2aaSAndroid Build Coastguard Worker     // 'stencilSettings' are provided merely for decision making purposes; When non-null,
654*c8dee2aaSAndroid Build Coastguard Worker     // optimization strategies that submit special ops are avoided.
655*c8dee2aaSAndroid Build Coastguard Worker     //
656*c8dee2aaSAndroid Build Coastguard Worker     // 'quad' should be the original draw request on input, and will be updated as
657*c8dee2aaSAndroid Build Coastguard Worker     // appropriate depending on the returned optimization level.
658*c8dee2aaSAndroid Build Coastguard Worker     //
659*c8dee2aaSAndroid Build Coastguard Worker     // If kSubmitted is returned, the provided paint was consumed. Otherwise it is left unchanged.
660*c8dee2aaSAndroid Build Coastguard Worker     QuadOptimization attemptQuadOptimization(const GrClip* clip,
661*c8dee2aaSAndroid Build Coastguard Worker                                              const GrUserStencilSettings* stencilSettings,
662*c8dee2aaSAndroid Build Coastguard Worker                                              DrawQuad* quad,
663*c8dee2aaSAndroid Build Coastguard Worker                                              GrPaint* paint);
664*c8dee2aaSAndroid Build Coastguard Worker 
665*c8dee2aaSAndroid Build Coastguard Worker     // The overall AA policy is determined by the quad's edge flags: kNone is no AA, and anything
666*c8dee2aaSAndroid Build Coastguard Worker     // else uses some form of anti-aliasing. If 'ss' is non-null, that will be MSAA; otherwise it's
667*c8dee2aaSAndroid Build Coastguard Worker     // MSAA or analytic coverage per chooseAAType(). This will always attempt to apply
668*c8dee2aaSAndroid Build Coastguard Worker     // quad optimizations, so all quad/rect public APIs should rely on this function for consistent
669*c8dee2aaSAndroid Build Coastguard Worker     // clipping behavior. 'quad' will be modified in place to reflect final rendered geometry.
670*c8dee2aaSAndroid Build Coastguard Worker     void drawFilledQuad(const GrClip* clip,
671*c8dee2aaSAndroid Build Coastguard Worker                         GrPaint&& paint,
672*c8dee2aaSAndroid Build Coastguard Worker                         DrawQuad* quad,
673*c8dee2aaSAndroid Build Coastguard Worker                         const GrUserStencilSettings* ss = nullptr);
674*c8dee2aaSAndroid Build Coastguard Worker 
675*c8dee2aaSAndroid Build Coastguard Worker     // Like drawFilledQuad but does not require using a GrPaint or FP for texturing.
676*c8dee2aaSAndroid Build Coastguard Worker     // 'quad' may be modified in place to reflect final geometry.
677*c8dee2aaSAndroid Build Coastguard Worker     void drawTexturedQuad(const GrClip* clip,
678*c8dee2aaSAndroid Build Coastguard Worker                           GrSurfaceProxyView proxyView,
679*c8dee2aaSAndroid Build Coastguard Worker                           SkAlphaType alphaType,
680*c8dee2aaSAndroid Build Coastguard Worker                           sk_sp<GrColorSpaceXform> textureXform,
681*c8dee2aaSAndroid Build Coastguard Worker                           GrSamplerState::Filter filter,
682*c8dee2aaSAndroid Build Coastguard Worker                           GrSamplerState::MipmapMode,
683*c8dee2aaSAndroid Build Coastguard Worker                           const SkPMColor4f& color,
684*c8dee2aaSAndroid Build Coastguard Worker                           SkBlendMode blendMode,
685*c8dee2aaSAndroid Build Coastguard Worker                           DrawQuad* quad,
686*c8dee2aaSAndroid Build Coastguard Worker                           const SkRect* subset = nullptr);
687*c8dee2aaSAndroid Build Coastguard Worker 
688*c8dee2aaSAndroid Build Coastguard Worker     // Tries to detect if the given shape is a simple, and draws it without path rendering if
689*c8dee2aaSAndroid Build Coastguard Worker     // we know how.
690*c8dee2aaSAndroid Build Coastguard Worker     bool drawSimpleShape(const GrClip*, GrPaint*, GrAA, const SkMatrix&, const GrStyledShape&);
691*c8dee2aaSAndroid Build Coastguard Worker 
692*c8dee2aaSAndroid Build Coastguard Worker     // If 'attemptDrawSimple' is true, of if the original shape is marked as having been simplfied,
693*c8dee2aaSAndroid Build Coastguard Worker     // this will attempt to re-route through drawSimpleShape() to see if we can avoid path rendering
694*c8dee2aaSAndroid Build Coastguard Worker     // one more time.
695*c8dee2aaSAndroid Build Coastguard Worker     void drawShapeUsingPathRenderer(const GrClip*, GrPaint&&, GrAA, const SkMatrix&,
696*c8dee2aaSAndroid Build Coastguard Worker                                     GrStyledShape&&, bool attemptDrawSimple = false);
697*c8dee2aaSAndroid Build Coastguard Worker 
698*c8dee2aaSAndroid Build Coastguard Worker     // Makes a copy of the proxy if it is necessary for the draw and places the texture that should
699*c8dee2aaSAndroid Build Coastguard Worker     // be used by GrXferProcessor to access the destination color in 'result'. If the return
700*c8dee2aaSAndroid Build Coastguard Worker     // value is false then a texture copy could not be made.
701*c8dee2aaSAndroid Build Coastguard Worker     //
702*c8dee2aaSAndroid Build Coastguard Worker     // The op should have already had setClippedBounds called on it.
703*c8dee2aaSAndroid Build Coastguard Worker     [[nodiscard]] bool setupDstProxyView(const SkRect& opBounds,
704*c8dee2aaSAndroid Build Coastguard Worker                                          bool opRequiresMSAA,
705*c8dee2aaSAndroid Build Coastguard Worker                                          GrDstProxyView* result);
706*c8dee2aaSAndroid Build Coastguard Worker 
707*c8dee2aaSAndroid Build Coastguard Worker     OpsTask* replaceOpsTaskIfModifiesColor();
708*c8dee2aaSAndroid Build Coastguard Worker 
709*c8dee2aaSAndroid Build Coastguard Worker     const SkSurfaceProps fSurfaceProps;
710*c8dee2aaSAndroid Build Coastguard Worker     const bool fCanUseDynamicMSAA;
711*c8dee2aaSAndroid Build Coastguard Worker 
712*c8dee2aaSAndroid Build Coastguard Worker     bool fNeedsStencil = false;
713*c8dee2aaSAndroid Build Coastguard Worker 
714*c8dee2aaSAndroid Build Coastguard Worker #if defined(GPU_TEST_UTILS)
715*c8dee2aaSAndroid Build Coastguard Worker     bool fPreserveOpsOnFullClear_TestingOnly = false;
716*c8dee2aaSAndroid Build Coastguard Worker #endif
717*c8dee2aaSAndroid Build Coastguard Worker };
718*c8dee2aaSAndroid Build Coastguard Worker 
719*c8dee2aaSAndroid Build Coastguard Worker }  // namespace skgpu::ganesh
720*c8dee2aaSAndroid Build Coastguard Worker 
721*c8dee2aaSAndroid Build Coastguard Worker #endif // SurfaceDrawContext_v1_DEFINED
722