Home | History | Annotate | Download | only in include
      1 /*
      2     Copyright 2011 Google Inc.
      3 
      4     Licensed under the Apache License, Version 2.0 (the "License");
      5     you may not use this file except in compliance with the License.
      6     You may obtain a copy of the License at
      7 
      8          http://www.apache.org/licenses/LICENSE-2.0
      9 
     10     Unless required by applicable law or agreed to in writing, software
     11     distributed under the License is distributed on an "AS IS" BASIS,
     12     WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
     13     See the License for the specific language governing permissions and
     14     limitations under the License.
     15  */
     16 
     17 
     18 #ifndef GrInOrderDrawBuffer_DEFINED
     19 #define GrInOrderDrawBuffer_DEFINED
     20 
     21 #include "GrDrawTarget.h"
     22 #include "GrAllocPool.h"
     23 #include "GrAllocator.h"
     24 #include "GrClip.h"
     25 
     26 class GrVertexBufferAllocPool;
     27 class GrIndexBufferAllocPool;
     28 
     29 /**
     30  * GrInOrderDrawBuffer is an implementation of GrDrawTarget that queues up
     31  * draws for eventual playback into a GrGpu. In theory one draw buffer could
     32  * playback into another. When index or vertex buffers are used as geometry
     33  * sources it is the callers the draw buffer only holds references to the
     34  * buffers. It is the callers responsibility to ensure that the data is still
     35  * valid when the draw buffer is played back into a GrGpu. Similarly, it is the
     36  * caller's responsibility to ensure that all referenced textures, buffers,
     37  * and rendertargets are associated in the GrGpu object that the buffer is
     38  * played back into. The buffer requires VB and IB pools to store geometry.
     39  */
     40 
     41 class GrInOrderDrawBuffer : public GrDrawTarget {
     42 public:
     43 
     44     /**
     45      * Creates a GrInOrderDrawBuffer
     46      *
     47      * @param vertexPool pool where vertices for queued draws will be saved when
     48      *                   the vertex source is either reserved or array.
     49      * @param indexPool  pool where indices for queued draws will be saved when
     50      *                   the index source is either reserved or array.
     51      */
     52     GrInOrderDrawBuffer(GrVertexBufferAllocPool* vertexPool,
     53                         GrIndexBufferAllocPool* indexPool);
     54 
     55     virtual ~GrInOrderDrawBuffer();
     56 
     57     /**
     58      * Copies the draw state and clip from target to this draw buffer.
     59      *
     60      * @param target    the target whose clip and state should be copied.
     61      */
     62     void initializeDrawStateAndClip(const GrDrawTarget& target);
     63 
     64     /**
     65      * Provides the buffer with an index buffer that can be used for quad rendering.
     66      * The buffer may be able to batch consecutive drawRects if this is provided.
     67      * @param indexBuffer   index buffer with quad indices.
     68      */
     69     void setQuadIndexBuffer(const GrIndexBuffer* indexBuffer);
     70 
     71     /**
     72      * Empties the draw buffer of any queued up draws.
     73      */
     74     void reset();
     75 
     76     /**
     77      * plays the queued up draws to another target. Does not empty this buffer so
     78      * that it can be played back multiple times.
     79      * @param target    the target to receive the playback
     80      */
     81     void playback(GrDrawTarget* target);
     82 
     83     // overrides from GrDrawTarget
     84     virtual void drawIndexed(GrPrimitiveType primitiveType,
     85                              int startVertex,
     86                              int startIndex,
     87                              int vertexCount,
     88                              int indexCount);
     89     virtual void drawNonIndexed(GrPrimitiveType primitiveType,
     90                                 int startVertex,
     91                                 int vertexCount);
     92 
     93     virtual void drawRect(const GrRect& rect,
     94                           const GrMatrix* matrix = NULL,
     95                           int stageEnableMask = 0,
     96                           const GrRect* srcRects[] = NULL,
     97                           const GrMatrix* srcMatrices[] = NULL);
     98 
     99     virtual bool geometryHints(GrVertexLayout vertexLayout,
    100                                int* vertexCount,
    101                                int* indexCount) const;
    102 
    103     virtual void clear(const GrIRect* rect, GrColor color);
    104 
    105 private:
    106 
    107     struct Draw {
    108         GrPrimitiveType         fPrimitiveType;
    109         int                     fStartVertex;
    110         int                     fStartIndex;
    111         int                     fVertexCount;
    112         int                     fIndexCount;
    113         bool                    fStateChanged;
    114         bool                    fClipChanged;
    115         GrVertexLayout          fVertexLayout;
    116         const GrVertexBuffer*   fVertexBuffer;
    117         const GrIndexBuffer*    fIndexBuffer;
    118     };
    119 
    120     struct Clear {
    121         int fBeforeDrawIdx;
    122         GrIRect fRect;
    123         GrColor fColor;
    124     };
    125 
    126     virtual bool onAcquireGeometry(GrVertexLayout vertexLayout,
    127                                    void**         vertices,
    128                                    void**         indices);
    129     virtual void onReleaseGeometry();
    130     virtual void clipWillBeSet(const GrClip& newClip);
    131 
    132     virtual void onSetVertexSourceToArray(const void* vertexArray,
    133                                          int vertexCount);
    134 
    135     virtual void onSetIndexSourceToArray(const void* indexArray,
    136                                          int indexCount);
    137 
    138     bool needsNewState() const;
    139     bool needsNewClip() const;
    140 
    141     void pushState();
    142     void pushClip();
    143 
    144     GrTAllocator<Draw>              fDraws;
    145     GrTAllocator<SavedDrawState>    fStates;
    146     GrTAllocator<Clear>             fClears;
    147 
    148     GrTAllocator<GrClip>            fClips;
    149     bool                            fClipSet;
    150 
    151     GrVertexLayout                  fLastRectVertexLayout;
    152     const GrIndexBuffer*            fQuadIndexBuffer;
    153     int                             fMaxQuads;
    154     int                             fCurrQuad;
    155 
    156     GrVertexBufferAllocPool&        fVertexPool;
    157     const GrVertexBuffer*           fCurrPoolVertexBuffer;
    158     int                             fCurrPoolStartVertex;
    159 
    160     GrIndexBufferAllocPool&         fIndexPool;
    161     const GrIndexBuffer*            fCurrPoolIndexBuffer;
    162     int                             fCurrPoolStartIndex;
    163 
    164     // caller may conservatively over reserve vertices / indices.
    165     // we release unused space back to allocator if possible
    166     size_t                          fReservedVertexBytes;
    167     size_t                          fReservedIndexBytes;
    168     size_t                          fUsedReservedVertexBytes;
    169     size_t                          fUsedReservedIndexBytes;
    170 
    171     enum {
    172         kDrawPreallocCnt   = 8,
    173         kStatePreallocCnt  = 8,
    174         kClipPreallocCnt   = 8,
    175         kClearPreallocCnt  = 4,
    176     };
    177 
    178     GrAlignedSTStorage<kDrawPreallocCnt, Draw>              fDrawStorage;
    179     GrAlignedSTStorage<kStatePreallocCnt, SavedDrawState>   fStateStorage;
    180     GrAlignedSTStorage<kClipPreallocCnt, GrClip>            fClipStorage;
    181     GrAlignedSTStorage<kClearPreallocCnt, Clear>            fClearStorage;
    182 
    183     typedef GrDrawTarget INHERITED;
    184 };
    185 
    186 #endif
    187