Home | History | Annotate | Download | only in gpu
      1 
      2 /*
      3  * Copyright 2010 Google Inc.
      4  *
      5  * Use of this source code is governed by a BSD-style license that can be
      6  * found in the LICENSE file.
      7  */
      8 
      9 
     10 
     11 #ifndef GrDrawTarget_DEFINED
     12 #define GrDrawTarget_DEFINED
     13 
     14 #include "GrClip.h"
     15 #include "GrColor.h"
     16 #include "GrDrawState.h"
     17 #include "GrMatrix.h"
     18 #include "GrRefCnt.h"
     19 #include "GrSamplerState.h"
     20 #include "GrStencil.h"
     21 #include "GrTexture.h"
     22 
     23 #include "SkXfermode.h"
     24 #include "SkTLazy.h"
     25 
     26 class GrTexture;
     27 class GrClipIterator;
     28 class GrVertexBuffer;
     29 class GrIndexBuffer;
     30 
     31 class GrDrawTarget : public GrRefCnt {
     32 public:
     33     /**
     34      * Represents the draw target capabilities.
     35      */
     36     struct Caps {
     37         Caps() { memset(this, 0, sizeof(Caps)); }
     38         Caps(const Caps& c) { *this = c; }
     39         Caps& operator= (const Caps& c) {
     40             memcpy(this, &c, sizeof(Caps));
     41             return *this;
     42         }
     43         void print() const;
     44         bool f8BitPaletteSupport        : 1;
     45         bool fNPOTTextureTileSupport    : 1;
     46         bool fTwoSidedStencilSupport    : 1;
     47         bool fStencilWrapOpsSupport     : 1;
     48         bool fHWAALineSupport           : 1;
     49         bool fShaderDerivativeSupport   : 1;
     50         bool fGeometryShaderSupport     : 1;
     51         bool fFSAASupport               : 1;
     52         bool fDualSourceBlendingSupport : 1;
     53         bool fBufferLockSupport         : 1;
     54         int fMaxRenderTargetSize;
     55         int fMaxTextureSize;
     56     };
     57 
     58     // for convenience
     59     typedef GrDrawState::StageMask StageMask;
     60 
     61     ///////////////////////////////////////////////////////////////////////////
     62 
     63     GrDrawTarget();
     64     virtual ~GrDrawTarget();
     65 
     66     /**
     67      * Gets the capabilities of the draw target.
     68      */
     69     const Caps& getCaps() const { return fCaps; }
     70 
     71     /**
     72      * Sets the current clip to the region specified by clip. All draws will be
     73      * clipped against this clip if kClip_StateBit is enabled.
     74      *
     75      * Setting the clip may (or may not) zero out the client's stencil bits.
     76      *
     77      * @param description of the clipping region
     78      */
     79     void setClip(const GrClip& clip);
     80 
     81     /**
     82      * Gets the current clip.
     83      *
     84      * @return the clip.
     85      */
     86     const GrClip& getClip() const;
     87 
     88     const GrDrawState& getDrawState() const { return fCurrDrawState; }
     89     GrDrawState* drawState() { return &fCurrDrawState; }
     90 
     91     /**
     92      * Shortcut for drawState()->preConcatSamplerMatrices() on all enabled
     93      * stages
     94      *
     95      * @param matrix  the matrix to concat
     96      */
     97     void preConcatEnabledSamplerMatrices(const GrMatrix& matrix) {
     98         StageMask stageMask = this->enabledStages();
     99         this->drawState()->preConcatSamplerMatrices(stageMask, matrix);
    100     }
    101 
    102     /**
    103      * Determines if blending will require a read of a dst given the current
    104      * state set on the draw target
    105      *
    106      * @return true if the dst surface will be read at each pixel hit by the
    107      *         a draw operation.
    108      */
    109     bool drawWillReadDst() const;
    110 
    111     /**
    112      * Color alpha and coverage are two inputs to the drawing pipeline. For some
    113      * blend modes it is safe to fold the coverage into constant or per-vertex
    114      * color alpha value. For other blend modes they must be handled separately.
    115      * Depending on features available in the underlying 3D API this may or may
    116      * not be possible.
    117      *
    118      * This function looks at the current blend on the draw target and the draw
    119      * target's capabilities to determine whether coverage can be handled
    120      * correctly.
    121      */
    122     bool canApplyCoverage() const;
    123 
    124     /**
    125      * Determines whether incorporating partial pixel coverage into the constant
    126      * color specified by setColor or per-vertex colors will give the right
    127      * blending result.
    128      */
    129     bool canTweakAlphaForCoverage() const;
    130 
    131     /**
    132      * Given the current draw state, vertex layout, and hw support, will HW AA
    133      * lines be used (if line primitive type is drawn)? (Note that lines are
    134      * always 1 pixel wide)
    135      */
    136     bool willUseHWAALines() const;
    137 
    138     /**
    139      * Used to save and restore the GrGpu's drawing state
    140      */
    141     struct SavedDrawState {
    142     private:
    143         SkTLazy<GrDrawState> fState;
    144         friend class GrDrawTarget;
    145     };
    146 
    147     /**
    148      * Saves the current draw state. The state can be restored at a later time
    149      * with restoreDrawState.
    150      *
    151      * See also AutoStateRestore class.
    152      *
    153      * @param   state will hold the state after the function returns.
    154      */
    155     void saveCurrentDrawState(SavedDrawState* state) const;
    156 
    157     /**
    158      * Restores previously saved draw state. The client guarantees that state
    159      * was previously passed to saveCurrentDrawState and that the rendertarget
    160      * and texture set at save are still valid.
    161      *
    162      * See also AutoStateRestore class.
    163      *
    164      * @param   state the previously saved state to restore.
    165      */
    166     void restoreDrawState(const SavedDrawState& state);
    167 
    168     /**
    169      * Copies the draw state from another target to this target.
    170      *
    171      * @param srcTarget     draw target used as src of the draw state.
    172      */
    173     void copyDrawState(const GrDrawTarget& srcTarget);
    174 
    175     /**
    176      * The format of vertices is represented as a bitfield of flags.
    177      * Flags that indicate the layout of vertex data. Vertices always contain
    178      * positions and may also contain up to GrDrawState::kMaxTexCoords sets
    179      * of 2D texture * coordinates, per-vertex colors, and per-vertex coverage.
    180      * Each stage can
    181      * use any of the texture coordinates as its input texture coordinates or it
    182      * may use the positions as texture coordinates.
    183      *
    184      * If no texture coordinates are specified for a stage then the stage is
    185      * disabled.
    186      *
    187      * Only one type of texture coord can be specified per stage. For
    188      * example StageTexCoordVertexLayoutBit(0, 2) and
    189      * StagePosAsTexCoordVertexLayoutBit(0) cannot both be specified.
    190      *
    191      * The order in memory is always (position, texture coord 0, ..., color,
    192      * coverage) with any unused fields omitted. Note that this means that if
    193      * only texture coordinates 1 is referenced then there is no texture
    194      * coordinates 0 and the order would be (position, texture coordinate 1
    195      * [, color][, coverage]).
    196      */
    197 
    198     /**
    199      * Generates a bit indicating that a texture stage uses texture coordinates
    200      *
    201      * @param stage       the stage that will use texture coordinates.
    202      * @param texCoordIdx the index of the texture coordinates to use
    203      *
    204      * @return the bit to add to a GrVertexLayout bitfield.
    205      */
    206     static int StageTexCoordVertexLayoutBit(int stage, int texCoordIdx) {
    207         GrAssert(stage < GrDrawState::kNumStages);
    208         GrAssert(texCoordIdx < GrDrawState::kMaxTexCoords);
    209         return 1 << (stage + (texCoordIdx * GrDrawState::kNumStages));
    210     }
    211 
    212 private:
    213     static const int TEX_COORD_BIT_CNT = GrDrawState::kNumStages *
    214                                          GrDrawState::kMaxTexCoords;
    215 
    216 public:
    217     /**
    218      * Generates a bit indicating that a texture stage uses the position
    219      * as its texture coordinate.
    220      *
    221      * @param stage       the stage that will use position as texture
    222      *                    coordinates.
    223      *
    224      * @return the bit to add to a GrVertexLayout bitfield.
    225      */
    226     static int StagePosAsTexCoordVertexLayoutBit(int stage) {
    227         GrAssert(stage < GrDrawState::kNumStages);
    228         return (1 << (TEX_COORD_BIT_CNT + stage));
    229     }
    230 
    231 private:
    232     static const int STAGE_BIT_CNT = TEX_COORD_BIT_CNT +
    233         GrDrawState::kNumStages;
    234 
    235 public:
    236 
    237     /**
    238      * Additional Bits that can be specified in GrVertexLayout.
    239      */
    240     enum VertexLayoutBits {
    241         /* vertices have colors (GrColor) */
    242         kColor_VertexLayoutBit              = 1 << (STAGE_BIT_CNT + 0),
    243         /* vertices have coverage (GrColor)
    244          */
    245         kCoverage_VertexLayoutBit           = 1 << (STAGE_BIT_CNT + 1),
    246         /* Use text vertices. (Pos and tex coords may be a different type for
    247          * text [GrGpuTextVertex vs GrPoint].)
    248          */
    249         kTextFormat_VertexLayoutBit         = 1 << (STAGE_BIT_CNT + 2),
    250 
    251         /* Each vertex specificies an edge. Distance to the edge is used to
    252          * compute a coverage. See GrDrawState::setVertexEdgeType().
    253          */
    254         kEdge_VertexLayoutBit               = 1 << (STAGE_BIT_CNT + 3),
    255         // for below assert
    256         kDummyVertexLayoutBit,
    257         kHighVertexLayoutBit = kDummyVertexLayoutBit - 1
    258     };
    259     // make sure we haven't exceeded the number of bits in GrVertexLayout.
    260     GR_STATIC_ASSERT(kHighVertexLayoutBit < ((uint64_t)1 << 8*sizeof(GrVertexLayout)));
    261 
    262     /**
    263      * There are three methods for specifying geometry (vertices and optionally
    264      * indices) to the draw target. When indexed drawing the indices and vertices
    265      * can use a different method. Once geometry is specified it can be used for
    266      * multiple drawIndexed and drawNonIndexed calls.
    267      *
    268      * Sometimes it is necessary to perform a draw while upstack code has
    269      * already specified geometry that it isn't finished with. There are push
    270      * pop methods
    271      *
    272      * 1. Provide a cpu array (set*SourceToArray). This is useful when the
    273      *    caller's client has already provided vertex data in a format
    274      *    the time compatible with a GrVertexLayout. The array must contain the
    275      *    data at set*SourceToArray is called. The source stays in effect for
    276      *    drawIndexed & drawNonIndexed calls until set*SourceToArray is called
    277      *    again or one of the other two paths is chosen.
    278      *
    279      * 2. Reserve. This is most useful when the caller has data it must
    280      *    transform before drawing and is not long-lived. The caller requests
    281      *    that the draw target make room for some amount of vertex and/or index
    282      *    data. The target provides ptrs to hold the vertex and/or index data.
    283      *
    284      *    The data is writable up until the next drawIndexed, drawNonIndexed,
    285      *    or pushGeometrySource At this point the data is frozen and the ptrs
    286      *    are no longer valid.
    287      *
    288      * 3. Vertex and Index Buffers. This is most useful for geometry that will
    289      *    is long-lived. SetVertexSourceToBuffer and SetIndexSourceToBuffer are
    290      *    used to set the buffer and subsequent drawIndexed and drawNonIndexed
    291      *    calls use this source until another source is set.
    292      */
    293 
    294     /**
    295      * Reserves space for vertices. Draw target will use reserved vertices at
    296      * at the next draw.
    297      *
    298      * If succeeds:
    299      *          if vertexCount > 0, *vertices will be the array
    300      *          of vertices to be filled by caller. The next draw will read
    301      *          these vertices.
    302      *
    303      * If a client does not already have a vertex buffer then this is the
    304      * preferred way to allocate vertex data. It allows the subclass of
    305      * GrDrawTarget to decide whether to put data in buffers, to group vertex
    306      * data that uses the same state (e.g. for deferred rendering), etc.
    307      *
    308      * After the next draw or pushGeometrySource the vertices ptr is no longer
    309      * valid and the geometry data cannot be further modified. The contents
    310      * that were put in the reserved space can be drawn by multiple draws,
    311      * however.
    312      *
    313      * @param vertexLayout the format of vertices (ignored if vertexCount == 0).
    314      * @param vertexCount  the number of vertices to reserve space for. Can be 0.
    315      * @param vertices     will point to reserved vertex space if vertexCount is
    316      *                     non-zero. Illegal to pass NULL if vertexCount > 0.
    317      *
    318      * @return  true if succeeded in allocating space for the vertices and false
    319      *               if not.
    320      */
    321     bool reserveVertexSpace(GrVertexLayout vertexLayout,
    322                             int vertexCount,
    323                             void** vertices);
    324     /**
    325      * Reserves space for indices. Draw target will use the reserved indices at
    326      * the next indexed draw.
    327      *
    328      * If succeeds:
    329      *          if indexCount > 0, *indices will be the array
    330      *          of indices to be filled by caller. The next draw will read
    331      *          these indices.
    332      *
    333      * If a client does not already have a index buffer then this is the
    334      * preferred way to allocate index data. It allows the subclass of
    335      * GrDrawTarget to decide whether to put data in buffers, to group index
    336      * data that uses the same state (e.g. for deferred rendering), etc.
    337      *
    338      * After the next indexed draw or pushGeometrySource the indices ptr is no
    339      * longer valid and the geometry data cannot be further modified. The
    340      * contents that were put in the reserved space can be drawn by multiple
    341      * draws, however.
    342      *
    343      * @param indexCount   the number of indices to reserve space for. Can be 0.
    344      * @param indices      will point to reserved index space if indexCount is
    345      *                     non-zero. Illegal to pass NULL if indexCount > 0.
    346      */
    347 
    348     bool reserveIndexSpace(int indexCount, void** indices);
    349     /**
    350      * Provides hints to caller about the number of vertices and indices
    351      * that can be allocated cheaply. This can be useful if caller is reserving
    352      * space but doesn't know exactly how much geometry is needed.
    353      *
    354      * Also may hint whether the draw target should be flushed first. This is
    355      * useful for deferred targets.
    356      *
    357      * @param vertexLayout layout of vertices caller would like to reserve
    358      * @param vertexCount  in: hint about how many vertices the caller would
    359      *                     like to allocate.
    360      *                     out: a hint about the number of vertices that can be
    361      *                     allocated cheaply. Negative means no hint.
    362      *                     Ignored if NULL.
    363      * @param indexCount   in: hint about how many indices the caller would
    364      *                     like to allocate.
    365      *                     out: a hint about the number of indices that can be
    366      *                     allocated cheaply. Negative means no hint.
    367      *                     Ignored if NULL.
    368      *
    369      * @return  true if target should be flushed based on the input values.
    370      */
    371     virtual bool geometryHints(GrVertexLayout vertexLayout,
    372                                int* vertexCount,
    373                                int* indexCount) const;
    374 
    375     /**
    376      * Sets source of vertex data for the next draw. Array must contain
    377      * the vertex data when this is called.
    378      *
    379      * @param array         cpu array containing vertex data.
    380      * @param size          size of the vertex data.
    381      * @param vertexCount   the number of vertices in the array.
    382      */
    383     void setVertexSourceToArray(GrVertexLayout vertexLayout,
    384                                 const void* vertexArray,
    385                                 int vertexCount);
    386 
    387     /**
    388      * Sets source of index data for the next indexed draw. Array must contain
    389      * the indices when this is called.
    390      *
    391      * @param array         cpu array containing index data.
    392      * @param indexCount    the number of indices in the array.
    393      */
    394     void setIndexSourceToArray(const void* indexArray, int indexCount);
    395 
    396     /**
    397      * Sets source of vertex data for the next draw. Data does not have to be
    398      * in the buffer until drawIndexed or drawNonIndexed.
    399      *
    400      * @param buffer        vertex buffer containing vertex data. Must be
    401      *                      unlocked before draw call.
    402      * @param vertexLayout  layout of the vertex data in the buffer.
    403      */
    404     void setVertexSourceToBuffer(GrVertexLayout vertexLayout,
    405                                  const GrVertexBuffer* buffer);
    406 
    407     /**
    408      * Sets source of index data for the next indexed draw. Data does not have
    409      * to be in the buffer until drawIndexed or drawNonIndexed.
    410      *
    411      * @param buffer index buffer containing indices. Must be unlocked
    412      *               before indexed draw call.
    413      */
    414     void setIndexSourceToBuffer(const GrIndexBuffer* buffer);
    415 
    416     /**
    417      * Resets vertex source. Drawing from reset vertices is illegal. Set vertex
    418      * source to reserved, array, or buffer before next draw. May be able to free
    419      * up temporary storage allocated by setVertexSourceToArray or
    420      * reserveVertexSpace.
    421      */
    422     void resetVertexSource();
    423 
    424     /**
    425      * Resets index source. Indexed Drawing from reset indices is illegal. Set
    426      * index source to reserved, array, or buffer before next indexed draw. May
    427      * be able to free up temporary storage allocated by setIndexSourceToArray
    428      * or reserveIndexSpace.
    429      */
    430     void resetIndexSource();
    431 
    432     /**
    433      * Pushes and resets the vertex/index sources. Any reserved vertex / index
    434      * data is finalized (i.e. cannot be updated after the matching pop but can
    435      * be drawn from). Must be balanced by a pop.
    436      */
    437     void pushGeometrySource();
    438 
    439     /**
    440      * Pops the vertex / index sources from the matching push.
    441      */
    442     void popGeometrySource();
    443 
    444     /**
    445      * Draws indexed geometry using the current state and current vertex / index
    446      * sources.
    447      *
    448      * @param type         The type of primitives to draw.
    449      * @param startVertex  the vertex in the vertex array/buffer corresponding
    450      *                     to index 0
    451      * @param startIndex   first index to read from index src.
    452      * @param vertexCount  one greater than the max index.
    453      * @param indexCount   the number of index elements to read. The index count
    454      *                     is effectively trimmed to the last completely
    455      *                     specified primitive.
    456      */
    457     void drawIndexed(GrPrimitiveType type,
    458                      int startVertex,
    459                      int startIndex,
    460                      int vertexCount,
    461                      int indexCount);
    462 
    463     /**
    464      * Draws non-indexed geometry using the current state and current vertex
    465      * sources.
    466      *
    467      * @param type         The type of primitives to draw.
    468      * @param startVertex  the vertex in the vertex array/buffer corresponding
    469      *                     to index 0
    470      * @param vertexCount  one greater than the max index.
    471      */
    472     void drawNonIndexed(GrPrimitiveType type,
    473                         int startVertex,
    474                         int vertexCount);
    475 
    476     /**
    477      * Helper function for drawing rects. This does not use the current index
    478      * and vertex sources. After returning, the vertex and index sources may
    479      * have changed. They should be reestablished before the next drawIndexed
    480      * or drawNonIndexed. This cannot be called between reserving and releasing
    481      * geometry. The GrDrawTarget subclass may be able to perform additional
    482      * optimizations if drawRect is used rather than drawIndexed or
    483      * drawNonIndexed.
    484      * @param rect      the rect to draw
    485      * @param matrix    optional matrix applied to rect (before viewMatrix)
    486      * @param stageMask bitmask indicating which stages are enabled.
    487      *                  Bit i indicates whether stage i is enabled.
    488      * @param srcRects  specifies rects for stages enabled by stageEnableMask.
    489      *                  if stageEnableMask bit i is 1, srcRects is not NULL,
    490      *                  and srcRects[i] is not NULL, then srcRects[i] will be
    491      *                  used as coordinates for stage i. Otherwise, if stage i
    492      *                  is enabled then rect is used as the coordinates.
    493      * @param srcMatrices   optional matrices applied to srcRects. If
    494      *                      srcRect[i] is non-NULL and srcMatrices[i] is
    495      *                      non-NULL then srcRect[i] will be transformed by
    496      *                      srcMatrix[i]. srcMatrices can be NULL when no
    497      *                      srcMatrices are desired.
    498      */
    499     virtual void drawRect(const GrRect& rect,
    500                           const GrMatrix* matrix,
    501                           StageMask stageMask,
    502                           const GrRect* srcRects[],
    503                           const GrMatrix* srcMatrices[]);
    504 
    505     /**
    506      * Helper for drawRect when the caller doesn't need separate src rects or
    507      * matrices.
    508      */
    509     void drawSimpleRect(const GrRect& rect,
    510                         const GrMatrix* matrix,
    511                         StageMask stageEnableBitfield) {
    512          drawRect(rect, matrix, stageEnableBitfield, NULL, NULL);
    513     }
    514 
    515     /**
    516      * Clear the render target. Ignores the clip and all other draw state
    517      * (blend mode, stages, etc). Clears the whole thing if rect is NULL,
    518      * otherwise just the rect.
    519      */
    520     virtual void clear(const GrIRect* rect, GrColor color) = 0;
    521 
    522     /**
    523      * Returns the maximum number of edges that may be specified in a single
    524      * draw call when performing edge antialiasing.  This is usually limited
    525      * by the number of fragment uniforms which may be uploaded.  Must be a
    526      * minimum of six, since a triangle's vertices each belong to two boundary
    527      * edges which may be distinct.
    528      */
    529     virtual int getMaxEdges() const { return 6; }
    530 
    531     ////////////////////////////////////////////////////////////////////////////
    532 
    533     class AutoStateRestore : ::GrNoncopyable {
    534     public:
    535         AutoStateRestore();
    536         AutoStateRestore(GrDrawTarget* target);
    537         ~AutoStateRestore();
    538 
    539         /**
    540          * if this object is already saving state for param target then
    541          * this does nothing. Otherise, it restores previously saved state on
    542          * previous target (if any) and saves current state on param target.
    543          */
    544         void set(GrDrawTarget* target);
    545 
    546     private:
    547         GrDrawTarget*       fDrawTarget;
    548         SavedDrawState      fDrawState;
    549     };
    550 
    551     ////////////////////////////////////////////////////////////////////////////
    552 
    553     /**
    554      * Sets the view matrix to I and preconcats all stage matrices enabled in
    555      * mask by the view inverse. Destructor undoes these changes.
    556      */
    557     class AutoDeviceCoordDraw : ::GrNoncopyable {
    558     public:
    559         AutoDeviceCoordDraw(GrDrawTarget* target, StageMask stageMask);
    560         ~AutoDeviceCoordDraw();
    561     private:
    562         GrDrawTarget*       fDrawTarget;
    563         GrMatrix            fViewMatrix;
    564         GrMatrix            fSamplerMatrices[GrDrawState::kNumStages];
    565         int                 fStageMask;
    566     };
    567 
    568     ////////////////////////////////////////////////////////////////////////////
    569 
    570     class AutoReleaseGeometry : ::GrNoncopyable {
    571     public:
    572         AutoReleaseGeometry(GrDrawTarget*  target,
    573                             GrVertexLayout vertexLayout,
    574                             int            vertexCount,
    575                             int            indexCount);
    576         AutoReleaseGeometry();
    577         ~AutoReleaseGeometry();
    578         bool set(GrDrawTarget*  target,
    579                  GrVertexLayout vertexLayout,
    580                  int            vertexCount,
    581                  int            indexCount);
    582         bool succeeded() const { return NULL != fTarget; }
    583         void* vertices() const { GrAssert(this->succeeded()); return fVertices; }
    584         void* indices() const { GrAssert(this->succeeded()); return fIndices; }
    585         GrPoint* positions() const {
    586             return static_cast<GrPoint*>(this->vertices());
    587         }
    588 
    589     private:
    590         void reset();
    591 
    592         GrDrawTarget* fTarget;
    593         void*         fVertices;
    594         void*         fIndices;
    595     };
    596 
    597     ////////////////////////////////////////////////////////////////////////////
    598 
    599     class AutoClipRestore : ::GrNoncopyable {
    600     public:
    601         AutoClipRestore(GrDrawTarget* target) {
    602             fTarget = target;
    603             fClip = fTarget->getClip();
    604         }
    605 
    606         ~AutoClipRestore() {
    607             fTarget->setClip(fClip);
    608         }
    609     private:
    610         GrDrawTarget* fTarget;
    611         GrClip        fClip;
    612     };
    613 
    614     ////////////////////////////////////////////////////////////////////////////
    615 
    616     class AutoGeometryPush : ::GrNoncopyable {
    617     public:
    618         AutoGeometryPush(GrDrawTarget* target) {
    619             GrAssert(NULL != target);
    620             fTarget = target;
    621             target->pushGeometrySource();
    622         }
    623         ~AutoGeometryPush() {
    624             fTarget->popGeometrySource();
    625         }
    626     private:
    627         GrDrawTarget* fTarget;
    628     };
    629 
    630     ////////////////////////////////////////////////////////////////////////////
    631     // Helpers for picking apart vertex layouts
    632 
    633     /**
    634      * Helper function to compute the size of a vertex from a vertex layout
    635      * @return size of a single vertex.
    636      */
    637     static size_t VertexSize(GrVertexLayout vertexLayout);
    638 
    639     /**
    640      * Helper function for determining the index of texture coordinates that
    641      * is input for a texture stage. Note that a stage may instead use positions
    642      * as texture coordinates, in which case the result of the function is
    643      * indistinguishable from the case when the stage is disabled.
    644      *
    645      * @param stage         the stage to query
    646      * @param vertexLayout  layout to query
    647      *
    648      * @return the texture coordinate index or -1 if the stage doesn't use
    649      *         separate (non-position) texture coordinates.
    650      */
    651     static int VertexTexCoordsForStage(int stage, GrVertexLayout vertexLayout);
    652 
    653     /**
    654      * Helper function to compute the offset of texture coordinates in a vertex
    655      * @return offset of texture coordinates in vertex layout or -1 if the
    656      *         layout has no texture coordinates. Will be 0 if positions are
    657      *         used as texture coordinates for the stage.
    658      */
    659     static int VertexStageCoordOffset(int stage, GrVertexLayout vertexLayout);
    660 
    661     /**
    662      * Helper function to compute the offset of the color in a vertex
    663      * @return offset of color in vertex layout or -1 if the
    664      *         layout has no color.
    665      */
    666     static int VertexColorOffset(GrVertexLayout vertexLayout);
    667 
    668     /**
    669      * Helper function to compute the offset of the coverage in a vertex
    670      * @return offset of coverage in vertex layout or -1 if the
    671      *         layout has no coverage.
    672      */
    673     static int VertexCoverageOffset(GrVertexLayout vertexLayout);
    674 
    675      /**
    676       * Helper function to compute the offset of the edge pts in a vertex
    677       * @return offset of edge in vertex layout or -1 if the
    678       *         layout has no edge.
    679       */
    680      static int VertexEdgeOffset(GrVertexLayout vertexLayout);
    681 
    682     /**
    683      * Helper function to determine if vertex layout contains explicit texture
    684      * coordinates of some index.
    685      *
    686      * @param coordIndex    the tex coord index to query
    687      * @param vertexLayout  layout to query
    688      *
    689      * @return true if vertex specifies texture coordinates for the index,
    690      *              false otherwise.
    691      */
    692     static bool VertexUsesTexCoordIdx(int coordIndex,
    693                                       GrVertexLayout vertexLayout);
    694 
    695     /**
    696      * Helper function to determine if vertex layout contains either explicit or
    697      * implicit texture coordinates for a stage.
    698      *
    699      * @param stage         the stage to query
    700      * @param vertexLayout  layout to query
    701      *
    702      * @return true if vertex specifies texture coordinates for the stage,
    703      *              false otherwise.
    704      */
    705     static bool VertexUsesStage(int stage, GrVertexLayout vertexLayout);
    706 
    707     /**
    708      * Helper function to compute the size of each vertex and the offsets of
    709      * texture coordinates and color. Determines tex coord offsets by tex coord
    710      * index rather than by stage. (Each stage can be mapped to any t.c. index
    711      * by StageTexCoordVertexLayoutBit.)
    712      *
    713      * @param vertexLayout          the layout to query
    714      * @param texCoordOffsetsByIdx  after return it is the offset of each
    715      *                              tex coord index in the vertex or -1 if
    716      *                              index isn't used. (optional)
    717      * @param colorOffset           after return it is the offset of the
    718      *                              color field in each vertex, or -1 if
    719      *                              there aren't per-vertex colors. (optional)
    720      * @param coverageOffset        after return it is the offset of the
    721      *                              coverage field in each vertex, or -1 if
    722      *                              there aren't per-vertex coeverages.
    723      *                              (optional)
    724      * @param edgeOffset            after return it is the offset of the
    725      *                              edge eq field in each vertex, or -1 if
    726      *                              there aren't per-vertex edge equations.
    727      *                              (optional)
    728      * @return size of a single vertex
    729      */
    730     static int VertexSizeAndOffsetsByIdx(GrVertexLayout vertexLayout,
    731                    int texCoordOffsetsByIdx[GrDrawState::kMaxTexCoords],
    732                    int *colorOffset,
    733                    int *coverageOffset,
    734                    int* edgeOffset);
    735 
    736     /**
    737      * Helper function to compute the size of each vertex and the offsets of
    738      * texture coordinates and color. Determines tex coord offsets by stage
    739      * rather than by index. (Each stage can be mapped to any t.c. index
    740      * by StageTexCoordVertexLayoutBit.) If a stage uses positions for
    741      * tex coords then that stage's offset will be 0 (positions are always at 0).
    742      *
    743      * @param vertexLayout              the layout to query
    744      * @param texCoordOffsetsByStage    after return it is the offset of each
    745      *                                  tex coord index in the vertex or -1 if
    746      *                                  index isn't used. (optional)
    747      * @param colorOffset               after return it is the offset of the
    748      *                                  color field in each vertex, or -1 if
    749      *                                  there aren't per-vertex colors.
    750      *                                  (optional)
    751      * @param coverageOffset            after return it is the offset of the
    752      *                                  coverage field in each vertex, or -1 if
    753      *                                  there aren't per-vertex coeverages.
    754      *                                  (optional)
    755      * @param edgeOffset                after return it is the offset of the
    756      *                                  edge eq field in each vertex, or -1 if
    757      *                                  there aren't per-vertex edge equations.
    758      *                                  (optional)
    759      * @return size of a single vertex
    760      */
    761     static int VertexSizeAndOffsetsByStage(GrVertexLayout vertexLayout,
    762                    int texCoordOffsetsByStage[GrDrawState::kNumStages],
    763                    int* colorOffset,
    764                    int* coverageOffset,
    765                    int* edgeOffset);
    766 
    767     /**
    768      * Accessing positions, texture coords, or colors, of a vertex within an
    769      * array is a hassle involving casts and simple math. These helpers exist
    770      * to keep GrDrawTarget clients' code a bit nicer looking.
    771      */
    772 
    773     /**
    774      * Gets a pointer to a GrPoint of a vertex's position or texture
    775      * coordinate.
    776      * @param vertices      the vetex array
    777      * @param vertexIndex   the index of the vertex in the array
    778      * @param vertexSize    the size of each vertex in the array
    779      * @param offset        the offset in bytes of the vertex component.
    780      *                      Defaults to zero (corresponding to vertex position)
    781      * @return pointer to the vertex component as a GrPoint
    782      */
    783     static GrPoint* GetVertexPoint(void* vertices,
    784                                    int vertexIndex,
    785                                    int vertexSize,
    786                                    int offset = 0) {
    787         intptr_t start = GrTCast<intptr_t>(vertices);
    788         return GrTCast<GrPoint*>(start + offset +
    789                                  vertexIndex * vertexSize);
    790     }
    791     static const GrPoint* GetVertexPoint(const void* vertices,
    792                                          int vertexIndex,
    793                                          int vertexSize,
    794                                          int offset = 0) {
    795         intptr_t start = GrTCast<intptr_t>(vertices);
    796         return GrTCast<const GrPoint*>(start + offset +
    797                                        vertexIndex * vertexSize);
    798     }
    799 
    800     /**
    801      * Gets a pointer to a GrColor inside a vertex within a vertex array.
    802      * @param vertices      the vetex array
    803      * @param vertexIndex   the index of the vertex in the array
    804      * @param vertexSize    the size of each vertex in the array
    805      * @param offset        the offset in bytes of the vertex color
    806      * @return pointer to the vertex component as a GrColor
    807      */
    808     static GrColor* GetVertexColor(void* vertices,
    809                                    int vertexIndex,
    810                                    int vertexSize,
    811                                    int offset) {
    812         intptr_t start = GrTCast<intptr_t>(vertices);
    813         return GrTCast<GrColor*>(start + offset +
    814                                  vertexIndex * vertexSize);
    815     }
    816     static const GrColor* GetVertexColor(const void* vertices,
    817                                          int vertexIndex,
    818                                          int vertexSize,
    819                                          int offset) {
    820         const intptr_t start = GrTCast<intptr_t>(vertices);
    821         return GrTCast<const GrColor*>(start + offset +
    822                                        vertexIndex * vertexSize);
    823     }
    824 
    825     static void VertexLayoutUnitTest();
    826 
    827 protected:
    828 
    829     /**
    830      * Optimizations for blending / coverage to be applied based on the current
    831      * state.
    832      * Subclasses that actually draw (as opposed to those that just buffer for
    833      * playback) must implement the flags that replace the output color.
    834      */
    835     enum BlendOptFlags {
    836         /**
    837          * No optimization
    838          */
    839         kNone_BlendOpt = 0,
    840         /**
    841          * Don't draw at all
    842          */
    843         kSkipDraw_BlendOptFlag = 0x2,
    844         /**
    845          * Emit the src color, disable HW blending (replace dst with src)
    846          */
    847         kDisableBlend_BlendOptFlag = 0x4,
    848         /**
    849          * The coverage value does not have to be computed separately from
    850          * alpha, the the output color can be the modulation of the two.
    851          */
    852         kCoverageAsAlpha_BlendOptFlag = 0x1,
    853         /**
    854          * Instead of emitting a src color, emit coverage in the alpha channel
    855          * and r,g,b are "don't cares".
    856          */
    857         kEmitCoverage_BlendOptFlag = 0x10,
    858         /**
    859          * Emit transparent black instead of the src color, no need to compute
    860          * coverage.
    861          */
    862         kEmitTransBlack_BlendOptFlag = 0x8,
    863     };
    864     GR_DECL_BITFIELD_OPS_FRIENDS(BlendOptFlags);
    865 
    866     // Determines what optimizations can be applied based on the blend.
    867     // The coeffecients may have to be tweaked in order for the optimization
    868     // to work. srcCoeff and dstCoeff are optional params that receive the
    869     // tweaked coeffecients.
    870     // Normally the function looks at the current state to see if coverage
    871     // is enabled. By setting forceCoverage the caller can speculatively
    872     // determine the blend optimizations that would be used if there was
    873     // partial pixel coverage
    874     BlendOptFlags getBlendOpts(bool forceCoverage = false,
    875                                GrBlendCoeff* srcCoeff = NULL,
    876                                GrBlendCoeff* dstCoeff = NULL) const;
    877 
    878     // determine if src alpha is guaranteed to be one for all src pixels
    879     bool srcAlphaWillBeOne() const;
    880 
    881     enum GeometrySrcType {
    882         kNone_GeometrySrcType,     //<! src has not been specified
    883         kReserved_GeometrySrcType, //<! src was set using reserve*Space
    884         kArray_GeometrySrcType,    //<! src was set using set*SourceToArray
    885         kBuffer_GeometrySrcType    //<! src was set using set*SourceToBuffer
    886     };
    887 
    888     struct GeometrySrcState {
    889         GeometrySrcType         fVertexSrc;
    890         union {
    891             // valid if src type is buffer
    892             const GrVertexBuffer*   fVertexBuffer;
    893             // valid if src type is reserved or array
    894             int                     fVertexCount;
    895         };
    896 
    897         GeometrySrcType         fIndexSrc;
    898         union {
    899             // valid if src type is buffer
    900             const GrIndexBuffer*    fIndexBuffer;
    901             // valid if src type is reserved or array
    902             int                     fIndexCount;
    903         };
    904 
    905         GrVertexLayout          fVertexLayout;
    906     };
    907 
    908     // given a vertex layout and a draw state, will a stage be used?
    909     static bool StageWillBeUsed(int stage, GrVertexLayout layout,
    910                                 const GrDrawState& state) {
    911         return NULL != state.getTexture(stage) &&
    912                VertexUsesStage(stage, layout);
    913     }
    914 
    915     bool isStageEnabled(int stage) const {
    916         return StageWillBeUsed(stage, this->getGeomSrc().fVertexLayout,
    917                                fCurrDrawState);
    918     }
    919 
    920     StageMask enabledStages() const {
    921         StageMask mask = 0;
    922         for (int s = 0; s < GrDrawState::kNumStages; ++s) {
    923             mask |= this->isStageEnabled(s) ? 1 : 0;
    924         }
    925         return mask;
    926     }
    927 
    928     // Helpers for GrDrawTarget subclasses that won't have private access to
    929     // SavedDrawState but need to peek at the state values.
    930     static GrDrawState& accessSavedDrawState(SavedDrawState& sds) {
    931         return *sds.fState.get();
    932     }
    933     static const GrDrawState& accessSavedDrawState(const SavedDrawState& sds){
    934         return *sds.fState.get();
    935     }
    936 
    937     // implemented by subclass to allocate space for reserved geom
    938     virtual bool onReserveVertexSpace(GrVertexLayout vertexLayout,
    939                                       int vertexCount,
    940                                       void** vertices) = 0;
    941     virtual bool onReserveIndexSpace(int indexCount, void** indices) = 0;
    942     // implemented by subclass to handle release of reserved geom space
    943     virtual void releaseReservedVertexSpace() = 0;
    944     virtual void releaseReservedIndexSpace() = 0;
    945     // subclass must consume array contents when set
    946     virtual void onSetVertexSourceToArray(const void* vertexArray,
    947                                           int vertexCount) = 0;
    948     virtual void onSetIndexSourceToArray(const void* indexArray,
    949                                          int indexCount) = 0;
    950     // subclass is notified that geom source will be set away from an array
    951     virtual void releaseVertexArray() = 0;
    952     virtual void releaseIndexArray() = 0;
    953     // subclass overrides to be notified just before geo src state
    954     // is pushed/popped.
    955     virtual void geometrySourceWillPush() = 0;
    956     virtual void geometrySourceWillPop(const GeometrySrcState& restoredState) = 0;
    957     // subclass called to perform drawing
    958     virtual void onDrawIndexed(GrPrimitiveType type,
    959                                int startVertex,
    960                                int startIndex,
    961                                int vertexCount,
    962                                int indexCount) = 0;
    963     virtual void onDrawNonIndexed(GrPrimitiveType type,
    964                                   int startVertex,
    965                                   int vertexCount) = 0;
    966     // subclass overrides to be notified when clip is set. Must call
    967     // INHERITED::clipwillBeSet
    968     virtual void clipWillBeSet(const GrClip& clip);
    969 
    970     // Helpers for drawRect, protected so subclasses that override drawRect
    971     // can use them.
    972     static GrVertexLayout GetRectVertexLayout(StageMask stageEnableBitfield,
    973                                               const GrRect* srcRects[]);
    974 
    975     static void SetRectVertices(const GrRect& rect,
    976                                 const GrMatrix* matrix,
    977                                 const GrRect* srcRects[],
    978                                 const GrMatrix* srcMatrices[],
    979                                 GrVertexLayout layout,
    980                                 void* vertices);
    981 
    982     // accessor for derived classes
    983     const GeometrySrcState& getGeomSrc() const {
    984         return fGeoSrcStateStack.back();
    985     }
    986 
    987     GrClip fClip;
    988 
    989     GrDrawState fCurrDrawState;
    990 
    991     Caps fCaps;
    992 
    993     // subclasses must call this in their destructors to ensure all vertex
    994     // and index sources have been released (including those held by
    995     // pushGeometrySource())
    996     void releaseGeometry();
    997 private:
    998     // called by drawIndexed and drawNonIndexed. Use a negative indexCount to
    999     // indicate non-indexed drawing.
   1000     bool checkDraw(GrPrimitiveType type, int startVertex,
   1001                    int startIndex, int vertexCount,
   1002                    int indexCount) const;
   1003     // called when setting a new vert/idx source to unref prev vb/ib
   1004     void releasePreviousVertexSource();
   1005     void releasePreviousIndexSource();
   1006 
   1007     enum {
   1008         kPreallocGeoSrcStateStackCnt = 4,
   1009     };
   1010     SkSTArray<kPreallocGeoSrcStateStackCnt,
   1011               GeometrySrcState, true>           fGeoSrcStateStack;
   1012 
   1013 };
   1014 
   1015 GR_MAKE_BITFIELD_OPS(GrDrawTarget::BlendOptFlags);
   1016 
   1017 #endif
   1018