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