blob: a4b329e5a85551835ebad80a423cb5cf1938ab92 [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
Brian Salomon7c8460e2017-05-12 11:36:10 -040011#include "../private/GrRenderTargetProxy.h"
bsalomonfaf82032016-09-16 09:53:27 -070012#include "GrContext.h"
Robert Phillips6be756b2018-01-16 15:07:54 -050013#include "GrContextPriv.h"
csmartdaltonecbc12b2016-06-08 10:08:43 -070014#include "GrPaint.h"
Brian Osman45580d32016-11-23 09:37:01 -050015#include "GrSurfaceContext.h"
Brian Salomon7c8460e2017-05-12 11:36:10 -040016#include "GrTypesPriv.h"
Brian Salomon467921e2017-03-06 16:17:12 -050017#include "GrXferProcessor.h"
Brian Salomon238069b2018-07-11 15:58:57 -040018#include "SkCanvas.h"
Greg Daniel64cc9aa2018-10-19 13:54:56 -040019#include "SkDrawable.h"
robertphillipsea461502015-05-26 11:38:03 -070020#include "SkRefCnt.h"
robertphillipsfcf78292015-06-19 11:49:52 -070021#include "SkSurfaceProps.h"
Herb Derbyc1b482c2018-08-09 15:02:27 -040022#include "text/GrTextTarget.h"
robertphillipsea461502015-05-26 11:38:03 -070023
Greg Daniela5cb7812017-06-16 09:45:32 -040024class GrBackendSemaphore;
robertphillipsea461502015-05-26 11:38:03 -070025class GrClip;
Brian Osman2240be92017-10-18 13:15:13 -040026class GrColorSpaceXform;
Chris Dalton1a325d22017-07-14 15:17:41 -060027class GrCoverageCountingPathRenderer;
robertphillips77a2e522015-10-17 07:43:27 -070028class GrDrawingManager;
Brian Salomon9afd3712016-12-01 10:59:09 -050029class GrDrawOp;
csmartdalton29df7602016-08-31 11:55:52 -070030class GrFixedClip;
robertphillipsea461502015-05-26 11:38:03 -070031class GrRenderTarget;
Brian Osman45580d32016-11-23 09:37:01 -050032class GrRenderTargetContextPriv;
Robert Phillipsf2361d22016-10-25 14:20:06 -040033class GrRenderTargetOpList;
Brian Salomon2fad74a2017-12-20 13:28:55 -050034class GrShape;
bsalomon6663acf2016-05-10 09:14:17 -070035class GrStyle;
Robert Phillipseaa86252016-11-08 13:49:39 +000036class GrTextureProxy;
robertphillips44302392016-07-08 14:43:03 -070037struct GrUserStencilSettings;
Jim Van Verth3af1af92017-05-18 15:06:54 -040038struct SkDrawShadowRec;
Herb Derbycddab252018-07-16 11:19:04 -040039class SkGlyphRunList;
robertphillipsea461502015-05-26 11:38:03 -070040struct SkIPoint;
41struct SkIRect;
msarett10e3d9b2016-08-18 15:46:03 -070042class SkLatticeIter;
robertphillipsea461502015-05-26 11:38:03 -070043class SkMatrix;
robertphillips2334fb62015-06-17 05:43:33 -070044class SkPaint;
robertphillipsea461502015-05-26 11:38:03 -070045class SkPath;
46struct SkPoint;
47struct SkRect;
Brian Osman45580d32016-11-23 09:37:01 -050048class SkRegion;
robertphillipsea461502015-05-26 11:38:03 -070049class SkRRect;
jvanverth31ff7622015-08-07 10:09:28 -070050struct SkRSXform;
robertphillips2334fb62015-06-17 05:43:33 -070051class SkTextBlob;
Brian Salomon199fb872017-02-06 09:41:10 -050052class SkVertices;
robertphillipsea461502015-05-26 11:38:03 -070053
Brian Osman45580d32016-11-23 09:37:01 -050054/**
55 * A helper object to orchestrate commands (draws, etc...) for GrSurfaces that are GrRenderTargets.
robertphillipsea461502015-05-26 11:38:03 -070056 */
Brian Osman45580d32016-11-23 09:37:01 -050057class SK_API GrRenderTargetContext : public GrSurfaceContext {
robertphillipsea461502015-05-26 11:38:03 -070058public:
Brian Osman11052242016-10-27 14:47:55 -040059 ~GrRenderTargetContext() override;
robertphillips2334fb62015-06-17 05:43:33 -070060
Robert Phillipse4643cc2018-08-14 13:01:29 -040061 virtual void drawGlyphRunList(const GrClip&, const SkMatrix& viewMatrix, const SkGlyphRunList&);
robertphillipsea461502015-05-26 11:38:03 -070062
robertphillipsea461502015-05-26 11:38:03 -070063 /**
64 * Provides a perfomance hint that the render target's contents are allowed
65 * to become undefined.
66 */
robertphillips2e1e51f2015-10-15 08:01:48 -070067 void discard();
robertphillipsea461502015-05-26 11:38:03 -070068
Chris Dalton344e9032017-12-11 15:42:09 -070069 enum class CanClearFullscreen : bool {
70 kNo = false,
71 kYes = true
72 };
73
robertphillipsea461502015-05-26 11:38:03 -070074 /**
75 * Clear the entire or rect of the render target, ignoring any clips.
robertphillipsea461502015-05-26 11:38:03 -070076 * @param rect the rect to clear or the whole thing if rect is NULL.
77 * @param color the color to clear to.
Chris Dalton344e9032017-12-11 15:42:09 -070078 * @param CanClearFullscreen allows partial clears to be converted to fullscreen clears on
79 * tiling platforms where that is an optimization.
robertphillipsea461502015-05-26 11:38:03 -070080 */
Brian Osman9a9baae2018-11-05 15:06:26 -050081 void clear(const SkIRect* rect, const SkPMColor4f& color, CanClearFullscreen);
robertphillipsea461502015-05-26 11:38:03 -070082
83 /**
84 * Draw everywhere (respecting the clip) with the paint.
85 */
Brian Salomon82f44312017-01-11 13:42:54 -050086 void drawPaint(const GrClip&, GrPaint&&, const SkMatrix& viewMatrix);
robertphillipsea461502015-05-26 11:38:03 -070087
88 /**
Brian Salomon0e8fc8b2016-12-09 15:10:07 -050089 * Draw the rect using a paint.
90 * @param paint describes how to color pixels.
91 * @param GrAA Controls whether rect is antialiased
92 * @param viewMatrix transformation matrix
93 * @param style The style to apply. Null means fill. Currently path effects are not
94 * allowed.
95 * The rects coords are used to access the paint (through texture matrix)
robertphillipsea461502015-05-26 11:38:03 -070096 */
robertphillips2e1e51f2015-10-15 08:01:48 -070097 void drawRect(const GrClip&,
Brian Salomon82f44312017-01-11 13:42:54 -050098 GrPaint&& paint,
Brian Salomon0e8fc8b2016-12-09 15:10:07 -050099 GrAA,
robertphillipsea461502015-05-26 11:38:03 -0700100 const SkMatrix& viewMatrix,
101 const SkRect&,
Brian Salomon82f44312017-01-11 13:42:54 -0500102 const GrStyle* style = nullptr);
robertphillipsea461502015-05-26 11:38:03 -0700103
104 /**
bsalomona2e69fc2015-11-05 10:41:43 -0800105 * Maps a rectangle of shader coordinates to a rectangle and fills that rectangle.
robertphillipsea461502015-05-26 11:38:03 -0700106 *
Brian Salomon0e8fc8b2016-12-09 15:10:07 -0500107 * @param paint describes how to color pixels.
108 * @param GrAA Controls whether rect is antialiased
109 * @param viewMatrix transformation matrix which applies to rectToDraw
110 * @param rectToDraw the rectangle to draw
111 * @param localRect the rectangle of shader coordinates applied to rectToDraw
robertphillipsea461502015-05-26 11:38:03 -0700112 */
bsalomona2e69fc2015-11-05 10:41:43 -0800113 void fillRectToRect(const GrClip&,
Brian Salomon82f44312017-01-11 13:42:54 -0500114 GrPaint&& paint,
Brian Salomon0e8fc8b2016-12-09 15:10:07 -0500115 GrAA,
bsalomona2e69fc2015-11-05 10:41:43 -0800116 const SkMatrix& viewMatrix,
117 const SkRect& rectToDraw,
118 const SkRect& localRect);
robertphillipsea461502015-05-26 11:38:03 -0700119
120 /**
bsalomona2e69fc2015-11-05 10:41:43 -0800121 * Fills a rect with a paint and a localMatrix.
robertphillipsea461502015-05-26 11:38:03 -0700122 */
bsalomona2e69fc2015-11-05 10:41:43 -0800123 void fillRectWithLocalMatrix(const GrClip& clip,
Brian Salomon82f44312017-01-11 13:42:54 -0500124 GrPaint&& paint,
Brian Salomon0e8fc8b2016-12-09 15:10:07 -0500125 GrAA,
bsalomona2e69fc2015-11-05 10:41:43 -0800126 const SkMatrix& viewMatrix,
127 const SkRect& rect,
128 const SkMatrix& localMatrix);
robertphillipsea461502015-05-26 11:38:03 -0700129
Michael Ludwig75451902019-01-23 11:14:29 -0500130 /**
131 * Creates an op that draws a fill rect with per-edge control over anti-aliasing.
132 */
133 void fillRectWithEdgeAA(const GrClip& clip, GrPaint&& paint, GrQuadAAFlags edgeAA,
134 const SkMatrix& viewMatrix, const SkRect& rect);
135
Michael Ludwig69858532018-11-28 15:34:34 -0500136 /** Used with drawQuadSet */
137 struct QuadSetEntry {
138 SkRect fRect;
139 SkPMColor4f fColor; // Overrides any color on the GrPaint
140 SkMatrix fLocalMatrix;
141 GrQuadAAFlags fAAFlags;
142 };
143
Michael Ludwig75451902019-01-23 11:14:29 -0500144 // TODO(michaelludwig) - remove if the bulk API is not useful for SkiaRenderer
Michael Ludwig69858532018-11-28 15:34:34 -0500145 void drawQuadSet(const GrClip& clip, GrPaint&& paint, GrAA aa, const SkMatrix& viewMatrix,
146 const QuadSetEntry[], int cnt);
147
robertphillipsea461502015-05-26 11:38:03 -0700148 /**
Brian Salomon34169692017-08-28 15:32:01 -0400149 * Creates an op that draws a subrectangle of a texture. The passed color is modulated by the
150 * texture's color. 'srcRect' specifies the rectangle of the texture to draw. 'dstRect'
151 * specifies the rectangle to draw in local coords which will be transformed by 'viewMatrix' to
Brian Salomonbe3c1d22018-05-21 12:54:39 -0400152 * device space.
Brian Salomon34169692017-08-28 15:32:01 -0400153 */
Brian Osman3d139a42018-11-19 10:42:10 -0500154 void drawTexture(const GrClip& clip, sk_sp<GrTextureProxy>, GrSamplerState::Filter,
155 const SkPMColor4f&, const SkRect& srcRect, const SkRect& dstRect,
156 GrQuadAAFlags, SkCanvas::SrcRectConstraint, const SkMatrix& viewMatrix,
157 sk_sp<GrColorSpaceXform> texXform);
Brian Salomon34169692017-08-28 15:32:01 -0400158
Brian Salomond7065e72018-10-12 11:42:02 -0400159 /** Used with drawTextureSet */
160 struct TextureSetEntry {
161 sk_sp<GrTextureProxy> fProxy;
162 SkRect fSrcRect;
163 SkRect fDstRect;
Brian Salomon1da5cad2018-11-21 09:21:18 -0500164 float fAlpha;
Brian Salomond7065e72018-10-12 11:42:02 -0400165 GrQuadAAFlags fAAFlags;
166 };
167 /**
168 * Draws a set of textures with a shared filter, color, view matrix, color xform, and
169 * texture color xform. The textures must all have the same GrTextureType and GrConfig.
170 */
171 void drawTextureSet(const GrClip&, const TextureSetEntry[], int cnt, GrSamplerState::Filter,
Michael Ludwiga3c45c72019-01-17 17:26:48 -0500172 SkBlendMode mode, const SkMatrix& viewMatrix,
173 sk_sp<GrColorSpaceXform> texXform);
Brian Salomond7065e72018-10-12 11:42:02 -0400174
Brian Salomon34169692017-08-28 15:32:01 -0400175 /**
Brian Salomon0e8fc8b2016-12-09 15:10:07 -0500176 * Draw a roundrect using a paint.
robertphillipsea461502015-05-26 11:38:03 -0700177 *
Brian Salomon0e8fc8b2016-12-09 15:10:07 -0500178 * @param paint describes how to color pixels.
179 * @param GrAA Controls whether rrect is antialiased.
180 * @param viewMatrix transformation matrix
181 * @param rrect the roundrect to draw
182 * @param style style to apply to the rrect. Currently path effects are not allowed.
robertphillipsea461502015-05-26 11:38:03 -0700183 */
robertphillips2e1e51f2015-10-15 08:01:48 -0700184 void drawRRect(const GrClip&,
Brian Salomon82f44312017-01-11 13:42:54 -0500185 GrPaint&&,
Brian Salomon0e8fc8b2016-12-09 15:10:07 -0500186 GrAA,
robertphillipsea461502015-05-26 11:38:03 -0700187 const SkMatrix& viewMatrix,
188 const SkRRect& rrect,
bsalomon6663acf2016-05-10 09:14:17 -0700189 const GrStyle& style);
robertphillipsea461502015-05-26 11:38:03 -0700190
191 /**
Jim Van Verth3af1af92017-05-18 15:06:54 -0400192 * Use a fast method to render the ambient and spot shadows for a path.
193 * Will return false if not possible for the given path.
Jim Van Verthc5903412016-11-17 15:27:09 -0500194 *
Brian Salomon0e8fc8b2016-12-09 15:10:07 -0500195 * @param viewMatrix transformation matrix
Jim Van Verth3af1af92017-05-18 15:06:54 -0400196 * @param path the path to shadow
197 * @param rec parameters for shadow rendering
Jim Van Verthc5903412016-11-17 15:27:09 -0500198 */
Jim Van Verth3af1af92017-05-18 15:06:54 -0400199 bool drawFastShadow(const GrClip&,
Jim Van Verth3af1af92017-05-18 15:06:54 -0400200 const SkMatrix& viewMatrix,
201 const SkPath& path,
202 const SkDrawShadowRec& rec);
Jim Van Verthc5903412016-11-17 15:27:09 -0500203
204 /**
Brian Salomon0e8fc8b2016-12-09 15:10:07 -0500205 * Shortcut for filling a SkPath consisting of nested rrects using a paint. The result is
206 * undefined if outer does not contain inner.
robertphillips00095892016-02-29 13:50:40 -0800207 *
Brian Salomon0e8fc8b2016-12-09 15:10:07 -0500208 * @param paint describes how to color pixels.
209 * @param GrAA Controls whether rrects edges are antialiased
210 * @param viewMatrix transformation matrix
211 * @param outer the outer roundrect
212 * @param inner the inner roundrect
robertphillips00095892016-02-29 13:50:40 -0800213 */
214 void drawDRRect(const GrClip&,
Brian Salomon82f44312017-01-11 13:42:54 -0500215 GrPaint&&,
Brian Salomon0e8fc8b2016-12-09 15:10:07 -0500216 GrAA,
robertphillips00095892016-02-29 13:50:40 -0800217 const SkMatrix& viewMatrix,
218 const SkRRect& outer,
219 const SkRRect& inner);
220
221 /**
robertphillipsea461502015-05-26 11:38:03 -0700222 * Draws a path.
223 *
224 * @param paint describes how to color pixels.
Brian Salomon0e8fc8b2016-12-09 15:10:07 -0500225 * @param GrAA Controls whether the path is antialiased.
robertphillipsea461502015-05-26 11:38:03 -0700226 * @param viewMatrix transformation matrix
227 * @param path the path to draw
bsalomon6663acf2016-05-10 09:14:17 -0700228 * @param style style to apply to the path.
robertphillipsea461502015-05-26 11:38:03 -0700229 */
robertphillips2e1e51f2015-10-15 08:01:48 -0700230 void drawPath(const GrClip&,
Brian Salomon82f44312017-01-11 13:42:54 -0500231 GrPaint&&,
Brian Salomon0e8fc8b2016-12-09 15:10:07 -0500232 GrAA,
robertphillipsea461502015-05-26 11:38:03 -0700233 const SkMatrix& viewMatrix,
234 const SkPath&,
Robert Phillips20390c32018-08-17 11:01:03 -0400235 const GrStyle&);
236
237 /**
238 * Draws a shape.
239 *
240 * @param paint describes how to color pixels.
241 * @param GrAA Controls whether the path is antialiased.
242 * @param viewMatrix transformation matrix
243 * @param shape the shape to draw
244 */
245 void drawShape(const GrClip&,
246 GrPaint&&,
247 GrAA,
248 const SkMatrix& viewMatrix,
249 const GrShape&);
250
robertphillipsea461502015-05-26 11:38:03 -0700251
252 /**
253 * Draws vertices with a paint.
254 *
Brian Osmanae0c50c2017-05-25 16:56:34 -0400255 * @param paint describes how to color pixels.
256 * @param viewMatrix transformation matrix
257 * @param vertices specifies the mesh to draw.
Ruiqi Mao4ec72f72018-07-10 17:21:07 -0400258 * @param bones bone deformation matrices.
259 * @param boneCount number of bone matrices.
Brian Osmanae0c50c2017-05-25 16:56:34 -0400260 * @param overridePrimType primitive type to draw. If NULL, derive prim type from vertices.
robertphillipsea461502015-05-26 11:38:03 -0700261 */
robertphillips2e1e51f2015-10-15 08:01:48 -0700262 void drawVertices(const GrClip&,
Brian Salomon82f44312017-01-11 13:42:54 -0500263 GrPaint&& paint,
robertphillipsea461502015-05-26 11:38:03 -0700264 const SkMatrix& viewMatrix,
Brian Osmanae0c50c2017-05-25 16:56:34 -0400265 sk_sp<SkVertices> vertices,
Ruiqi Maoc97a3392018-08-15 10:44:19 -0400266 const SkVertices::Bone bones[],
Ruiqi Mao4ec72f72018-07-10 17:21:07 -0400267 int boneCount,
Brian Osmanae0c50c2017-05-25 16:56:34 -0400268 GrPrimitiveType* overridePrimType = nullptr);
Brian Salomon199fb872017-02-06 09:41:10 -0500269
270 /**
Brian Salomon0e8fc8b2016-12-09 15:10:07 -0500271 * Draws textured sprites from an atlas with a paint. This currently does not support AA for the
272 * sprite rectangle edges.
jvanverth31ff7622015-08-07 10:09:28 -0700273 *
274 * @param paint describes how to color pixels.
275 * @param viewMatrix transformation matrix
276 * @param spriteCount number of sprites.
277 * @param xform array of compressed transformation data, required.
278 * @param texRect array of texture rectangles used to access the paint.
279 * @param colors optional array of per-sprite colors, supercedes
280 * the paint's color field.
281 */
robertphillips2e1e51f2015-10-15 08:01:48 -0700282 void drawAtlas(const GrClip&,
Brian Salomon82f44312017-01-11 13:42:54 -0500283 GrPaint&& paint,
jvanverth31ff7622015-08-07 10:09:28 -0700284 const SkMatrix& viewMatrix,
285 int spriteCount,
286 const SkRSXform xform[],
287 const SkRect texRect[],
288 const SkColor colors[]);
msarettcc319b92016-08-25 18:07:18 -0700289
290 /**
291 * Draws a region.
292 *
293 * @param paint describes how to color pixels
294 * @param viewMatrix transformation matrix
Brian Salomon0e8fc8b2016-12-09 15:10:07 -0500295 * @param aa should the rects of the region be antialiased.
msarettcc319b92016-08-25 18:07:18 -0700296 * @param region the region to be drawn
297 * @param style style to apply to the region
298 */
299 void drawRegion(const GrClip&,
Brian Salomon82f44312017-01-11 13:42:54 -0500300 GrPaint&& paint,
Brian Salomon0e8fc8b2016-12-09 15:10:07 -0500301 GrAA aa,
msarettcc319b92016-08-25 18:07:18 -0700302 const SkMatrix& viewMatrix,
303 const SkRegion& region,
Stan Iliev73d8fd92017-08-02 15:36:24 -0400304 const GrStyle& style,
305 const GrUserStencilSettings* ss = nullptr);
msarettcc319b92016-08-25 18:07:18 -0700306
jvanverth31ff7622015-08-07 10:09:28 -0700307 /**
robertphillipsea461502015-05-26 11:38:03 -0700308 * Draws an oval.
309 *
310 * @param paint describes how to color pixels.
Brian Salomon0e8fc8b2016-12-09 15:10:07 -0500311 * @param GrAA Controls whether the oval is antialiased.
robertphillipsea461502015-05-26 11:38:03 -0700312 * @param viewMatrix transformation matrix
313 * @param oval the bounding rect of the oval.
bsalomon6663acf2016-05-10 09:14:17 -0700314 * @param style style to apply to the oval. Currently path effects are not allowed.
robertphillipsea461502015-05-26 11:38:03 -0700315 */
robertphillips2e1e51f2015-10-15 08:01:48 -0700316 void drawOval(const GrClip&,
Brian Salomon82f44312017-01-11 13:42:54 -0500317 GrPaint&& paint,
Brian Salomon0e8fc8b2016-12-09 15:10:07 -0500318 GrAA,
robertphillipsea461502015-05-26 11:38:03 -0700319 const SkMatrix& viewMatrix,
320 const SkRect& oval,
bsalomon6663acf2016-05-10 09:14:17 -0700321 const GrStyle& style);
Brian Salomon0e8fc8b2016-12-09 15:10:07 -0500322 /**
323 * Draws a partial arc of an oval.
324 *
325 * @param paint describes how to color pixels.
Brian Salomon99504082016-12-09 15:51:31 -0500326 * @param GrGrAA Controls whether the arc is antialiased.
Brian Salomon0e8fc8b2016-12-09 15:10:07 -0500327 * @param viewMatrix transformation matrix.
328 * @param oval the bounding rect of the oval.
329 * @param startAngle starting angle in degrees.
330 * @param sweepAngle angle to sweep in degrees. Must be in (-360, 360)
331 * @param useCenter true means that the implied path begins at the oval center, connects as
332 * a line to the point indicated by the start contains the arc indicated by
333 * the sweep angle. If false the line beginning at the center point is
334 * omitted.
335 * @param style style to apply to the oval.
336 */
bsalomon4f3a0ca2016-08-22 13:14:26 -0700337 void drawArc(const GrClip&,
Brian Salomon82f44312017-01-11 13:42:54 -0500338 GrPaint&& paint,
Brian Salomon0e8fc8b2016-12-09 15:10:07 -0500339 GrAA,
bsalomon4f3a0ca2016-08-22 13:14:26 -0700340 const SkMatrix& viewMatrix,
341 const SkRect& oval,
342 SkScalar startAngle,
343 SkScalar sweepAngle,
344 bool useCenter,
345 const GrStyle& style);
robertphillipsea461502015-05-26 11:38:03 -0700346
joshualitt33a5fce2015-11-18 13:28:51 -0800347 /**
bsalomon4f3a0ca2016-08-22 13:14:26 -0700348 * Draw the image as a set of rects, specified by |iter|.
joshualitt33a5fce2015-11-18 13:28:51 -0800349 */
msarett10e3d9b2016-08-18 15:46:03 -0700350 void drawImageLattice(const GrClip&,
Brian Salomon2a943df2018-05-04 13:43:19 -0400351 GrPaint&&,
msarett10e3d9b2016-08-18 15:46:03 -0700352 const SkMatrix& viewMatrix,
Brian Salomon2a943df2018-05-04 13:43:19 -0400353 sk_sp<GrTextureProxy>,
354 sk_sp<GrColorSpaceXform>,
355 GrSamplerState::Filter,
356 std::unique_ptr<SkLatticeIter>,
msarett10e3d9b2016-08-18 15:46:03 -0700357 const SkRect& dst);
robertphillipsea461502015-05-26 11:38:03 -0700358
robertphillips8c523e02016-07-26 07:41:00 -0700359 /**
Greg Daniel64cc9aa2018-10-19 13:54:56 -0400360 * Adds the necessary signal and wait semaphores and adds the passed in SkDrawable to the
361 * command stream.
362 */
363 void drawDrawable(std::unique_ptr<SkDrawable::GpuDrawHandler>, const SkRect& bounds);
364
365 /**
robertphillips8c523e02016-07-26 07:41:00 -0700366 * After this returns any pending surface IO will be issued to the backend 3D API and
367 * if the surface has MSAA it will be resolved.
368 */
Greg Daniel51316782017-08-02 15:10:09 +0000369 GrSemaphoresSubmitted prepareForExternalIO(int numSemaphores,
370 GrBackendSemaphore backendSemaphores[]);
Greg Daniela5cb7812017-06-16 09:45:32 -0400371
372 /**
373 * The next time this GrRenderTargetContext is flushed, the gpu will wait on the passed in
374 * semaphores before executing any commands.
375 */
Greg Danielc64ee462017-06-15 16:59:49 -0400376 bool waitOnSemaphores(int numSemaphores, const GrBackendSemaphore* waitSemaphores);
robertphillips8c523e02016-07-26 07:41:00 -0700377
Robert Phillips65a88fa2017-08-08 08:36:22 -0400378 void insertEventMarker(const SkString&);
379
Brian Salomon7c8460e2017-05-12 11:36:10 -0400380 GrFSAAType fsaaType() const { return fRenderTargetProxy->fsaaType(); }
Robert Phillips9da87e02019-02-04 13:26:26 -0500381 const GrCaps* caps() const { return fContext->priv().caps(); }
Robert Phillipsc7635fa2016-10-28 13:25:24 -0400382 int width() const { return fRenderTargetProxy->width(); }
383 int height() const { return fRenderTargetProxy->height(); }
Robert Phillipsc7635fa2016-10-28 13:25:24 -0400384 int numColorSamples() const { return fRenderTargetProxy->numColorSamples(); }
Brian Salomon50e66d42017-05-15 16:28:07 -0400385 int numStencilSamples() const { return fRenderTargetProxy->numStencilSamples(); }
robertphillipsca6eafc2016-05-17 09:57:46 -0700386 const SkSurfaceProps& surfaceProps() const { return fSurfaceProps; }
Robert Phillipsc7635fa2016-10-28 13:25:24 -0400387 GrSurfaceOrigin origin() const { return fRenderTargetProxy->origin(); }
Greg Danielb46add82019-01-02 14:51:29 -0500388 bool wrapsVkSecondaryCB() const { return fRenderTargetProxy->wrapsVkSecondaryCB(); }
Greg Daniele252f082017-10-23 16:05:23 -0400389 GrMipMapped mipMapped() const;
robertphillips7bceedc2015-12-01 12:51:26 -0800390
Robert Phillips65048132017-08-10 08:44:49 -0400391 void setNeedsStencil() { fRenderTargetProxy->setNeedsStencil(); }
392
Robert Phillipsc7635fa2016-10-28 13:25:24 -0400393 GrRenderTarget* accessRenderTarget() {
394 // TODO: usage of this entry point needs to be reduced and potentially eliminated
395 // since it ends the deferral of the GrRenderTarget's allocation
Robert Phillips9da87e02019-02-04 13:26:26 -0500396 if (!fRenderTargetProxy->instantiate(fContext->priv().resourceProvider())) {
Robert Phillipseee4d6e2017-06-05 09:26:07 -0400397 return nullptr;
398 }
Brian Salomonfd98c2c2018-07-31 17:25:29 -0400399 return fRenderTargetProxy->peekRenderTarget();
Robert Phillipsc7635fa2016-10-28 13:25:24 -0400400 }
robertphillips6c7e3252016-04-27 10:47:51 -0700401
Robert Phillipsf200a902017-01-30 13:27:37 -0500402 GrSurfaceProxy* asSurfaceProxy() override { return fRenderTargetProxy.get(); }
403 const GrSurfaceProxy* asSurfaceProxy() const override { return fRenderTargetProxy.get(); }
404 sk_sp<GrSurfaceProxy> asSurfaceProxyRef() override { return fRenderTargetProxy; }
405
406 GrTextureProxy* asTextureProxy() override;
Greg Daniele252f082017-10-23 16:05:23 -0400407 const GrTextureProxy* asTextureProxy() const override;
Robert Phillipsf200a902017-01-30 13:27:37 -0500408 sk_sp<GrTextureProxy> asTextureProxyRef() override;
409
410 GrRenderTargetProxy* asRenderTargetProxy() override { return fRenderTargetProxy.get(); }
411 sk_sp<GrRenderTargetProxy> asRenderTargetProxyRef() override { return fRenderTargetProxy; }
Robert Phillipseaa86252016-11-08 13:49:39 +0000412
Robert Phillipsd46697a2017-01-25 12:10:37 -0500413 GrRenderTargetContext* asRenderTargetContext() override { return this; }
414
robertphillips391395d2016-03-02 09:26:36 -0800415 // Provides access to functions that aren't part of the public API.
Brian Osman693a5402016-10-27 15:13:22 -0400416 GrRenderTargetContextPriv priv();
417 const GrRenderTargetContextPriv priv() const;
joshualittf5883a62016-01-13 07:47:38 -0800418
Herb Derbyc1b482c2018-08-09 15:02:27 -0400419 GrTextTarget* textTarget() { return fTextTarget.get(); }
Brian Salomonf18b1d82017-10-27 11:30:49 -0400420
Robert Phillipseaa86252016-11-08 13:49:39 +0000421 bool isWrapped_ForTesting() const;
422
joshualitt96880d92016-02-16 10:36:53 -0800423protected:
Robert Phillipsc7635fa2016-10-28 13:25:24 -0400424 GrRenderTargetContext(GrContext*, GrDrawingManager*, sk_sp<GrRenderTargetProxy>,
Robert Phillips2c862492017-01-18 10:08:39 -0500425 sk_sp<SkColorSpace>, const SkSurfaceProps*, GrAuditTrail*,
Robert Phillips941d1442017-06-14 16:37:02 -0400426 GrSingleOwner*, bool managedOpList = true);
joshualitt96880d92016-02-16 10:36:53 -0800427
Robert Phillips2de8cfa2017-06-28 10:33:41 -0400428 SkDEBUGCODE(void validate() const override;)
joshualitt96880d92016-02-16 10:36:53 -0800429
robertphillipsea461502015-05-26 11:38:03 -0700430private:
Brian Salomonf18b1d82017-10-27 11:30:49 -0400431 class TextTarget;
432
Brian Salomonea26d6b2018-01-23 20:33:21 +0000433 inline GrAAType chooseAAType(GrAA aa, GrAllowMixedSamples allowMixedSamples) {
434 return GrChooseAAType(aa, this->fsaaType(), allowMixedSamples, *this->caps());
Brian Salomon0e8fc8b2016-12-09 15:10:07 -0500435 }
436
Brian Salomon649a3412017-03-09 13:50:43 -0500437 friend class GrAtlasTextBlob; // for access to add[Mesh]DrawOp
Brian Osman5d034742017-09-11 13:38:55 -0400438 friend class GrClipStackClip; // for access to getOpList
robertphillips55fdccc2016-06-06 06:16:20 -0700439
robertphillips77a2e522015-10-17 07:43:27 -0700440 friend class GrDrawingManager; // for ctor
Brian Osman11052242016-10-27 14:47:55 -0400441 friend class GrRenderTargetContextPriv;
robertphillips976f5f02016-06-03 10:59:20 -0700442
Brian Salomon42521e82016-12-07 16:44:58 -0500443 // All the path renderers currently make their own ops
Brian Salomon649a3412017-03-09 13:50:43 -0500444 friend class GrSoftwarePathRenderer; // for access to add[Mesh]DrawOp
445 friend class GrAAConvexPathRenderer; // for access to add[Mesh]DrawOp
446 friend class GrDashLinePathRenderer; // for access to add[Mesh]DrawOp
447 friend class GrAAHairLinePathRenderer; // for access to add[Mesh]DrawOp
448 friend class GrAALinearizingConvexPathRenderer; // for access to add[Mesh]DrawOp
Jim Van Verth83010462017-03-16 08:45:39 -0400449 friend class GrSmallPathRenderer; // for access to add[Mesh]DrawOp
Brian Salomon649a3412017-03-09 13:50:43 -0500450 friend class GrDefaultPathRenderer; // for access to add[Mesh]DrawOp
Brian Salomon649a3412017-03-09 13:50:43 -0500451 friend class GrStencilAndCoverPathRenderer; // for access to add[Mesh]DrawOp
452 friend class GrTessellatingPathRenderer; // for access to add[Mesh]DrawOp
Chris Dalton9414c962018-06-14 10:14:50 -0600453 friend class GrCCPerFlushResources; // for access to addDrawOp
Chris Dalton1a325d22017-07-14 15:17:41 -0600454 friend class GrCoverageCountingPathRenderer; // for access to addDrawOp
Brian Salomon5d4cd9e2017-02-09 11:16:46 -0500455 // for a unit test
Robert Phillips7c525e62018-06-12 10:11:12 -0400456 friend void test_draw_op(GrContext*,
457 GrRenderTargetContext*,
458 std::unique_ptr<GrFragmentProcessor>,
Brian Salomonaff329b2017-08-11 09:40:37 -0400459 sk_sp<GrTextureProxy>);
robertphillipsea461502015-05-26 11:38:03 -0700460
Brian Osman9a9baae2018-11-05 15:06:26 -0500461 void internalClear(const GrFixedClip&, const SkPMColor4f&, CanClearFullscreen);
Michael Ludwigc39d0c82019-01-15 10:03:43 -0500462 void internalStencilClear(const GrFixedClip&, bool insideStencilMask);
csmartdalton29df7602016-08-31 11:55:52 -0700463
Brian Salomon82f44312017-01-11 13:42:54 -0500464 // Only consumes the GrPaint if successful.
robertphillips00095892016-02-29 13:50:40 -0800465 bool drawFilledDRRect(const GrClip& clip,
Brian Salomon82f44312017-01-11 13:42:54 -0500466 GrPaint&& paint,
Brian Salomon0e8fc8b2016-12-09 15:10:07 -0500467 GrAA,
robertphillips00095892016-02-29 13:50:40 -0800468 const SkMatrix& viewMatrix,
469 const SkRRect& origOuter,
470 const SkRRect& origInner);
471
Michael Ludwig61a16512019-01-15 11:15:13 -0500472 void drawFilledRect(const GrClip& clip,
Brian Salomon82f44312017-01-11 13:42:54 -0500473 GrPaint&& paint,
Brian Salomon0e8fc8b2016-12-09 15:10:07 -0500474 GrAA,
robertphillips44302392016-07-08 14:43:03 -0700475 const SkMatrix& viewMatrix,
476 const SkRect& rect,
Michael Ludwig61a16512019-01-15 11:15:13 -0500477 const GrUserStencilSettings* ss = nullptr);
478
479 // Only consumes the GrPaint if successful.
480 bool drawFilledRectAsClear(const GrClip& clip,
481 GrPaint&& paint,
482 GrAA aa,
483 const SkMatrix& viewMatrix,
484 const SkRect& rect);
robertphillips44302392016-07-08 14:43:03 -0700485
Brian Salomon2fad74a2017-12-20 13:28:55 -0500486 void drawShapeUsingPathRenderer(const GrClip&, GrPaint&&, GrAA, const SkMatrix&,
487 const GrShape&);
robertphillipsea461502015-05-26 11:38:03 -0700488
Brian Salomon348a0372018-10-31 10:42:18 -0400489 // Allows caller of addDrawOp to know which op list an op will be added to.
490 using WillAddOpFn = void(GrOp*, uint32_t opListID);
491 // These perform processing specific to GrDrawOp-derived ops before recording them into an
492 // op list. Before adding the op to an op list the WillAddOpFn is called. Note that it
493 // will not be called in the event that the op is discarded. Moreover, the op may merge into
494 // another op after the function is called (either before addDrawOp returns or some time later).
495 void addDrawOp(const GrClip&, std::unique_ptr<GrDrawOp>,
496 const std::function<WillAddOpFn>& = std::function<WillAddOpFn>());
robertphillips2334fb62015-06-17 05:43:33 -0700497
Robert Phillipsbf25d432017-04-07 10:08:53 -0400498 // Makes a copy of the proxy if it is necessary for the draw and places the texture that should
499 // be used by GrXferProcessor to access the destination color in 'result'. If the return
500 // value is false then a texture copy could not be made.
Robert Phillipsbb581ce2017-05-29 15:05:15 -0400501 bool SK_WARN_UNUSED_RESULT setupDstProxy(GrRenderTargetProxy*,
502 const GrClip&,
Brian Salomon09181ef2018-11-14 13:39:51 -0500503 const GrOp& op,
Robert Phillipsbb581ce2017-05-29 15:05:15 -0400504 GrXferProcessor::DstProxy* result);
Brian Salomon467921e2017-03-06 16:17:12 -0500505
Robert Phillips2de8cfa2017-06-28 10:33:41 -0400506 GrRenderTargetOpList* getRTOpList();
507 GrOpList* getOpList() override;
robertphillipsa106c622015-10-16 09:07:06 -0700508
Herb Derbyc1b482c2018-08-09 15:02:27 -0400509 std::unique_ptr<GrTextTarget> fTextTarget;
Brian Salomonf18b1d82017-10-27 11:30:49 -0400510 sk_sp<GrRenderTargetProxy> fRenderTargetProxy;
robertphillipsa106c622015-10-16 09:07:06 -0700511
Brian Osman11052242016-10-27 14:47:55 -0400512 // In MDB-mode the GrOpList can be closed by some other renderTargetContext that has picked
Robert Phillipsf2361d22016-10-25 14:20:06 -0400513 // it up. For this reason, the GrOpList should only ever be accessed via 'getOpList'.
Brian Salomonf18b1d82017-10-27 11:30:49 -0400514 sk_sp<GrRenderTargetOpList> fOpList;
robertphillips2334fb62015-06-17 05:43:33 -0700515
Brian Salomonf18b1d82017-10-27 11:30:49 -0400516 SkSurfaceProps fSurfaceProps;
517 bool fManagedOpList;
Robert Phillipse305cc1f2016-12-14 12:19:05 -0500518
519 typedef GrSurfaceContext INHERITED;
robertphillipsea461502015-05-26 11:38:03 -0700520};
521
522#endif