• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
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 
8 #ifndef GrRenderTargetContext_DEFINED
9 #define GrRenderTargetContext_DEFINED
10 
11 #include "../private/GrRenderTargetProxy.h"
12 #include "GrColor.h"
13 #include "GrContext.h"
14 #include "GrContextPriv.h"
15 #include "GrPaint.h"
16 #include "GrSurfaceContext.h"
17 #include "GrTypesPriv.h"
18 #include "GrXferProcessor.h"
19 #include "SkRefCnt.h"
20 #include "SkSurfaceProps.h"
21 #include "text/GrTextUtils.h"
22 
23 class GrBackendSemaphore;
24 class GrCCPRAtlas;
25 class GrClip;
26 class GrColorSpaceXform;
27 class GrCoverageCountingPathRenderer;
28 class GrDrawingManager;
29 class GrDrawOp;
30 class GrFixedClip;
31 class GrRenderTarget;
32 class GrRenderTargetContextPriv;
33 class GrRenderTargetOpList;
34 class GrShape;
35 class GrStyle;
36 class GrTextureProxy;
37 struct GrUserStencilSettings;
38 class SkDrawFilter;
39 struct SkDrawShadowRec;
40 struct SkIPoint;
41 struct SkIRect;
42 class SkLatticeIter;
43 class SkMatrix;
44 class SkPaint;
45 class SkPath;
46 struct SkPoint;
47 struct SkRect;
48 class SkRegion;
49 class SkRRect;
50 struct SkRSXform;
51 class SkTextBlob;
52 class SkVertices;
53 
54 /**
55  * A helper object to orchestrate commands (draws, etc...) for GrSurfaces that are GrRenderTargets.
56  */
57 class SK_API GrRenderTargetContext : public GrSurfaceContext {
58 public:
59     ~GrRenderTargetContext() override;
60 
61     // We use SkPaint rather than GrPaint here for two reasons:
62     //    * The SkPaint carries extra text settings. If these were extracted to a lighter object
63     //      we could use GrPaint except that
64     //    * SkPaint->GrPaint conversion depends upon whether the glyphs are color or grayscale and
65     //      this can vary within a text run.
66     virtual void drawText(const GrClip&, const SkPaint&, const SkMatrix& viewMatrix,
67                           const char text[], size_t byteLength, SkScalar x, SkScalar y,
68                           const SkIRect& clipBounds);
69     virtual void drawPosText(const GrClip&, const SkPaint&, const SkMatrix& viewMatrix,
70                              const char text[], size_t byteLength, const SkScalar pos[],
71                              int scalarsPerPosition, const SkPoint& offset,
72                              const SkIRect& clipBounds);
73     virtual void drawTextBlob(const GrClip&, const SkPaint&,
74                               const SkMatrix& viewMatrix, const SkTextBlob*,
75                               SkScalar x, SkScalar y,
76                               SkDrawFilter*, const SkIRect& clipBounds);
77 
78     /**
79      * Provides a perfomance hint that the render target's contents are allowed
80      * to become undefined.
81      */
82     void discard();
83 
84     enum class CanClearFullscreen : bool {
85         kNo = false,
86         kYes = true
87     };
88 
89     /**
90      * Clear the entire or rect of the render target, ignoring any clips.
91      * @param rect  the rect to clear or the whole thing if rect is NULL.
92      * @param color the color to clear to.
93      * @param CanClearFullscreen allows partial clears to be converted to fullscreen clears on
94      *                           tiling platforms where that is an optimization.
95      */
96     void clear(const SkIRect* rect, GrColor color, CanClearFullscreen);
97 
98     /**
99      *  Draw everywhere (respecting the clip) with the paint.
100      */
101     void drawPaint(const GrClip&, GrPaint&&, const SkMatrix& viewMatrix);
102 
103     /**
104      * Draw the rect using a paint.
105      * @param paint        describes how to color pixels.
106      * @param GrAA         Controls whether rect is antialiased
107      * @param viewMatrix   transformation matrix
108      * @param style        The style to apply. Null means fill. Currently path effects are not
109      *                     allowed.
110      * The rects coords are used to access the paint (through texture matrix)
111      */
112     void drawRect(const GrClip&,
113                   GrPaint&& paint,
114                   GrAA,
115                   const SkMatrix& viewMatrix,
116                   const SkRect&,
117                   const GrStyle* style = nullptr);
118 
119     /**
120      * Maps a rectangle of shader coordinates to a rectangle and fills that rectangle.
121      *
122      * @param paint        describes how to color pixels.
123      * @param GrAA         Controls whether rect is antialiased
124      * @param viewMatrix   transformation matrix which applies to rectToDraw
125      * @param rectToDraw   the rectangle to draw
126      * @param localRect    the rectangle of shader coordinates applied to rectToDraw
127      */
128     void fillRectToRect(const GrClip&,
129                         GrPaint&& paint,
130                         GrAA,
131                         const SkMatrix& viewMatrix,
132                         const SkRect& rectToDraw,
133                         const SkRect& localRect);
134 
135     /**
136      * Fills a rect with a paint and a localMatrix.
137      */
138     void fillRectWithLocalMatrix(const GrClip& clip,
139                                  GrPaint&& paint,
140                                  GrAA,
141                                  const SkMatrix& viewMatrix,
142                                  const SkRect& rect,
143                                  const SkMatrix& localMatrix);
144 
145     /**
146      * Creates an op that draws a subrectangle of a texture. The passed color is modulated by the
147      * texture's color. 'srcRect' specifies the rectangle of the texture to draw. 'dstRect'
148      * specifies the rectangle to draw in local coords which will be transformed by 'viewMatrix' to
149      * device space. This asserts that the view matrix does not have perspective.
150      */
151     void drawTextureAffine(const GrClip& clip, sk_sp<GrTextureProxy>, GrSamplerState::Filter,
152                            GrColor, const SkRect& srcRect, const SkRect& dstRect, GrAA aa,
153                            const SkMatrix& viewMatrix, sk_sp<GrColorSpaceXform>);
154 
155     /**
156      * Draw a roundrect using a paint.
157      *
158      * @param paint       describes how to color pixels.
159      * @param GrAA        Controls whether rrect is antialiased.
160      * @param viewMatrix  transformation matrix
161      * @param rrect       the roundrect to draw
162      * @param style       style to apply to the rrect. Currently path effects are not allowed.
163      */
164     void drawRRect(const GrClip&,
165                    GrPaint&&,
166                    GrAA,
167                    const SkMatrix& viewMatrix,
168                    const SkRRect& rrect,
169                    const GrStyle& style);
170 
171     /**
172      * Use a fast method to render the ambient and spot shadows for a path.
173      * Will return false if not possible for the given path.
174      *
175      * @param viewMatrix   transformation matrix
176      * @param path         the path to shadow
177      * @param rec          parameters for shadow rendering
178      */
179     bool drawFastShadow(const GrClip&,
180                         const SkMatrix& viewMatrix,
181                         const SkPath& path,
182                         const SkDrawShadowRec& rec);
183 
184     /**
185      * Shortcut for filling a SkPath consisting of nested rrects using a paint. The result is
186      * undefined if outer does not contain inner.
187      *
188      * @param paint        describes how to color pixels.
189      * @param GrAA         Controls whether rrects edges are antialiased
190      * @param viewMatrix   transformation matrix
191      * @param outer        the outer roundrect
192      * @param inner        the inner roundrect
193      */
194     void drawDRRect(const GrClip&,
195                     GrPaint&&,
196                     GrAA,
197                     const SkMatrix& viewMatrix,
198                     const SkRRect& outer,
199                     const SkRRect& inner);
200 
201     /**
202      * Draws a path.
203      *
204      * @param paint         describes how to color pixels.
205      * @param GrAA          Controls whether the path is antialiased.
206      * @param viewMatrix    transformation matrix
207      * @param path          the path to draw
208      * @param style         style to apply to the path.
209      */
210     void drawPath(const GrClip&,
211                   GrPaint&&,
212                   GrAA,
213                   const SkMatrix& viewMatrix,
214                   const SkPath&,
215                   const GrStyle& style);
216 
217     /**
218      * Draws vertices with a paint.
219      *
220      * @param   paint            describes how to color pixels.
221      * @param   viewMatrix       transformation matrix
222      * @param   vertices         specifies the mesh to draw.
223      * @param   overridePrimType primitive type to draw. If NULL, derive prim type from vertices.
224      */
225     void drawVertices(const GrClip&,
226                       GrPaint&& paint,
227                       const SkMatrix& viewMatrix,
228                       sk_sp<SkVertices> vertices,
229                       GrPrimitiveType* overridePrimType = nullptr);
230 
231     /**
232      * Draws textured sprites from an atlas with a paint. This currently does not support AA for the
233      * sprite rectangle edges.
234      *
235      * @param   paint           describes how to color pixels.
236      * @param   viewMatrix      transformation matrix
237      * @param   spriteCount     number of sprites.
238      * @param   xform           array of compressed transformation data, required.
239      * @param   texRect         array of texture rectangles used to access the paint.
240      * @param   colors          optional array of per-sprite colors, supercedes
241      *                          the paint's color field.
242      */
243     void drawAtlas(const GrClip&,
244                    GrPaint&& paint,
245                    const SkMatrix& viewMatrix,
246                    int spriteCount,
247                    const SkRSXform xform[],
248                    const SkRect texRect[],
249                    const SkColor colors[]);
250 
251     /**
252      * Draws a region.
253      *
254      * @param paint         describes how to color pixels
255      * @param viewMatrix    transformation matrix
256      * @param aa            should the rects of the region be antialiased.
257      * @param region        the region to be drawn
258      * @param style         style to apply to the region
259      */
260     void drawRegion(const GrClip&,
261                     GrPaint&& paint,
262                     GrAA aa,
263                     const SkMatrix& viewMatrix,
264                     const SkRegion& region,
265                     const GrStyle& style,
266                     const GrUserStencilSettings* ss = nullptr);
267 
268     /**
269      * Draws an oval.
270      *
271      * @param paint         describes how to color pixels.
272      * @param GrAA          Controls whether the oval is antialiased.
273      * @param viewMatrix    transformation matrix
274      * @param oval          the bounding rect of the oval.
275      * @param style         style to apply to the oval. Currently path effects are not allowed.
276      */
277     void drawOval(const GrClip&,
278                   GrPaint&& paint,
279                   GrAA,
280                   const SkMatrix& viewMatrix,
281                   const SkRect& oval,
282                   const GrStyle& style);
283     /**
284      * Draws a partial arc of an oval.
285      *
286      * @param paint         describes how to color pixels.
287      * @param GrGrAA        Controls whether the arc is antialiased.
288      * @param viewMatrix    transformation matrix.
289      * @param oval          the bounding rect of the oval.
290      * @param startAngle    starting angle in degrees.
291      * @param sweepAngle    angle to sweep in degrees. Must be in (-360, 360)
292      * @param useCenter     true means that the implied path begins at the oval center, connects as
293      *                      a line to the point indicated by the start contains the arc indicated by
294      *                      the sweep angle. If false the line beginning at the center point is
295      *                      omitted.
296      * @param style         style to apply to the oval.
297      */
298     void drawArc(const GrClip&,
299                  GrPaint&& paint,
300                  GrAA,
301                  const SkMatrix& viewMatrix,
302                  const SkRect& oval,
303                  SkScalar startAngle,
304                  SkScalar sweepAngle,
305                  bool useCenter,
306                  const GrStyle& style);
307 
308     /**
309      * Draw the image as a set of rects, specified by |iter|.
310      */
311     void drawImageLattice(const GrClip&,
312                           GrPaint&&,
313                           const SkMatrix& viewMatrix,
314                           sk_sp<GrTextureProxy>,
315                           sk_sp<GrColorSpaceXform>,
316                           GrSamplerState::Filter,
317                           std::unique_ptr<SkLatticeIter>,
318                           const SkRect& dst);
319 
320     /**
321      * After this returns any pending surface IO will be issued to the backend 3D API and
322      * if the surface has MSAA it will be resolved.
323      */
324     GrSemaphoresSubmitted prepareForExternalIO(int numSemaphores,
325                                                GrBackendSemaphore backendSemaphores[]);
326 
327     /**
328      *  The next time this GrRenderTargetContext is flushed, the gpu will wait on the passed in
329      *  semaphores before executing any commands.
330      */
331     bool waitOnSemaphores(int numSemaphores, const GrBackendSemaphore* waitSemaphores);
332 
333     void insertEventMarker(const SkString&);
334 
fsaaType()335     GrFSAAType fsaaType() const { return fRenderTargetProxy->fsaaType(); }
caps()336     const GrCaps* caps() const { return fContext->caps(); }
width()337     int width() const { return fRenderTargetProxy->width(); }
height()338     int height() const { return fRenderTargetProxy->height(); }
numColorSamples()339     int numColorSamples() const { return fRenderTargetProxy->numColorSamples(); }
numStencilSamples()340     int numStencilSamples() const { return fRenderTargetProxy->numStencilSamples(); }
surfaceProps()341     const SkSurfaceProps& surfaceProps() const { return fSurfaceProps; }
origin()342     GrSurfaceOrigin origin() const { return fRenderTargetProxy->origin(); }
343     GrMipMapped mipMapped() const;
344 
345     bool wasAbandoned() const;
346 
setNeedsStencil()347     void setNeedsStencil() { fRenderTargetProxy->setNeedsStencil(); }
348 
accessRenderTarget()349     GrRenderTarget* accessRenderTarget() {
350         // TODO: usage of this entry point needs to be reduced and potentially eliminated
351         // since it ends the deferral of the GrRenderTarget's allocation
352         if (!fRenderTargetProxy->instantiate(fContext->contextPriv().resourceProvider())) {
353             return nullptr;
354         }
355         return fRenderTargetProxy->priv().peekRenderTarget();
356     }
357 
asSurfaceProxy()358     GrSurfaceProxy* asSurfaceProxy() override { return fRenderTargetProxy.get(); }
asSurfaceProxy()359     const GrSurfaceProxy* asSurfaceProxy() const override { return fRenderTargetProxy.get(); }
asSurfaceProxyRef()360     sk_sp<GrSurfaceProxy> asSurfaceProxyRef() override { return fRenderTargetProxy; }
361 
362     GrTextureProxy* asTextureProxy() override;
363     const GrTextureProxy* asTextureProxy() const override;
364     sk_sp<GrTextureProxy> asTextureProxyRef() override;
365 
asRenderTargetProxy()366     GrRenderTargetProxy* asRenderTargetProxy() override { return fRenderTargetProxy.get(); }
asRenderTargetProxyRef()367     sk_sp<GrRenderTargetProxy> asRenderTargetProxyRef() override { return fRenderTargetProxy; }
368 
asRenderTargetContext()369     GrRenderTargetContext* asRenderTargetContext() override { return this; }
370 
371     // Provides access to functions that aren't part of the public API.
372     GrRenderTargetContextPriv priv();
373     const GrRenderTargetContextPriv priv() const;
374 
textTarget()375     GrTextUtils::Target* textTarget() { return fTextTarget.get(); }
376 
377     bool isWrapped_ForTesting() const;
378 
379 protected:
380     GrRenderTargetContext(GrContext*, GrDrawingManager*, sk_sp<GrRenderTargetProxy>,
381                           sk_sp<SkColorSpace>, const SkSurfaceProps*, GrAuditTrail*,
382                           GrSingleOwner*, bool managedOpList = true);
383 
384     SkDEBUGCODE(void validate() const override;)
385 
386 private:
387     class TextTarget;
388 
chooseAAType(GrAA aa,GrAllowMixedSamples allowMixedSamples)389     inline GrAAType chooseAAType(GrAA aa, GrAllowMixedSamples allowMixedSamples) {
390         return GrChooseAAType(aa, this->fsaaType(), allowMixedSamples, *this->caps());
391     }
392 
393     friend class GrAtlasTextBlob;               // for access to add[Mesh]DrawOp
394     friend class GrClipStackClip;               // for access to getOpList
395 
396     friend class GrDrawingManager; // for ctor
397     friend class GrRenderTargetContextPriv;
398 
399     // All the path renderers currently make their own ops
400     friend class GrSoftwarePathRenderer;             // for access to add[Mesh]DrawOp
401     friend class GrAAConvexPathRenderer;             // for access to add[Mesh]DrawOp
402     friend class GrDashLinePathRenderer;             // for access to add[Mesh]DrawOp
403     friend class GrAAHairLinePathRenderer;           // for access to add[Mesh]DrawOp
404     friend class GrAALinearizingConvexPathRenderer;  // for access to add[Mesh]DrawOp
405     friend class GrSmallPathRenderer;                // for access to add[Mesh]DrawOp
406     friend class GrDefaultPathRenderer;              // for access to add[Mesh]DrawOp
407     friend class GrMSAAPathRenderer;                 // for access to add[Mesh]DrawOp
408     friend class GrStencilAndCoverPathRenderer;      // for access to add[Mesh]DrawOp
409     friend class GrTessellatingPathRenderer;         // for access to add[Mesh]DrawOp
410     friend class GrCCAtlas;                          // for access to addDrawOp
411     friend class GrCoverageCountingPathRenderer;     // for access to addDrawOp
412     // for a unit test
413     friend void test_draw_op(GrRenderTargetContext*, std::unique_ptr<GrFragmentProcessor>,
414                              sk_sp<GrTextureProxy>);
415 
416     void internalClear(const GrFixedClip&, const GrColor, CanClearFullscreen);
417 
418     // Only consumes the GrPaint if successful.
419     bool drawFilledDRRect(const GrClip& clip,
420                           GrPaint&& paint,
421                           GrAA,
422                           const SkMatrix& viewMatrix,
423                           const SkRRect& origOuter,
424                           const SkRRect& origInner);
425 
426     // Only consumes the GrPaint if successful.
427     bool drawFilledRect(const GrClip& clip,
428                         GrPaint&& paint,
429                         GrAA,
430                         const SkMatrix& viewMatrix,
431                         const SkRect& rect,
432                         const GrUserStencilSettings* ss);
433 
434     void drawShapeUsingPathRenderer(const GrClip&, GrPaint&&, GrAA, const SkMatrix&,
435                                     const GrShape&);
436 
437     // These perform processing specific to Gr[Mesh]DrawOp-derived ops before recording them into
438     // the op list. They return the id of the opList to which the op was added, or 0, if it was
439     // dropped (e.g., due to clipping).
440     uint32_t addDrawOp(const GrClip&, std::unique_ptr<GrDrawOp>);
441 
442     // Makes a copy of the proxy if it is necessary for the draw and places the texture that should
443     // be used by GrXferProcessor to access the destination color in 'result'. If the return
444     // value is false then a texture copy could not be made.
445     bool SK_WARN_UNUSED_RESULT setupDstProxy(GrRenderTargetProxy*,
446                                              const GrClip&,
447                                              const SkRect& opBounds,
448                                              GrXferProcessor::DstProxy* result);
449 
450     GrRenderTargetOpList* getRTOpList();
451     GrOpList* getOpList() override;
452 
453     std::unique_ptr<GrTextUtils::Target> fTextTarget;
454     sk_sp<GrRenderTargetProxy> fRenderTargetProxy;
455 
456     // In MDB-mode the GrOpList can be closed by some other renderTargetContext that has picked
457     // it up. For this reason, the GrOpList should only ever be accessed via 'getOpList'.
458     sk_sp<GrRenderTargetOpList> fOpList;
459 
460     SkSurfaceProps fSurfaceProps;
461     bool fManagedOpList;
462 
463     typedef GrSurfaceContext INHERITED;
464 };
465 
466 #endif
467