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
21class GrAARectRenderer;
22class GrAutoScratchTexture;
23class GrDrawState;
24class GrDrawTarget;
25class GrFontCache;
26class GrFragmentProcessor;
27class GrGpu;
28class GrGpuTraceMarker;
29class GrIndexBuffer;
30class GrIndexBufferAllocPool;
31class GrInOrderDrawBuffer;
32class GrLayerCache;
33class GrOvalRenderer;
34class GrPath;
35class GrPathRenderer;
36class GrResourceEntry;
37class GrResourceCache;
38class GrResourceCache2;
39class GrStencilBuffer;
40class GrTestTarget;
41class GrTextContext;
42class GrTextureParams;
43class GrVertexBuffer;
44class GrVertexBufferAllocPool;
45class GrStrokeInfo;
46class GrSoftwarePathRenderer;
47class SkStrokeRec;
48
49class SK_API GrContext : public SkRefCnt {
50public:
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
987private:
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 */
1085class GrAutoScratchTexture : public ::SkNoncopyable {
1086public:
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
1162private:
1163    GrContext*                    fContext;
1164    GrTexture*                    fTexture;
1165};
1166
1167#endif
1168