Upstream version 10.39.225.0
[platform/framework/web/crosswalk.git] / src / third_party / skia / include / gpu / GrContext.h
1 /*
2  * Copyright 2010 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 GrContext_DEFINED
9 #define GrContext_DEFINED
10
11 #include "GrClipData.h"
12 #include "GrColor.h"
13 #include "GrPaint.h"
14 #include "GrPathRendererChain.h"
15 #include "GrRenderTarget.h"
16 #include "GrTexture.h"
17 #include "SkMatrix.h"
18 #include "SkPathEffect.h"
19 #include "SkTypes.h"
20
21 class GrAARectRenderer;
22 class GrAutoScratchTexture;
23 class GrDrawState;
24 class GrDrawTarget;
25 class GrFontCache;
26 class GrFragmentProcessor;
27 class GrGpu;
28 class GrGpuTraceMarker;
29 class GrIndexBuffer;
30 class GrIndexBufferAllocPool;
31 class GrInOrderDrawBuffer;
32 class GrLayerCache;
33 class GrOvalRenderer;
34 class GrPath;
35 class GrPathRenderer;
36 class GrResourceEntry;
37 class GrResourceCache;
38 class GrResourceCache2;
39 class GrStencilBuffer;
40 class GrTestTarget;
41 class GrTextContext;
42 class GrTextureParams;
43 class GrVertexBuffer;
44 class GrVertexBufferAllocPool;
45 class GrStrokeInfo;
46 class GrSoftwarePathRenderer;
47 class SkStrokeRec;
48
49 class SK_API GrContext : public SkRefCnt {
50 public:
51     SK_DECLARE_INST_COUNT(GrContext)
52
53     struct Options {
54         Options() : fDrawPathToCompressedTexture(false) { }
55
56         // EXPERIMENTAL
57         // May be removed in the future, or may become standard depending
58         // on the outcomes of a variety of internal tests.
59         bool fDrawPathToCompressedTexture;
60     };
61
62     /**
63      * Creates a GrContext for a backend context.
64      */
65     static GrContext* Create(GrBackend, GrBackendContext, const Options* opts = NULL);
66
67     virtual ~GrContext();
68
69     /**
70      * The GrContext normally assumes that no outsider is setting state
71      * within the underlying 3D API's context/device/whatever. This call informs
72      * the context that the state was modified and it should resend. Shouldn't
73      * be called frequently for good performance.
74      * The flag bits, state, is dpendent on which backend is used by the
75      * context, either GL or D3D (possible in future).
76      */
77     void resetContext(uint32_t state = kAll_GrBackendState);
78
79     /**
80      * Callback function to allow classes to cleanup on GrContext destruction.
81      * The 'info' field is filled in with the 'info' passed to addCleanUp.
82      */
83     typedef void (*PFCleanUpFunc)(const GrContext* context, void* info);
84
85     /**
86      * Add a function to be called from within GrContext's destructor.
87      * This gives classes a chance to free resources held on a per context basis.
88      * The 'info' parameter will be stored and passed to the callback function.
89      */
90     void addCleanUp(PFCleanUpFunc cleanUp, void* info) {
91         CleanUpData* entry = fCleanUpData.push();
92
93         entry->fFunc = cleanUp;
94         entry->fInfo = info;
95     }
96
97     /**
98      * Abandons all GPU resources and assumes the underlying backend 3D API 
99      * context is not longer usable. Call this if you have lost the associated
100      * GPU context, and thus internal texture, buffer, etc. references/IDs are
101      * now invalid. Should be called even when GrContext is no longer going to
102      * be used for two reasons:
103      *  1) ~GrContext will not try to free the objects in the 3D API.
104      *  2) Any GrGpuResources created by this GrContext that outlive
105      *     will be marked as invalid (GrGpuResource::wasDestroyed()) and
106      *     when they're destroyed no 3D API calls will be made.
107      * Content drawn since the last GrContext::flush() may be lost. After this
108      * function is called the only valid action on the GrContext or
109      * GrGpuResources it created is to destroy them.
110      */
111     void abandonContext();
112     void contextDestroyed() { this->abandonContext(); }  //  legacy alias
113
114     ///////////////////////////////////////////////////////////////////////////
115     // Resource Cache
116
117     /**
118      *  Return the current GPU resource cache limits.
119      *
120      *  @param maxResources If non-null, returns maximum number of resources that
121      *                      can be held in the cache.
122      *  @param maxResourceBytes If non-null, returns maximum number of bytes of
123      *                          video memory that can be held in the cache.
124      */
125     void getResourceCacheLimits(int* maxResources, size_t* maxResourceBytes) const;
126     SK_ATTR_DEPRECATED("This function has been renamed to getResourceCacheLimits().")
127     void getTextureCacheLimits(int* maxTextures, size_t* maxTextureBytes) const {
128         this->getResourceCacheLimits(maxTextures, maxTextureBytes);
129     }
130
131     /**
132      *  Gets the current GPU resource cache usage.
133      *
134      *  @param resourceCount If non-null, returns the number of resources that are held in the
135      *                       cache.
136      *  @param maxResourceBytes If non-null, returns the total number of bytes of video memory held
137      *                          in the cache.
138      */
139     void getResourceCacheUsage(int* resourceCount, size_t* resourceBytes) const;
140
141     SK_ATTR_DEPRECATED("Use getResourceCacheUsage().")
142     size_t getGpuTextureCacheBytes() const {
143         size_t bytes;
144         this->getResourceCacheUsage(NULL, &bytes);
145         return bytes;
146     }
147
148     SK_ATTR_DEPRECATED("Use getResourceCacheUsage().")
149     int getGpuTextureCacheResourceCount() const {
150         int count;
151         this->getResourceCacheUsage(&count, NULL);
152         return count;
153     }
154
155     /**
156      *  Specify the GPU resource cache limits. If the current cache exceeds either
157      *  of these, it will be purged (LRU) to keep the cache within these limits.
158      *
159      *  @param maxResources The maximum number of resources that can be held in
160      *                      the cache.
161      *  @param maxResourceBytes The maximum number of bytes of video memory
162      *                          that can be held in the cache.
163      */
164     void setResourceCacheLimits(int maxResources, size_t maxResourceBytes);
165     SK_ATTR_DEPRECATED("This function has been renamed to setResourceCacheLimits().")
166     void setTextureCacheLimits(int maxTextures, size_t maxTextureBytes) {
167         this->setResourceCacheLimits(maxTextures, maxTextureBytes);
168     }
169
170     /**
171      * Frees GPU created by the context. Can be called to reduce GPU memory
172      * pressure.
173      */
174     void freeGpuResources();
175
176     /**
177      * This method should be called whenever a GrResource is unreffed or
178      * switched from exclusive to non-exclusive. This
179      * gives the resource cache a chance to discard unneeded resources.
180      * Note: this entry point will be removed once totally ref-driven
181      * cache maintenance is implemented.
182      */
183     void purgeCache();
184
185     /**
186      * Purge all the unlocked resources from the cache.
187      * This entry point is mainly meant for timing texture uploads
188      * and is not defined in normal builds of Skia.
189      */
190     void purgeAllUnlockedResources();
191
192     /**
193      * Stores a custom resource in the cache, based on the specified key.
194      */
195     void addResourceToCache(const GrResourceKey&, GrGpuResource*);
196
197     /**
198      * Finds a resource in the cache, based on the specified key. This is intended for use in
199      * conjunction with addResourceToCache(). The return value will be NULL if not found. The
200      * caller must balance with a call to unref().
201      */
202     GrGpuResource* findAndRefCachedResource(const GrResourceKey&);
203
204     /**
205      * Creates a new text rendering context that is optimal for the
206      * render target and the context. Caller assumes the ownership
207      * of the returned object. The returned object must be deleted
208      * before the context is destroyed.
209      */
210     GrTextContext* createTextContext(GrRenderTarget*,
211                                      const SkDeviceProperties&,
212                                      bool enableDistanceFieldFonts);
213
214     ///////////////////////////////////////////////////////////////////////////
215     // Textures
216
217     /**
218      * Creates a new entry, based on the specified key and texture and returns it. The caller owns a
219      * ref on the returned texture which must be balanced by a call to unref.
220      *
221      * @param params    The texture params used to draw a texture may help determine
222      *                  the cache entry used. (e.g. different versions may exist
223      *                  for different wrap modes on GPUs with limited NPOT
224      *                  texture support). NULL implies clamp wrap modes.
225      * @param desc      Description of the texture properties.
226      * @param cacheID   Cache-specific properties (e.g., texture gen ID)
227      * @param srcData   Pointer to the pixel values.
228      * @param rowBytes  The number of bytes between rows of the texture. Zero
229      *                  implies tightly packed rows. For compressed pixel configs, this
230      *                  field is ignored.
231      * @param cacheKey  (optional) If non-NULL, we'll write the cache key we used to cacheKey.
232      */
233     GrTexture* createTexture(const GrTextureParams* params,
234                              const GrTextureDesc& desc,
235                              const GrCacheID& cacheID,
236                              const void* srcData,
237                              size_t rowBytes,
238                              GrResourceKey* cacheKey = NULL);
239     /**
240      * Search for an entry based on key and dimensions. If found, ref it and return it. The return
241      * value will be NULL if not found. The caller must balance with a call to unref.
242      *
243      *  @param desc     Description of the texture properties.
244      *  @param cacheID Cache-specific properties (e.g., texture gen ID)
245      *  @param params   The texture params used to draw a texture may help determine
246      *                  the cache entry used. (e.g. different versions may exist
247      *                  for different wrap modes on GPUs with limited NPOT
248      *                  texture support). NULL implies clamp wrap modes.
249      */
250     GrTexture* findAndRefTexture(const GrTextureDesc& desc,
251                                  const GrCacheID& cacheID,
252                                  const GrTextureParams* params);
253     /**
254      * Determines whether a texture is in the cache. If the texture is found it
255      * will not be locked or returned. This call does not affect the priority of
256      * the texture for deletion.
257      */
258     bool isTextureInCache(const GrTextureDesc& desc,
259                           const GrCacheID& cacheID,
260                           const GrTextureParams* params) const;
261
262     /**
263      * Enum that determines how closely a returned scratch texture must match
264      * a provided GrTextureDesc.
265      */
266     enum ScratchTexMatch {
267         /**
268          * Finds a texture that exactly matches the descriptor.
269          */
270         kExact_ScratchTexMatch,
271         /**
272          * Finds a texture that approximately matches the descriptor. Will be
273          * at least as large in width and height as desc specifies. If desc
274          * specifies that texture is a render target then result will be a
275          * render target. If desc specifies a render target and doesn't set the
276          * no stencil flag then result will have a stencil. Format and aa level
277          * will always match.
278          */
279         kApprox_ScratchTexMatch
280     };
281
282     /**
283      * Returns a texture matching the desc. It's contents are unknown. Subsequent
284      * requests with the same descriptor are not guaranteed to return the same
285      * texture. The same texture is guaranteed not be returned again until it is
286      * unlocked. Call must be balanced with an unlockTexture() call. The caller
287      * owns a ref on the returned texture and must balance with a call to unref.
288      *
289      * Textures created by createAndLockTexture() hide the complications of
290      * tiling non-power-of-two textures on APIs that don't support this (e.g.
291      * unextended GLES2). Tiling a NPOT texture created by lockScratchTexture on
292      * such an API will create gaps in the tiling pattern. This includes clamp
293      * mode. (This may be addressed in a future update.)
294      */
295     GrTexture* lockAndRefScratchTexture(const GrTextureDesc&, ScratchTexMatch match);
296
297     /**
298      *  When done with an entry, call unlockScratchTexture(entry) on it, which returns
299      *  it to the cache, where it may be purged. This does not unref the texture.
300      */
301     void unlockScratchTexture(GrTexture* texture);
302
303     /**
304      * Creates a texture that is outside the cache. Does not count against
305      * cache's budget.
306      */
307     GrTexture* createUncachedTexture(const GrTextureDesc& desc,
308                                      void* srcData,
309                                      size_t rowBytes);
310
311     /**
312      * Returns true if the specified use of an indexed texture is supported.
313      * Support may depend upon whether the texture params indicate that the
314      * texture will be tiled. Passing NULL for the texture params indicates
315      * clamp mode.
316      */
317     bool supportsIndex8PixelConfig(const GrTextureParams*,
318                                    int width,
319                                    int height) const;
320
321     /**
322      *  Return the max width or height of a texture supported by the current GPU.
323      */
324     int getMaxTextureSize() const;
325
326     /**
327      *  Temporarily override the true max texture size. Note: an override
328      *  larger then the true max texture size will have no effect.
329      *  This entry point is mainly meant for testing texture size dependent
330      *  features and is only available if defined outside of Skia (see
331      *  bleed GM.
332      */
333     void setMaxTextureSizeOverride(int maxTextureSizeOverride);
334
335     ///////////////////////////////////////////////////////////////////////////
336     // Render targets
337
338     /**
339      * Sets the render target.
340      * @param target    the render target to set.
341      */
342     void setRenderTarget(GrRenderTarget* target) {
343         fRenderTarget.reset(SkSafeRef(target));
344     }
345
346     /**
347      * Gets the current render target.
348      * @return the currently bound render target.
349      */
350     const GrRenderTarget* getRenderTarget() const { return fRenderTarget.get(); }
351     GrRenderTarget* getRenderTarget() { return fRenderTarget.get(); }
352
353     /**
354      * Can the provided configuration act as a color render target?
355      */
356     bool isConfigRenderable(GrPixelConfig config, bool withMSAA) const;
357
358     /**
359      * Return the max width or height of a render target supported by the
360      * current GPU.
361      */
362     int getMaxRenderTargetSize() const;
363
364     /**
365      * Returns the max sample count for a render target. It will be 0 if MSAA
366      * is not supported.
367      */
368     int getMaxSampleCount() const;
369
370     /**
371      * Returns the recommended sample count for a render target when using this
372      * context.
373      *
374      * @param  config the configuration of the render target.
375      * @param  dpi the display density in dots per inch.
376      *
377      * @return sample count that should be perform well and have good enough
378      *         rendering quality for the display. Alternatively returns 0 if
379      *         MSAA is not supported or recommended to be used by default.
380      */
381     int getRecommendedSampleCount(GrPixelConfig config, SkScalar dpi) const;
382
383     ///////////////////////////////////////////////////////////////////////////
384     // Backend Surfaces
385
386     /**
387      * Wraps an existing texture with a GrTexture object.
388      *
389      * OpenGL: if the object is a texture Gr may change its GL texture params
390      *         when it is drawn.
391      *
392      * @param  desc     description of the object to create.
393      *
394      * @return GrTexture object or NULL on failure.
395      */
396     GrTexture* wrapBackendTexture(const GrBackendTextureDesc& desc);
397
398     /**
399      * Wraps an existing render target with a GrRenderTarget object. It is
400      * similar to wrapBackendTexture but can be used to draw into surfaces
401      * that are not also textures (e.g. FBO 0 in OpenGL, or an MSAA buffer that
402      * the client will resolve to a texture).
403      *
404      * @param  desc     description of the object to create.
405      *
406      * @return GrTexture object or NULL on failure.
407      */
408      GrRenderTarget* wrapBackendRenderTarget(const GrBackendRenderTargetDesc& desc);
409
410     ///////////////////////////////////////////////////////////////////////////
411     // Matrix state
412
413     /**
414      * Gets the current transformation matrix.
415      * @return the current matrix.
416      */
417     const SkMatrix& getMatrix() const { return fViewMatrix; }
418
419     /**
420      * Sets the transformation matrix.
421      * @param m the matrix to set.
422      */
423     void setMatrix(const SkMatrix& m) { fViewMatrix = m; }
424
425     /**
426      * Sets the current transformation matrix to identity.
427      */
428     void setIdentityMatrix() { fViewMatrix.reset(); }
429
430     /**
431      * Concats the current matrix. The passed matrix is applied before the
432      * current matrix.
433      * @param m the matrix to concat.
434      */
435     void concatMatrix(const SkMatrix& m) { fViewMatrix.preConcat(m); }
436
437
438     ///////////////////////////////////////////////////////////////////////////
439     // Clip state
440     /**
441      * Gets the current clip.
442      * @return the current clip.
443      */
444     const GrClipData* getClip() const { return fClip; }
445
446     /**
447      * Sets the clip.
448      * @param clipData  the clip to set.
449      */
450     void setClip(const GrClipData* clipData) { fClip = clipData; }
451
452     ///////////////////////////////////////////////////////////////////////////
453     // Draws
454
455     /**
456      * Clear the entire or rect of the render target, ignoring any clips.
457      * @param rect  the rect to clear or the whole thing if rect is NULL.
458      * @param color the color to clear to.
459      * @param canIgnoreRect allows partial clears to be converted to whole
460      *                      clears on platforms for which that is cheap
461      * @param target if non-NULL, the render target to clear otherwise clear
462      *               the current render target
463      */
464     void clear(const SkIRect* rect, GrColor color, bool canIgnoreRect,
465                GrRenderTarget* target = NULL);
466
467     /**
468      *  Draw everywhere (respecting the clip) with the paint.
469      */
470     void drawPaint(const GrPaint& paint);
471
472     /**
473      *  Draw the rect using a paint.
474      *  @param paint        describes how to color pixels.
475      *  @param strokeInfo   the stroke information (width, join, cap), and.
476      *                      the dash information (intervals, count, phase).
477      *                      If strokeInfo == NULL, then the rect is filled.
478      *                      Otherwise, if stroke width == 0, then the stroke
479      *                      is always a single pixel thick, else the rect is
480      *                      mitered/beveled stroked based on stroke width.
481      *  The rects coords are used to access the paint (through texture matrix)
482      */
483     void drawRect(const GrPaint& paint,
484                   const SkRect&,
485                   const GrStrokeInfo* strokeInfo = NULL);
486
487     /**
488      * Maps a rect of local coordinates onto the a rect of destination
489      * coordinates. The localRect is stretched over the dstRect. The dstRect is
490      * transformed by the context's matrix. An additional optional matrix can be
491      *  provided to transform the local rect.
492      *
493      * @param paint         describes how to color pixels.
494      * @param dstRect       the destination rect to draw.
495      * @param localRect     rect of local coordinates to be mapped onto dstRect
496      * @param localMatrix   Optional matrix to transform localRect.
497      */
498     void drawRectToRect(const GrPaint& paint,
499                         const SkRect& dstRect,
500                         const SkRect& localRect,
501                         const SkMatrix* localMatrix = NULL);
502
503     /**
504      *  Draw a roundrect using a paint.
505      *
506      *  @param paint        describes how to color pixels.
507      *  @param rrect        the roundrect to draw
508      *  @param strokeInfo   the stroke information (width, join, cap) and
509      *                      the dash information (intervals, count, phase).
510      */
511     void drawRRect(const GrPaint& paint, const SkRRect& rrect, const GrStrokeInfo& strokeInfo);
512
513     /**
514      *  Shortcut for drawing an SkPath consisting of nested rrects using a paint.
515      *  Does not support stroking. The result is undefined if outer does not contain
516      *  inner.
517      *
518      *  @param paint        describes how to color pixels.
519      *  @param outer        the outer roundrect
520      *  @param inner        the inner roundrect
521      */
522     void drawDRRect(const GrPaint& paint, const SkRRect& outer, const SkRRect& inner);
523
524
525     /**
526      * Draws a path.
527      *
528      * @param paint         describes how to color pixels.
529      * @param path          the path to draw
530      * @param strokeInfo    the stroke information (width, join, cap) and
531      *                      the dash information (intervals, count, phase).
532      */
533     void drawPath(const GrPaint& paint, const SkPath& path, const GrStrokeInfo& strokeInfo);
534
535     /**
536      * Draws vertices with a paint.
537      *
538      * @param   paint           describes how to color pixels.
539      * @param   primitiveType   primitives type to draw.
540      * @param   vertexCount     number of vertices.
541      * @param   positions       array of vertex positions, required.
542      * @param   texCoords       optional array of texture coordinates used
543      *                          to access the paint.
544      * @param   colors          optional array of per-vertex colors, supercedes
545      *                          the paint's color field.
546      * @param   indices         optional array of indices. If NULL vertices
547      *                          are drawn non-indexed.
548      * @param   indexCount      if indices is non-null then this is the
549      *                          number of indices.
550      */
551     void drawVertices(const GrPaint& paint,
552                       GrPrimitiveType primitiveType,
553                       int vertexCount,
554                       const SkPoint positions[],
555                       const SkPoint texs[],
556                       const GrColor colors[],
557                       const uint16_t indices[],
558                       int indexCount);
559
560     /**
561      * Draws an oval.
562      *
563      * @param paint         describes how to color pixels.
564      * @param oval          the bounding rect of the oval.
565      * @param strokeInfo    the stroke information (width, join, cap) and
566      *                      the dash information (intervals, count, phase).
567      */
568     void drawOval(const GrPaint& paint,
569                   const SkRect& oval,
570                   const GrStrokeInfo& strokeInfo);
571
572     ///////////////////////////////////////////////////////////////////////////
573     // Misc.
574
575     /**
576      * Flags that affect flush() behavior.
577      */
578     enum FlushBits {
579         /**
580          * A client may reach a point where it has partially rendered a frame
581          * through a GrContext that it knows the user will never see. This flag
582          * causes the flush to skip submission of deferred content to the 3D API
583          * during the flush.
584          */
585         kDiscard_FlushBit                    = 0x2,
586     };
587
588     /**
589      * Call to ensure all drawing to the context has been issued to the
590      * underlying 3D API.
591      * @param flagsBitfield     flags that control the flushing behavior. See
592      *                          FlushBits.
593      */
594     void flush(int flagsBitfield = 0);
595
596    /**
597     * These flags can be used with the read/write pixels functions below.
598     */
599     enum PixelOpsFlags {
600         /** The GrContext will not be flushed. This means that the read or write may occur before
601             previous draws have executed. */
602         kDontFlush_PixelOpsFlag = 0x1,
603         /** The src for write or dst read is unpremultiplied. This is only respected if both the
604             config src and dst configs are an RGBA/BGRA 8888 format. */
605         kUnpremul_PixelOpsFlag  = 0x2,
606     };
607
608     /**
609      * Reads a rectangle of pixels from a render target.
610      * @param target        the render target to read from. NULL means the current render target.
611      * @param left          left edge of the rectangle to read (inclusive)
612      * @param top           top edge of the rectangle to read (inclusive)
613      * @param width         width of rectangle to read in pixels.
614      * @param height        height of rectangle to read in pixels.
615      * @param config        the pixel config of the destination buffer
616      * @param buffer        memory to read the rectangle into.
617      * @param rowBytes      number of bytes bewtween consecutive rows. Zero means rows are tightly
618      *                      packed.
619      * @param pixelOpsFlags see PixelOpsFlags enum above.
620      *
621      * @return true if the read succeeded, false if not. The read can fail because of an unsupported
622      *         pixel config or because no render target is currently set and NULL was passed for
623      *         target.
624      */
625     bool readRenderTargetPixels(GrRenderTarget* target,
626                                 int left, int top, int width, int height,
627                                 GrPixelConfig config, void* buffer,
628                                 size_t rowBytes = 0,
629                                 uint32_t pixelOpsFlags = 0);
630
631     /**
632      * Copy the src pixels [buffer, row bytes, pixel config] into a render target at the specified
633      * rectangle.
634      * @param target        the render target to write into. NULL means the current render target.
635      * @param left          left edge of the rectangle to write (inclusive)
636      * @param top           top edge of the rectangle to write (inclusive)
637      * @param width         width of rectangle to write in pixels.
638      * @param height        height of rectangle to write in pixels.
639      * @param config        the pixel config of the source buffer
640      * @param buffer        memory to read the rectangle from.
641      * @param rowBytes      number of bytes between consecutive rows. Zero means rows are tightly
642      *                      packed.
643      * @param pixelOpsFlags see PixelOpsFlags enum above.
644      *
645      * @return true if the write succeeded, false if not. The write can fail because of an
646      *         unsupported combination of target and pixel configs.
647      */
648     bool writeRenderTargetPixels(GrRenderTarget* target,
649                                  int left, int top, int width, int height,
650                                  GrPixelConfig config, const void* buffer,
651                                  size_t rowBytes = 0,
652                                  uint32_t pixelOpsFlags = 0);
653
654     /**
655      * Reads a rectangle of pixels from a texture.
656      * @param texture       the texture to read from.
657      * @param left          left edge of the rectangle to read (inclusive)
658      * @param top           top edge of the rectangle to read (inclusive)
659      * @param width         width of rectangle to read in pixels.
660      * @param height        height of rectangle to read in pixels.
661      * @param config        the pixel config of the destination buffer
662      * @param buffer        memory to read the rectangle into.
663      * @param rowBytes      number of bytes between consecutive rows. Zero means rows are tightly
664      *                      packed.
665      * @param pixelOpsFlags see PixelOpsFlags enum above.
666      *
667      * @return true if the read succeeded, false if not. The read can fail because of an unsupported
668      *         pixel config.
669      */
670     bool readTexturePixels(GrTexture* texture,
671                            int left, int top, int width, int height,
672                            GrPixelConfig config, void* buffer,
673                            size_t rowBytes = 0,
674                            uint32_t pixelOpsFlags = 0);
675
676     /**
677      * Writes a rectangle of pixels to a texture.
678      * @param texture       the render target to read from.
679      * @param left          left edge of the rectangle to write (inclusive)
680      * @param top           top edge of the rectangle to write (inclusive)
681      * @param width         width of rectangle to write in pixels.
682      * @param height        height of rectangle to write in pixels.
683      * @param config        the pixel config of the source buffer
684      * @param buffer        memory to read pixels from
685      * @param rowBytes      number of bytes between consecutive rows. Zero
686      *                      means rows are tightly packed.
687      * @param pixelOpsFlags see PixelOpsFlags enum above.
688      * @return true if the write succeeded, false if not. The write can fail because of an
689      *         unsupported combination of texture and pixel configs.
690      */
691     bool writeTexturePixels(GrTexture* texture,
692                             int left, int top, int width, int height,
693                             GrPixelConfig config, const void* buffer,
694                             size_t rowBytes,
695                             uint32_t pixelOpsFlags = 0);
696
697     /**
698      * Copies a rectangle of texels from src to dst. The size of dst is the size of the rectangle
699      * copied and topLeft is the position of the rect in src. The rectangle is clipped to src's
700      * bounds.
701      * @param src           the texture to copy from.
702      * @param dst           the render target to copy to.
703      * @param topLeft       the point in src that will be copied to the top-left of dst. If NULL,
704      *                      (0, 0) will be used.
705      */
706     void copyTexture(GrTexture* src, GrRenderTarget* dst, const SkIPoint* topLeft = NULL);
707
708     /**
709      * Resolves a render target that has MSAA. The intermediate MSAA buffer is
710      * down-sampled to the associated GrTexture (accessible via
711      * GrRenderTarget::asTexture()). Any pending draws to the render target will
712      * be executed before the resolve.
713      *
714      * This is only necessary when a client wants to access the object directly
715      * using the backend API directly. GrContext will detect when it must
716      * perform a resolve to a GrTexture used as the source of a draw or before
717      * reading pixels back from a GrTexture or GrRenderTarget.
718      */
719     void resolveRenderTarget(GrRenderTarget*);
720
721     /**
722      * Provides a perfomance hint that the render target's contents are allowed
723      * to become undefined.
724      */
725     void discardRenderTarget(GrRenderTarget*);
726
727 #ifdef SK_DEVELOPER
728     void dumpFontCache() const;
729 #endif
730
731     ///////////////////////////////////////////////////////////////////////////
732     // Helpers
733
734     class AutoRenderTarget : public ::SkNoncopyable {
735     public:
736         AutoRenderTarget(GrContext* context, GrRenderTarget* target) {
737             fPrevTarget = context->getRenderTarget();
738             SkSafeRef(fPrevTarget);
739             context->setRenderTarget(target);
740             fContext = context;
741         }
742         AutoRenderTarget(GrContext* context) {
743             fPrevTarget = context->getRenderTarget();
744             SkSafeRef(fPrevTarget);
745             fContext = context;
746         }
747         ~AutoRenderTarget() {
748             if (fContext) {
749                 fContext->setRenderTarget(fPrevTarget);
750             }
751             SkSafeUnref(fPrevTarget);
752         }
753     private:
754         GrContext*      fContext;
755         GrRenderTarget* fPrevTarget;
756     };
757
758     /**
759      * Save/restore the view-matrix in the context. It can optionally adjust a paint to account
760      * for a coordinate system change. Here is an example of how the paint param can be used:
761      *
762      * A GrPaint is setup with GrProcessors. The stages will have access to the pre-matrix source
763      * geometry positions when the draw is executed. Later on a decision is made to transform the
764      * geometry to device space on the CPU. The effects now need to know that the space in which
765      * the geometry will be specified has changed.
766      *
767      * Note that when restore is called (or in the destructor) the context's matrix will be
768      * restored. However, the paint will not be restored. The caller must make a copy of the
769      * paint if necessary. Hint: use SkTCopyOnFirstWrite if the AutoMatrix is conditionally
770      * initialized.
771      */
772     class AutoMatrix : public ::SkNoncopyable {
773     public:
774         AutoMatrix() : fContext(NULL) {}
775
776         ~AutoMatrix() { this->restore(); }
777
778         /**
779          * Initializes by pre-concat'ing the context's current matrix with the preConcat param.
780          */
781         void setPreConcat(GrContext* context, const SkMatrix& preConcat, GrPaint* paint = NULL) {
782             SkASSERT(context);
783
784             this->restore();
785
786             fContext = context;
787             fMatrix = context->getMatrix();
788             this->preConcat(preConcat, paint);
789         }
790
791         /**
792          * Sets the context's matrix to identity. Returns false if the inverse matrix is required to
793          * update a paint but the matrix cannot be inverted.
794          */
795         bool setIdentity(GrContext* context, GrPaint* paint = NULL) {
796             SkASSERT(context);
797
798             this->restore();
799
800             if (paint) {
801                 if (!paint->localCoordChangeInverse(context->getMatrix())) {
802                     return false;
803                 }
804             }
805             fMatrix = context->getMatrix();
806             fContext = context;
807             context->setIdentityMatrix();
808             return true;
809         }
810
811         /**
812          * Replaces the context's matrix with a new matrix. Returns false if the inverse matrix is
813          * required to update a paint but the matrix cannot be inverted.
814          */
815         bool set(GrContext* context, const SkMatrix& newMatrix, GrPaint* paint = NULL) {
816             if (paint) {
817                 if (!this->setIdentity(context, paint)) {
818                     return false;
819                 }
820                 this->preConcat(newMatrix, paint);
821             } else {
822                 this->restore();
823                 fContext = context;
824                 fMatrix = context->getMatrix();
825                 context->setMatrix(newMatrix);
826             }
827             return true;
828         }
829
830         /**
831          * If this has been initialized then the context's matrix will be further updated by
832          * pre-concat'ing the preConcat param. The matrix that will be restored remains unchanged.
833          * The paint is assumed to be relative to the context's matrix at the time this call is
834          * made, not the matrix at the time AutoMatrix was first initialized. In other words, this
835          * performs an incremental update of the paint.
836          */
837         void preConcat(const SkMatrix& preConcat, GrPaint* paint = NULL) {
838             if (paint) {
839                 paint->localCoordChange(preConcat);
840             }
841             fContext->concatMatrix(preConcat);
842         }
843
844         /**
845          * Returns false if never initialized or the inverse matrix was required to update a paint
846          * but the matrix could not be inverted.
847          */
848         bool succeeded() const { return SkToBool(fContext); }
849
850         /**
851          * If this has been initialized then the context's original matrix is restored.
852          */
853         void restore() {
854             if (fContext) {
855                 fContext->setMatrix(fMatrix);
856                 fContext = NULL;
857             }
858         }
859
860     private:
861         GrContext*  fContext;
862         SkMatrix    fMatrix;
863     };
864
865     class AutoClip : public ::SkNoncopyable {
866     public:
867         // This enum exists to require a caller of the constructor to acknowledge that the clip will
868         // initially be wide open. It also could be extended if there are other desirable initial
869         // clip states.
870         enum InitialClip {
871             kWideOpen_InitialClip,
872         };
873
874         AutoClip(GrContext* context, InitialClip initialState)
875         : fContext(context) {
876             SkASSERT(kWideOpen_InitialClip == initialState);
877             fNewClipData.fClipStack = &fNewClipStack;
878
879             fOldClip = context->getClip();
880             context->setClip(&fNewClipData);
881         }
882
883         AutoClip(GrContext* context, const SkRect& newClipRect)
884         : fContext(context)
885         , fNewClipStack(newClipRect) {
886             fNewClipData.fClipStack = &fNewClipStack;
887
888             fOldClip = fContext->getClip();
889             fContext->setClip(&fNewClipData);
890         }
891
892         ~AutoClip() {
893             if (fContext) {
894                 fContext->setClip(fOldClip);
895             }
896         }
897     private:
898         GrContext*        fContext;
899         const GrClipData* fOldClip;
900
901         SkClipStack       fNewClipStack;
902         GrClipData        fNewClipData;
903     };
904
905     class AutoWideOpenIdentityDraw {
906     public:
907         AutoWideOpenIdentityDraw(GrContext* ctx, GrRenderTarget* rt)
908             : fAutoClip(ctx, AutoClip::kWideOpen_InitialClip)
909             , fAutoRT(ctx, rt) {
910             fAutoMatrix.setIdentity(ctx);
911             // should never fail with no paint param.
912             SkASSERT(fAutoMatrix.succeeded());
913         }
914
915     private:
916         AutoClip fAutoClip;
917         AutoRenderTarget fAutoRT;
918         AutoMatrix fAutoMatrix;
919     };
920
921     ///////////////////////////////////////////////////////////////////////////
922     // Functions intended for internal use only.
923     GrGpu* getGpu() { return fGpu; }
924     const GrGpu* getGpu() const { return fGpu; }
925     GrFontCache* getFontCache() { return fFontCache; }
926     GrLayerCache* getLayerCache() { return fLayerCache.get(); }
927     GrDrawTarget* getTextTarget();
928     const GrIndexBuffer* getQuadIndexBuffer() const;
929     GrAARectRenderer* getAARectRenderer() { return fAARectRenderer; }
930     GrResourceCache2* getResourceCache2() { return fResourceCache2; }
931
932     // Called by tests that draw directly to the context via GrDrawTarget
933     void getTestTarget(GrTestTarget*);
934
935     void addGpuTraceMarker(const GrGpuTraceMarker* marker);
936     void removeGpuTraceMarker(const GrGpuTraceMarker* marker);
937
938     /**
939      * Stencil buffers add themselves to the cache using addStencilBuffer. findStencilBuffer is
940      * called to check the cache for a SB that matches an RT's criteria.
941      */
942     void addStencilBuffer(GrStencilBuffer* sb);
943     GrStencilBuffer* findStencilBuffer(int width, int height, int sampleCnt);
944
945     GrPathRenderer* getPathRenderer(
946                     const SkPath& path,
947                     const SkStrokeRec& stroke,
948                     const GrDrawTarget* target,
949                     bool allowSW,
950                     GrPathRendererChain::DrawType drawType = GrPathRendererChain::kColor_DrawType,
951                     GrPathRendererChain::StencilSupport* stencilSupport = NULL);
952
953     /**
954      *  This returns a copy of the the GrContext::Options that was passed to the
955      *  constructor of this class.
956      */
957     const Options& getOptions() const { return fOptions; }
958
959 #if GR_CACHE_STATS
960     void printCacheStats() const;
961 #endif
962
963     class GPUStats {
964     public:
965 #if GR_GPU_STATS
966         GPUStats() { this->reset(); }
967
968         void reset() { fRenderTargetBinds = 0; fShaderCompilations = 0; }
969
970         int renderTargetBinds() const { return fRenderTargetBinds; }
971         void incRenderTargetBinds() { fRenderTargetBinds++; }
972         int shaderCompilations() const { return fShaderCompilations; }
973         void incShaderCompilations() { fShaderCompilations++; }
974     private:
975         int fRenderTargetBinds;
976         int fShaderCompilations;
977 #else
978         void incRenderTargetBinds() {}
979         void incShaderCompilations() {}
980 #endif
981     };
982
983 #if GR_GPU_STATS
984     const GPUStats* gpuStats() const;
985 #endif
986
987 private:
988     // Used to indicate whether a draw should be performed immediately or queued in fDrawBuffer.
989     enum BufferedDraw {
990         kYes_BufferedDraw,
991         kNo_BufferedDraw,
992     };
993     BufferedDraw fLastDrawWasBuffered;
994
995     GrGpu*                          fGpu;
996     SkMatrix                        fViewMatrix;
997     SkAutoTUnref<GrRenderTarget>    fRenderTarget;
998     const GrClipData*               fClip;  // TODO: make this ref counted
999     GrDrawState*                    fDrawState;
1000
1001     GrResourceCache*                fResourceCache;
1002     GrResourceCache2*               fResourceCache2;
1003     GrFontCache*                    fFontCache;
1004     SkAutoTDelete<GrLayerCache>     fLayerCache;
1005
1006     GrPathRendererChain*            fPathRendererChain;
1007     GrSoftwarePathRenderer*         fSoftwarePathRenderer;
1008
1009     GrVertexBufferAllocPool*        fDrawBufferVBAllocPool;
1010     GrIndexBufferAllocPool*         fDrawBufferIBAllocPool;
1011     GrInOrderDrawBuffer*            fDrawBuffer;
1012
1013     // Set by OverbudgetCB() to request that GrContext flush before exiting a draw.
1014     bool                            fFlushToReduceCacheSize;
1015
1016     GrAARectRenderer*               fAARectRenderer;
1017     GrOvalRenderer*                 fOvalRenderer;
1018
1019     bool                            fDidTestPMConversions;
1020     int                             fPMToUPMConversion;
1021     int                             fUPMToPMConversion;
1022
1023     struct CleanUpData {
1024         PFCleanUpFunc fFunc;
1025         void*         fInfo;
1026     };
1027
1028     SkTDArray<CleanUpData>          fCleanUpData;
1029
1030     int                             fMaxTextureSizeOverride;
1031
1032     const Options                   fOptions;
1033
1034     GrContext(const Options&); // init must be called after the constructor.
1035     bool init(GrBackend, GrBackendContext);
1036
1037     void setupDrawBuffer();
1038
1039     class AutoRestoreEffects;
1040     class AutoCheckFlush;
1041     /// Sets the paint and returns the target to draw into. The paint can be NULL in which case the
1042     /// draw state is left unmodified.
1043     GrDrawTarget* prepareToDraw(const GrPaint*, BufferedDraw, AutoRestoreEffects*, AutoCheckFlush*);
1044
1045     void internalDrawPath(GrDrawTarget* target, bool useAA, const SkPath& path,
1046                           const GrStrokeInfo& stroke);
1047
1048     GrTexture* createResizedTexture(const GrTextureDesc& desc,
1049                                     const GrCacheID& cacheID,
1050                                     const void* srcData,
1051                                     size_t rowBytes,
1052                                     bool filter);
1053
1054     // Needed so GrTexture's returnToCache helper function can call
1055     // addExistingTextureToCache
1056     friend class GrTexture;
1057     friend class GrStencilAndCoverPathRenderer;
1058     friend class GrStencilAndCoverTextContext;
1059
1060     // Add an existing texture to the texture cache. This is intended solely
1061     // for use with textures released from an GrAutoScratchTexture.
1062     void addExistingTextureToCache(GrTexture* texture);
1063
1064     /**
1065      * These functions create premul <-> unpremul effects if it is possible to generate a pair
1066      * of effects that make a readToUPM->writeToPM->readToUPM cycle invariant. Otherwise, they
1067      * return NULL.
1068      */
1069     const GrFragmentProcessor* createPMToUPMEffect(GrTexture*, bool swapRAndB, const SkMatrix&);
1070     const GrFragmentProcessor* createUPMToPMEffect(GrTexture*, bool swapRAndB, const SkMatrix&);
1071
1072     /**
1073      *  This callback allows the resource cache to callback into the GrContext
1074      *  when the cache is still overbudget after a purge.
1075      */
1076     static bool OverbudgetCB(void* data);
1077
1078     typedef SkRefCnt INHERITED;
1079 };
1080
1081 /**
1082  * Gets and locks a scratch texture from a descriptor using either exact or approximate criteria.
1083  * Unlocks texture in the destructor.
1084  */
1085 class GrAutoScratchTexture : public ::SkNoncopyable {
1086 public:
1087     GrAutoScratchTexture()
1088         : fContext(NULL)
1089         , fTexture(NULL) {
1090     }
1091
1092     GrAutoScratchTexture(GrContext* context,
1093                          const GrTextureDesc& desc,
1094                          GrContext::ScratchTexMatch match = GrContext::kApprox_ScratchTexMatch)
1095       : fContext(NULL)
1096       , fTexture(NULL) {
1097       this->set(context, desc, match);
1098     }
1099
1100     ~GrAutoScratchTexture() {
1101         this->reset();
1102     }
1103
1104     void reset() {
1105         if (fContext && fTexture) {
1106             fContext->unlockScratchTexture(fTexture);
1107             fTexture->unref();
1108             fTexture = NULL;
1109         }
1110     }
1111
1112     /*
1113      * When detaching a texture we do not unlock it in the texture cache but
1114      * we do set the returnToCache flag. In this way the texture remains
1115      * "locked" in the texture cache until it is freed and recycled in
1116      * GrTexture::internal_dispose. In reality, the texture has been removed
1117      * from the cache (because this is in AutoScratchTexture) and by not
1118      * calling unlockScratchTexture we simply don't re-add it. It will be
1119      * reattached in GrTexture::internal_dispose.
1120      *
1121      * Note that the caller is assumed to accept and manage the ref to the
1122      * returned texture.
1123      */
1124     GrTexture* detach() {
1125         if (NULL == fTexture) {
1126             return NULL;
1127         }
1128         GrTexture* texture = fTexture;
1129         fTexture = NULL;
1130
1131         // This GrAutoScratchTexture has a ref from lockAndRefScratchTexture, which we give up now.
1132         // The cache also has a ref which we are lending to the caller of detach(). When the caller
1133         // lets go of the ref and the ref count goes to 0 internal_dispose will see this flag is
1134         // set and re-ref the texture, thereby restoring the cache's ref.
1135         SkASSERT(!texture->unique());
1136         texture->impl()->setFlag((GrTextureFlags) GrTextureImpl::kReturnToCache_FlagBit);
1137         texture->unref();
1138         SkASSERT(texture->getCacheEntry());
1139
1140         return texture;
1141     }
1142
1143     GrTexture* set(GrContext* context,
1144                    const GrTextureDesc& desc,
1145                    GrContext::ScratchTexMatch match = GrContext::kApprox_ScratchTexMatch) {
1146         this->reset();
1147
1148         fContext = context;
1149         if (fContext) {
1150             fTexture = fContext->lockAndRefScratchTexture(desc, match);
1151             if (NULL == fTexture) {
1152                 fContext = NULL;
1153             }
1154             return fTexture;
1155         } else {
1156             return NULL;
1157         }
1158     }
1159
1160     GrTexture* texture() { return fTexture; }
1161
1162 private:
1163     GrContext*                    fContext;
1164     GrTexture*                    fTexture;
1165 };
1166
1167 #endif