105b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger
21cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger/*
31cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger * Copyright 2011 Google Inc.
41cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger *
51cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger * Use of this source code is governed by a BSD-style license that can be
61cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger * found in the LICENSE file.
705b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger */
805b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger
905b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger
101cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger
1105b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger#ifndef GrInOrderDrawBuffer_DEFINED
1205b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger#define GrInOrderDrawBuffer_DEFINED
1305b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger
1405b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger#include "GrDrawTarget.h"
1505b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger#include "GrAllocPool.h"
1605b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger#include "GrAllocator.h"
1705b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger#include "GrClip.h"
1805b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger
191cab2921ab279367f8206cdadc9259d12e603548Derek Sollenbergerclass GrGpu;
2005b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenbergerclass GrIndexBufferAllocPool;
211cab2921ab279367f8206cdadc9259d12e603548Derek Sollenbergerclass GrVertexBufferAllocPool;
2205b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger
2305b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger/**
2405b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger * GrInOrderDrawBuffer is an implementation of GrDrawTarget that queues up
2505b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger * draws for eventual playback into a GrGpu. In theory one draw buffer could
2605b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger * playback into another. When index or vertex buffers are used as geometry
2705b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger * sources it is the callers the draw buffer only holds references to the
2805b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger * buffers. It is the callers responsibility to ensure that the data is still
2905b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger * valid when the draw buffer is played back into a GrGpu. Similarly, it is the
3005b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger * caller's responsibility to ensure that all referenced textures, buffers,
3105b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger * and rendertargets are associated in the GrGpu object that the buffer is
3205b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger * played back into. The buffer requires VB and IB pools to store geometry.
3305b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger */
3405b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger
3505b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenbergerclass GrInOrderDrawBuffer : public GrDrawTarget {
3605b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenbergerpublic:
3705b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger
3805b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger    /**
3905b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger     * Creates a GrInOrderDrawBuffer
4005b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger     *
411cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger     * @param gpu        the gpu object where this will be played back
421cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger     *                   (possible indirectly). GrResources used with the draw
431cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger     *                   buffer are created by this gpu object.
4405b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger     * @param vertexPool pool where vertices for queued draws will be saved when
4505b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger     *                   the vertex source is either reserved or array.
4605b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger     * @param indexPool  pool where indices for queued draws will be saved when
4705b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger     *                   the index source is either reserved or array.
4805b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger     */
491cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    GrInOrderDrawBuffer(const GrGpu* gpu,
501cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger                        GrVertexBufferAllocPool* vertexPool,
5105b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger                        GrIndexBufferAllocPool* indexPool);
5205b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger
5305b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger    virtual ~GrInOrderDrawBuffer();
5405b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger
5505b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger    /**
5605b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger     * Copies the draw state and clip from target to this draw buffer.
5705b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger     *
5805b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger     * @param target    the target whose clip and state should be copied.
5905b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger     */
6005b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger    void initializeDrawStateAndClip(const GrDrawTarget& target);
6105b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger
6205b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger    /**
6305b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger     * Provides the buffer with an index buffer that can be used for quad rendering.
6405b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger     * The buffer may be able to batch consecutive drawRects if this is provided.
6505b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger     * @param indexBuffer   index buffer with quad indices.
6605b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger     */
6705b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger    void setQuadIndexBuffer(const GrIndexBuffer* indexBuffer);
6805b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger
6905b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger    /**
7005b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger     * Empties the draw buffer of any queued up draws.
7105b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger     */
7205b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger    void reset();
7305b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger
7405b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger    /**
7505b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger     * plays the queued up draws to another target. Does not empty this buffer so
7605b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger     * that it can be played back multiple times.
7705b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger     * @param target    the target to receive the playback
7805b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger     */
7905b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger    void playback(GrDrawTarget* target);
8005b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger
8105b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger    // overrides from GrDrawTarget
8205b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger    virtual void drawRect(const GrRect& rect,
8305b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger                          const GrMatrix* matrix = NULL,
841cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger                          StageMask stageEnableMask = 0,
8505b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger                          const GrRect* srcRects[] = NULL,
8605b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger                          const GrMatrix* srcMatrices[] = NULL);
8705b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger
8805b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger    virtual bool geometryHints(GrVertexLayout vertexLayout,
8905b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger                               int* vertexCount,
9005b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger                               int* indexCount) const;
9105b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger
9235e2e62b55598210f6999fc2ea26ff8f41446ffeDerek Sollenberger    virtual void clear(const GrIRect* rect, GrColor color);
9335e2e62b55598210f6999fc2ea26ff8f41446ffeDerek Sollenberger
9405b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenbergerprivate:
9505b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger
9605b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger    struct Draw {
9705b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger        GrPrimitiveType         fPrimitiveType;
9805b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger        int                     fStartVertex;
9905b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger        int                     fStartIndex;
10005b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger        int                     fVertexCount;
10105b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger        int                     fIndexCount;
10205b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger        bool                    fStateChanged;
10305b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger        bool                    fClipChanged;
10405b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger        GrVertexLayout          fVertexLayout;
10505b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger        const GrVertexBuffer*   fVertexBuffer;
10605b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger        const GrIndexBuffer*    fIndexBuffer;
10705b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger    };
10805b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger
10935e2e62b55598210f6999fc2ea26ff8f41446ffeDerek Sollenberger    struct Clear {
11035e2e62b55598210f6999fc2ea26ff8f41446ffeDerek Sollenberger        int fBeforeDrawIdx;
11135e2e62b55598210f6999fc2ea26ff8f41446ffeDerek Sollenberger        GrIRect fRect;
11235e2e62b55598210f6999fc2ea26ff8f41446ffeDerek Sollenberger        GrColor fColor;
11335e2e62b55598210f6999fc2ea26ff8f41446ffeDerek Sollenberger    };
11435e2e62b55598210f6999fc2ea26ff8f41446ffeDerek Sollenberger
1151cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    // overrides from GrDrawTarget
1161cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    virtual void onDrawIndexed(GrPrimitiveType primitiveType,
1171cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger                               int startVertex,
1181cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger                               int startIndex,
1191cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger                               int vertexCount,
1201cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger                               int indexCount);
1211cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    virtual void onDrawNonIndexed(GrPrimitiveType primitiveType,
1221cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger                                  int startVertex,
1231cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger                                  int vertexCount);
1241cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    virtual bool onReserveVertexSpace(GrVertexLayout layout,
1251cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger                                      int vertexCount,
1261cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger                                      void** vertices);
1271cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    virtual bool onReserveIndexSpace(int indexCount, void** indices);
1281cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    virtual void releaseReservedVertexSpace();
1291cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    virtual void releaseReservedIndexSpace();
13087b8e645865f9633f410c02252a0fd3feb18f09bDerek Sollenberger    virtual void onSetVertexSourceToArray(const void* vertexArray,
1311cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger                                          int vertexCount);
13287b8e645865f9633f410c02252a0fd3feb18f09bDerek Sollenberger    virtual void onSetIndexSourceToArray(const void* indexArray,
13387b8e645865f9633f410c02252a0fd3feb18f09bDerek Sollenberger                                         int indexCount);
1341cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    virtual void releaseVertexArray();
1351cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    virtual void releaseIndexArray();
1361cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    virtual void geometrySourceWillPush();
1371cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    virtual void geometrySourceWillPop(const GeometrySrcState& restoredState);
1381cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    virtual void clipWillBeSet(const GrClip& newClip);
13905b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger
14005b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger    bool needsNewState() const;
14105b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger    bool needsNewClip() const;
14205b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger
14305b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger    void pushState();
14405b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger    void pushClip();
1451cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger
1461cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    enum {
1471cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger        kDrawPreallocCnt         = 8,
1481cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger        kStatePreallocCnt        = 8,
1491cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger        kClipPreallocCnt         = 8,
1501cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger        kClearPreallocCnt        = 4,
1511cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger        kGeoPoolStatePreAllocCnt = 4,
1521cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    };
15305b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger
1541cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    GrSTAllocator<kDrawPreallocCnt, Draw>               fDraws;
1551cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    GrSTAllocator<kStatePreallocCnt, SavedDrawState>    fStates;
1561cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    GrSTAllocator<kClearPreallocCnt, Clear>             fClears;
1571cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    GrSTAllocator<kClipPreallocCnt, GrClip>             fClips;
1581cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger
15905b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger    bool                            fClipSet;
16005b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger
16105b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger    GrVertexLayout                  fLastRectVertexLayout;
16205b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger    const GrIndexBuffer*            fQuadIndexBuffer;
16305b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger    int                             fMaxQuads;
16405b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger    int                             fCurrQuad;
16505b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger
16605b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger    GrVertexBufferAllocPool&        fVertexPool;
16705b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger
16805b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger    GrIndexBufferAllocPool&         fIndexPool;
16935e2e62b55598210f6999fc2ea26ff8f41446ffeDerek Sollenberger
1701cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    struct GeometryPoolState {
1711cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger        const GrVertexBuffer*           fPoolVertexBuffer;
1721cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger        int                             fPoolStartVertex;
1731cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger        const GrIndexBuffer*            fPoolIndexBuffer;
1741cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger        int                             fPoolStartIndex;
1751cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger        // caller may conservatively over reserve vertices / indices.
1761cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger        // we release unused space back to allocator if possible
1771cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger        // can only do this if there isn't an intervening pushGeometrySource()
1781cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger        size_t                          fUsedPoolVertexBytes;
1791cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger        size_t                          fUsedPoolIndexBytes;
1801cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    };
1811cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    SkSTArray<kGeoPoolStatePreAllocCnt, GeometryPoolState> fGeoPoolStateStack;
18205b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger
18305b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger    typedef GrDrawTarget INHERITED;
18405b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger};
18505b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger
18605b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger#endif
187