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