blob: 53e0e5c12a7a14a25d95fdcfcee7ab84e1a8afa1 [file] [log] [blame]
robertphillipsea461502015-05-26 11:38:03 -07001/*
2 * Copyright 2015 Google Inc.
3 *
4 * Use of this source code is governed by a BSD-style license that can be
5 * found in the LICENSE file.
6 */
7
Brian Osman11052242016-10-27 14:47:55 -04008#ifndef GrRenderTargetContext_DEFINED
9#define GrRenderTargetContext_DEFINED
robertphillipsea461502015-05-26 11:38:03 -070010
Mike Kleinc0bd9f92019-04-23 12:05:21 -050011#include "include/core/SkCanvas.h"
12#include "include/core/SkDrawable.h"
13#include "include/core/SkRefCnt.h"
14#include "include/core/SkSurface.h"
15#include "include/core/SkSurfaceProps.h"
Mike Kleinc0bd9f92019-04-23 12:05:21 -050016#include "include/private/GrTypesPriv.h"
Greg Danielf41b2bd2019-08-22 16:19:24 -040017#include "src/gpu/GrOpsTask.h"
Mike Kleinc0bd9f92019-04-23 12:05:21 -050018#include "src/gpu/GrPaint.h"
Greg Danielf91aeb22019-06-18 09:58:02 -040019#include "src/gpu/GrRenderTargetProxy.h"
Mike Kleinc0bd9f92019-04-23 12:05:21 -050020#include "src/gpu/GrSurfaceContext.h"
Greg Daniela83de582019-10-22 09:33:25 -040021#include "src/gpu/GrSurfaceProxyView.h"
Mike Kleinc0bd9f92019-04-23 12:05:21 -050022#include "src/gpu/GrXferProcessor.h"
Michael Ludwig61328202019-06-19 14:48:58 +000023#include "src/gpu/geometry/GrQuad.h"
Mike Kleinc0bd9f92019-04-23 12:05:21 -050024#include "src/gpu/text/GrTextTarget.h"
robertphillipsea461502015-05-26 11:38:03 -070025
Greg Daniela5cb7812017-06-16 09:45:32 -040026class GrBackendSemaphore;
robertphillipsea461502015-05-26 11:38:03 -070027class GrClip;
Brian Osman2240be92017-10-18 13:15:13 -040028class GrColorSpaceXform;
Chris Dalton1a325d22017-07-14 15:17:41 -060029class GrCoverageCountingPathRenderer;
Brian Salomon9afd3712016-12-01 10:59:09 -050030class GrDrawOp;
csmartdalton29df7602016-08-31 11:55:52 -070031class GrFixedClip;
Robert Phillips0d075de2019-03-04 11:08:13 -050032class GrOp;
robertphillipsea461502015-05-26 11:38:03 -070033class GrRenderTarget;
Brian Osman45580d32016-11-23 09:37:01 -050034class GrRenderTargetContextPriv;
Michael Ludwig2686d692020-04-17 20:21:37 +000035class GrStyledShape;
bsalomon6663acf2016-05-10 09:14:17 -070036class GrStyle;
Robert Phillipseaa86252016-11-08 13:49:39 +000037class GrTextureProxy;
robertphillips44302392016-07-08 14:43:03 -070038struct GrUserStencilSettings;
Jim Van Verth3af1af92017-05-18 15:06:54 -040039struct SkDrawShadowRec;
Herb Derbycddab252018-07-16 11:19:04 -040040class SkGlyphRunList;
robertphillipsea461502015-05-26 11:38:03 -070041struct SkIPoint;
42struct SkIRect;
msarett10e3d9b2016-08-18 15:46:03 -070043class SkLatticeIter;
Brian Osman449b1152020-04-15 16:43:00 -040044class SkMatrixProvider;
robertphillipsea461502015-05-26 11:38:03 -070045class SkMatrix;
robertphillips2334fb62015-06-17 05:43:33 -070046class SkPaint;
robertphillipsea461502015-05-26 11:38:03 -070047class SkPath;
48struct SkPoint;
49struct SkRect;
Brian Osman45580d32016-11-23 09:37:01 -050050class SkRegion;
robertphillipsea461502015-05-26 11:38:03 -070051class SkRRect;
jvanverth31ff7622015-08-07 10:09:28 -070052struct SkRSXform;
Brian Osman3c358422020-03-23 10:44:12 -040053class SkRuntimeEffect;
robertphillips2334fb62015-06-17 05:43:33 -070054class SkTextBlob;
Brian Salomon199fb872017-02-06 09:41:10 -050055class SkVertices;
robertphillipsea461502015-05-26 11:38:03 -070056
Brian Osman45580d32016-11-23 09:37:01 -050057/**
58 * A helper object to orchestrate commands (draws, etc...) for GrSurfaces that are GrRenderTargets.
robertphillipsea461502015-05-26 11:38:03 -070059 */
Brian Salomon3b8486a2020-04-21 12:43:26 -040060class GrRenderTargetContext : public GrSurfaceContext, public GrOpsTaskClosedObserver {
robertphillipsea461502015-05-26 11:38:03 -070061public:
Greg Daniele20fcad2020-01-08 11:52:34 -050062 static std::unique_ptr<GrRenderTargetContext> Make(
Greg Danielba0ff782020-01-07 15:42:57 -050063 GrRecordingContext*, GrColorType, sk_sp<SkColorSpace>, sk_sp<GrSurfaceProxy>,
64 GrSurfaceOrigin, const SkSurfaceProps*, bool managedOps = true);
65
Brian Salomona56a7462020-02-07 14:17:25 -050066 static std::unique_ptr<GrRenderTargetContext> Make(GrRecordingContext*,
67 GrColorType,
68 sk_sp<SkColorSpace>,
69 SkBackingFit,
70 SkISize dimensions,
71 const GrBackendFormat&,
72 int sampleCnt,
73 GrMipMapped,
74 GrProtected,
75 GrSurfaceOrigin,
76 SkBudgeted,
77 const SkSurfaceProps*);
Greg Daniele20fcad2020-01-08 11:52:34 -050078
79 // Same as above but will use the default GrBackendFormat for the given GrColorType
80 static std::unique_ptr<GrRenderTargetContext> Make(
Brian Salomona56a7462020-02-07 14:17:25 -050081 GrRecordingContext*,
82 GrColorType,
83 sk_sp<SkColorSpace>,
84 SkBackingFit,
85 SkISize dimensions,
86 int sampleCnt = 1,
87 GrMipMapped = GrMipMapped::kNo,
88 GrProtected = GrProtected::kNo,
89 GrSurfaceOrigin = kBottomLeft_GrSurfaceOrigin,
90 SkBudgeted = SkBudgeted::kYes,
91 const SkSurfaceProps* = nullptr);
Greg Daniele20fcad2020-01-08 11:52:34 -050092
Brian Salomond005b692020-04-01 15:47:05 -040093 static std::tuple<GrColorType, GrBackendFormat> GetFallbackColorTypeAndFormat(GrImageContext*,
Brian Salomon0029db02020-04-03 10:41:24 -040094 GrColorType,
95 int sampleCnt);
Brian Salomond005b692020-04-01 15:47:05 -040096
Greg Daniele20fcad2020-01-08 11:52:34 -050097 // Same as previous factory but will try to use fallback GrColorTypes if the one passed in
98 // fails. The fallback GrColorType will have at least the number of channels and precision per
99 // channel as the passed in GrColorType. It may also swizzle the changes (e.g., BGRA -> RGBA).
100 // SRGB-ness will be preserved.
101 static std::unique_ptr<GrRenderTargetContext> MakeWithFallback(
Brian Salomona56a7462020-02-07 14:17:25 -0500102 GrRecordingContext*,
103 GrColorType,
104 sk_sp<SkColorSpace>,
105 SkBackingFit,
106 SkISize dimensions,
107 int sampleCnt = 1,
108 GrMipMapped = GrMipMapped::kNo,
109 GrProtected = GrProtected::kNo,
110 GrSurfaceOrigin = kBottomLeft_GrSurfaceOrigin,
111 SkBudgeted = SkBudgeted::kYes,
112 const SkSurfaceProps* = nullptr);
Greg Daniele20fcad2020-01-08 11:52:34 -0500113
Greg Danielba0ff782020-01-07 15:42:57 -0500114 // These match the definitions in SkSurface & GrSurface.h, for whence they came
115 typedef void* ReleaseContext;
116 typedef void (*ReleaseProc)(ReleaseContext);
117
118 // Creates a GrRenderTargetContext that wraps the passed in GrBackendTexture.
119 static std::unique_ptr<GrRenderTargetContext> MakeFromBackendTexture(
120 GrRecordingContext*, GrColorType, sk_sp<SkColorSpace>, const GrBackendTexture&,
121 int sampleCnt, GrSurfaceOrigin, const SkSurfaceProps*, ReleaseProc releaseProc,
122 ReleaseContext releaseCtx);
123
124 static std::unique_ptr<GrRenderTargetContext> MakeFromBackendTextureAsRenderTarget(
125 GrRecordingContext*, GrColorType, sk_sp<SkColorSpace>, const GrBackendTexture&,
126 int sampleCnt, GrSurfaceOrigin, const SkSurfaceProps*);
127
128 static std::unique_ptr<GrRenderTargetContext> MakeFromBackendRenderTarget(
129 GrRecordingContext*, GrColorType, sk_sp<SkColorSpace>, const GrBackendRenderTarget&,
130 GrSurfaceOrigin, const SkSurfaceProps*, ReleaseProc releaseProc,
131 ReleaseContext releaseCtx);
132
133 static std::unique_ptr<GrRenderTargetContext> MakeFromVulkanSecondaryCB(
134 GrRecordingContext*, const SkImageInfo&, const GrVkDrawableInfo&,
135 const SkSurfaceProps*);
136
Greg Daniel3912a4b2020-01-14 09:56:04 -0500137 GrRenderTargetContext(GrRecordingContext*, GrSurfaceProxyView readView,
Brian Salomon8afde5f2020-04-01 16:22:00 -0400138 GrSurfaceProxyView writeView, GrColorType, sk_sp<SkColorSpace>,
Greg Daniel3912a4b2020-01-14 09:56:04 -0500139 const SkSurfaceProps*, bool managedOpsTask = true);
Greg Danielbfa19c42019-12-19 16:41:40 -0500140
Brian Osman11052242016-10-27 14:47:55 -0400141 ~GrRenderTargetContext() override;
robertphillips2334fb62015-06-17 05:43:33 -0700142
Brian Osman449b1152020-04-15 16:43:00 -0400143 virtual void drawGlyphRunList(const GrClip&, const SkMatrixProvider&, const SkGlyphRunList&);
robertphillipsea461502015-05-26 11:38:03 -0700144
robertphillipsea461502015-05-26 11:38:03 -0700145 /**
146 * Provides a perfomance hint that the render target's contents are allowed
147 * to become undefined.
148 */
robertphillips2e1e51f2015-10-15 08:01:48 -0700149 void discard();
robertphillipsea461502015-05-26 11:38:03 -0700150
Chris Dalton344e9032017-12-11 15:42:09 -0700151 enum class CanClearFullscreen : bool {
152 kNo = false,
153 kYes = true
154 };
155
robertphillipsea461502015-05-26 11:38:03 -0700156 /**
157 * Clear the entire or rect of the render target, ignoring any clips.
robertphillipsea461502015-05-26 11:38:03 -0700158 * @param rect the rect to clear or the whole thing if rect is NULL.
159 * @param color the color to clear to.
Chris Dalton344e9032017-12-11 15:42:09 -0700160 * @param CanClearFullscreen allows partial clears to be converted to fullscreen clears on
161 * tiling platforms where that is an optimization.
robertphillipsea461502015-05-26 11:38:03 -0700162 */
Brian Osman9a9baae2018-11-05 15:06:26 -0500163 void clear(const SkIRect* rect, const SkPMColor4f& color, CanClearFullscreen);
robertphillipsea461502015-05-26 11:38:03 -0700164
Chris Dalton0493fbd2019-09-18 15:49:46 -0600165 void clear(const SkPMColor4f& color) {
166 return this->clear(nullptr, color, CanClearFullscreen::kYes);
167 }
168
robertphillipsea461502015-05-26 11:38:03 -0700169 /**
170 * Draw everywhere (respecting the clip) with the paint.
171 */
Brian Salomon82f44312017-01-11 13:42:54 -0500172 void drawPaint(const GrClip&, GrPaint&&, const SkMatrix& viewMatrix);
robertphillipsea461502015-05-26 11:38:03 -0700173
174 /**
Brian Salomon0e8fc8b2016-12-09 15:10:07 -0500175 * Draw the rect using a paint.
176 * @param paint describes how to color pixels.
177 * @param GrAA Controls whether rect is antialiased
178 * @param viewMatrix transformation matrix
179 * @param style The style to apply. Null means fill. Currently path effects are not
180 * allowed.
181 * The rects coords are used to access the paint (through texture matrix)
robertphillipsea461502015-05-26 11:38:03 -0700182 */
robertphillips2e1e51f2015-10-15 08:01:48 -0700183 void drawRect(const GrClip&,
Brian Salomon82f44312017-01-11 13:42:54 -0500184 GrPaint&& paint,
Brian Salomon0e8fc8b2016-12-09 15:10:07 -0500185 GrAA,
robertphillipsea461502015-05-26 11:38:03 -0700186 const SkMatrix& viewMatrix,
187 const SkRect&,
Brian Salomon82f44312017-01-11 13:42:54 -0500188 const GrStyle* style = nullptr);
robertphillipsea461502015-05-26 11:38:03 -0700189
190 /**
bsalomona2e69fc2015-11-05 10:41:43 -0800191 * Maps a rectangle of shader coordinates to a rectangle and fills that rectangle.
robertphillipsea461502015-05-26 11:38:03 -0700192 *
Brian Salomon0e8fc8b2016-12-09 15:10:07 -0500193 * @param paint describes how to color pixels.
194 * @param GrAA Controls whether rect is antialiased
195 * @param viewMatrix transformation matrix which applies to rectToDraw
196 * @param rectToDraw the rectangle to draw
197 * @param localRect the rectangle of shader coordinates applied to rectToDraw
robertphillipsea461502015-05-26 11:38:03 -0700198 */
Michael Ludwig136f45a2019-02-19 11:44:41 -0500199 void fillRectToRect(const GrClip& clip,
Brian Salomon82f44312017-01-11 13:42:54 -0500200 GrPaint&& paint,
Michael Ludwig136f45a2019-02-19 11:44:41 -0500201 GrAA aa,
bsalomona2e69fc2015-11-05 10:41:43 -0800202 const SkMatrix& viewMatrix,
203 const SkRect& rectToDraw,
Michael Ludwig136f45a2019-02-19 11:44:41 -0500204 const SkRect& localRect) {
Michael Ludwig6b45c5d2020-02-07 09:56:38 -0500205 DrawQuad quad{GrQuad::MakeFromRect(rectToDraw, viewMatrix), GrQuad(localRect),
206 aa == GrAA::kYes ? GrQuadAAFlags::kAll : GrQuadAAFlags::kNone};
207 this->drawFilledQuad(clip, std::move(paint), aa, &quad);
Michael Ludwig136f45a2019-02-19 11:44:41 -0500208 }
robertphillipsea461502015-05-26 11:38:03 -0700209
210 /**
bsalomona2e69fc2015-11-05 10:41:43 -0800211 * Fills a rect with a paint and a localMatrix.
robertphillipsea461502015-05-26 11:38:03 -0700212 */
bsalomona2e69fc2015-11-05 10:41:43 -0800213 void fillRectWithLocalMatrix(const GrClip& clip,
Brian Salomon82f44312017-01-11 13:42:54 -0500214 GrPaint&& paint,
Michael Ludwig61328202019-06-19 14:48:58 +0000215 GrAA aa,
bsalomona2e69fc2015-11-05 10:41:43 -0800216 const SkMatrix& viewMatrix,
217 const SkRect& rect,
Michael Ludwig61328202019-06-19 14:48:58 +0000218 const SkMatrix& localMatrix) {
Michael Ludwig6b45c5d2020-02-07 09:56:38 -0500219 DrawQuad quad{GrQuad::MakeFromRect(rect, viewMatrix),
220 GrQuad::MakeFromRect(rect, localMatrix),
221 aa == GrAA::kYes ? GrQuadAAFlags::kAll : GrQuadAAFlags::kNone};
222 this->drawFilledQuad(clip, std::move(paint), aa, &quad);
Michael Ludwig61328202019-06-19 14:48:58 +0000223 }
robertphillipsea461502015-05-26 11:38:03 -0700224
Michael Ludwig75451902019-01-23 11:14:29 -0500225 /**
226 * Creates an op that draws a fill rect with per-edge control over anti-aliasing.
Michael Ludwigce62dec2019-02-19 11:48:46 -0500227 *
228 * This is a specialized version of fillQuadWithEdgeAA, but is kept separate since knowing
229 * the geometry is a rectangle affords more optimizations.
Michael Ludwig75451902019-01-23 11:14:29 -0500230 */
Michael Ludwig136f45a2019-02-19 11:44:41 -0500231 void fillRectWithEdgeAA(const GrClip& clip, GrPaint&& paint, GrAA aa, GrQuadAAFlags edgeAA,
232 const SkMatrix& viewMatrix, const SkRect& rect,
Michael Ludwig61328202019-06-19 14:48:58 +0000233 const SkRect* optionalLocalRect = nullptr) {
234 const SkRect& localRect = optionalLocalRect ? *optionalLocalRect : rect;
Michael Ludwig6b45c5d2020-02-07 09:56:38 -0500235 DrawQuad quad{GrQuad::MakeFromRect(rect, viewMatrix), GrQuad(localRect), edgeAA};
236 this->drawFilledQuad(clip, std::move(paint), aa, &quad);
Michael Ludwig61328202019-06-19 14:48:58 +0000237 }
Michael Ludwig75451902019-01-23 11:14:29 -0500238
Michael Ludwigce62dec2019-02-19 11:48:46 -0500239 /**
240 * Similar to fillRectWithEdgeAA but draws an arbitrary 2D convex quadrilateral transformed
241 * by 'viewMatrix', with per-edge control over anti-aliasing. The quad should follow the
242 * ordering used by SkRect::toQuad(), which determines how the edge AA is applied:
243 * - "top" = points [0] and [1]
244 * - "right" = points[1] and [2]
245 * - "bottom" = points[2] and [3]
246 * - "left" = points[3] and [0]
247 *
248 * The last argument, 'optionalLocalQuad', can be null if no separate local coordinates are
249 * necessary.
250 */
251 void fillQuadWithEdgeAA(const GrClip& clip, GrPaint&& paint, GrAA aa, GrQuadAAFlags edgeAA,
Michael Ludwig6b45c5d2020-02-07 09:56:38 -0500252 const SkMatrix& viewMatrix, const SkPoint points[4],
253 const SkPoint optionalLocalPoints[4]) {
254 const SkPoint* localPoints = optionalLocalPoints ? optionalLocalPoints : points;
255 DrawQuad quad{GrQuad::MakeFromSkQuad(points, viewMatrix),
256 GrQuad::MakeFromSkQuad(localPoints, SkMatrix::I()), edgeAA};
257 this->drawFilledQuad(clip, std::move(paint), aa, &quad);
Michael Ludwig61328202019-06-19 14:48:58 +0000258 }
Michael Ludwigce62dec2019-02-19 11:48:46 -0500259
Michael Ludwig69858532018-11-28 15:34:34 -0500260 /** Used with drawQuadSet */
261 struct QuadSetEntry {
262 SkRect fRect;
263 SkPMColor4f fColor; // Overrides any color on the GrPaint
264 SkMatrix fLocalMatrix;
265 GrQuadAAFlags fAAFlags;
266 };
267
Michael Ludwig75451902019-01-23 11:14:29 -0500268 // TODO(michaelludwig) - remove if the bulk API is not useful for SkiaRenderer
Michael Ludwig69858532018-11-28 15:34:34 -0500269 void drawQuadSet(const GrClip& clip, GrPaint&& paint, GrAA aa, const SkMatrix& viewMatrix,
270 const QuadSetEntry[], int cnt);
271
robertphillipsea461502015-05-26 11:38:03 -0700272 /**
Brian Salomon34169692017-08-28 15:32:01 -0400273 * Creates an op that draws a subrectangle of a texture. The passed color is modulated by the
274 * texture's color. 'srcRect' specifies the rectangle of the texture to draw. 'dstRect'
275 * specifies the rectangle to draw in local coords which will be transformed by 'viewMatrix' to
Brian Salomonbe3c1d22018-05-21 12:54:39 -0400276 * device space.
Brian Salomon34169692017-08-28 15:32:01 -0400277 */
Greg Daniel40903af2020-01-30 14:55:05 -0500278 void drawTexture(const GrClip& clip, GrSurfaceProxyView view, SkAlphaType srcAlphaType,
279 GrSamplerState::Filter filter, SkBlendMode mode, const SkPMColor4f& color,
280 const SkRect& srcRect, const SkRect& dstRect, GrAA aa, GrQuadAAFlags edgeAA,
281 SkCanvas::SrcRectConstraint constraint, const SkMatrix& viewMatrix,
282 sk_sp<GrColorSpaceXform> texXform) {
Michael Ludwigaee26ea2019-07-08 16:22:48 +0000283 const SkRect* domain = constraint == SkCanvas::kStrict_SrcRectConstraint ?
284 &srcRect : nullptr;
Michael Ludwig6b45c5d2020-02-07 09:56:38 -0500285 DrawQuad quad{GrQuad::MakeFromRect(dstRect, viewMatrix), GrQuad(srcRect), edgeAA};
286
Greg Daniel40903af2020-01-30 14:55:05 -0500287 this->drawTexturedQuad(clip, std::move(view), srcAlphaType, std::move(texXform),
Michael Ludwig6b45c5d2020-02-07 09:56:38 -0500288 filter, color, mode, aa, &quad, domain);
Michael Ludwigaee26ea2019-07-08 16:22:48 +0000289 }
Brian Salomon34169692017-08-28 15:32:01 -0400290
Michael Ludwigce62dec2019-02-19 11:48:46 -0500291 /**
292 * Variant of drawTexture that instead draws the texture applied to 'dstQuad' transformed by
293 * 'viewMatrix', using the 'srcQuad' texture coordinates clamped to the optional 'domain'. If
294 * 'domain' is null, it's equivalent to using the fast src rect constraint. If 'domain' is
295 * provided, the strict src rect constraint is applied using 'domain'.
296 */
Greg Daniel2f3cd4f2020-02-07 11:07:25 -0500297 void drawTextureQuad(const GrClip& clip, GrSurfaceProxyView view, GrColorType srcColorType,
Brian Salomonfc118442019-11-22 19:09:27 -0500298 SkAlphaType srcAlphaType, GrSamplerState::Filter filter, SkBlendMode mode,
299 const SkPMColor4f& color, const SkPoint srcQuad[4],
300 const SkPoint dstQuad[4], GrAA aa, GrQuadAAFlags edgeAA,
301 const SkRect* domain, const SkMatrix& viewMatrix,
Michael Ludwigaee26ea2019-07-08 16:22:48 +0000302 sk_sp<GrColorSpaceXform> texXform) {
Michael Ludwig6b45c5d2020-02-07 09:56:38 -0500303 DrawQuad quad{GrQuad::MakeFromSkQuad(dstQuad, viewMatrix),
304 GrQuad::MakeFromSkQuad(srcQuad, SkMatrix::I()), edgeAA};
Greg Daniel2f3cd4f2020-02-07 11:07:25 -0500305 this->drawTexturedQuad(clip, std::move(view), srcAlphaType, std::move(texXform),
Michael Ludwig6b45c5d2020-02-07 09:56:38 -0500306 filter, color, mode, aa, &quad, domain);
Michael Ludwigaee26ea2019-07-08 16:22:48 +0000307 }
Michael Ludwigce62dec2019-02-19 11:48:46 -0500308
Brian Salomond7065e72018-10-12 11:42:02 -0400309 /** Used with drawTextureSet */
310 struct TextureSetEntry {
Greg Daniel549325c2019-10-30 16:19:20 -0400311 GrSurfaceProxyView fProxyView;
Brian Salomonfc118442019-11-22 19:09:27 -0500312 SkAlphaType fSrcAlphaType;
Brian Salomond7065e72018-10-12 11:42:02 -0400313 SkRect fSrcRect;
314 SkRect fDstRect;
Michael Ludwig1433cfd2019-02-27 17:12:30 -0500315 const SkPoint* fDstClipQuad; // Must be null, or point to an array of 4 points
Michael Ludwig7ae2ab52019-03-05 16:00:20 -0500316 const SkMatrix* fPreViewMatrix; // If not null, entry's CTM is 'viewMatrix' * fPreViewMatrix
Brian Salomon1da5cad2018-11-21 09:21:18 -0500317 float fAlpha;
Brian Salomond7065e72018-10-12 11:42:02 -0400318 GrQuadAAFlags fAAFlags;
319 };
320 /**
321 * Draws a set of textures with a shared filter, color, view matrix, color xform, and
322 * texture color xform. The textures must all have the same GrTextureType and GrConfig.
Michael Ludwigce62dec2019-02-19 11:48:46 -0500323 *
324 * If any entries provide a non-null fDstClip array, it will be read from immediately based on
325 * fDstClipCount, so the pointer can become invalid after this returns.
Michael Ludwig379e4962019-12-06 13:21:26 -0500326 *
Hal Canary425929c2019-12-09 11:55:40 -0500327 * 'proxRunCnt' is the number of proxy changes encountered in the entry array. Technically this
Michael Ludwig379e4962019-12-06 13:21:26 -0500328 * can be inferred from the array within this function, but the information is already known
329 * by SkGpuDevice, so no need to incur another iteration over the array.
Brian Salomond7065e72018-10-12 11:42:02 -0400330 */
Hal Canary425929c2019-12-09 11:55:40 -0500331 void drawTextureSet(const GrClip&, TextureSetEntry[], int cnt, int proxyRunCnt,
Michael Ludwig379e4962019-12-06 13:21:26 -0500332 GrSamplerState::Filter, SkBlendMode mode, GrAA aa,
333 SkCanvas::SrcRectConstraint, const SkMatrix& viewMatrix,
334 sk_sp<GrColorSpaceXform> texXform);
Brian Salomond7065e72018-10-12 11:42:02 -0400335
Brian Salomon34169692017-08-28 15:32:01 -0400336 /**
Brian Salomon0e8fc8b2016-12-09 15:10:07 -0500337 * Draw a roundrect using a paint.
robertphillipsea461502015-05-26 11:38:03 -0700338 *
Brian Salomon0e8fc8b2016-12-09 15:10:07 -0500339 * @param paint describes how to color pixels.
340 * @param GrAA Controls whether rrect is antialiased.
341 * @param viewMatrix transformation matrix
342 * @param rrect the roundrect to draw
343 * @param style style to apply to the rrect. Currently path effects are not allowed.
robertphillipsea461502015-05-26 11:38:03 -0700344 */
robertphillips2e1e51f2015-10-15 08:01:48 -0700345 void drawRRect(const GrClip&,
Brian Salomon82f44312017-01-11 13:42:54 -0500346 GrPaint&&,
Brian Salomon0e8fc8b2016-12-09 15:10:07 -0500347 GrAA,
robertphillipsea461502015-05-26 11:38:03 -0700348 const SkMatrix& viewMatrix,
349 const SkRRect& rrect,
bsalomon6663acf2016-05-10 09:14:17 -0700350 const GrStyle& style);
robertphillipsea461502015-05-26 11:38:03 -0700351
352 /**
Jim Van Verth3af1af92017-05-18 15:06:54 -0400353 * Use a fast method to render the ambient and spot shadows for a path.
354 * Will return false if not possible for the given path.
Jim Van Verthc5903412016-11-17 15:27:09 -0500355 *
Brian Salomon0e8fc8b2016-12-09 15:10:07 -0500356 * @param viewMatrix transformation matrix
Jim Van Verth3af1af92017-05-18 15:06:54 -0400357 * @param path the path to shadow
358 * @param rec parameters for shadow rendering
Jim Van Verthc5903412016-11-17 15:27:09 -0500359 */
Jim Van Verth3af1af92017-05-18 15:06:54 -0400360 bool drawFastShadow(const GrClip&,
Jim Van Verth3af1af92017-05-18 15:06:54 -0400361 const SkMatrix& viewMatrix,
362 const SkPath& path,
363 const SkDrawShadowRec& rec);
Jim Van Verthc5903412016-11-17 15:27:09 -0500364
365 /**
Brian Salomon0e8fc8b2016-12-09 15:10:07 -0500366 * Shortcut for filling a SkPath consisting of nested rrects using a paint. The result is
367 * undefined if outer does not contain inner.
robertphillips00095892016-02-29 13:50:40 -0800368 *
Brian Salomon0e8fc8b2016-12-09 15:10:07 -0500369 * @param paint describes how to color pixels.
370 * @param GrAA Controls whether rrects edges are antialiased
371 * @param viewMatrix transformation matrix
372 * @param outer the outer roundrect
373 * @param inner the inner roundrect
robertphillips00095892016-02-29 13:50:40 -0800374 */
375 void drawDRRect(const GrClip&,
Brian Salomon82f44312017-01-11 13:42:54 -0500376 GrPaint&&,
Brian Salomon0e8fc8b2016-12-09 15:10:07 -0500377 GrAA,
robertphillips00095892016-02-29 13:50:40 -0800378 const SkMatrix& viewMatrix,
379 const SkRRect& outer,
380 const SkRRect& inner);
381
382 /**
robertphillipsea461502015-05-26 11:38:03 -0700383 * Draws a path.
384 *
385 * @param paint describes how to color pixels.
Brian Salomon0e8fc8b2016-12-09 15:10:07 -0500386 * @param GrAA Controls whether the path is antialiased.
robertphillipsea461502015-05-26 11:38:03 -0700387 * @param viewMatrix transformation matrix
388 * @param path the path to draw
bsalomon6663acf2016-05-10 09:14:17 -0700389 * @param style style to apply to the path.
robertphillipsea461502015-05-26 11:38:03 -0700390 */
robertphillips2e1e51f2015-10-15 08:01:48 -0700391 void drawPath(const GrClip&,
Brian Salomon82f44312017-01-11 13:42:54 -0500392 GrPaint&&,
Brian Salomon0e8fc8b2016-12-09 15:10:07 -0500393 GrAA,
robertphillipsea461502015-05-26 11:38:03 -0700394 const SkMatrix& viewMatrix,
395 const SkPath&,
Robert Phillips20390c32018-08-17 11:01:03 -0400396 const GrStyle&);
397
398 /**
399 * Draws a shape.
400 *
401 * @param paint describes how to color pixels.
402 * @param GrAA Controls whether the path is antialiased.
403 * @param viewMatrix transformation matrix
404 * @param shape the shape to draw
405 */
406 void drawShape(const GrClip&,
407 GrPaint&&,
408 GrAA,
409 const SkMatrix& viewMatrix,
Michael Ludwig2686d692020-04-17 20:21:37 +0000410 const GrStyledShape&);
Robert Phillips20390c32018-08-17 11:01:03 -0400411
robertphillipsea461502015-05-26 11:38:03 -0700412
413 /**
414 * Draws vertices with a paint.
415 *
Brian Osmanae0c50c2017-05-25 16:56:34 -0400416 * @param paint describes how to color pixels.
417 * @param viewMatrix transformation matrix
418 * @param vertices specifies the mesh to draw.
419 * @param overridePrimType primitive type to draw. If NULL, derive prim type from vertices.
Brian Osman3c358422020-03-23 10:44:12 -0400420 * @param effect runtime effect that will handle custom vertex attributes.
robertphillipsea461502015-05-26 11:38:03 -0700421 */
robertphillips2e1e51f2015-10-15 08:01:48 -0700422 void drawVertices(const GrClip&,
Brian Salomon82f44312017-01-11 13:42:54 -0500423 GrPaint&& paint,
Brian Osman449b1152020-04-15 16:43:00 -0400424 const SkMatrixProvider& matrixProvider,
Brian Osmanae0c50c2017-05-25 16:56:34 -0400425 sk_sp<SkVertices> vertices,
Brian Osman3c358422020-03-23 10:44:12 -0400426 GrPrimitiveType* overridePrimType = nullptr,
Brian Osman449b1152020-04-15 16:43:00 -0400427 const SkRuntimeEffect* effect = nullptr);
Brian Salomon199fb872017-02-06 09:41:10 -0500428
429 /**
Brian Osman4d92b892019-03-24 00:53:23 +0000430 * Draws textured sprites from an atlas with a paint. This currently does not support AA for the
431 * sprite rectangle edges.
432 *
433 * @param paint describes how to color pixels.
434 * @param viewMatrix transformation matrix
435 * @param spriteCount number of sprites.
436 * @param xform array of compressed transformation data, required.
437 * @param texRect array of texture rectangles used to access the paint.
438 * @param colors optional array of per-sprite colors, supercedes
439 * the paint's color field.
440 */
441 void drawAtlas(const GrClip&,
442 GrPaint&& paint,
443 const SkMatrix& viewMatrix,
444 int spriteCount,
445 const SkRSXform xform[],
446 const SkRect texRect[],
447 const SkColor colors[]);
448
449 /**
msarettcc319b92016-08-25 18:07:18 -0700450 * Draws a region.
451 *
452 * @param paint describes how to color pixels
453 * @param viewMatrix transformation matrix
Brian Salomon0e8fc8b2016-12-09 15:10:07 -0500454 * @param aa should the rects of the region be antialiased.
msarettcc319b92016-08-25 18:07:18 -0700455 * @param region the region to be drawn
456 * @param style style to apply to the region
457 */
458 void drawRegion(const GrClip&,
Brian Salomon82f44312017-01-11 13:42:54 -0500459 GrPaint&& paint,
Brian Salomon0e8fc8b2016-12-09 15:10:07 -0500460 GrAA aa,
msarettcc319b92016-08-25 18:07:18 -0700461 const SkMatrix& viewMatrix,
462 const SkRegion& region,
Stan Iliev73d8fd92017-08-02 15:36:24 -0400463 const GrStyle& style,
464 const GrUserStencilSettings* ss = nullptr);
msarettcc319b92016-08-25 18:07:18 -0700465
jvanverth31ff7622015-08-07 10:09:28 -0700466 /**
robertphillipsea461502015-05-26 11:38:03 -0700467 * Draws an oval.
468 *
469 * @param paint describes how to color pixels.
Brian Salomon0e8fc8b2016-12-09 15:10:07 -0500470 * @param GrAA Controls whether the oval is antialiased.
robertphillipsea461502015-05-26 11:38:03 -0700471 * @param viewMatrix transformation matrix
472 * @param oval the bounding rect of the oval.
bsalomon6663acf2016-05-10 09:14:17 -0700473 * @param style style to apply to the oval. Currently path effects are not allowed.
robertphillipsea461502015-05-26 11:38:03 -0700474 */
robertphillips2e1e51f2015-10-15 08:01:48 -0700475 void drawOval(const GrClip&,
Brian Salomon82f44312017-01-11 13:42:54 -0500476 GrPaint&& paint,
Brian Salomon0e8fc8b2016-12-09 15:10:07 -0500477 GrAA,
robertphillipsea461502015-05-26 11:38:03 -0700478 const SkMatrix& viewMatrix,
479 const SkRect& oval,
bsalomon6663acf2016-05-10 09:14:17 -0700480 const GrStyle& style);
Brian Salomon0e8fc8b2016-12-09 15:10:07 -0500481 /**
482 * Draws a partial arc of an oval.
483 *
484 * @param paint describes how to color pixels.
Brian Salomon99504082016-12-09 15:51:31 -0500485 * @param GrGrAA Controls whether the arc is antialiased.
Brian Salomon0e8fc8b2016-12-09 15:10:07 -0500486 * @param viewMatrix transformation matrix.
487 * @param oval the bounding rect of the oval.
488 * @param startAngle starting angle in degrees.
489 * @param sweepAngle angle to sweep in degrees. Must be in (-360, 360)
490 * @param useCenter true means that the implied path begins at the oval center, connects as
491 * a line to the point indicated by the start contains the arc indicated by
492 * the sweep angle. If false the line beginning at the center point is
493 * omitted.
494 * @param style style to apply to the oval.
495 */
bsalomon4f3a0ca2016-08-22 13:14:26 -0700496 void drawArc(const GrClip&,
Brian Salomon82f44312017-01-11 13:42:54 -0500497 GrPaint&& paint,
Brian Salomon0e8fc8b2016-12-09 15:10:07 -0500498 GrAA,
bsalomon4f3a0ca2016-08-22 13:14:26 -0700499 const SkMatrix& viewMatrix,
500 const SkRect& oval,
501 SkScalar startAngle,
502 SkScalar sweepAngle,
503 bool useCenter,
504 const GrStyle& style);
robertphillipsea461502015-05-26 11:38:03 -0700505
joshualitt33a5fce2015-11-18 13:28:51 -0800506 /**
bsalomon4f3a0ca2016-08-22 13:14:26 -0700507 * Draw the image as a set of rects, specified by |iter|.
joshualitt33a5fce2015-11-18 13:28:51 -0800508 */
msarett10e3d9b2016-08-18 15:46:03 -0700509 void drawImageLattice(const GrClip&,
Brian Salomon2a943df2018-05-04 13:43:19 -0400510 GrPaint&&,
msarett10e3d9b2016-08-18 15:46:03 -0700511 const SkMatrix& viewMatrix,
Greg Danieled96bca2019-12-05 15:05:54 -0500512 GrSurfaceProxyView,
Greg Daniel82c6b102020-01-21 10:33:22 -0500513 SkAlphaType alphaType,
Brian Salomon2a943df2018-05-04 13:43:19 -0400514 sk_sp<GrColorSpaceXform>,
515 GrSamplerState::Filter,
516 std::unique_ptr<SkLatticeIter>,
msarett10e3d9b2016-08-18 15:46:03 -0700517 const SkRect& dst);
robertphillipsea461502015-05-26 11:38:03 -0700518
robertphillips8c523e02016-07-26 07:41:00 -0700519 /**
Greg Daniel46cfbc62019-06-07 11:43:30 -0400520 * Draws the src texture with no matrix. The dstRect is the dstPoint with the width and height
521 * of the srcRect. The srcRect and dstRect are clipped to the bounds of the src and dst surfaces
522 * respectively.
523 */
Greg Daniel573312e2020-02-07 17:22:35 -0500524 bool blitTexture(GrSurfaceProxyView view, const SkIRect& srcRect, const SkIPoint& dstPoint);
Greg Daniel46cfbc62019-06-07 11:43:30 -0400525
526 /**
Greg Daniel64cc9aa2018-10-19 13:54:56 -0400527 * Adds the necessary signal and wait semaphores and adds the passed in SkDrawable to the
528 * command stream.
529 */
530 void drawDrawable(std::unique_ptr<SkDrawable::GpuDrawHandler>, const SkRect& bounds);
531
Brian Salomonab32f652019-05-10 14:24:50 -0400532 using ReadPixelsCallback = SkSurface::ReadPixelsCallback;
533 using ReadPixelsContext = SkSurface::ReadPixelsContext;
Brian Salomon024bd002019-06-11 11:38:16 -0400534 using RescaleGamma = SkSurface::RescaleGamma;
535
536 // GPU implementation for SkSurface::asyncRescaleAndReadPixels.
Brian Salomon031b0ba2019-05-23 11:05:26 -0400537 void asyncRescaleAndReadPixels(const SkImageInfo& info, const SkIRect& srcRect,
Brian Salomon024bd002019-06-11 11:38:16 -0400538 RescaleGamma rescaleGamma, SkFilterQuality rescaleQuality,
539 ReadPixelsCallback callback, ReadPixelsContext context);
540 // GPU implementation for SkSurface::asyncRescaleAndReadPixelsYUV420.
541 void asyncRescaleAndReadPixelsYUV420(SkYUVColorSpace yuvColorSpace,
Brian Salomon9241a6d2019-10-03 13:26:54 -0400542 sk_sp<SkColorSpace> dstColorSpace,
543 const SkIRect& srcRect,
Brian Salomona56a7462020-02-07 14:17:25 -0500544 SkISize dstSize,
Brian Salomon9241a6d2019-10-03 13:26:54 -0400545 RescaleGamma rescaleGamma,
Brian Salomon024bd002019-06-11 11:38:16 -0400546 SkFilterQuality rescaleQuality,
Brian Salomon9241a6d2019-10-03 13:26:54 -0400547 ReadPixelsCallback callback,
Brian Salomon024bd002019-06-11 11:38:16 -0400548 ReadPixelsContext context);
Brian Salomonab32f652019-05-10 14:24:50 -0400549
Greg Daniel64cc9aa2018-10-19 13:54:56 -0400550 /**
robertphillips8c523e02016-07-26 07:41:00 -0700551 * After this returns any pending surface IO will be issued to the backend 3D API and
552 * if the surface has MSAA it will be resolved.
553 */
Greg Daniele6bfb7d2019-04-17 15:26:11 -0400554 GrSemaphoresSubmitted flush(SkSurface::BackendSurfaceAccess access, const GrFlushInfo&);
Greg Daniela5cb7812017-06-16 09:45:32 -0400555
556 /**
557 * The next time this GrRenderTargetContext is flushed, the gpu will wait on the passed in
558 * semaphores before executing any commands.
559 */
Robert Phillipsbc4994a2019-02-14 08:36:56 -0500560 bool waitOnSemaphores(int numSemaphores, const GrBackendSemaphore waitSemaphores[]);
robertphillips8c523e02016-07-26 07:41:00 -0700561
Greg Daniel46e366a2019-12-16 14:38:36 -0500562 int numSamples() const { return this->asRenderTargetProxy()->numSamples(); }
robertphillipsca6eafc2016-05-17 09:57:46 -0700563 const SkSurfaceProps& surfaceProps() const { return fSurfaceProps; }
Greg Daniel46e366a2019-12-16 14:38:36 -0500564 bool wrapsVkSecondaryCB() const { return this->asRenderTargetProxy()->wrapsVkSecondaryCB(); }
Greg Daniele252f082017-10-23 16:05:23 -0400565 GrMipMapped mipMapped() const;
robertphillips7bceedc2015-12-01 12:51:26 -0800566
Greg Daniel3912a4b2020-01-14 09:56:04 -0500567 // TODO: See if it makes sense for this to return a const& instead and require the callers to
568 // make a copy (which refs the proxy) if needed.
Brian Salomon8afde5f2020-04-01 16:22:00 -0400569 GrSurfaceProxyView writeSurfaceView() { return fWriteView; }
Greg Daniela83de582019-10-22 09:33:25 -0400570
Robert Phillipsbe9aff22019-02-15 11:33:22 -0500571 // This entry point should only be called if the backing GPU object is known to be
572 // instantiated.
Greg Daniel3912a4b2020-01-14 09:56:04 -0500573 GrRenderTarget* accessRenderTarget() { return this->asSurfaceProxy()->peekRenderTarget(); }
Robert Phillipseaa86252016-11-08 13:49:39 +0000574
Robert Phillipsd46697a2017-01-25 12:10:37 -0500575 GrRenderTargetContext* asRenderTargetContext() override { return this; }
576
robertphillips391395d2016-03-02 09:26:36 -0800577 // Provides access to functions that aren't part of the public API.
Brian Osman693a5402016-10-27 15:13:22 -0400578 GrRenderTargetContextPriv priv();
579 const GrRenderTargetContextPriv priv() const;
joshualittf5883a62016-01-13 07:47:38 -0800580
Herb Derbyc1b482c2018-08-09 15:02:27 -0400581 GrTextTarget* textTarget() { return fTextTarget.get(); }
Brian Salomonf18b1d82017-10-27 11:30:49 -0400582
Brian Salomon3b8486a2020-04-21 12:43:26 -0400583 void wasClosed(const GrOpsTask& task) override;
584
Robert Phillipsb5204762019-06-19 14:12:13 -0400585#if GR_TEST_UTILS
Greg Daniel3912a4b2020-01-14 09:56:04 -0500586 bool testingOnly_IsInstantiated() const { return this->asSurfaceProxy()->isInstantiated(); }
Chris Dalton6b982802019-06-27 13:53:46 -0600587 void testingOnly_SetPreserveOpsOnFullClear() { fPreserveOpsOnFullClear_TestingOnly = true; }
Greg Danielf41b2bd2019-08-22 16:19:24 -0400588 GrOpsTask* testingOnly_PeekLastOpsTask() { return fOpsTask.get(); }
Robert Phillipsb5204762019-06-19 14:12:13 -0400589#endif
Robert Phillipseaa86252016-11-08 13:49:39 +0000590
robertphillipsea461502015-05-26 11:38:03 -0700591private:
Brian Salomonf18b1d82017-10-27 11:30:49 -0400592 class TextTarget;
Michael Ludwig61328202019-06-19 14:48:58 +0000593 enum class QuadOptimization;
Brian Salomonf18b1d82017-10-27 11:30:49 -0400594
Chris Dalton7d6748e2019-03-13 00:34:52 -0600595 GrAAType chooseAAType(GrAA);
Brian Salomon0e8fc8b2016-12-09 15:10:07 -0500596
Brian Salomon649a3412017-03-09 13:50:43 -0500597 friend class GrAtlasTextBlob; // for access to add[Mesh]DrawOp
Greg Danielf41b2bd2019-08-22 16:19:24 -0400598 friend class GrClipStackClip; // for access to getOpsTask
Chris Daltonc4b47352019-08-23 10:10:36 -0600599 friend class GrOnFlushResourceProvider; // for access to getOpsTask (http://skbug.com/9357)
robertphillips55fdccc2016-06-06 06:16:20 -0700600
Brian Osman11052242016-10-27 14:47:55 -0400601 friend class GrRenderTargetContextPriv;
robertphillips976f5f02016-06-03 10:59:20 -0700602
Brian Salomon42521e82016-12-07 16:44:58 -0500603 // All the path renderers currently make their own ops
Brian Salomon649a3412017-03-09 13:50:43 -0500604 friend class GrSoftwarePathRenderer; // for access to add[Mesh]DrawOp
605 friend class GrAAConvexPathRenderer; // for access to add[Mesh]DrawOp
606 friend class GrDashLinePathRenderer; // for access to add[Mesh]DrawOp
607 friend class GrAAHairLinePathRenderer; // for access to add[Mesh]DrawOp
608 friend class GrAALinearizingConvexPathRenderer; // for access to add[Mesh]DrawOp
Jim Van Verth83010462017-03-16 08:45:39 -0400609 friend class GrSmallPathRenderer; // for access to add[Mesh]DrawOp
Brian Salomon649a3412017-03-09 13:50:43 -0500610 friend class GrDefaultPathRenderer; // for access to add[Mesh]DrawOp
Brian Salomon649a3412017-03-09 13:50:43 -0500611 friend class GrStencilAndCoverPathRenderer; // for access to add[Mesh]DrawOp
Chris Dalton17dc4182020-03-25 16:18:16 -0600612 friend class GrTriangulatingPathRenderer; // for access to add[Mesh]DrawOp
Chris Dalton9414c962018-06-14 10:14:50 -0600613 friend class GrCCPerFlushResources; // for access to addDrawOp
Chris Dalton1a325d22017-07-14 15:17:41 -0600614 friend class GrCoverageCountingPathRenderer; // for access to addDrawOp
Robert Phillips438d9862019-11-14 12:46:05 -0500615 friend class GrFillRectOp; // for access to addDrawOp
Chris Dalton0a22b1e2020-03-26 11:52:15 -0600616 friend class GrTessellationPathRenderer; // for access to addDrawOp
Robert Phillipse837e612019-11-15 11:02:50 -0500617 friend class GrTextureOp; // for access to addDrawOp
Robert Phillips438d9862019-11-14 12:46:05 -0500618
Greg Daniel46e366a2019-12-16 14:38:36 -0500619 SkDEBUGCODE(void onValidate() const override;)
Greg Daniela83de582019-10-22 09:33:25 -0400620
621
Greg Danielf41b2bd2019-08-22 16:19:24 -0400622 GrOpsTask::CanDiscardPreviousOps canDiscardPreviousOpsOnFullClear() const;
Chris Dalton858cf232019-10-14 16:20:00 -0600623 void setNeedsStencil(bool useMixedSamplesIfNotMSAA);
Chris Dalton6b982802019-06-27 13:53:46 -0600624
Brian Osman9a9baae2018-11-05 15:06:26 -0500625 void internalClear(const GrFixedClip&, const SkPMColor4f&, CanClearFullscreen);
Michael Ludwigc39d0c82019-01-15 10:03:43 -0500626 void internalStencilClear(const GrFixedClip&, bool insideStencilMask);
csmartdalton29df7602016-08-31 11:55:52 -0700627
Brian Salomon82f44312017-01-11 13:42:54 -0500628 // Only consumes the GrPaint if successful.
robertphillips00095892016-02-29 13:50:40 -0800629 bool drawFilledDRRect(const GrClip& clip,
Brian Salomon82f44312017-01-11 13:42:54 -0500630 GrPaint&& paint,
Brian Salomon0e8fc8b2016-12-09 15:10:07 -0500631 GrAA,
robertphillips00095892016-02-29 13:50:40 -0800632 const SkMatrix& viewMatrix,
633 const SkRRect& origOuter,
634 const SkRRect& origInner);
635
Michael Ludwig61328202019-06-19 14:48:58 +0000636 // If the drawn quad's paint is a const blended color, provide it as a non-null pointer to
637 // 'constColor', which enables the draw-as-clear optimization. Otherwise it is assumed the paint
638 // requires some form of shading that invalidates using a clear op.
639 //
640 // The non-const pointers should be the original draw request on input, and will be updated as
641 // appropriate depending on the returned optimization level.
642 //
Michael Ludwige08b4432019-06-19 18:00:48 -0400643 // 'stencilSettings' are provided merely for decision making purposes; When non-null,
644 // optimization strategies that submit special ops are avoided.
Michael Ludwig61328202019-06-19 14:48:58 +0000645 QuadOptimization attemptQuadOptimization(const GrClip& clip,
646 const SkPMColor4f* constColor,
Michael Ludwige08b4432019-06-19 18:00:48 -0400647 const GrUserStencilSettings* stencilSettings,
Michael Ludwig61328202019-06-19 14:48:58 +0000648 GrAA* aa,
Michael Ludwig6b45c5d2020-02-07 09:56:38 -0500649 DrawQuad* quad);
robertphillips44302392016-07-08 14:43:03 -0700650
Michael Ludwig61328202019-06-19 14:48:58 +0000651 // If stencil settings, 'ss', are non-null, AA controls MSAA or no AA. If they are null, then AA
652 // can choose between coverage, MSAA as per chooseAAType(). This will always attempt to apply
653 // quad optimizations, so all quad/rect public APIs should rely on this function for consistent
Michael Ludwig6b45c5d2020-02-07 09:56:38 -0500654 // clipping behavior. 'quad' will be modified in place to reflect final rendered geometry.
Michael Ludwig61328202019-06-19 14:48:58 +0000655 void drawFilledQuad(const GrClip& clip,
656 GrPaint&& paint,
657 GrAA aa,
Michael Ludwig6b45c5d2020-02-07 09:56:38 -0500658 DrawQuad* quad,
Michael Ludwig61328202019-06-19 14:48:58 +0000659 const GrUserStencilSettings* ss = nullptr);
Brian Salomon7694b902019-06-18 21:00:21 +0000660
Michael Ludwig6b45c5d2020-02-07 09:56:38 -0500661 // Like drawFilledQuad but does not require using a GrPaint or FP for texturing.
662 // 'quad' may be modified in place to reflect final geometry.
Michael Ludwigaee26ea2019-07-08 16:22:48 +0000663 void drawTexturedQuad(const GrClip& clip,
Greg Daniel549325c2019-10-30 16:19:20 -0400664 GrSurfaceProxyView proxyView,
Brian Salomonfc118442019-11-22 19:09:27 -0500665 SkAlphaType alphaType,
Michael Ludwigaee26ea2019-07-08 16:22:48 +0000666 sk_sp<GrColorSpaceXform> textureXform,
667 GrSamplerState::Filter filter,
668 const SkPMColor4f& color,
669 SkBlendMode blendMode,
670 GrAA aa,
Michael Ludwig6b45c5d2020-02-07 09:56:38 -0500671 DrawQuad* quad,
Michael Ludwigaee26ea2019-07-08 16:22:48 +0000672 const SkRect* domain = nullptr);
673
Brian Salomon2fad74a2017-12-20 13:28:55 -0500674 void drawShapeUsingPathRenderer(const GrClip&, GrPaint&&, GrAA, const SkMatrix&,
Michael Ludwig2686d692020-04-17 20:21:37 +0000675 const GrStyledShape&);
robertphillipsea461502015-05-26 11:38:03 -0700676
Chris Dalton08755122019-08-05 16:13:47 -0600677 void addOp(std::unique_ptr<GrOp>);
678
Brian Salomon348a0372018-10-31 10:42:18 -0400679 // Allows caller of addDrawOp to know which op list an op will be added to.
Greg Danielf41b2bd2019-08-22 16:19:24 -0400680 using WillAddOpFn = void(GrOp*, uint32_t opsTaskID);
Brian Salomon348a0372018-10-31 10:42:18 -0400681 // These perform processing specific to GrDrawOp-derived ops before recording them into an
682 // op list. Before adding the op to an op list the WillAddOpFn is called. Note that it
683 // will not be called in the event that the op is discarded. Moreover, the op may merge into
684 // another op after the function is called (either before addDrawOp returns or some time later).
685 void addDrawOp(const GrClip&, std::unique_ptr<GrDrawOp>,
686 const std::function<WillAddOpFn>& = std::function<WillAddOpFn>());
robertphillips2334fb62015-06-17 05:43:33 -0700687
Robert Phillipsbf25d432017-04-07 10:08:53 -0400688 // Makes a copy of the proxy if it is necessary for the draw and places the texture that should
689 // be used by GrXferProcessor to access the destination color in 'result'. If the return
690 // value is false then a texture copy could not be made.
Greg Daniel524e28b2019-11-01 11:48:53 -0400691 bool SK_WARN_UNUSED_RESULT setupDstProxyView(const GrClip&, const GrOp& op,
692 GrXferProcessor::DstProxyView* result);
Brian Salomon467921e2017-03-06 16:17:12 -0500693
Brian Salomon9241a6d2019-10-03 13:26:54 -0400694 class AsyncReadResult;
695
Brian Salomon024bd002019-06-11 11:38:16 -0400696 // The async read step of asyncRescaleAndReadPixels()
697 void asyncReadPixels(const SkIRect& rect, SkColorType colorType, ReadPixelsCallback callback,
698 ReadPixelsContext context);
699
Greg Danielf41b2bd2019-08-22 16:19:24 -0400700 GrOpsTask* getOpsTask();
robertphillipsa106c622015-10-16 09:07:06 -0700701
Herb Derbyc1b482c2018-08-09 15:02:27 -0400702 std::unique_ptr<GrTextTarget> fTextTarget;
Greg Daniela83de582019-10-22 09:33:25 -0400703
Brian Salomon8afde5f2020-04-01 16:22:00 -0400704 GrSurfaceProxyView fWriteView;
robertphillipsa106c622015-10-16 09:07:06 -0700705
Greg Danielf41b2bd2019-08-22 16:19:24 -0400706 // In MDB-mode the GrOpsTask can be closed by some other renderTargetContext that has picked
707 // it up. For this reason, the GrOpsTask should only ever be accessed via 'getOpsTask'.
708 sk_sp<GrOpsTask> fOpsTask;
robertphillips2334fb62015-06-17 05:43:33 -0700709
Brian Salomonf18b1d82017-10-27 11:30:49 -0400710 SkSurfaceProps fSurfaceProps;
Greg Danielf41b2bd2019-08-22 16:19:24 -0400711 bool fManagedOpsTask;
Robert Phillipse305cc1f2016-12-14 12:19:05 -0500712
Chris Daltoneffee202019-07-01 22:28:03 -0600713 int fNumStencilSamples = 0;
Chris Dalton6b982802019-06-27 13:53:46 -0600714#if GR_TEST_UTILS
715 bool fPreserveOpsOnFullClear_TestingOnly = false;
716#endif
717
Robert Phillipse305cc1f2016-12-14 12:19:05 -0500718 typedef GrSurfaceContext INHERITED;
robertphillipsea461502015-05-26 11:38:03 -0700719};
720
721#endif