blob: c4494ae98d41e2f424e4448e2b31b2d780edb251 [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"
Herb Derbyd29207a2020-06-08 13:50:19 -040017#include "src/core/SkGlyphRunPainter.h"
Greg Danielf41b2bd2019-08-22 16:19:24 -040018#include "src/gpu/GrOpsTask.h"
Mike Kleinc0bd9f92019-04-23 12:05:21 -050019#include "src/gpu/GrPaint.h"
Greg Danielf91aeb22019-06-18 09:58:02 -040020#include "src/gpu/GrRenderTargetProxy.h"
Mike Kleinc0bd9f92019-04-23 12:05:21 -050021#include "src/gpu/GrSurfaceContext.h"
Greg Daniela83de582019-10-22 09:33:25 -040022#include "src/gpu/GrSurfaceProxyView.h"
Mike Kleinc0bd9f92019-04-23 12:05:21 -050023#include "src/gpu/GrXferProcessor.h"
Michael Ludwig61328202019-06-19 14:48:58 +000024#include "src/gpu/geometry/GrQuad.h"
Herb Derby35c42b92020-07-10 10:48:57 -040025#include "src/gpu/text/GrTextBlob.h"
robertphillipsea461502015-05-26 11:38:03 -070026
Herb Derby411e7aa2020-07-09 16:02:08 -040027#include <tuple>
28
Greg Daniela5cb7812017-06-16 09:45:32 -040029class GrBackendSemaphore;
robertphillipsea461502015-05-26 11:38:03 -070030class GrClip;
Brian Osman2240be92017-10-18 13:15:13 -040031class GrColorSpaceXform;
Chris Dalton1a325d22017-07-14 15:17:41 -060032class GrCoverageCountingPathRenderer;
Brian Salomon9afd3712016-12-01 10:59:09 -050033class GrDrawOp;
Robert Phillips0d075de2019-03-04 11:08:13 -050034class GrOp;
robertphillipsea461502015-05-26 11:38:03 -070035class GrRenderTarget;
Brian Osman45580d32016-11-23 09:37:01 -050036class GrRenderTargetContextPriv;
Michael Ludwig2686d692020-04-17 20:21:37 +000037class GrStyledShape;
bsalomon6663acf2016-05-10 09:14:17 -070038class GrStyle;
Robert Phillipseaa86252016-11-08 13:49:39 +000039class GrTextureProxy;
robertphillips44302392016-07-08 14:43:03 -070040struct GrUserStencilSettings;
Jim Van Verth3af1af92017-05-18 15:06:54 -040041struct SkDrawShadowRec;
Herb Derbycddab252018-07-16 11:19:04 -040042class SkGlyphRunList;
robertphillipsea461502015-05-26 11:38:03 -070043struct SkIPoint;
44struct SkIRect;
msarett10e3d9b2016-08-18 15:46:03 -070045class SkLatticeIter;
Brian Osman449b1152020-04-15 16:43:00 -040046class SkMatrixProvider;
robertphillipsea461502015-05-26 11:38:03 -070047class SkMatrix;
robertphillips2334fb62015-06-17 05:43:33 -070048class SkPaint;
robertphillipsea461502015-05-26 11:38:03 -070049class SkPath;
50struct SkPoint;
51struct SkRect;
Brian Osman45580d32016-11-23 09:37:01 -050052class SkRegion;
robertphillipsea461502015-05-26 11:38:03 -070053class SkRRect;
jvanverth31ff7622015-08-07 10:09:28 -070054struct SkRSXform;
Brian Osman3c358422020-03-23 10:44:12 -040055class SkRuntimeEffect;
robertphillips2334fb62015-06-17 05:43:33 -070056class SkTextBlob;
Brian Salomon199fb872017-02-06 09:41:10 -050057class SkVertices;
robertphillipsea461502015-05-26 11:38:03 -070058
Brian Osman45580d32016-11-23 09:37:01 -050059/**
60 * A helper object to orchestrate commands (draws, etc...) for GrSurfaces that are GrRenderTargets.
robertphillipsea461502015-05-26 11:38:03 -070061 */
Brian Salomon3b8486a2020-04-21 12:43:26 -040062class GrRenderTargetContext : public GrSurfaceContext, public GrOpsTaskClosedObserver {
robertphillipsea461502015-05-26 11:38:03 -070063public:
Greg Daniele20fcad2020-01-08 11:52:34 -050064 static std::unique_ptr<GrRenderTargetContext> Make(
Greg Danielba0ff782020-01-07 15:42:57 -050065 GrRecordingContext*, GrColorType, sk_sp<SkColorSpace>, sk_sp<GrSurfaceProxy>,
66 GrSurfaceOrigin, const SkSurfaceProps*, bool managedOps = true);
67
Brian Salomona56a7462020-02-07 14:17:25 -050068 static std::unique_ptr<GrRenderTargetContext> Make(GrRecordingContext*,
69 GrColorType,
70 sk_sp<SkColorSpace>,
71 SkBackingFit,
72 SkISize dimensions,
73 const GrBackendFormat&,
74 int sampleCnt,
Brian Salomon7e67dca2020-07-21 09:27:25 -040075 GrMipmapped,
Brian Salomona56a7462020-02-07 14:17:25 -050076 GrProtected,
77 GrSurfaceOrigin,
78 SkBudgeted,
79 const SkSurfaceProps*);
Greg Daniele20fcad2020-01-08 11:52:34 -050080
81 // Same as above but will use the default GrBackendFormat for the given GrColorType
82 static std::unique_ptr<GrRenderTargetContext> Make(
Brian Salomona56a7462020-02-07 14:17:25 -050083 GrRecordingContext*,
84 GrColorType,
85 sk_sp<SkColorSpace>,
86 SkBackingFit,
87 SkISize dimensions,
88 int sampleCnt = 1,
Brian Salomon7e67dca2020-07-21 09:27:25 -040089 GrMipmapped = GrMipmapped::kNo,
Brian Salomona56a7462020-02-07 14:17:25 -050090 GrProtected = GrProtected::kNo,
91 GrSurfaceOrigin = kBottomLeft_GrSurfaceOrigin,
92 SkBudgeted = SkBudgeted::kYes,
93 const SkSurfaceProps* = nullptr);
Greg Daniele20fcad2020-01-08 11:52:34 -050094
Brian Salomond005b692020-04-01 15:47:05 -040095 static std::tuple<GrColorType, GrBackendFormat> GetFallbackColorTypeAndFormat(GrImageContext*,
Brian Salomon0029db02020-04-03 10:41:24 -040096 GrColorType,
97 int sampleCnt);
Brian Salomond005b692020-04-01 15:47:05 -040098
Greg Daniele20fcad2020-01-08 11:52:34 -050099 // Same as previous factory but will try to use fallback GrColorTypes if the one passed in
100 // fails. The fallback GrColorType will have at least the number of channels and precision per
101 // channel as the passed in GrColorType. It may also swizzle the changes (e.g., BGRA -> RGBA).
102 // SRGB-ness will be preserved.
103 static std::unique_ptr<GrRenderTargetContext> MakeWithFallback(
Brian Salomona56a7462020-02-07 14:17:25 -0500104 GrRecordingContext*,
105 GrColorType,
106 sk_sp<SkColorSpace>,
107 SkBackingFit,
108 SkISize dimensions,
109 int sampleCnt = 1,
Brian Salomon7e67dca2020-07-21 09:27:25 -0400110 GrMipmapped = GrMipmapped::kNo,
Brian Salomona56a7462020-02-07 14:17:25 -0500111 GrProtected = GrProtected::kNo,
112 GrSurfaceOrigin = kBottomLeft_GrSurfaceOrigin,
113 SkBudgeted = SkBudgeted::kYes,
114 const SkSurfaceProps* = nullptr);
Greg Daniele20fcad2020-01-08 11:52:34 -0500115
Greg Danielba0ff782020-01-07 15:42:57 -0500116 // These match the definitions in SkSurface & GrSurface.h, for whence they came
117 typedef void* ReleaseContext;
118 typedef void (*ReleaseProc)(ReleaseContext);
119
120 // Creates a GrRenderTargetContext that wraps the passed in GrBackendTexture.
121 static std::unique_ptr<GrRenderTargetContext> MakeFromBackendTexture(
122 GrRecordingContext*, GrColorType, sk_sp<SkColorSpace>, const GrBackendTexture&,
Robert Phillipsa1121332020-06-29 13:05:29 -0400123 int sampleCnt, GrSurfaceOrigin, const SkSurfaceProps*,
124 sk_sp<GrRefCntedCallback> releaseHelper);
Greg Danielba0ff782020-01-07 15:42:57 -0500125
126 static std::unique_ptr<GrRenderTargetContext> MakeFromBackendTextureAsRenderTarget(
127 GrRecordingContext*, GrColorType, sk_sp<SkColorSpace>, const GrBackendTexture&,
128 int sampleCnt, GrSurfaceOrigin, const SkSurfaceProps*);
129
130 static std::unique_ptr<GrRenderTargetContext> MakeFromBackendRenderTarget(
Brian Salomon8ba54ea2020-10-01 09:48:21 -0400131 GrRecordingContext*,
132 GrColorType,
133 sk_sp<SkColorSpace>,
134 const GrBackendRenderTarget&,
135 GrSurfaceOrigin,
136 const SkSurfaceProps*,
137 sk_sp<GrRefCntedCallback> releaseHelper);
Greg Danielba0ff782020-01-07 15:42:57 -0500138
139 static std::unique_ptr<GrRenderTargetContext> MakeFromVulkanSecondaryCB(
140 GrRecordingContext*, const SkImageInfo&, const GrVkDrawableInfo&,
141 const SkSurfaceProps*);
142
Greg Daniel3912a4b2020-01-14 09:56:04 -0500143 GrRenderTargetContext(GrRecordingContext*, GrSurfaceProxyView readView,
Brian Salomon8afde5f2020-04-01 16:22:00 -0400144 GrSurfaceProxyView writeView, GrColorType, sk_sp<SkColorSpace>,
Greg Daniel3912a4b2020-01-14 09:56:04 -0500145 const SkSurfaceProps*, bool managedOpsTask = true);
Greg Danielbfa19c42019-12-19 16:41:40 -0500146
Brian Osman11052242016-10-27 14:47:55 -0400147 ~GrRenderTargetContext() override;
robertphillips2334fb62015-06-17 05:43:33 -0700148
robertphillipsea461502015-05-26 11:38:03 -0700149 /**
150 * Provides a perfomance hint that the render target's contents are allowed
151 * to become undefined.
152 */
robertphillips2e1e51f2015-10-15 08:01:48 -0700153 void discard();
robertphillipsea461502015-05-26 11:38:03 -0700154
155 /**
Michael Ludwig81d41722020-05-26 16:57:38 -0400156 * Clear the rect of the render target to the given color.
157 * @param rect the rect to clear to
robertphillipsea461502015-05-26 11:38:03 -0700158 * @param color the color to clear to.
robertphillipsea461502015-05-26 11:38:03 -0700159 */
Michael Ludwig81d41722020-05-26 16:57:38 -0400160 void clear(const SkIRect& rect, const SkPMColor4f& color) {
161 this->internalClear(&rect, color);
162 }
163 // Clears the entire render target to the color.
Chris Dalton0493fbd2019-09-18 15:49:46 -0600164 void clear(const SkPMColor4f& color) {
Michael Ludwig81d41722020-05-26 16:57:38 -0400165 this->internalClear(nullptr, color);
Chris Dalton0493fbd2019-09-18 15:49:46 -0600166 }
167
robertphillipsea461502015-05-26 11:38:03 -0700168 /**
169 * Draw everywhere (respecting the clip) with the paint.
170 */
Michael Ludwig7c12e282020-05-29 09:54:07 -0400171 void drawPaint(const GrClip*, GrPaint&&, const SkMatrix& viewMatrix);
robertphillipsea461502015-05-26 11:38:03 -0700172
173 /**
Brian Salomon0e8fc8b2016-12-09 15:10:07 -0500174 * Draw the rect using a paint.
175 * @param paint describes how to color pixels.
176 * @param GrAA Controls whether rect is antialiased
177 * @param viewMatrix transformation matrix
178 * @param style The style to apply. Null means fill. Currently path effects are not
179 * allowed.
180 * The rects coords are used to access the paint (through texture matrix)
robertphillipsea461502015-05-26 11:38:03 -0700181 */
Michael Ludwig7c12e282020-05-29 09:54:07 -0400182 void drawRect(const GrClip*,
Brian Salomon82f44312017-01-11 13:42:54 -0500183 GrPaint&& paint,
Brian Salomon0e8fc8b2016-12-09 15:10:07 -0500184 GrAA,
robertphillipsea461502015-05-26 11:38:03 -0700185 const SkMatrix& viewMatrix,
186 const SkRect&,
Brian Salomon82f44312017-01-11 13:42:54 -0500187 const GrStyle* style = nullptr);
robertphillipsea461502015-05-26 11:38:03 -0700188
189 /**
bsalomona2e69fc2015-11-05 10:41:43 -0800190 * Maps a rectangle of shader coordinates to a rectangle and fills that rectangle.
robertphillipsea461502015-05-26 11:38:03 -0700191 *
Brian Salomon0e8fc8b2016-12-09 15:10:07 -0500192 * @param paint describes how to color pixels.
193 * @param GrAA Controls whether rect is antialiased
194 * @param viewMatrix transformation matrix which applies to rectToDraw
195 * @param rectToDraw the rectangle to draw
196 * @param localRect the rectangle of shader coordinates applied to rectToDraw
robertphillipsea461502015-05-26 11:38:03 -0700197 */
Michael Ludwig7c12e282020-05-29 09:54:07 -0400198 void fillRectToRect(const GrClip* clip,
Brian Salomon82f44312017-01-11 13:42:54 -0500199 GrPaint&& paint,
Michael Ludwig136f45a2019-02-19 11:44:41 -0500200 GrAA aa,
bsalomona2e69fc2015-11-05 10:41:43 -0800201 const SkMatrix& viewMatrix,
202 const SkRect& rectToDraw,
Michael Ludwig136f45a2019-02-19 11:44:41 -0500203 const SkRect& localRect) {
Michael Ludwig6b45c5d2020-02-07 09:56:38 -0500204 DrawQuad quad{GrQuad::MakeFromRect(rectToDraw, viewMatrix), GrQuad(localRect),
205 aa == GrAA::kYes ? GrQuadAAFlags::kAll : GrQuadAAFlags::kNone};
206 this->drawFilledQuad(clip, std::move(paint), aa, &quad);
Michael Ludwig136f45a2019-02-19 11:44:41 -0500207 }
robertphillipsea461502015-05-26 11:38:03 -0700208
209 /**
bsalomona2e69fc2015-11-05 10:41:43 -0800210 * Fills a rect with a paint and a localMatrix.
robertphillipsea461502015-05-26 11:38:03 -0700211 */
Michael Ludwig7c12e282020-05-29 09:54:07 -0400212 void fillRectWithLocalMatrix(const GrClip* clip,
Brian Salomon82f44312017-01-11 13:42:54 -0500213 GrPaint&& paint,
Michael Ludwig61328202019-06-19 14:48:58 +0000214 GrAA aa,
bsalomona2e69fc2015-11-05 10:41:43 -0800215 const SkMatrix& viewMatrix,
216 const SkRect& rect,
Michael Ludwig61328202019-06-19 14:48:58 +0000217 const SkMatrix& localMatrix) {
Michael Ludwig6b45c5d2020-02-07 09:56:38 -0500218 DrawQuad quad{GrQuad::MakeFromRect(rect, viewMatrix),
219 GrQuad::MakeFromRect(rect, localMatrix),
220 aa == GrAA::kYes ? GrQuadAAFlags::kAll : GrQuadAAFlags::kNone};
221 this->drawFilledQuad(clip, std::move(paint), aa, &quad);
Michael Ludwig61328202019-06-19 14:48:58 +0000222 }
robertphillipsea461502015-05-26 11:38:03 -0700223
Michael Ludwig75451902019-01-23 11:14:29 -0500224 /**
225 * Creates an op that draws a fill rect with per-edge control over anti-aliasing.
Michael Ludwigce62dec2019-02-19 11:48:46 -0500226 *
227 * This is a specialized version of fillQuadWithEdgeAA, but is kept separate since knowing
228 * the geometry is a rectangle affords more optimizations.
Michael Ludwig75451902019-01-23 11:14:29 -0500229 */
Michael Ludwig7c12e282020-05-29 09:54:07 -0400230 void fillRectWithEdgeAA(const GrClip* clip, GrPaint&& paint, GrAA aa, GrQuadAAFlags edgeAA,
Michael Ludwig136f45a2019-02-19 11:44:41 -0500231 const SkMatrix& viewMatrix, const SkRect& rect,
Michael Ludwig61328202019-06-19 14:48:58 +0000232 const SkRect* optionalLocalRect = nullptr) {
233 const SkRect& localRect = optionalLocalRect ? *optionalLocalRect : rect;
Michael Ludwig6b45c5d2020-02-07 09:56:38 -0500234 DrawQuad quad{GrQuad::MakeFromRect(rect, viewMatrix), GrQuad(localRect), edgeAA};
235 this->drawFilledQuad(clip, std::move(paint), aa, &quad);
Michael Ludwig61328202019-06-19 14:48:58 +0000236 }
Michael Ludwig75451902019-01-23 11:14:29 -0500237
Michael Ludwigce62dec2019-02-19 11:48:46 -0500238 /**
239 * Similar to fillRectWithEdgeAA but draws an arbitrary 2D convex quadrilateral transformed
240 * by 'viewMatrix', with per-edge control over anti-aliasing. The quad should follow the
241 * ordering used by SkRect::toQuad(), which determines how the edge AA is applied:
242 * - "top" = points [0] and [1]
243 * - "right" = points[1] and [2]
244 * - "bottom" = points[2] and [3]
245 * - "left" = points[3] and [0]
246 *
247 * The last argument, 'optionalLocalQuad', can be null if no separate local coordinates are
248 * necessary.
249 */
Michael Ludwig7c12e282020-05-29 09:54:07 -0400250 void fillQuadWithEdgeAA(const GrClip* clip, GrPaint&& paint, GrAA aa, GrQuadAAFlags edgeAA,
Michael Ludwig6b45c5d2020-02-07 09:56:38 -0500251 const SkMatrix& viewMatrix, const SkPoint points[4],
252 const SkPoint optionalLocalPoints[4]) {
253 const SkPoint* localPoints = optionalLocalPoints ? optionalLocalPoints : points;
254 DrawQuad quad{GrQuad::MakeFromSkQuad(points, viewMatrix),
255 GrQuad::MakeFromSkQuad(localPoints, SkMatrix::I()), edgeAA};
256 this->drawFilledQuad(clip, std::move(paint), aa, &quad);
Michael Ludwig61328202019-06-19 14:48:58 +0000257 }
Michael Ludwigce62dec2019-02-19 11:48:46 -0500258
Michael Ludwig69858532018-11-28 15:34:34 -0500259 /** Used with drawQuadSet */
260 struct QuadSetEntry {
261 SkRect fRect;
262 SkPMColor4f fColor; // Overrides any color on the GrPaint
263 SkMatrix fLocalMatrix;
264 GrQuadAAFlags fAAFlags;
265 };
266
Michael Ludwig75451902019-01-23 11:14:29 -0500267 // TODO(michaelludwig) - remove if the bulk API is not useful for SkiaRenderer
Michael Ludwig7c12e282020-05-29 09:54:07 -0400268 void drawQuadSet(const GrClip* clip, GrPaint&& paint, GrAA aa, const SkMatrix& viewMatrix,
Michael Ludwig69858532018-11-28 15:34:34 -0500269 const QuadSetEntry[], int cnt);
270
robertphillipsea461502015-05-26 11:38:03 -0700271 /**
Brian Salomon34169692017-08-28 15:32:01 -0400272 * Creates an op that draws a subrectangle of a texture. The passed color is modulated by the
273 * texture's color. 'srcRect' specifies the rectangle of the texture to draw. 'dstRect'
274 * specifies the rectangle to draw in local coords which will be transformed by 'viewMatrix' to
Brian Salomonbe3c1d22018-05-21 12:54:39 -0400275 * device space.
Brian Salomon34169692017-08-28 15:32:01 -0400276 */
Brian Salomone69b9ef2020-07-22 11:18:06 -0400277 void drawTexture(const GrClip* clip,
278 GrSurfaceProxyView view,
279 SkAlphaType srcAlphaType,
280 GrSamplerState::Filter filter,
281 GrSamplerState::MipmapMode mm,
282 SkBlendMode mode,
283 const SkPMColor4f& color,
284 const SkRect& srcRect,
285 const SkRect& dstRect,
286 GrAA aa,
287 GrQuadAAFlags edgeAA,
288 SkCanvas::SrcRectConstraint constraint,
289 const SkMatrix& viewMatrix,
Greg Daniel40903af2020-01-30 14:55:05 -0500290 sk_sp<GrColorSpaceXform> texXform) {
Brian Salomon2432d062020-04-16 20:48:09 -0400291 const SkRect* subset = constraint == SkCanvas::kStrict_SrcRectConstraint ?
Michael Ludwigaee26ea2019-07-08 16:22:48 +0000292 &srcRect : nullptr;
Michael Ludwig6b45c5d2020-02-07 09:56:38 -0500293 DrawQuad quad{GrQuad::MakeFromRect(dstRect, viewMatrix), GrQuad(srcRect), edgeAA};
294
Brian Salomone69b9ef2020-07-22 11:18:06 -0400295 this->drawTexturedQuad(clip, std::move(view), srcAlphaType, std::move(texXform), filter, mm,
296 color, mode, aa, &quad, subset);
Michael Ludwigaee26ea2019-07-08 16:22:48 +0000297 }
Brian Salomon34169692017-08-28 15:32:01 -0400298
Michael Ludwigce62dec2019-02-19 11:48:46 -0500299 /**
300 * Variant of drawTexture that instead draws the texture applied to 'dstQuad' transformed by
Brian Salomon2432d062020-04-16 20:48:09 -0400301 * 'viewMatrix', using the 'srcQuad' texture coordinates clamped to the optional 'subset'. If
302 * 'subset' is null, it's equivalent to using the fast src rect constraint. If 'subset' is
303 * provided, the strict src rect constraint is applied using 'subset'.
Michael Ludwigce62dec2019-02-19 11:48:46 -0500304 */
Brian Salomone69b9ef2020-07-22 11:18:06 -0400305 void drawTextureQuad(const GrClip* clip,
306 GrSurfaceProxyView view,
307 GrColorType srcColorType,
308 SkAlphaType srcAlphaType,
309 GrSamplerState::Filter filter,
310 GrSamplerState::MipmapMode mm,
311 SkBlendMode mode,
312 const SkPMColor4f& color,
313 const SkPoint srcQuad[4],
314 const SkPoint dstQuad[4],
315 GrAA aa,
316 GrQuadAAFlags edgeAA,
317 const SkRect* subset,
318 const SkMatrix& viewMatrix,
Michael Ludwigaee26ea2019-07-08 16:22:48 +0000319 sk_sp<GrColorSpaceXform> texXform) {
Michael Ludwig6b45c5d2020-02-07 09:56:38 -0500320 DrawQuad quad{GrQuad::MakeFromSkQuad(dstQuad, viewMatrix),
321 GrQuad::MakeFromSkQuad(srcQuad, SkMatrix::I()), edgeAA};
Brian Salomone69b9ef2020-07-22 11:18:06 -0400322 this->drawTexturedQuad(clip, std::move(view), srcAlphaType, std::move(texXform), filter, mm,
323 color, mode, aa, &quad, subset);
Michael Ludwigaee26ea2019-07-08 16:22:48 +0000324 }
Michael Ludwigce62dec2019-02-19 11:48:46 -0500325
Brian Salomond7065e72018-10-12 11:42:02 -0400326 /** Used with drawTextureSet */
327 struct TextureSetEntry {
Greg Daniel549325c2019-10-30 16:19:20 -0400328 GrSurfaceProxyView fProxyView;
Brian Salomonfc118442019-11-22 19:09:27 -0500329 SkAlphaType fSrcAlphaType;
Brian Salomond7065e72018-10-12 11:42:02 -0400330 SkRect fSrcRect;
331 SkRect fDstRect;
Michael Ludwig1433cfd2019-02-27 17:12:30 -0500332 const SkPoint* fDstClipQuad; // Must be null, or point to an array of 4 points
Michael Ludwig7ae2ab52019-03-05 16:00:20 -0500333 const SkMatrix* fPreViewMatrix; // If not null, entry's CTM is 'viewMatrix' * fPreViewMatrix
Michael Ludwig1c66ad92020-07-10 08:59:44 -0400334 SkPMColor4f fColor; // {a,a,a,a} for rgb textures, {r,g,b,a} for alpha-only textures
Brian Salomond7065e72018-10-12 11:42:02 -0400335 GrQuadAAFlags fAAFlags;
336 };
337 /**
338 * Draws a set of textures with a shared filter, color, view matrix, color xform, and
339 * texture color xform. The textures must all have the same GrTextureType and GrConfig.
Michael Ludwigce62dec2019-02-19 11:48:46 -0500340 *
341 * If any entries provide a non-null fDstClip array, it will be read from immediately based on
342 * fDstClipCount, so the pointer can become invalid after this returns.
Michael Ludwig379e4962019-12-06 13:21:26 -0500343 *
Hal Canary425929c2019-12-09 11:55:40 -0500344 * 'proxRunCnt' is the number of proxy changes encountered in the entry array. Technically this
Michael Ludwig379e4962019-12-06 13:21:26 -0500345 * can be inferred from the array within this function, but the information is already known
346 * by SkGpuDevice, so no need to incur another iteration over the array.
Brian Salomond7065e72018-10-12 11:42:02 -0400347 */
Brian Salomone69b9ef2020-07-22 11:18:06 -0400348 void drawTextureSet(const GrClip*,
349 TextureSetEntry[],
350 int cnt,
351 int proxyRunCnt,
352 GrSamplerState::Filter,
353 GrSamplerState::MipmapMode,
354 SkBlendMode mode,
355 GrAA aa,
356 SkCanvas::SrcRectConstraint,
357 const SkMatrix& viewMatrix,
Michael Ludwig379e4962019-12-06 13:21:26 -0500358 sk_sp<GrColorSpaceXform> texXform);
Brian Salomond7065e72018-10-12 11:42:02 -0400359
Brian Salomon34169692017-08-28 15:32:01 -0400360 /**
Brian Salomon0e8fc8b2016-12-09 15:10:07 -0500361 * Draw a roundrect using a paint.
robertphillipsea461502015-05-26 11:38:03 -0700362 *
Brian Salomon0e8fc8b2016-12-09 15:10:07 -0500363 * @param paint describes how to color pixels.
364 * @param GrAA Controls whether rrect is antialiased.
365 * @param viewMatrix transformation matrix
366 * @param rrect the roundrect to draw
367 * @param style style to apply to the rrect. Currently path effects are not allowed.
robertphillipsea461502015-05-26 11:38:03 -0700368 */
Michael Ludwig7c12e282020-05-29 09:54:07 -0400369 void drawRRect(const GrClip*,
Brian Salomon82f44312017-01-11 13:42:54 -0500370 GrPaint&&,
Brian Salomon0e8fc8b2016-12-09 15:10:07 -0500371 GrAA,
robertphillipsea461502015-05-26 11:38:03 -0700372 const SkMatrix& viewMatrix,
373 const SkRRect& rrect,
bsalomon6663acf2016-05-10 09:14:17 -0700374 const GrStyle& style);
robertphillipsea461502015-05-26 11:38:03 -0700375
376 /**
Jim Van Verth3af1af92017-05-18 15:06:54 -0400377 * Use a fast method to render the ambient and spot shadows for a path.
378 * Will return false if not possible for the given path.
Jim Van Verthc5903412016-11-17 15:27:09 -0500379 *
Brian Salomon0e8fc8b2016-12-09 15:10:07 -0500380 * @param viewMatrix transformation matrix
Jim Van Verth3af1af92017-05-18 15:06:54 -0400381 * @param path the path to shadow
382 * @param rec parameters for shadow rendering
Jim Van Verthc5903412016-11-17 15:27:09 -0500383 */
Michael Ludwig7c12e282020-05-29 09:54:07 -0400384 bool drawFastShadow(const GrClip*,
Jim Van Verth3af1af92017-05-18 15:06:54 -0400385 const SkMatrix& viewMatrix,
386 const SkPath& path,
387 const SkDrawShadowRec& rec);
Jim Van Verthc5903412016-11-17 15:27:09 -0500388
389 /**
Brian Salomon0e8fc8b2016-12-09 15:10:07 -0500390 * Shortcut for filling a SkPath consisting of nested rrects using a paint. The result is
391 * undefined if outer does not contain inner.
robertphillips00095892016-02-29 13:50:40 -0800392 *
Brian Salomon0e8fc8b2016-12-09 15:10:07 -0500393 * @param paint describes how to color pixels.
394 * @param GrAA Controls whether rrects edges are antialiased
395 * @param viewMatrix transformation matrix
396 * @param outer the outer roundrect
397 * @param inner the inner roundrect
robertphillips00095892016-02-29 13:50:40 -0800398 */
Michael Ludwig7c12e282020-05-29 09:54:07 -0400399 void drawDRRect(const GrClip*,
Brian Salomon82f44312017-01-11 13:42:54 -0500400 GrPaint&&,
Brian Salomon0e8fc8b2016-12-09 15:10:07 -0500401 GrAA,
robertphillips00095892016-02-29 13:50:40 -0800402 const SkMatrix& viewMatrix,
403 const SkRRect& outer,
404 const SkRRect& inner);
405
406 /**
robertphillipsea461502015-05-26 11:38:03 -0700407 * Draws a path.
408 *
409 * @param paint describes how to color pixels.
Brian Salomon0e8fc8b2016-12-09 15:10:07 -0500410 * @param GrAA Controls whether the path is antialiased.
robertphillipsea461502015-05-26 11:38:03 -0700411 * @param viewMatrix transformation matrix
412 * @param path the path to draw
bsalomon6663acf2016-05-10 09:14:17 -0700413 * @param style style to apply to the path.
robertphillipsea461502015-05-26 11:38:03 -0700414 */
Michael Ludwig7c12e282020-05-29 09:54:07 -0400415 void drawPath(const GrClip*,
Brian Salomon82f44312017-01-11 13:42:54 -0500416 GrPaint&&,
Brian Salomon0e8fc8b2016-12-09 15:10:07 -0500417 GrAA,
robertphillipsea461502015-05-26 11:38:03 -0700418 const SkMatrix& viewMatrix,
419 const SkPath&,
Robert Phillips20390c32018-08-17 11:01:03 -0400420 const GrStyle&);
421
422 /**
423 * Draws a shape.
424 *
425 * @param paint describes how to color pixels.
426 * @param GrAA Controls whether the path is antialiased.
427 * @param viewMatrix transformation matrix
428 * @param shape the shape to draw
429 */
Michael Ludwig7c12e282020-05-29 09:54:07 -0400430 void drawShape(const GrClip*,
Robert Phillips20390c32018-08-17 11:01:03 -0400431 GrPaint&&,
432 GrAA,
433 const SkMatrix& viewMatrix,
Michael Ludwig2686d692020-04-17 20:21:37 +0000434 const GrStyledShape&);
Robert Phillips20390c32018-08-17 11:01:03 -0400435
robertphillipsea461502015-05-26 11:38:03 -0700436
437 /**
438 * Draws vertices with a paint.
439 *
Brian Osmanae0c50c2017-05-25 16:56:34 -0400440 * @param paint describes how to color pixels.
441 * @param viewMatrix transformation matrix
442 * @param vertices specifies the mesh to draw.
443 * @param overridePrimType primitive type to draw. If NULL, derive prim type from vertices.
Brian Osman3c358422020-03-23 10:44:12 -0400444 * @param effect runtime effect that will handle custom vertex attributes.
robertphillipsea461502015-05-26 11:38:03 -0700445 */
Michael Ludwig7c12e282020-05-29 09:54:07 -0400446 void drawVertices(const GrClip*,
Brian Salomon82f44312017-01-11 13:42:54 -0500447 GrPaint&& paint,
Brian Osman449b1152020-04-15 16:43:00 -0400448 const SkMatrixProvider& matrixProvider,
Brian Osmanae0c50c2017-05-25 16:56:34 -0400449 sk_sp<SkVertices> vertices,
Brian Osman3c358422020-03-23 10:44:12 -0400450 GrPrimitiveType* overridePrimType = nullptr,
Brian Osman449b1152020-04-15 16:43:00 -0400451 const SkRuntimeEffect* effect = nullptr);
Brian Salomon199fb872017-02-06 09:41:10 -0500452
453 /**
Brian Osman4d92b892019-03-24 00:53:23 +0000454 * Draws textured sprites from an atlas with a paint. This currently does not support AA for the
455 * sprite rectangle edges.
456 *
457 * @param paint describes how to color pixels.
458 * @param viewMatrix transformation matrix
459 * @param spriteCount number of sprites.
460 * @param xform array of compressed transformation data, required.
461 * @param texRect array of texture rectangles used to access the paint.
462 * @param colors optional array of per-sprite colors, supercedes
463 * the paint's color field.
464 */
Michael Ludwig7c12e282020-05-29 09:54:07 -0400465 void drawAtlas(const GrClip*,
Brian Osman4d92b892019-03-24 00:53:23 +0000466 GrPaint&& paint,
467 const SkMatrix& viewMatrix,
468 int spriteCount,
469 const SkRSXform xform[],
470 const SkRect texRect[],
471 const SkColor colors[]);
472
473 /**
msarettcc319b92016-08-25 18:07:18 -0700474 * Draws a region.
475 *
476 * @param paint describes how to color pixels
477 * @param viewMatrix transformation matrix
Brian Salomon0e8fc8b2016-12-09 15:10:07 -0500478 * @param aa should the rects of the region be antialiased.
msarettcc319b92016-08-25 18:07:18 -0700479 * @param region the region to be drawn
480 * @param style style to apply to the region
481 */
Michael Ludwig7c12e282020-05-29 09:54:07 -0400482 void drawRegion(const GrClip*,
Brian Salomon82f44312017-01-11 13:42:54 -0500483 GrPaint&& paint,
Brian Salomon0e8fc8b2016-12-09 15:10:07 -0500484 GrAA aa,
msarettcc319b92016-08-25 18:07:18 -0700485 const SkMatrix& viewMatrix,
486 const SkRegion& region,
Stan Iliev73d8fd92017-08-02 15:36:24 -0400487 const GrStyle& style,
488 const GrUserStencilSettings* ss = nullptr);
msarettcc319b92016-08-25 18:07:18 -0700489
jvanverth31ff7622015-08-07 10:09:28 -0700490 /**
robertphillipsea461502015-05-26 11:38:03 -0700491 * Draws an oval.
492 *
493 * @param paint describes how to color pixels.
Brian Salomon0e8fc8b2016-12-09 15:10:07 -0500494 * @param GrAA Controls whether the oval is antialiased.
robertphillipsea461502015-05-26 11:38:03 -0700495 * @param viewMatrix transformation matrix
496 * @param oval the bounding rect of the oval.
bsalomon6663acf2016-05-10 09:14:17 -0700497 * @param style style to apply to the oval. Currently path effects are not allowed.
robertphillipsea461502015-05-26 11:38:03 -0700498 */
Michael Ludwig7c12e282020-05-29 09:54:07 -0400499 void drawOval(const GrClip*,
Brian Salomon82f44312017-01-11 13:42:54 -0500500 GrPaint&& paint,
Brian Salomon0e8fc8b2016-12-09 15:10:07 -0500501 GrAA,
robertphillipsea461502015-05-26 11:38:03 -0700502 const SkMatrix& viewMatrix,
503 const SkRect& oval,
bsalomon6663acf2016-05-10 09:14:17 -0700504 const GrStyle& style);
Herb Derbyc1583cb2020-07-13 10:42:18 -0400505
Brian Salomon0e8fc8b2016-12-09 15:10:07 -0500506 /**
507 * Draws a partial arc of an oval.
508 *
509 * @param paint describes how to color pixels.
Brian Salomon99504082016-12-09 15:51:31 -0500510 * @param GrGrAA Controls whether the arc is antialiased.
Brian Salomon0e8fc8b2016-12-09 15:10:07 -0500511 * @param viewMatrix transformation matrix.
512 * @param oval the bounding rect of the oval.
513 * @param startAngle starting angle in degrees.
514 * @param sweepAngle angle to sweep in degrees. Must be in (-360, 360)
515 * @param useCenter true means that the implied path begins at the oval center, connects as
516 * a line to the point indicated by the start contains the arc indicated by
517 * the sweep angle. If false the line beginning at the center point is
518 * omitted.
519 * @param style style to apply to the oval.
520 */
Michael Ludwig7c12e282020-05-29 09:54:07 -0400521 void drawArc(const GrClip*,
Brian Salomon82f44312017-01-11 13:42:54 -0500522 GrPaint&& paint,
Brian Salomon0e8fc8b2016-12-09 15:10:07 -0500523 GrAA,
bsalomon4f3a0ca2016-08-22 13:14:26 -0700524 const SkMatrix& viewMatrix,
525 const SkRect& oval,
526 SkScalar startAngle,
527 SkScalar sweepAngle,
528 bool useCenter,
529 const GrStyle& style);
robertphillipsea461502015-05-26 11:38:03 -0700530
joshualitt33a5fce2015-11-18 13:28:51 -0800531 /**
bsalomon4f3a0ca2016-08-22 13:14:26 -0700532 * Draw the image as a set of rects, specified by |iter|.
joshualitt33a5fce2015-11-18 13:28:51 -0800533 */
Michael Ludwig7c12e282020-05-29 09:54:07 -0400534 void drawImageLattice(const GrClip*,
Brian Salomon2a943df2018-05-04 13:43:19 -0400535 GrPaint&&,
msarett10e3d9b2016-08-18 15:46:03 -0700536 const SkMatrix& viewMatrix,
Greg Danieled96bca2019-12-05 15:05:54 -0500537 GrSurfaceProxyView,
Greg Daniel82c6b102020-01-21 10:33:22 -0500538 SkAlphaType alphaType,
Brian Salomon2a943df2018-05-04 13:43:19 -0400539 sk_sp<GrColorSpaceXform>,
540 GrSamplerState::Filter,
541 std::unique_ptr<SkLatticeIter>,
msarett10e3d9b2016-08-18 15:46:03 -0700542 const SkRect& dst);
robertphillipsea461502015-05-26 11:38:03 -0700543
robertphillips8c523e02016-07-26 07:41:00 -0700544 /**
Herb Derby411e7aa2020-07-09 16:02:08 -0400545 * Draw the text specified by the SkGlyphRunList.
546 *
547 * @param viewMatrix transformationMatrix
548 * @param glyphRunList text, text positions, and paint.
549 */
550 void drawGlyphRunList(const GrClip*,
551 const SkMatrixProvider& viewMatrix,
552 const SkGlyphRunList& glyphRunList);
553
554 /**
Greg Daniel46cfbc62019-06-07 11:43:30 -0400555 * Draws the src texture with no matrix. The dstRect is the dstPoint with the width and height
556 * of the srcRect. The srcRect and dstRect are clipped to the bounds of the src and dst surfaces
557 * respectively.
558 */
Greg Daniel573312e2020-02-07 17:22:35 -0500559 bool blitTexture(GrSurfaceProxyView view, const SkIRect& srcRect, const SkIPoint& dstPoint);
Greg Daniel46cfbc62019-06-07 11:43:30 -0400560
561 /**
Greg Daniel64cc9aa2018-10-19 13:54:56 -0400562 * Adds the necessary signal and wait semaphores and adds the passed in SkDrawable to the
563 * command stream.
564 */
565 void drawDrawable(std::unique_ptr<SkDrawable::GpuDrawHandler>, const SkRect& bounds);
566
Greg Daniela5cb7812017-06-16 09:45:32 -0400567 /**
568 * The next time this GrRenderTargetContext is flushed, the gpu will wait on the passed in
569 * semaphores before executing any commands.
570 */
Greg Daniel414418d2020-07-08 11:44:25 -0400571 bool waitOnSemaphores(int numSemaphores, const GrBackendSemaphore waitSemaphores[],
572 bool deleteSemaphoresAfterWait);
robertphillips8c523e02016-07-26 07:41:00 -0700573
Greg Daniel46e366a2019-12-16 14:38:36 -0500574 int numSamples() const { return this->asRenderTargetProxy()->numSamples(); }
robertphillipsca6eafc2016-05-17 09:57:46 -0700575 const SkSurfaceProps& surfaceProps() const { return fSurfaceProps; }
Greg Daniel46e366a2019-12-16 14:38:36 -0500576 bool wrapsVkSecondaryCB() const { return this->asRenderTargetProxy()->wrapsVkSecondaryCB(); }
Brian Salomon8c82a872020-07-21 12:09:58 -0400577 GrMipmapped mipmapped() const;
robertphillips7bceedc2015-12-01 12:51:26 -0800578
Greg Daniel3912a4b2020-01-14 09:56:04 -0500579 // TODO: See if it makes sense for this to return a const& instead and require the callers to
580 // make a copy (which refs the proxy) if needed.
Brian Salomon8afde5f2020-04-01 16:22:00 -0400581 GrSurfaceProxyView writeSurfaceView() { return fWriteView; }
Greg Daniela83de582019-10-22 09:33:25 -0400582
Robert Phillipsbe9aff22019-02-15 11:33:22 -0500583 // This entry point should only be called if the backing GPU object is known to be
584 // instantiated.
Greg Daniel3912a4b2020-01-14 09:56:04 -0500585 GrRenderTarget* accessRenderTarget() { return this->asSurfaceProxy()->peekRenderTarget(); }
Robert Phillipseaa86252016-11-08 13:49:39 +0000586
Robert Phillipsd46697a2017-01-25 12:10:37 -0500587 GrRenderTargetContext* asRenderTargetContext() override { return this; }
588
robertphillips391395d2016-03-02 09:26:36 -0800589 // Provides access to functions that aren't part of the public API.
Brian Osman693a5402016-10-27 15:13:22 -0400590 GrRenderTargetContextPriv priv();
John Stilesec9b4aa2020-08-07 13:05:14 -0400591 const GrRenderTargetContextPriv priv() const; // NOLINT(readability-const-return-type)
joshualittf5883a62016-01-13 07:47:38 -0800592
Brian Salomon3b8486a2020-04-21 12:43:26 -0400593 void wasClosed(const GrOpsTask& task) override;
594
Robert Phillipsb5204762019-06-19 14:12:13 -0400595#if GR_TEST_UTILS
Greg Daniel3912a4b2020-01-14 09:56:04 -0500596 bool testingOnly_IsInstantiated() const { return this->asSurfaceProxy()->isInstantiated(); }
Chris Dalton6b982802019-06-27 13:53:46 -0600597 void testingOnly_SetPreserveOpsOnFullClear() { fPreserveOpsOnFullClear_TestingOnly = true; }
Greg Danielf41b2bd2019-08-22 16:19:24 -0400598 GrOpsTask* testingOnly_PeekLastOpsTask() { return fOpsTask.get(); }
Robert Phillipsb5204762019-06-19 14:12:13 -0400599#endif
Robert Phillipseaa86252016-11-08 13:49:39 +0000600
robertphillipsea461502015-05-26 11:38:03 -0700601private:
Michael Ludwig61328202019-06-19 14:48:58 +0000602 enum class QuadOptimization;
Brian Salomonf18b1d82017-10-27 11:30:49 -0400603
Chris Dalton7d6748e2019-03-13 00:34:52 -0600604 GrAAType chooseAAType(GrAA);
Brian Salomon0e8fc8b2016-12-09 15:10:07 -0500605
Greg Danielf41b2bd2019-08-22 16:19:24 -0400606 friend class GrClipStackClip; // for access to getOpsTask
Michael Ludwiga195d102020-09-15 14:51:52 -0400607 friend class GrClipStack; // ""
Chris Daltonc4b47352019-08-23 10:10:36 -0600608 friend class GrOnFlushResourceProvider; // for access to getOpsTask (http://skbug.com/9357)
robertphillips55fdccc2016-06-06 06:16:20 -0700609
Brian Osman11052242016-10-27 14:47:55 -0400610 friend class GrRenderTargetContextPriv;
robertphillips976f5f02016-06-03 10:59:20 -0700611
Herb Derbyba426ba2020-06-09 14:50:32 -0400612 // All the path and text renderers/ops currently make their own ops
Brian Salomon649a3412017-03-09 13:50:43 -0500613 friend class GrSoftwarePathRenderer; // for access to add[Mesh]DrawOp
614 friend class GrAAConvexPathRenderer; // for access to add[Mesh]DrawOp
615 friend class GrDashLinePathRenderer; // for access to add[Mesh]DrawOp
616 friend class GrAAHairLinePathRenderer; // for access to add[Mesh]DrawOp
617 friend class GrAALinearizingConvexPathRenderer; // for access to add[Mesh]DrawOp
Jim Van Verth83010462017-03-16 08:45:39 -0400618 friend class GrSmallPathRenderer; // for access to add[Mesh]DrawOp
Brian Salomon649a3412017-03-09 13:50:43 -0500619 friend class GrDefaultPathRenderer; // for access to add[Mesh]DrawOp
Brian Salomon649a3412017-03-09 13:50:43 -0500620 friend class GrStencilAndCoverPathRenderer; // for access to add[Mesh]DrawOp
Chris Dalton17dc4182020-03-25 16:18:16 -0600621 friend class GrTriangulatingPathRenderer; // for access to add[Mesh]DrawOp
Chris Dalton9414c962018-06-14 10:14:50 -0600622 friend class GrCCPerFlushResources; // for access to addDrawOp
Chris Dalton1a325d22017-07-14 15:17:41 -0600623 friend class GrCoverageCountingPathRenderer; // for access to addDrawOp
Robert Phillips438d9862019-11-14 12:46:05 -0500624 friend class GrFillRectOp; // for access to addDrawOp
Chris Dalton0a22b1e2020-03-26 11:52:15 -0600625 friend class GrTessellationPathRenderer; // for access to addDrawOp
Robert Phillipse837e612019-11-15 11:02:50 -0500626 friend class GrTextureOp; // for access to addDrawOp
Robert Phillips438d9862019-11-14 12:46:05 -0500627
Greg Daniel46e366a2019-12-16 14:38:36 -0500628 SkDEBUGCODE(void onValidate() const override;)
Greg Daniela83de582019-10-22 09:33:25 -0400629
630
Greg Danielf41b2bd2019-08-22 16:19:24 -0400631 GrOpsTask::CanDiscardPreviousOps canDiscardPreviousOpsOnFullClear() const;
Chris Dalton858cf232019-10-14 16:20:00 -0600632 void setNeedsStencil(bool useMixedSamplesIfNotMSAA);
Chris Dalton6b982802019-06-27 13:53:46 -0600633
Michael Ludwig81d41722020-05-26 16:57:38 -0400634 void internalClear(const SkIRect* scissor, const SkPMColor4f&,
635 bool upgradePartialToFull = false);
636 void internalStencilClear(const SkIRect* scissor, bool insideStencilMask);
csmartdalton29df7602016-08-31 11:55:52 -0700637
Brian Salomon82f44312017-01-11 13:42:54 -0500638 // Only consumes the GrPaint if successful.
Michael Ludwig7c12e282020-05-29 09:54:07 -0400639 bool drawFilledDRRect(const GrClip* clip,
Brian Salomon82f44312017-01-11 13:42:54 -0500640 GrPaint&& paint,
Brian Salomon0e8fc8b2016-12-09 15:10:07 -0500641 GrAA,
robertphillips00095892016-02-29 13:50:40 -0800642 const SkMatrix& viewMatrix,
643 const SkRRect& origOuter,
644 const SkRRect& origInner);
645
Michael Ludwig61328202019-06-19 14:48:58 +0000646 // If the drawn quad's paint is a const blended color, provide it as a non-null pointer to
647 // 'constColor', which enables the draw-as-clear optimization. Otherwise it is assumed the paint
648 // requires some form of shading that invalidates using a clear op.
649 //
650 // The non-const pointers should be the original draw request on input, and will be updated as
651 // appropriate depending on the returned optimization level.
652 //
Michael Ludwige08b4432019-06-19 18:00:48 -0400653 // 'stencilSettings' are provided merely for decision making purposes; When non-null,
654 // optimization strategies that submit special ops are avoided.
Michael Ludwig7c12e282020-05-29 09:54:07 -0400655 QuadOptimization attemptQuadOptimization(const GrClip* clip,
Michael Ludwig61328202019-06-19 14:48:58 +0000656 const SkPMColor4f* constColor,
Michael Ludwige08b4432019-06-19 18:00:48 -0400657 const GrUserStencilSettings* stencilSettings,
Michael Ludwig61328202019-06-19 14:48:58 +0000658 GrAA* aa,
Michael Ludwig6b45c5d2020-02-07 09:56:38 -0500659 DrawQuad* quad);
robertphillips44302392016-07-08 14:43:03 -0700660
Michael Ludwig61328202019-06-19 14:48:58 +0000661 // If stencil settings, 'ss', are non-null, AA controls MSAA or no AA. If they are null, then AA
662 // can choose between coverage, MSAA as per chooseAAType(). This will always attempt to apply
663 // quad optimizations, so all quad/rect public APIs should rely on this function for consistent
Michael Ludwig6b45c5d2020-02-07 09:56:38 -0500664 // clipping behavior. 'quad' will be modified in place to reflect final rendered geometry.
Michael Ludwig7c12e282020-05-29 09:54:07 -0400665 void drawFilledQuad(const GrClip* clip,
Michael Ludwig61328202019-06-19 14:48:58 +0000666 GrPaint&& paint,
667 GrAA aa,
Michael Ludwig6b45c5d2020-02-07 09:56:38 -0500668 DrawQuad* quad,
Michael Ludwig61328202019-06-19 14:48:58 +0000669 const GrUserStencilSettings* ss = nullptr);
Brian Salomon7694b902019-06-18 21:00:21 +0000670
Michael Ludwig6b45c5d2020-02-07 09:56:38 -0500671 // Like drawFilledQuad but does not require using a GrPaint or FP for texturing.
672 // 'quad' may be modified in place to reflect final geometry.
Michael Ludwig7c12e282020-05-29 09:54:07 -0400673 void drawTexturedQuad(const GrClip* clip,
Greg Daniel549325c2019-10-30 16:19:20 -0400674 GrSurfaceProxyView proxyView,
Brian Salomonfc118442019-11-22 19:09:27 -0500675 SkAlphaType alphaType,
Michael Ludwigaee26ea2019-07-08 16:22:48 +0000676 sk_sp<GrColorSpaceXform> textureXform,
677 GrSamplerState::Filter filter,
Brian Salomone69b9ef2020-07-22 11:18:06 -0400678 GrSamplerState::MipmapMode,
Michael Ludwigaee26ea2019-07-08 16:22:48 +0000679 const SkPMColor4f& color,
680 SkBlendMode blendMode,
681 GrAA aa,
Michael Ludwig6b45c5d2020-02-07 09:56:38 -0500682 DrawQuad* quad,
Brian Salomon2432d062020-04-16 20:48:09 -0400683 const SkRect* subset = nullptr);
Michael Ludwigaee26ea2019-07-08 16:22:48 +0000684
Michael Ludwig6a6de652020-04-30 20:16:36 -0400685 // If 'attemptShapeFallback' is true, and the original shape had been simplfied, this
686 // will re-route through drawShape() to see if we can avoid path rendering one more time.
Michael Ludwig7c12e282020-05-29 09:54:07 -0400687 void drawShapeUsingPathRenderer(const GrClip*, GrPaint&&, GrAA, const SkMatrix&,
Michael Ludwig6a6de652020-04-30 20:16:36 -0400688 const GrStyledShape&, bool attemptShapeFallback = true);
robertphillipsea461502015-05-26 11:38:03 -0700689
Chris Dalton08755122019-08-05 16:13:47 -0600690 void addOp(std::unique_ptr<GrOp>);
691
Brian Salomon348a0372018-10-31 10:42:18 -0400692 // Allows caller of addDrawOp to know which op list an op will be added to.
Greg Danielf41b2bd2019-08-22 16:19:24 -0400693 using WillAddOpFn = void(GrOp*, uint32_t opsTaskID);
Brian Salomon348a0372018-10-31 10:42:18 -0400694 // These perform processing specific to GrDrawOp-derived ops before recording them into an
695 // op list. Before adding the op to an op list the WillAddOpFn is called. Note that it
696 // will not be called in the event that the op is discarded. Moreover, the op may merge into
697 // another op after the function is called (either before addDrawOp returns or some time later).
Michael Ludwig7c12e282020-05-29 09:54:07 -0400698 //
699 // If the clip pointer is null, no clipping will be performed.
700 void addDrawOp(const GrClip*, std::unique_ptr<GrDrawOp>,
Brian Salomon348a0372018-10-31 10:42:18 -0400701 const std::function<WillAddOpFn>& = std::function<WillAddOpFn>());
robertphillips2334fb62015-06-17 05:43:33 -0700702
Robert Phillipsbf25d432017-04-07 10:08:53 -0400703 // Makes a copy of the proxy if it is necessary for the draw and places the texture that should
704 // be used by GrXferProcessor to access the destination color in 'result'. If the return
705 // value is false then a texture copy could not be made.
Michael Ludwig28e5f112020-06-09 10:57:24 -0400706 //
707 // The op should have already had setClippedBounds called on it.
708 bool SK_WARN_UNUSED_RESULT setupDstProxyView(const GrOp& op,
Greg Daniel524e28b2019-11-01 11:48:53 -0400709 GrXferProcessor::DstProxyView* result);
Brian Salomon467921e2017-03-06 16:17:12 -0500710
Greg Danielf41b2bd2019-08-22 16:19:24 -0400711 GrOpsTask* getOpsTask();
robertphillipsa106c622015-10-16 09:07:06 -0700712
Herb Derbyd29207a2020-06-08 13:50:19 -0400713 SkGlyphRunListPainter* glyphPainter() { return &fGlyphPainter; }
714
Brian Salomon8afde5f2020-04-01 16:22:00 -0400715 GrSurfaceProxyView fWriteView;
robertphillipsa106c622015-10-16 09:07:06 -0700716
Greg Danielf41b2bd2019-08-22 16:19:24 -0400717 // In MDB-mode the GrOpsTask can be closed by some other renderTargetContext that has picked
718 // it up. For this reason, the GrOpsTask should only ever be accessed via 'getOpsTask'.
719 sk_sp<GrOpsTask> fOpsTask;
robertphillips2334fb62015-06-17 05:43:33 -0700720
Brian Salomonf18b1d82017-10-27 11:30:49 -0400721 SkSurfaceProps fSurfaceProps;
Greg Danielf41b2bd2019-08-22 16:19:24 -0400722 bool fManagedOpsTask;
Robert Phillipse305cc1f2016-12-14 12:19:05 -0500723
Chris Daltoneffee202019-07-01 22:28:03 -0600724 int fNumStencilSamples = 0;
Greg Danield358cbe2020-09-11 09:33:54 -0400725
726 GrDstSampleType fDstSampleType = GrDstSampleType::kNone;
727
Chris Dalton6b982802019-06-27 13:53:46 -0600728#if GR_TEST_UTILS
729 bool fPreserveOpsOnFullClear_TestingOnly = false;
730#endif
Herb Derbyd29207a2020-06-08 13:50:19 -0400731 SkGlyphRunListPainter fGlyphPainter;
John Stiles7571f9e2020-09-02 22:42:33 -0400732 using INHERITED = GrSurfaceContext;
robertphillipsea461502015-05-26 11:38:03 -0700733};
734
735#endif