180bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru/*
280bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru * Copyright 2011 Google Inc.
380bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru *
480bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru * Use of this source code is governed by a BSD-style license that can be
580bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru * found in the LICENSE file.
680bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru */
780bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru
880bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru#ifndef GrInOrderDrawBuffer_DEFINED
980bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru#define GrInOrderDrawBuffer_DEFINED
1080bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru
1180bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru#include "GrDrawTarget.h"
1280bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru#include "GrAllocPool.h"
1380bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru#include "GrAllocator.h"
1480bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru#include "GrPath.h"
1580bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru
1680bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru#include "SkClipStack.h"
1780bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru#include "SkTemplates.h"
180a657bbc2c6fc9daf699942e023050536d5ec95fDerek Sollenberger#include "SkTypes.h"
1980bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru
2080bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queruclass GrGpu;
2180bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queruclass GrIndexBufferAllocPool;
2280bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queruclass GrVertexBufferAllocPool;
2380bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru
2480bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru/**
25d686ac77c2c485c4a3302eda9c1de597a6f8c568Derek Sollenberger * GrInOrderDrawBuffer is an implementation of GrDrawTarget that queues up draws for eventual
26d686ac77c2c485c4a3302eda9c1de597a6f8c568Derek Sollenberger * playback into a GrGpu. In theory one draw buffer could playback into another. When index or
27d686ac77c2c485c4a3302eda9c1de597a6f8c568Derek Sollenberger * vertex buffers are used as geometry sources it is the callers the draw buffer only holds
28d686ac77c2c485c4a3302eda9c1de597a6f8c568Derek Sollenberger * references to the buffers. It is the callers responsibility to ensure that the data is still
29d686ac77c2c485c4a3302eda9c1de597a6f8c568Derek Sollenberger * valid when the draw buffer is played back into a GrGpu. Similarly, it is the caller's
30d686ac77c2c485c4a3302eda9c1de597a6f8c568Derek Sollenberger * responsibility to ensure that all referenced textures, buffers, and render-targets are associated
31d686ac77c2c485c4a3302eda9c1de597a6f8c568Derek Sollenberger * in the GrGpu object that the buffer is played back into. The buffer requires VB and IB pools to
32d686ac77c2c485c4a3302eda9c1de597a6f8c568Derek Sollenberger * store geometry.
3380bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru */
3480bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queruclass GrInOrderDrawBuffer : public GrDrawTarget {
3580bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Querupublic:
3680bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru
3780bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    /**
3880bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru     * Creates a GrInOrderDrawBuffer
3980bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru     *
40096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger     * @param gpu        the gpu object that this draw buffer flushes to.
4180bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru     * @param vertexPool pool where vertices for queued draws will be saved when
4280bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru     *                   the vertex source is either reserved or array.
4380bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru     * @param indexPool  pool where indices for queued draws will be saved when
4480bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru     *                   the index source is either reserved or array.
4580bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru     */
46096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger    GrInOrderDrawBuffer(GrGpu* gpu,
4780bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru                        GrVertexBufferAllocPool* vertexPool,
4880bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru                        GrIndexBufferAllocPool* indexPool);
4980bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru
5080bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    virtual ~GrInOrderDrawBuffer();
5180bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru
5280bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    /**
53d686ac77c2c485c4a3302eda9c1de597a6f8c568Derek Sollenberger     * Empties the draw buffer of any queued up draws. This must not be called while inside an
54d686ac77c2c485c4a3302eda9c1de597a6f8c568Derek Sollenberger     * unbalanced pushGeometrySource(). The current draw state and clip are preserved.
5580bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru     */
5680bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    void reset();
5780bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru
5880bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    /**
59096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger     * This plays the queued up draws to its GrGpu target. It also resets this object (i.e. flushing
60d686ac77c2c485c4a3302eda9c1de597a6f8c568Derek Sollenberger     * is destructive). This buffer must not have an active reserved vertex or index source. Any
61d686ac77c2c485c4a3302eda9c1de597a6f8c568Derek Sollenberger     * reserved geometry on the target will be finalized because it's geometry source will be pushed
62d686ac77c2c485c4a3302eda9c1de597a6f8c568Derek Sollenberger     * before flushing and popped afterwards.
6380bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru     */
6458190644c30e1c4aa8e527f3503c58f841e0fcf3Derek Sollenberger    void flush();
6580bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru
660a657bbc2c6fc9daf699942e023050536d5ec95fDerek Sollenberger    // tracking for draws
670a657bbc2c6fc9daf699942e023050536d5ec95fDerek Sollenberger    virtual DrawToken getCurrentDrawToken() { return DrawToken(this, fDrawID); }
680a657bbc2c6fc9daf699942e023050536d5ec95fDerek Sollenberger
6980bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    // overrides from GrDrawTarget
70096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger    virtual bool geometryHints(int* vertexCount,
7180bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru                               int* indexCount) const SK_OVERRIDE;
7258190644c30e1c4aa8e527f3503c58f841e0fcf3Derek Sollenberger    virtual void clear(const SkIRect* rect,
7380bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru                       GrColor color,
740a657bbc2c6fc9daf699942e023050536d5ec95fDerek Sollenberger                       bool canIgnoreRect,
7580bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru                       GrRenderTarget* renderTarget = NULL) SK_OVERRIDE;
767839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger
777839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger    virtual void initCopySurfaceDstDesc(const GrSurface* src, GrTextureDesc* desc) SK_OVERRIDE;
787839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger
7980bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queruprotected:
80d686ac77c2c485c4a3302eda9c1de597a6f8c568Derek Sollenberger    virtual void clipWillBeSet(const GrClipData* newClip) SK_OVERRIDE;
81d686ac77c2c485c4a3302eda9c1de597a6f8c568Derek Sollenberger
8280bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queruprivate:
8380bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    enum Cmd {
8480bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru        kDraw_Cmd           = 1,
8580bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru        kStencilPath_Cmd    = 2,
8680bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru        kSetState_Cmd       = 3,
8780bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru        kSetClip_Cmd        = 4,
8880bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru        kClear_Cmd          = 5,
897839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger        kCopySurface_Cmd    = 6,
900a657bbc2c6fc9daf699942e023050536d5ec95fDerek Sollenberger        kDrawPath_Cmd       = 7,
9180bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    };
9280bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru
93d686ac77c2c485c4a3302eda9c1de597a6f8c568Derek Sollenberger    class DrawRecord : public DrawInfo {
94d686ac77c2c485c4a3302eda9c1de597a6f8c568Derek Sollenberger    public:
95d686ac77c2c485c4a3302eda9c1de597a6f8c568Derek Sollenberger        DrawRecord(const DrawInfo& info) : DrawInfo(info) {}
9680bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru        const GrVertexBuffer*   fVertexBuffer;
9780bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru        const GrIndexBuffer*    fIndexBuffer;
9880bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    };
9980bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru
1000a657bbc2c6fc9daf699942e023050536d5ec95fDerek Sollenberger    struct StencilPath : public ::SkNoncopyable {
101363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger        StencilPath();
102363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger
10380bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru        SkAutoTUnref<const GrPath>  fPath;
104363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger        SkPath::FillType            fFill;
10580bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    };
10680bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru
1070a657bbc2c6fc9daf699942e023050536d5ec95fDerek Sollenberger    struct DrawPath : public ::SkNoncopyable {
1080a657bbc2c6fc9daf699942e023050536d5ec95fDerek Sollenberger        DrawPath();
1090a657bbc2c6fc9daf699942e023050536d5ec95fDerek Sollenberger
1100a657bbc2c6fc9daf699942e023050536d5ec95fDerek Sollenberger        SkAutoTUnref<const GrPath>  fPath;
1110a657bbc2c6fc9daf699942e023050536d5ec95fDerek Sollenberger        SkPath::FillType            fFill;
1120a657bbc2c6fc9daf699942e023050536d5ec95fDerek Sollenberger        GrDeviceCoordTexture        fDstCopy;
1130a657bbc2c6fc9daf699942e023050536d5ec95fDerek Sollenberger    };
1140a657bbc2c6fc9daf699942e023050536d5ec95fDerek Sollenberger
1150a657bbc2c6fc9daf699942e023050536d5ec95fDerek Sollenberger    struct Clear : public ::SkNoncopyable {
11680bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru        Clear() : fRenderTarget(NULL) {}
1170a657bbc2c6fc9daf699942e023050536d5ec95fDerek Sollenberger        ~Clear() { SkSafeUnref(fRenderTarget); }
11880bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru
11958190644c30e1c4aa8e527f3503c58f841e0fcf3Derek Sollenberger        SkIRect         fRect;
12080bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru        GrColor         fColor;
1210a657bbc2c6fc9daf699942e023050536d5ec95fDerek Sollenberger        bool            fCanIgnoreRect;
12280bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru        GrRenderTarget* fRenderTarget;
12380bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    };
12480bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru
1250a657bbc2c6fc9daf699942e023050536d5ec95fDerek Sollenberger    struct CopySurface : public ::SkNoncopyable {
1267839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger        SkAutoTUnref<GrSurface> fDst;
1277839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger        SkAutoTUnref<GrSurface> fSrc;
1287839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger        SkIRect                 fSrcRect;
1297839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger        SkIPoint                fDstPoint;
1307839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger    };
1317839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger
13280bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    // overrides from GrDrawTarget
133d686ac77c2c485c4a3302eda9c1de597a6f8c568Derek Sollenberger    virtual void onDraw(const DrawInfo&) SK_OVERRIDE;
13458190644c30e1c4aa8e527f3503c58f841e0fcf3Derek Sollenberger    virtual void onDrawRect(const SkRect& rect,
1357839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger                            const SkMatrix* matrix,
13658190644c30e1c4aa8e527f3503c58f841e0fcf3Derek Sollenberger                            const SkRect* localRect,
1377839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger                            const SkMatrix* localMatrix) SK_OVERRIDE;
1380a657bbc2c6fc9daf699942e023050536d5ec95fDerek Sollenberger
1390a657bbc2c6fc9daf699942e023050536d5ec95fDerek Sollenberger    virtual void onStencilPath(const GrPath*, SkPath::FillType) SK_OVERRIDE;
1400a657bbc2c6fc9daf699942e023050536d5ec95fDerek Sollenberger    virtual void onDrawPath(const GrPath*, SkPath::FillType,
1410a657bbc2c6fc9daf699942e023050536d5ec95fDerek Sollenberger                            const GrDeviceCoordTexture* dstCopy) SK_OVERRIDE;
1420a657bbc2c6fc9daf699942e023050536d5ec95fDerek Sollenberger
143d686ac77c2c485c4a3302eda9c1de597a6f8c568Derek Sollenberger    virtual bool onReserveVertexSpace(size_t vertexSize,
14480bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru                                      int vertexCount,
14580bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru                                      void** vertices) SK_OVERRIDE;
14680bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    virtual bool onReserveIndexSpace(int indexCount,
14780bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru                                     void** indices) SK_OVERRIDE;
14880bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    virtual void releaseReservedVertexSpace() SK_OVERRIDE;
14980bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    virtual void releaseReservedIndexSpace() SK_OVERRIDE;
15080bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    virtual void onSetVertexSourceToArray(const void* vertexArray,
15180bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru                                          int vertexCount) SK_OVERRIDE;
15280bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    virtual void onSetIndexSourceToArray(const void* indexArray,
15380bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru                                         int indexCount) SK_OVERRIDE;
15480bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    virtual void releaseVertexArray() SK_OVERRIDE;
15580bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    virtual void releaseIndexArray() SK_OVERRIDE;
15680bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    virtual void geometrySourceWillPush() SK_OVERRIDE;
157d686ac77c2c485c4a3302eda9c1de597a6f8c568Derek Sollenberger    virtual void geometrySourceWillPop(const GeometrySrcState& restoredState) SK_OVERRIDE;
158096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger    virtual void willReserveVertexAndIndexSpace(int vertexCount,
159d686ac77c2c485c4a3302eda9c1de597a6f8c568Derek Sollenberger                                                int indexCount) SK_OVERRIDE;
1607839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger    virtual bool onCopySurface(GrSurface* dst,
1617839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger                               GrSurface* src,
1627839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger                               const SkIRect& srcRect,
1637839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger                               const SkIPoint& dstPoint)  SK_OVERRIDE;
1647839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger    virtual bool onCanCopySurface(GrSurface* dst,
1657839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger                                  GrSurface* src,
1667839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger                                  const SkIRect& srcRect,
1677839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger                                  const SkIPoint& dstPoint) SK_OVERRIDE;
1687839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger
169d686ac77c2c485c4a3302eda9c1de597a6f8c568Derek Sollenberger    bool quickInsideClip(const SkRect& devBounds);
17080bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru
171d686ac77c2c485c4a3302eda9c1de597a6f8c568Derek Sollenberger    // Attempts to concat instances from info onto the previous draw. info must represent an
172d686ac77c2c485c4a3302eda9c1de597a6f8c568Derek Sollenberger    // instanced draw. The caller must have already recorded a new draw state and clip if necessary.
173d686ac77c2c485c4a3302eda9c1de597a6f8c568Derek Sollenberger    int concatInstancedDraw(const DrawInfo& info);
174d686ac77c2c485c4a3302eda9c1de597a6f8c568Derek Sollenberger
175d686ac77c2c485c4a3302eda9c1de597a6f8c568Derek Sollenberger    // we lazily record state and clip changes in order to skip clips and states that have no
176d686ac77c2c485c4a3302eda9c1de597a6f8c568Derek Sollenberger    // effect.
17780bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    bool needsNewState() const;
17880bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    bool needsNewClip() const;
17980bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru
18080bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    // these functions record a command
18180bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    void            recordState();
18280bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    void            recordClip();
183d686ac77c2c485c4a3302eda9c1de597a6f8c568Derek Sollenberger    DrawRecord*     recordDraw(const DrawInfo&);
18480bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    StencilPath*    recordStencilPath();
1850a657bbc2c6fc9daf699942e023050536d5ec95fDerek Sollenberger    DrawPath*       recordDrawPath();
18680bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    Clear*          recordClear();
1877839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger    CopySurface*    recordCopySurface();
18880bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru
1897839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger    // TODO: Use a single allocator for commands and records
19080bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    enum {
19180bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru        kCmdPreallocCnt          = 32,
19280bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru        kDrawPreallocCnt         = 8,
19380bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru        kStencilPathPreallocCnt  = 8,
1940a657bbc2c6fc9daf699942e023050536d5ec95fDerek Sollenberger        kDrawPathPreallocCnt     = 8,
19580bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru        kStatePreallocCnt        = 8,
19680bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru        kClipPreallocCnt         = 8,
19780bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru        kClearPreallocCnt        = 4,
19880bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru        kGeoPoolStatePreAllocCnt = 4,
1997839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger        kCopySurfacePreallocCnt  = 4,
20080bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    };
20180bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru
202d686ac77c2c485c4a3302eda9c1de597a6f8c568Derek Sollenberger    SkSTArray<kCmdPreallocCnt, uint8_t, true>                          fCmds;
203d686ac77c2c485c4a3302eda9c1de597a6f8c568Derek Sollenberger    GrSTAllocator<kDrawPreallocCnt, DrawRecord>                        fDraws;
204d686ac77c2c485c4a3302eda9c1de597a6f8c568Derek Sollenberger    GrSTAllocator<kStatePreallocCnt, StencilPath>                      fStencilPaths;
2050a657bbc2c6fc9daf699942e023050536d5ec95fDerek Sollenberger    GrSTAllocator<kStatePreallocCnt, DrawPath>                         fDrawPaths;
206d686ac77c2c485c4a3302eda9c1de597a6f8c568Derek Sollenberger    GrSTAllocator<kStatePreallocCnt, GrDrawState::DeferredState>       fStates;
207d686ac77c2c485c4a3302eda9c1de597a6f8c568Derek Sollenberger    GrSTAllocator<kClearPreallocCnt, Clear>                            fClears;
2087839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger    GrSTAllocator<kCopySurfacePreallocCnt, CopySurface>                fCopySurfaces;
2097839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger    GrSTAllocator<kClipPreallocCnt, SkClipStack>                       fClips;
2107839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger    GrSTAllocator<kClipPreallocCnt, SkIPoint>                          fClipOrigins;
21180bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru
212096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger    GrDrawTarget*                   fDstGpu;
21380bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru
21480bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    bool                            fClipSet;
21580bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru
216d686ac77c2c485c4a3302eda9c1de597a6f8c568Derek Sollenberger    enum ClipProxyState {
217d686ac77c2c485c4a3302eda9c1de597a6f8c568Derek Sollenberger        kUnknown_ClipProxyState,
218d686ac77c2c485c4a3302eda9c1de597a6f8c568Derek Sollenberger        kValid_ClipProxyState,
219d686ac77c2c485c4a3302eda9c1de597a6f8c568Derek Sollenberger        kInvalid_ClipProxyState
220d686ac77c2c485c4a3302eda9c1de597a6f8c568Derek Sollenberger    };
221d686ac77c2c485c4a3302eda9c1de597a6f8c568Derek Sollenberger    ClipProxyState                  fClipProxyState;
222d686ac77c2c485c4a3302eda9c1de597a6f8c568Derek Sollenberger    SkRect                          fClipProxy;
223d686ac77c2c485c4a3302eda9c1de597a6f8c568Derek Sollenberger
22480bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    GrVertexBufferAllocPool&        fVertexPool;
22580bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru
22680bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    GrIndexBufferAllocPool&         fIndexPool;
22780bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru
22880bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    struct GeometryPoolState {
22980bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru        const GrVertexBuffer*           fPoolVertexBuffer;
23080bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru        int                             fPoolStartVertex;
23180bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru        const GrIndexBuffer*            fPoolIndexBuffer;
23280bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru        int                             fPoolStartIndex;
23380bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru        // caller may conservatively over reserve vertices / indices.
23480bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru        // we release unused space back to allocator if possible
23580bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru        // can only do this if there isn't an intervening pushGeometrySource()
23680bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru        size_t                          fUsedPoolVertexBytes;
23780bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru        size_t                          fUsedPoolIndexBytes;
23880bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    };
23980bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    SkSTArray<kGeoPoolStatePreAllocCnt, GeometryPoolState> fGeoPoolStateStack;
24080bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru
2410a657bbc2c6fc9daf699942e023050536d5ec95fDerek Sollenberger    virtual bool       isIssued(uint32_t drawID) { return drawID != fDrawID; }
2420a657bbc2c6fc9daf699942e023050536d5ec95fDerek Sollenberger
24380bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    bool                            fFlushing;
2440a657bbc2c6fc9daf699942e023050536d5ec95fDerek Sollenberger    uint32_t                        fDrawID;
24580bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru
24680bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    typedef GrDrawTarget INHERITED;
24780bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru};
24880bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru
24980bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru#endif
250