blob: f66acc520abec89d84e457cff88fda250557eb8b [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 Ludwig69858532018-11-28 15:34:34 -0500130 /** Used with drawQuadSet */
131 struct QuadSetEntry {
132 SkRect fRect;
133 SkPMColor4f fColor; // Overrides any color on the GrPaint
134 SkMatrix fLocalMatrix;
135 GrQuadAAFlags fAAFlags;
136 };
137
138 void drawQuadSet(const GrClip& clip, GrPaint&& paint, GrAA aa, const SkMatrix& viewMatrix,
139 const QuadSetEntry[], int cnt);
140
robertphillipsea461502015-05-26 11:38:03 -0700141 /**
Brian Salomon34169692017-08-28 15:32:01 -0400142 * Creates an op that draws a subrectangle of a texture. The passed color is modulated by the
143 * texture's color. 'srcRect' specifies the rectangle of the texture to draw. 'dstRect'
144 * specifies the rectangle to draw in local coords which will be transformed by 'viewMatrix' to
Brian Salomonbe3c1d22018-05-21 12:54:39 -0400145 * device space.
Brian Salomon34169692017-08-28 15:32:01 -0400146 */
Brian Osman3d139a42018-11-19 10:42:10 -0500147 void drawTexture(const GrClip& clip, sk_sp<GrTextureProxy>, GrSamplerState::Filter,
148 const SkPMColor4f&, const SkRect& srcRect, const SkRect& dstRect,
149 GrQuadAAFlags, SkCanvas::SrcRectConstraint, const SkMatrix& viewMatrix,
150 sk_sp<GrColorSpaceXform> texXform);
Brian Salomon34169692017-08-28 15:32:01 -0400151
Brian Salomond7065e72018-10-12 11:42:02 -0400152 /** Used with drawTextureSet */
153 struct TextureSetEntry {
154 sk_sp<GrTextureProxy> fProxy;
155 SkRect fSrcRect;
156 SkRect fDstRect;
Brian Salomon1da5cad2018-11-21 09:21:18 -0500157 float fAlpha;
Brian Salomond7065e72018-10-12 11:42:02 -0400158 GrQuadAAFlags fAAFlags;
159 };
160 /**
161 * Draws a set of textures with a shared filter, color, view matrix, color xform, and
162 * texture color xform. The textures must all have the same GrTextureType and GrConfig.
163 */
164 void drawTextureSet(const GrClip&, const TextureSetEntry[], int cnt, GrSamplerState::Filter,
Brian Salomond003d222018-11-26 13:25:05 -0500165 const SkMatrix& viewMatrix, sk_sp<GrColorSpaceXform> texXform);
Brian Salomond7065e72018-10-12 11:42:02 -0400166
Brian Salomon34169692017-08-28 15:32:01 -0400167 /**
Brian Salomon0e8fc8b2016-12-09 15:10:07 -0500168 * Draw a roundrect using a paint.
robertphillipsea461502015-05-26 11:38:03 -0700169 *
Brian Salomon0e8fc8b2016-12-09 15:10:07 -0500170 * @param paint describes how to color pixels.
171 * @param GrAA Controls whether rrect is antialiased.
172 * @param viewMatrix transformation matrix
173 * @param rrect the roundrect to draw
174 * @param style style to apply to the rrect. Currently path effects are not allowed.
robertphillipsea461502015-05-26 11:38:03 -0700175 */
robertphillips2e1e51f2015-10-15 08:01:48 -0700176 void drawRRect(const GrClip&,
Brian Salomon82f44312017-01-11 13:42:54 -0500177 GrPaint&&,
Brian Salomon0e8fc8b2016-12-09 15:10:07 -0500178 GrAA,
robertphillipsea461502015-05-26 11:38:03 -0700179 const SkMatrix& viewMatrix,
180 const SkRRect& rrect,
bsalomon6663acf2016-05-10 09:14:17 -0700181 const GrStyle& style);
robertphillipsea461502015-05-26 11:38:03 -0700182
183 /**
Jim Van Verth3af1af92017-05-18 15:06:54 -0400184 * Use a fast method to render the ambient and spot shadows for a path.
185 * Will return false if not possible for the given path.
Jim Van Verthc5903412016-11-17 15:27:09 -0500186 *
Brian Salomon0e8fc8b2016-12-09 15:10:07 -0500187 * @param viewMatrix transformation matrix
Jim Van Verth3af1af92017-05-18 15:06:54 -0400188 * @param path the path to shadow
189 * @param rec parameters for shadow rendering
Jim Van Verthc5903412016-11-17 15:27:09 -0500190 */
Jim Van Verth3af1af92017-05-18 15:06:54 -0400191 bool drawFastShadow(const GrClip&,
Jim Van Verth3af1af92017-05-18 15:06:54 -0400192 const SkMatrix& viewMatrix,
193 const SkPath& path,
194 const SkDrawShadowRec& rec);
Jim Van Verthc5903412016-11-17 15:27:09 -0500195
196 /**
Brian Salomon0e8fc8b2016-12-09 15:10:07 -0500197 * Shortcut for filling a SkPath consisting of nested rrects using a paint. The result is
198 * undefined if outer does not contain inner.
robertphillips00095892016-02-29 13:50:40 -0800199 *
Brian Salomon0e8fc8b2016-12-09 15:10:07 -0500200 * @param paint describes how to color pixels.
201 * @param GrAA Controls whether rrects edges are antialiased
202 * @param viewMatrix transformation matrix
203 * @param outer the outer roundrect
204 * @param inner the inner roundrect
robertphillips00095892016-02-29 13:50:40 -0800205 */
206 void drawDRRect(const GrClip&,
Brian Salomon82f44312017-01-11 13:42:54 -0500207 GrPaint&&,
Brian Salomon0e8fc8b2016-12-09 15:10:07 -0500208 GrAA,
robertphillips00095892016-02-29 13:50:40 -0800209 const SkMatrix& viewMatrix,
210 const SkRRect& outer,
211 const SkRRect& inner);
212
213 /**
robertphillipsea461502015-05-26 11:38:03 -0700214 * Draws a path.
215 *
216 * @param paint describes how to color pixels.
Brian Salomon0e8fc8b2016-12-09 15:10:07 -0500217 * @param GrAA Controls whether the path is antialiased.
robertphillipsea461502015-05-26 11:38:03 -0700218 * @param viewMatrix transformation matrix
219 * @param path the path to draw
bsalomon6663acf2016-05-10 09:14:17 -0700220 * @param style style to apply to the path.
robertphillipsea461502015-05-26 11:38:03 -0700221 */
robertphillips2e1e51f2015-10-15 08:01:48 -0700222 void drawPath(const GrClip&,
Brian Salomon82f44312017-01-11 13:42:54 -0500223 GrPaint&&,
Brian Salomon0e8fc8b2016-12-09 15:10:07 -0500224 GrAA,
robertphillipsea461502015-05-26 11:38:03 -0700225 const SkMatrix& viewMatrix,
226 const SkPath&,
Robert Phillips20390c32018-08-17 11:01:03 -0400227 const GrStyle&);
228
229 /**
230 * Draws a shape.
231 *
232 * @param paint describes how to color pixels.
233 * @param GrAA Controls whether the path is antialiased.
234 * @param viewMatrix transformation matrix
235 * @param shape the shape to draw
236 */
237 void drawShape(const GrClip&,
238 GrPaint&&,
239 GrAA,
240 const SkMatrix& viewMatrix,
241 const GrShape&);
242
robertphillipsea461502015-05-26 11:38:03 -0700243
244 /**
245 * Draws vertices with a paint.
246 *
Brian Osmanae0c50c2017-05-25 16:56:34 -0400247 * @param paint describes how to color pixels.
248 * @param viewMatrix transformation matrix
249 * @param vertices specifies the mesh to draw.
Ruiqi Mao4ec72f72018-07-10 17:21:07 -0400250 * @param bones bone deformation matrices.
251 * @param boneCount number of bone matrices.
Brian Osmanae0c50c2017-05-25 16:56:34 -0400252 * @param overridePrimType primitive type to draw. If NULL, derive prim type from vertices.
robertphillipsea461502015-05-26 11:38:03 -0700253 */
robertphillips2e1e51f2015-10-15 08:01:48 -0700254 void drawVertices(const GrClip&,
Brian Salomon82f44312017-01-11 13:42:54 -0500255 GrPaint&& paint,
robertphillipsea461502015-05-26 11:38:03 -0700256 const SkMatrix& viewMatrix,
Brian Osmanae0c50c2017-05-25 16:56:34 -0400257 sk_sp<SkVertices> vertices,
Ruiqi Maoc97a3392018-08-15 10:44:19 -0400258 const SkVertices::Bone bones[],
Ruiqi Mao4ec72f72018-07-10 17:21:07 -0400259 int boneCount,
Brian Osmanae0c50c2017-05-25 16:56:34 -0400260 GrPrimitiveType* overridePrimType = nullptr);
Brian Salomon199fb872017-02-06 09:41:10 -0500261
262 /**
Brian Salomon0e8fc8b2016-12-09 15:10:07 -0500263 * Draws textured sprites from an atlas with a paint. This currently does not support AA for the
264 * sprite rectangle edges.
jvanverth31ff7622015-08-07 10:09:28 -0700265 *
266 * @param paint describes how to color pixels.
267 * @param viewMatrix transformation matrix
268 * @param spriteCount number of sprites.
269 * @param xform array of compressed transformation data, required.
270 * @param texRect array of texture rectangles used to access the paint.
271 * @param colors optional array of per-sprite colors, supercedes
272 * the paint's color field.
273 */
robertphillips2e1e51f2015-10-15 08:01:48 -0700274 void drawAtlas(const GrClip&,
Brian Salomon82f44312017-01-11 13:42:54 -0500275 GrPaint&& paint,
jvanverth31ff7622015-08-07 10:09:28 -0700276 const SkMatrix& viewMatrix,
277 int spriteCount,
278 const SkRSXform xform[],
279 const SkRect texRect[],
280 const SkColor colors[]);
msarettcc319b92016-08-25 18:07:18 -0700281
282 /**
283 * Draws a region.
284 *
285 * @param paint describes how to color pixels
286 * @param viewMatrix transformation matrix
Brian Salomon0e8fc8b2016-12-09 15:10:07 -0500287 * @param aa should the rects of the region be antialiased.
msarettcc319b92016-08-25 18:07:18 -0700288 * @param region the region to be drawn
289 * @param style style to apply to the region
290 */
291 void drawRegion(const GrClip&,
Brian Salomon82f44312017-01-11 13:42:54 -0500292 GrPaint&& paint,
Brian Salomon0e8fc8b2016-12-09 15:10:07 -0500293 GrAA aa,
msarettcc319b92016-08-25 18:07:18 -0700294 const SkMatrix& viewMatrix,
295 const SkRegion& region,
Stan Iliev73d8fd92017-08-02 15:36:24 -0400296 const GrStyle& style,
297 const GrUserStencilSettings* ss = nullptr);
msarettcc319b92016-08-25 18:07:18 -0700298
jvanverth31ff7622015-08-07 10:09:28 -0700299 /**
robertphillipsea461502015-05-26 11:38:03 -0700300 * Draws an oval.
301 *
302 * @param paint describes how to color pixels.
Brian Salomon0e8fc8b2016-12-09 15:10:07 -0500303 * @param GrAA Controls whether the oval is antialiased.
robertphillipsea461502015-05-26 11:38:03 -0700304 * @param viewMatrix transformation matrix
305 * @param oval the bounding rect of the oval.
bsalomon6663acf2016-05-10 09:14:17 -0700306 * @param style style to apply to the oval. Currently path effects are not allowed.
robertphillipsea461502015-05-26 11:38:03 -0700307 */
robertphillips2e1e51f2015-10-15 08:01:48 -0700308 void drawOval(const GrClip&,
Brian Salomon82f44312017-01-11 13:42:54 -0500309 GrPaint&& paint,
Brian Salomon0e8fc8b2016-12-09 15:10:07 -0500310 GrAA,
robertphillipsea461502015-05-26 11:38:03 -0700311 const SkMatrix& viewMatrix,
312 const SkRect& oval,
bsalomon6663acf2016-05-10 09:14:17 -0700313 const GrStyle& style);
Brian Salomon0e8fc8b2016-12-09 15:10:07 -0500314 /**
315 * Draws a partial arc of an oval.
316 *
317 * @param paint describes how to color pixels.
Brian Salomon99504082016-12-09 15:51:31 -0500318 * @param GrGrAA Controls whether the arc is antialiased.
Brian Salomon0e8fc8b2016-12-09 15:10:07 -0500319 * @param viewMatrix transformation matrix.
320 * @param oval the bounding rect of the oval.
321 * @param startAngle starting angle in degrees.
322 * @param sweepAngle angle to sweep in degrees. Must be in (-360, 360)
323 * @param useCenter true means that the implied path begins at the oval center, connects as
324 * a line to the point indicated by the start contains the arc indicated by
325 * the sweep angle. If false the line beginning at the center point is
326 * omitted.
327 * @param style style to apply to the oval.
328 */
bsalomon4f3a0ca2016-08-22 13:14:26 -0700329 void drawArc(const GrClip&,
Brian Salomon82f44312017-01-11 13:42:54 -0500330 GrPaint&& paint,
Brian Salomon0e8fc8b2016-12-09 15:10:07 -0500331 GrAA,
bsalomon4f3a0ca2016-08-22 13:14:26 -0700332 const SkMatrix& viewMatrix,
333 const SkRect& oval,
334 SkScalar startAngle,
335 SkScalar sweepAngle,
336 bool useCenter,
337 const GrStyle& style);
robertphillipsea461502015-05-26 11:38:03 -0700338
joshualitt33a5fce2015-11-18 13:28:51 -0800339 /**
bsalomon4f3a0ca2016-08-22 13:14:26 -0700340 * Draw the image as a set of rects, specified by |iter|.
joshualitt33a5fce2015-11-18 13:28:51 -0800341 */
msarett10e3d9b2016-08-18 15:46:03 -0700342 void drawImageLattice(const GrClip&,
Brian Salomon2a943df2018-05-04 13:43:19 -0400343 GrPaint&&,
msarett10e3d9b2016-08-18 15:46:03 -0700344 const SkMatrix& viewMatrix,
Brian Salomon2a943df2018-05-04 13:43:19 -0400345 sk_sp<GrTextureProxy>,
346 sk_sp<GrColorSpaceXform>,
347 GrSamplerState::Filter,
348 std::unique_ptr<SkLatticeIter>,
msarett10e3d9b2016-08-18 15:46:03 -0700349 const SkRect& dst);
robertphillipsea461502015-05-26 11:38:03 -0700350
robertphillips8c523e02016-07-26 07:41:00 -0700351 /**
Greg Daniel64cc9aa2018-10-19 13:54:56 -0400352 * Adds the necessary signal and wait semaphores and adds the passed in SkDrawable to the
353 * command stream.
354 */
355 void drawDrawable(std::unique_ptr<SkDrawable::GpuDrawHandler>, const SkRect& bounds);
356
357 /**
robertphillips8c523e02016-07-26 07:41:00 -0700358 * After this returns any pending surface IO will be issued to the backend 3D API and
359 * if the surface has MSAA it will be resolved.
360 */
Greg Daniel51316782017-08-02 15:10:09 +0000361 GrSemaphoresSubmitted prepareForExternalIO(int numSemaphores,
362 GrBackendSemaphore backendSemaphores[]);
Greg Daniela5cb7812017-06-16 09:45:32 -0400363
364 /**
365 * The next time this GrRenderTargetContext is flushed, the gpu will wait on the passed in
366 * semaphores before executing any commands.
367 */
Greg Danielc64ee462017-06-15 16:59:49 -0400368 bool waitOnSemaphores(int numSemaphores, const GrBackendSemaphore* waitSemaphores);
robertphillips8c523e02016-07-26 07:41:00 -0700369
Robert Phillips65a88fa2017-08-08 08:36:22 -0400370 void insertEventMarker(const SkString&);
371
Brian Salomon7c8460e2017-05-12 11:36:10 -0400372 GrFSAAType fsaaType() const { return fRenderTargetProxy->fsaaType(); }
Brian Salomonc7fe0f72018-05-11 10:14:21 -0400373 const GrCaps* caps() const { return fContext->contextPriv().caps(); }
Robert Phillipsc7635fa2016-10-28 13:25:24 -0400374 int width() const { return fRenderTargetProxy->width(); }
375 int height() const { return fRenderTargetProxy->height(); }
Robert Phillipsc7635fa2016-10-28 13:25:24 -0400376 int numColorSamples() const { return fRenderTargetProxy->numColorSamples(); }
Brian Salomon50e66d42017-05-15 16:28:07 -0400377 int numStencilSamples() const { return fRenderTargetProxy->numStencilSamples(); }
robertphillipsca6eafc2016-05-17 09:57:46 -0700378 const SkSurfaceProps& surfaceProps() const { return fSurfaceProps; }
Robert Phillipsc7635fa2016-10-28 13:25:24 -0400379 GrSurfaceOrigin origin() const { return fRenderTargetProxy->origin(); }
Greg Danielb46add82019-01-02 14:51:29 -0500380 bool wrapsVkSecondaryCB() const { return fRenderTargetProxy->wrapsVkSecondaryCB(); }
Greg Daniele252f082017-10-23 16:05:23 -0400381 GrMipMapped mipMapped() const;
robertphillips7bceedc2015-12-01 12:51:26 -0800382
robertphillips7761d612016-05-16 09:14:53 -0700383 bool wasAbandoned() const;
384
Robert Phillips65048132017-08-10 08:44:49 -0400385 void setNeedsStencil() { fRenderTargetProxy->setNeedsStencil(); }
386
Robert Phillipsc7635fa2016-10-28 13:25:24 -0400387 GrRenderTarget* accessRenderTarget() {
388 // TODO: usage of this entry point needs to be reduced and potentially eliminated
389 // since it ends the deferral of the GrRenderTarget's allocation
Robert Phillips6be756b2018-01-16 15:07:54 -0500390 if (!fRenderTargetProxy->instantiate(fContext->contextPriv().resourceProvider())) {
Robert Phillipseee4d6e2017-06-05 09:26:07 -0400391 return nullptr;
392 }
Brian Salomonfd98c2c2018-07-31 17:25:29 -0400393 return fRenderTargetProxy->peekRenderTarget();
Robert Phillipsc7635fa2016-10-28 13:25:24 -0400394 }
robertphillips6c7e3252016-04-27 10:47:51 -0700395
Robert Phillipsf200a902017-01-30 13:27:37 -0500396 GrSurfaceProxy* asSurfaceProxy() override { return fRenderTargetProxy.get(); }
397 const GrSurfaceProxy* asSurfaceProxy() const override { return fRenderTargetProxy.get(); }
398 sk_sp<GrSurfaceProxy> asSurfaceProxyRef() override { return fRenderTargetProxy; }
399
400 GrTextureProxy* asTextureProxy() override;
Greg Daniele252f082017-10-23 16:05:23 -0400401 const GrTextureProxy* asTextureProxy() const override;
Robert Phillipsf200a902017-01-30 13:27:37 -0500402 sk_sp<GrTextureProxy> asTextureProxyRef() override;
403
404 GrRenderTargetProxy* asRenderTargetProxy() override { return fRenderTargetProxy.get(); }
405 sk_sp<GrRenderTargetProxy> asRenderTargetProxyRef() override { return fRenderTargetProxy; }
Robert Phillipseaa86252016-11-08 13:49:39 +0000406
Robert Phillipsd46697a2017-01-25 12:10:37 -0500407 GrRenderTargetContext* asRenderTargetContext() override { return this; }
408
robertphillips391395d2016-03-02 09:26:36 -0800409 // Provides access to functions that aren't part of the public API.
Brian Osman693a5402016-10-27 15:13:22 -0400410 GrRenderTargetContextPriv priv();
411 const GrRenderTargetContextPriv priv() const;
joshualittf5883a62016-01-13 07:47:38 -0800412
Herb Derbyc1b482c2018-08-09 15:02:27 -0400413 GrTextTarget* textTarget() { return fTextTarget.get(); }
Brian Salomonf18b1d82017-10-27 11:30:49 -0400414
Robert Phillipseaa86252016-11-08 13:49:39 +0000415 bool isWrapped_ForTesting() const;
416
joshualitt96880d92016-02-16 10:36:53 -0800417protected:
Robert Phillipsc7635fa2016-10-28 13:25:24 -0400418 GrRenderTargetContext(GrContext*, GrDrawingManager*, sk_sp<GrRenderTargetProxy>,
Robert Phillips2c862492017-01-18 10:08:39 -0500419 sk_sp<SkColorSpace>, const SkSurfaceProps*, GrAuditTrail*,
Robert Phillips941d1442017-06-14 16:37:02 -0400420 GrSingleOwner*, bool managedOpList = true);
joshualitt96880d92016-02-16 10:36:53 -0800421
Robert Phillips2de8cfa2017-06-28 10:33:41 -0400422 SkDEBUGCODE(void validate() const override;)
joshualitt96880d92016-02-16 10:36:53 -0800423
robertphillipsea461502015-05-26 11:38:03 -0700424private:
Brian Salomonf18b1d82017-10-27 11:30:49 -0400425 class TextTarget;
426
Brian Salomonea26d6b2018-01-23 20:33:21 +0000427 inline GrAAType chooseAAType(GrAA aa, GrAllowMixedSamples allowMixedSamples) {
428 return GrChooseAAType(aa, this->fsaaType(), allowMixedSamples, *this->caps());
Brian Salomon0e8fc8b2016-12-09 15:10:07 -0500429 }
430
Brian Salomon649a3412017-03-09 13:50:43 -0500431 friend class GrAtlasTextBlob; // for access to add[Mesh]DrawOp
Brian Osman5d034742017-09-11 13:38:55 -0400432 friend class GrClipStackClip; // for access to getOpList
robertphillips55fdccc2016-06-06 06:16:20 -0700433
robertphillips77a2e522015-10-17 07:43:27 -0700434 friend class GrDrawingManager; // for ctor
Brian Osman11052242016-10-27 14:47:55 -0400435 friend class GrRenderTargetContextPriv;
robertphillips976f5f02016-06-03 10:59:20 -0700436
Brian Salomon42521e82016-12-07 16:44:58 -0500437 // All the path renderers currently make their own ops
Brian Salomon649a3412017-03-09 13:50:43 -0500438 friend class GrSoftwarePathRenderer; // for access to add[Mesh]DrawOp
439 friend class GrAAConvexPathRenderer; // for access to add[Mesh]DrawOp
440 friend class GrDashLinePathRenderer; // for access to add[Mesh]DrawOp
441 friend class GrAAHairLinePathRenderer; // for access to add[Mesh]DrawOp
442 friend class GrAALinearizingConvexPathRenderer; // for access to add[Mesh]DrawOp
Jim Van Verth83010462017-03-16 08:45:39 -0400443 friend class GrSmallPathRenderer; // for access to add[Mesh]DrawOp
Brian Salomon649a3412017-03-09 13:50:43 -0500444 friend class GrDefaultPathRenderer; // for access to add[Mesh]DrawOp
Brian Salomon649a3412017-03-09 13:50:43 -0500445 friend class GrStencilAndCoverPathRenderer; // for access to add[Mesh]DrawOp
446 friend class GrTessellatingPathRenderer; // for access to add[Mesh]DrawOp
Chris Dalton9414c962018-06-14 10:14:50 -0600447 friend class GrCCPerFlushResources; // for access to addDrawOp
Chris Dalton1a325d22017-07-14 15:17:41 -0600448 friend class GrCoverageCountingPathRenderer; // for access to addDrawOp
Brian Salomon5d4cd9e2017-02-09 11:16:46 -0500449 // for a unit test
Robert Phillips7c525e62018-06-12 10:11:12 -0400450 friend void test_draw_op(GrContext*,
451 GrRenderTargetContext*,
452 std::unique_ptr<GrFragmentProcessor>,
Brian Salomonaff329b2017-08-11 09:40:37 -0400453 sk_sp<GrTextureProxy>);
robertphillipsea461502015-05-26 11:38:03 -0700454
Brian Osman9a9baae2018-11-05 15:06:26 -0500455 void internalClear(const GrFixedClip&, const SkPMColor4f&, CanClearFullscreen);
csmartdalton29df7602016-08-31 11:55:52 -0700456
Brian Salomon82f44312017-01-11 13:42:54 -0500457 // Only consumes the GrPaint if successful.
robertphillips00095892016-02-29 13:50:40 -0800458 bool drawFilledDRRect(const GrClip& clip,
Brian Salomon82f44312017-01-11 13:42:54 -0500459 GrPaint&& paint,
Brian Salomon0e8fc8b2016-12-09 15:10:07 -0500460 GrAA,
robertphillips00095892016-02-29 13:50:40 -0800461 const SkMatrix& viewMatrix,
462 const SkRRect& origOuter,
463 const SkRRect& origInner);
464
Brian Salomon82f44312017-01-11 13:42:54 -0500465 // Only consumes the GrPaint if successful.
robertphillips44302392016-07-08 14:43:03 -0700466 bool drawFilledRect(const GrClip& clip,
Brian Salomon82f44312017-01-11 13:42:54 -0500467 GrPaint&& paint,
Brian Salomon0e8fc8b2016-12-09 15:10:07 -0500468 GrAA,
robertphillips44302392016-07-08 14:43:03 -0700469 const SkMatrix& viewMatrix,
470 const SkRect& rect,
471 const GrUserStencilSettings* ss);
472
Brian Salomon2fad74a2017-12-20 13:28:55 -0500473 void drawShapeUsingPathRenderer(const GrClip&, GrPaint&&, GrAA, const SkMatrix&,
474 const GrShape&);
robertphillipsea461502015-05-26 11:38:03 -0700475
Brian Salomon348a0372018-10-31 10:42:18 -0400476 // Allows caller of addDrawOp to know which op list an op will be added to.
477 using WillAddOpFn = void(GrOp*, uint32_t opListID);
478 // These perform processing specific to GrDrawOp-derived ops before recording them into an
479 // op list. Before adding the op to an op list the WillAddOpFn is called. Note that it
480 // will not be called in the event that the op is discarded. Moreover, the op may merge into
481 // another op after the function is called (either before addDrawOp returns or some time later).
482 void addDrawOp(const GrClip&, std::unique_ptr<GrDrawOp>,
483 const std::function<WillAddOpFn>& = std::function<WillAddOpFn>());
robertphillips2334fb62015-06-17 05:43:33 -0700484
Robert Phillipsbf25d432017-04-07 10:08:53 -0400485 // Makes a copy of the proxy if it is necessary for the draw and places the texture that should
486 // be used by GrXferProcessor to access the destination color in 'result'. If the return
487 // value is false then a texture copy could not be made.
Robert Phillipsbb581ce2017-05-29 15:05:15 -0400488 bool SK_WARN_UNUSED_RESULT setupDstProxy(GrRenderTargetProxy*,
489 const GrClip&,
Brian Salomon09181ef2018-11-14 13:39:51 -0500490 const GrOp& op,
Robert Phillipsbb581ce2017-05-29 15:05:15 -0400491 GrXferProcessor::DstProxy* result);
Brian Salomon467921e2017-03-06 16:17:12 -0500492
Robert Phillips2de8cfa2017-06-28 10:33:41 -0400493 GrRenderTargetOpList* getRTOpList();
494 GrOpList* getOpList() override;
robertphillipsa106c622015-10-16 09:07:06 -0700495
Herb Derbyc1b482c2018-08-09 15:02:27 -0400496 std::unique_ptr<GrTextTarget> fTextTarget;
Brian Salomonf18b1d82017-10-27 11:30:49 -0400497 sk_sp<GrRenderTargetProxy> fRenderTargetProxy;
robertphillipsa106c622015-10-16 09:07:06 -0700498
Brian Osman11052242016-10-27 14:47:55 -0400499 // In MDB-mode the GrOpList can be closed by some other renderTargetContext that has picked
Robert Phillipsf2361d22016-10-25 14:20:06 -0400500 // it up. For this reason, the GrOpList should only ever be accessed via 'getOpList'.
Brian Salomonf18b1d82017-10-27 11:30:49 -0400501 sk_sp<GrRenderTargetOpList> fOpList;
robertphillips2334fb62015-06-17 05:43:33 -0700502
Brian Salomonf18b1d82017-10-27 11:30:49 -0400503 SkSurfaceProps fSurfaceProps;
504 bool fManagedOpList;
Robert Phillipse305cc1f2016-12-14 12:19:05 -0500505
506 typedef GrSurfaceContext INHERITED;
robertphillipsea461502015-05-26 11:38:03 -0700507};
508
509#endif