11cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger
21cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger/*
31cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger * Copyright 2010 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.
71cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger */
81cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger
91cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger
101cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger
111cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger#ifndef GrDrawTarget_DEFINED
121cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger#define GrDrawTarget_DEFINED
131cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger
141cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger#include "GrClip.h"
151cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger#include "GrColor.h"
161cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger#include "GrDrawState.h"
171cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger#include "GrMatrix.h"
181cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger#include "GrRefCnt.h"
191cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger#include "GrSamplerState.h"
201cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger#include "GrStencil.h"
211cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger#include "GrTexture.h"
221cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger
231cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger#include "SkXfermode.h"
244f1dae40e24d57d647db01443b8bf2410514b8b5Derek Sollenberger#include "SkTLazy.h"
251cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger
261cab2921ab279367f8206cdadc9259d12e603548Derek Sollenbergerclass GrTexture;
271cab2921ab279367f8206cdadc9259d12e603548Derek Sollenbergerclass GrClipIterator;
281cab2921ab279367f8206cdadc9259d12e603548Derek Sollenbergerclass GrVertexBuffer;
291cab2921ab279367f8206cdadc9259d12e603548Derek Sollenbergerclass GrIndexBuffer;
301cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger
311cab2921ab279367f8206cdadc9259d12e603548Derek Sollenbergerclass GrDrawTarget : public GrRefCnt {
321cab2921ab279367f8206cdadc9259d12e603548Derek Sollenbergerpublic:
331cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    /**
341cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger     * Represents the draw target capabilities.
351cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger     */
361cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    struct Caps {
371cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger        Caps() { memset(this, 0, sizeof(Caps)); }
381cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger        Caps(const Caps& c) { *this = c; }
391cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger        Caps& operator= (const Caps& c) {
401cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger            memcpy(this, &c, sizeof(Caps));
411cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger            return *this;
421cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger        }
431cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger        void print() const;
441cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger        bool f8BitPaletteSupport        : 1;
451cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger        bool fNPOTTextureTileSupport    : 1;
461cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger        bool fTwoSidedStencilSupport    : 1;
471cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger        bool fStencilWrapOpsSupport     : 1;
481cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger        bool fHWAALineSupport           : 1;
491cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger        bool fShaderDerivativeSupport   : 1;
501cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger        bool fGeometryShaderSupport     : 1;
511cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger        bool fFSAASupport               : 1;
521cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger        bool fDualSourceBlendingSupport : 1;
531cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger        bool fBufferLockSupport         : 1;
541cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger        int fMaxRenderTargetSize;
551cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger        int fMaxTextureSize;
561cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    };
571cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger
581cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    // for convenience
591cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    typedef GrDrawState::StageMask StageMask;
601cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger
611cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    ///////////////////////////////////////////////////////////////////////////
621cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger
631cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    GrDrawTarget();
641cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    virtual ~GrDrawTarget();
651cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger
661cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    /**
671cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger     * Gets the capabilities of the draw target.
681cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger     */
691cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    const Caps& getCaps() const { return fCaps; }
701cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger
711cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    /**
721cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger     * Sets the current clip to the region specified by clip. All draws will be
731cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger     * clipped against this clip if kClip_StateBit is enabled.
741cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger     *
751cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger     * Setting the clip may (or may not) zero out the client's stencil bits.
761cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger     *
771cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger     * @param description of the clipping region
781cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger     */
791cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    void setClip(const GrClip& clip);
801cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger
811cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    /**
821cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger     * Gets the current clip.
831cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger     *
841cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger     * @return the clip.
851cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger     */
861cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    const GrClip& getClip() const;
871cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger
881cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    const GrDrawState& getDrawState() const { return fCurrDrawState; }
891cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    GrDrawState* drawState() { return &fCurrDrawState; }
901cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger
911cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    /**
921cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger     * Shortcut for drawState()->preConcatSamplerMatrices() on all enabled
931cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger     * stages
941cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger     *
951cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger     * @param matrix  the matrix to concat
961cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger     */
971cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    void preConcatEnabledSamplerMatrices(const GrMatrix& matrix) {
981cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger        StageMask stageMask = this->enabledStages();
991cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger        this->drawState()->preConcatSamplerMatrices(stageMask, matrix);
1001cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    }
1011cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger
1021cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    /**
1031cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger     * Determines if blending will require a read of a dst given the current
1041cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger     * state set on the draw target
1051cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger     *
1061cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger     * @return true if the dst surface will be read at each pixel hit by the
1071cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger     *         a draw operation.
1081cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger     */
1091cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    bool drawWillReadDst() const;
1101cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger
1111cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    /**
1121cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger     * Color alpha and coverage are two inputs to the drawing pipeline. For some
1131cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger     * blend modes it is safe to fold the coverage into constant or per-vertex
1141cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger     * color alpha value. For other blend modes they must be handled separately.
1151cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger     * Depending on features available in the underlying 3D API this may or may
1161cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger     * not be possible.
1171cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger     *
1181cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger     * This function looks at the current blend on the draw target and the draw
1191cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger     * target's capabilities to determine whether coverage can be handled
1201cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger     * correctly.
1211cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger     */
1221cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    bool canApplyCoverage() const;
1231cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger
1241cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    /**
1251cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger     * Determines whether incorporating partial pixel coverage into the constant
1261cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger     * color specified by setColor or per-vertex colors will give the right
1271cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger     * blending result.
1281cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger     */
1291cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    bool canTweakAlphaForCoverage() const;
1301cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger
1311cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    /**
1321cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger     * Given the current draw state, vertex layout, and hw support, will HW AA
1331cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger     * lines be used (if line primitive type is drawn)? (Note that lines are
1341cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger     * always 1 pixel wide)
1351cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger     */
1361cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    bool willUseHWAALines() const;
1371cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger
1381cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    /**
1391cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger     * Used to save and restore the GrGpu's drawing state
1401cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger     */
1411cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    struct SavedDrawState {
1421cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    private:
1434f1dae40e24d57d647db01443b8bf2410514b8b5Derek Sollenberger        SkTLazy<GrDrawState> fState;
1441cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger        friend class GrDrawTarget;
1451cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    };
1461cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger
1471cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    /**
1481cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger     * Saves the current draw state. The state can be restored at a later time
1491cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger     * with restoreDrawState.
1501cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger     *
1511cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger     * See also AutoStateRestore class.
1521cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger     *
1531cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger     * @param   state will hold the state after the function returns.
1541cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger     */
1551cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    void saveCurrentDrawState(SavedDrawState* state) const;
1561cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger
1571cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    /**
1581cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger     * Restores previously saved draw state. The client guarantees that state
1591cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger     * was previously passed to saveCurrentDrawState and that the rendertarget
1601cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger     * and texture set at save are still valid.
1611cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger     *
1621cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger     * See also AutoStateRestore class.
1631cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger     *
1641cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger     * @param   state the previously saved state to restore.
1651cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger     */
1661cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    void restoreDrawState(const SavedDrawState& state);
1671cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger
1681cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    /**
1691cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger     * Copies the draw state from another target to this target.
1701cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger     *
1711cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger     * @param srcTarget     draw target used as src of the draw state.
1721cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger     */
1731cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    void copyDrawState(const GrDrawTarget& srcTarget);
1741cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger
1751cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    /**
1761cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger     * The format of vertices is represented as a bitfield of flags.
1771cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger     * Flags that indicate the layout of vertex data. Vertices always contain
1781cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger     * positions and may also contain up to GrDrawState::kMaxTexCoords sets
1791cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger     * of 2D texture * coordinates, per-vertex colors, and per-vertex coverage.
1801cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger     * Each stage can
1811cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger     * use any of the texture coordinates as its input texture coordinates or it
1821cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger     * may use the positions as texture coordinates.
1831cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger     *
1841cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger     * If no texture coordinates are specified for a stage then the stage is
1851cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger     * disabled.
1861cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger     *
1871cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger     * Only one type of texture coord can be specified per stage. For
1881cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger     * example StageTexCoordVertexLayoutBit(0, 2) and
1891cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger     * StagePosAsTexCoordVertexLayoutBit(0) cannot both be specified.
1901cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger     *
1911cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger     * The order in memory is always (position, texture coord 0, ..., color,
1921cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger     * coverage) with any unused fields omitted. Note that this means that if
1931cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger     * only texture coordinates 1 is referenced then there is no texture
1941cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger     * coordinates 0 and the order would be (position, texture coordinate 1
1951cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger     * [, color][, coverage]).
1961cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger     */
1971cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger
1981cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    /**
1991cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger     * Generates a bit indicating that a texture stage uses texture coordinates
2001cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger     *
2011cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger     * @param stage       the stage that will use texture coordinates.
2021cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger     * @param texCoordIdx the index of the texture coordinates to use
2031cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger     *
2041cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger     * @return the bit to add to a GrVertexLayout bitfield.
2051cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger     */
2061cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    static int StageTexCoordVertexLayoutBit(int stage, int texCoordIdx) {
2071cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger        GrAssert(stage < GrDrawState::kNumStages);
2081cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger        GrAssert(texCoordIdx < GrDrawState::kMaxTexCoords);
2091cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger        return 1 << (stage + (texCoordIdx * GrDrawState::kNumStages));
2101cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    }
2111cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger
2121cab2921ab279367f8206cdadc9259d12e603548Derek Sollenbergerprivate:
2131cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    static const int TEX_COORD_BIT_CNT = GrDrawState::kNumStages *
2141cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger                                         GrDrawState::kMaxTexCoords;
2151cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger
2161cab2921ab279367f8206cdadc9259d12e603548Derek Sollenbergerpublic:
2171cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    /**
2181cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger     * Generates a bit indicating that a texture stage uses the position
2191cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger     * as its texture coordinate.
2201cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger     *
2211cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger     * @param stage       the stage that will use position as texture
2221cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger     *                    coordinates.
2231cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger     *
2241cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger     * @return the bit to add to a GrVertexLayout bitfield.
2251cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger     */
2261cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    static int StagePosAsTexCoordVertexLayoutBit(int stage) {
2271cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger        GrAssert(stage < GrDrawState::kNumStages);
2281cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger        return (1 << (TEX_COORD_BIT_CNT + stage));
2291cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    }
2301cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger
2311cab2921ab279367f8206cdadc9259d12e603548Derek Sollenbergerprivate:
2321cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    static const int STAGE_BIT_CNT = TEX_COORD_BIT_CNT +
2331cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger        GrDrawState::kNumStages;
2341cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger
2351cab2921ab279367f8206cdadc9259d12e603548Derek Sollenbergerpublic:
2361cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger
2371cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    /**
2381cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger     * Additional Bits that can be specified in GrVertexLayout.
2391cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger     */
2401cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    enum VertexLayoutBits {
2411cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger        /* vertices have colors (GrColor) */
2421cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger        kColor_VertexLayoutBit              = 1 << (STAGE_BIT_CNT + 0),
2434f1dae40e24d57d647db01443b8bf2410514b8b5Derek Sollenberger        /* vertices have coverage (GrColor)
2441cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger         */
2451cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger        kCoverage_VertexLayoutBit           = 1 << (STAGE_BIT_CNT + 1),
2461cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger        /* Use text vertices. (Pos and tex coords may be a different type for
2471cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger         * text [GrGpuTextVertex vs GrPoint].)
2481cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger         */
2491cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger        kTextFormat_VertexLayoutBit         = 1 << (STAGE_BIT_CNT + 2),
2501cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger
2511cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger        /* Each vertex specificies an edge. Distance to the edge is used to
2521cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger         * compute a coverage. See GrDrawState::setVertexEdgeType().
2531cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger         */
2541cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger        kEdge_VertexLayoutBit               = 1 << (STAGE_BIT_CNT + 3),
2551cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger        // for below assert
2561cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger        kDummyVertexLayoutBit,
2571cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger        kHighVertexLayoutBit = kDummyVertexLayoutBit - 1
2581cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    };
2591cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    // make sure we haven't exceeded the number of bits in GrVertexLayout.
2601cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    GR_STATIC_ASSERT(kHighVertexLayoutBit < ((uint64_t)1 << 8*sizeof(GrVertexLayout)));
2611cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger
2621cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    /**
2631cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger     * There are three methods for specifying geometry (vertices and optionally
2641cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger     * indices) to the draw target. When indexed drawing the indices and vertices
2651cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger     * can use a different method. Once geometry is specified it can be used for
2661cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger     * multiple drawIndexed and drawNonIndexed calls.
2671cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger     *
2681cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger     * Sometimes it is necessary to perform a draw while upstack code has
2691cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger     * already specified geometry that it isn't finished with. There are push
2701cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger     * pop methods
2711cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger     *
2721cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger     * 1. Provide a cpu array (set*SourceToArray). This is useful when the
2731cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger     *    caller's client has already provided vertex data in a format
2741cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger     *    the time compatible with a GrVertexLayout. The array must contain the
2751cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger     *    data at set*SourceToArray is called. The source stays in effect for
2761cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger     *    drawIndexed & drawNonIndexed calls until set*SourceToArray is called
2771cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger     *    again or one of the other two paths is chosen.
2781cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger     *
2791cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger     * 2. Reserve. This is most useful when the caller has data it must
2801cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger     *    transform before drawing and is not long-lived. The caller requests
2811cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger     *    that the draw target make room for some amount of vertex and/or index
2821cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger     *    data. The target provides ptrs to hold the vertex and/or index data.
2831cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger     *
2841cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger     *    The data is writable up until the next drawIndexed, drawNonIndexed,
2851cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger     *    or pushGeometrySource At this point the data is frozen and the ptrs
2861cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger     *    are no longer valid.
2871cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger     *
2881cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger     * 3. Vertex and Index Buffers. This is most useful for geometry that will
2891cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger     *    is long-lived. SetVertexSourceToBuffer and SetIndexSourceToBuffer are
2901cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger     *    used to set the buffer and subsequent drawIndexed and drawNonIndexed
2911cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger     *    calls use this source until another source is set.
2921cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger     */
2931cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger
2941cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    /**
2951cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger     * Reserves space for vertices. Draw target will use reserved vertices at
2961cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger     * at the next draw.
2971cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger     *
2981cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger     * If succeeds:
2991cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger     *          if vertexCount > 0, *vertices will be the array
3001cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger     *          of vertices to be filled by caller. The next draw will read
3011cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger     *          these vertices.
3021cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger     *
3031cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger     * If a client does not already have a vertex buffer then this is the
3041cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger     * preferred way to allocate vertex data. It allows the subclass of
3051cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger     * GrDrawTarget to decide whether to put data in buffers, to group vertex
3061cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger     * data that uses the same state (e.g. for deferred rendering), etc.
3071cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger     *
3081cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger     * After the next draw or pushGeometrySource the vertices ptr is no longer
3091cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger     * valid and the geometry data cannot be further modified. The contents
3101cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger     * that were put in the reserved space can be drawn by multiple draws,
3111cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger     * however.
3121cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger     *
3131cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger     * @param vertexLayout the format of vertices (ignored if vertexCount == 0).
3141cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger     * @param vertexCount  the number of vertices to reserve space for. Can be 0.
3151cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger     * @param vertices     will point to reserved vertex space if vertexCount is
3161cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger     *                     non-zero. Illegal to pass NULL if vertexCount > 0.
3171cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger     *
3181cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger     * @return  true if succeeded in allocating space for the vertices and false
3191cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger     *               if not.
3201cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger     */
3211cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    bool reserveVertexSpace(GrVertexLayout vertexLayout,
3221cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger                            int vertexCount,
3231cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger                            void** vertices);
3241cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    /**
3251cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger     * Reserves space for indices. Draw target will use the reserved indices at
3261cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger     * the next indexed draw.
3271cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger     *
3281cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger     * If succeeds:
3291cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger     *          if indexCount > 0, *indices will be the array
3301cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger     *          of indices to be filled by caller. The next draw will read
3311cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger     *          these indices.
3321cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger     *
3331cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger     * If a client does not already have a index buffer then this is the
3341cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger     * preferred way to allocate index data. It allows the subclass of
3351cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger     * GrDrawTarget to decide whether to put data in buffers, to group index
3361cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger     * data that uses the same state (e.g. for deferred rendering), etc.
3371cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger     *
3381cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger     * After the next indexed draw or pushGeometrySource the indices ptr is no
3391cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger     * longer valid and the geometry data cannot be further modified. The
3401cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger     * contents that were put in the reserved space can be drawn by multiple
3411cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger     * draws, however.
3421cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger     *
3431cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger     * @param indexCount   the number of indices to reserve space for. Can be 0.
3441cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger     * @param indices      will point to reserved index space if indexCount is
3451cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger     *                     non-zero. Illegal to pass NULL if indexCount > 0.
3461cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger     */
3471cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger
3481cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    bool reserveIndexSpace(int indexCount, void** indices);
3491cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    /**
3501cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger     * Provides hints to caller about the number of vertices and indices
3511cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger     * that can be allocated cheaply. This can be useful if caller is reserving
3521cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger     * space but doesn't know exactly how much geometry is needed.
3531cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger     *
3541cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger     * Also may hint whether the draw target should be flushed first. This is
3551cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger     * useful for deferred targets.
3561cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger     *
3571cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger     * @param vertexLayout layout of vertices caller would like to reserve
3581cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger     * @param vertexCount  in: hint about how many vertices the caller would
3591cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger     *                     like to allocate.
3601cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger     *                     out: a hint about the number of vertices that can be
3611cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger     *                     allocated cheaply. Negative means no hint.
3621cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger     *                     Ignored if NULL.
3631cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger     * @param indexCount   in: hint about how many indices the caller would
3641cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger     *                     like to allocate.
3651cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger     *                     out: a hint about the number of indices that can be
3661cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger     *                     allocated cheaply. Negative means no hint.
3671cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger     *                     Ignored if NULL.
3681cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger     *
3691cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger     * @return  true if target should be flushed based on the input values.
3701cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger     */
3711cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    virtual bool geometryHints(GrVertexLayout vertexLayout,
3721cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger                               int* vertexCount,
3731cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger                               int* indexCount) const;
3741cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger
3751cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    /**
3761cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger     * Sets source of vertex data for the next draw. Array must contain
3771cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger     * the vertex data when this is called.
3781cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger     *
3791cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger     * @param array         cpu array containing vertex data.
3801cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger     * @param size          size of the vertex data.
3811cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger     * @param vertexCount   the number of vertices in the array.
3821cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger     */
3831cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    void setVertexSourceToArray(GrVertexLayout vertexLayout,
3841cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger                                const void* vertexArray,
3851cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger                                int vertexCount);
3861cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger
3871cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    /**
3881cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger     * Sets source of index data for the next indexed draw. Array must contain
3891cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger     * the indices when this is called.
3901cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger     *
3911cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger     * @param array         cpu array containing index data.
3921cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger     * @param indexCount    the number of indices in the array.
3931cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger     */
3941cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    void setIndexSourceToArray(const void* indexArray, int indexCount);
3951cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger
3961cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    /**
3971cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger     * Sets source of vertex data for the next draw. Data does not have to be
3981cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger     * in the buffer until drawIndexed or drawNonIndexed.
3991cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger     *
4001cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger     * @param buffer        vertex buffer containing vertex data. Must be
4011cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger     *                      unlocked before draw call.
4021cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger     * @param vertexLayout  layout of the vertex data in the buffer.
4031cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger     */
4041cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    void setVertexSourceToBuffer(GrVertexLayout vertexLayout,
4051cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger                                 const GrVertexBuffer* buffer);
4061cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger
4071cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    /**
4081cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger     * Sets source of index data for the next indexed draw. Data does not have
4091cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger     * to be in the buffer until drawIndexed or drawNonIndexed.
4101cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger     *
4111cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger     * @param buffer index buffer containing indices. Must be unlocked
4121cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger     *               before indexed draw call.
4131cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger     */
4141cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    void setIndexSourceToBuffer(const GrIndexBuffer* buffer);
4151cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger
4161cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    /**
4171cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger     * Resets vertex source. Drawing from reset vertices is illegal. Set vertex
4181cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger     * source to reserved, array, or buffer before next draw. May be able to free
4191cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger     * up temporary storage allocated by setVertexSourceToArray or
4201cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger     * reserveVertexSpace.
4211cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger     */
4221cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    void resetVertexSource();
4231cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger
4241cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    /**
4251cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger     * Resets index source. Indexed Drawing from reset indices is illegal. Set
4261cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger     * index source to reserved, array, or buffer before next indexed draw. May
4271cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger     * be able to free up temporary storage allocated by setIndexSourceToArray
4281cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger     * or reserveIndexSpace.
4291cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger     */
4301cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    void resetIndexSource();
4311cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger
4321cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    /**
4331cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger     * Pushes and resets the vertex/index sources. Any reserved vertex / index
4341cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger     * data is finalized (i.e. cannot be updated after the matching pop but can
4351cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger     * be drawn from). Must be balanced by a pop.
4361cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger     */
4371cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    void pushGeometrySource();
4381cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger
4391cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    /**
4401cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger     * Pops the vertex / index sources from the matching push.
4411cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger     */
4421cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    void popGeometrySource();
4431cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger
4441cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    /**
4451cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger     * Draws indexed geometry using the current state and current vertex / index
4461cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger     * sources.
4471cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger     *
4481cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger     * @param type         The type of primitives to draw.
4491cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger     * @param startVertex  the vertex in the vertex array/buffer corresponding
4501cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger     *                     to index 0
4511cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger     * @param startIndex   first index to read from index src.
4521cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger     * @param vertexCount  one greater than the max index.
4531cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger     * @param indexCount   the number of index elements to read. The index count
4541cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger     *                     is effectively trimmed to the last completely
4551cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger     *                     specified primitive.
4561cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger     */
4571cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    void drawIndexed(GrPrimitiveType type,
4581cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger                     int startVertex,
4591cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger                     int startIndex,
4601cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger                     int vertexCount,
4611cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger                     int indexCount);
4621cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger
4631cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    /**
4641cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger     * Draws non-indexed geometry using the current state and current vertex
4651cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger     * sources.
4661cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger     *
4671cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger     * @param type         The type of primitives to draw.
4681cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger     * @param startVertex  the vertex in the vertex array/buffer corresponding
4691cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger     *                     to index 0
4701cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger     * @param vertexCount  one greater than the max index.
4711cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger     */
4721cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    void drawNonIndexed(GrPrimitiveType type,
4731cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger                        int startVertex,
4741cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger                        int vertexCount);
4751cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger
4761cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    /**
4771cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger     * Helper function for drawing rects. This does not use the current index
4781cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger     * and vertex sources. After returning, the vertex and index sources may
4791cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger     * have changed. They should be reestablished before the next drawIndexed
4801cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger     * or drawNonIndexed. This cannot be called between reserving and releasing
4811cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger     * geometry. The GrDrawTarget subclass may be able to perform additional
4821cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger     * optimizations if drawRect is used rather than drawIndexed or
4831cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger     * drawNonIndexed.
4841cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger     * @param rect      the rect to draw
4851cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger     * @param matrix    optional matrix applied to rect (before viewMatrix)
4861cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger     * @param stageMask bitmask indicating which stages are enabled.
4871cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger     *                  Bit i indicates whether stage i is enabled.
4881cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger     * @param srcRects  specifies rects for stages enabled by stageEnableMask.
4891cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger     *                  if stageEnableMask bit i is 1, srcRects is not NULL,
4901cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger     *                  and srcRects[i] is not NULL, then srcRects[i] will be
4911cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger     *                  used as coordinates for stage i. Otherwise, if stage i
4921cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger     *                  is enabled then rect is used as the coordinates.
4931cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger     * @param srcMatrices   optional matrices applied to srcRects. If
4941cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger     *                      srcRect[i] is non-NULL and srcMatrices[i] is
4951cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger     *                      non-NULL then srcRect[i] will be transformed by
4961cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger     *                      srcMatrix[i]. srcMatrices can be NULL when no
4971cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger     *                      srcMatrices are desired.
4981cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger     */
4991cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    virtual void drawRect(const GrRect& rect,
5001cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger                          const GrMatrix* matrix,
5011cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger                          StageMask stageMask,
5021cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger                          const GrRect* srcRects[],
5031cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger                          const GrMatrix* srcMatrices[]);
5041cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger
5051cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    /**
5061cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger     * Helper for drawRect when the caller doesn't need separate src rects or
5071cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger     * matrices.
5081cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger     */
5091cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    void drawSimpleRect(const GrRect& rect,
5101cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger                        const GrMatrix* matrix,
5111cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger                        StageMask stageEnableBitfield) {
5121cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger         drawRect(rect, matrix, stageEnableBitfield, NULL, NULL);
5131cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    }
5141cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger
5151cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    /**
5161cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger     * Clear the render target. Ignores the clip and all other draw state
5171cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger     * (blend mode, stages, etc). Clears the whole thing if rect is NULL,
5181cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger     * otherwise just the rect.
5191cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger     */
5201cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    virtual void clear(const GrIRect* rect, GrColor color) = 0;
5211cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger
5221cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    /**
5231cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger     * Returns the maximum number of edges that may be specified in a single
5241cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger     * draw call when performing edge antialiasing.  This is usually limited
5251cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger     * by the number of fragment uniforms which may be uploaded.  Must be a
5261cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger     * minimum of six, since a triangle's vertices each belong to two boundary
5271cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger     * edges which may be distinct.
5281cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger     */
5291cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    virtual int getMaxEdges() const { return 6; }
5301cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger
5311cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    ////////////////////////////////////////////////////////////////////////////
5321cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger
5331cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    class AutoStateRestore : ::GrNoncopyable {
5341cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    public:
5351cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger        AutoStateRestore();
5361cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger        AutoStateRestore(GrDrawTarget* target);
5371cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger        ~AutoStateRestore();
5381cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger
5391cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger        /**
5401cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger         * if this object is already saving state for param target then
5411cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger         * this does nothing. Otherise, it restores previously saved state on
5421cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger         * previous target (if any) and saves current state on param target.
5431cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger         */
5441cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger        void set(GrDrawTarget* target);
5451cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger
5461cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    private:
5471cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger        GrDrawTarget*       fDrawTarget;
5481cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger        SavedDrawState      fDrawState;
5491cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    };
5501cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger
5511cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    ////////////////////////////////////////////////////////////////////////////
5521cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger
5531cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    /**
5541cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger     * Sets the view matrix to I and preconcats all stage matrices enabled in
5551cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger     * mask by the view inverse. Destructor undoes these changes.
5561cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger     */
5571cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    class AutoDeviceCoordDraw : ::GrNoncopyable {
5581cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    public:
5591cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger        AutoDeviceCoordDraw(GrDrawTarget* target, StageMask stageMask);
5601cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger        ~AutoDeviceCoordDraw();
5611cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    private:
5621cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger        GrDrawTarget*       fDrawTarget;
5631cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger        GrMatrix            fViewMatrix;
5641cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger        GrMatrix            fSamplerMatrices[GrDrawState::kNumStages];
5651cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger        int                 fStageMask;
5661cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    };
5671cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger
5681cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    ////////////////////////////////////////////////////////////////////////////
5691cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger
5701cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    class AutoReleaseGeometry : ::GrNoncopyable {
5711cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    public:
5721cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger        AutoReleaseGeometry(GrDrawTarget*  target,
5731cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger                            GrVertexLayout vertexLayout,
5741cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger                            int            vertexCount,
5751cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger                            int            indexCount);
5761cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger        AutoReleaseGeometry();
5771cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger        ~AutoReleaseGeometry();
5781cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger        bool set(GrDrawTarget*  target,
5791cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger                 GrVertexLayout vertexLayout,
5801cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger                 int            vertexCount,
5811cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger                 int            indexCount);
5821cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger        bool succeeded() const { return NULL != fTarget; }
5831cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger        void* vertices() const { GrAssert(this->succeeded()); return fVertices; }
5841cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger        void* indices() const { GrAssert(this->succeeded()); return fIndices; }
5851cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger        GrPoint* positions() const {
5861cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger            return static_cast<GrPoint*>(this->vertices());
5871cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger        }
5881cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger
5891cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    private:
5901cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger        void reset();
5911cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger
5921cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger        GrDrawTarget* fTarget;
5931cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger        void*         fVertices;
5941cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger        void*         fIndices;
5951cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    };
5961cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger
5971cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    ////////////////////////////////////////////////////////////////////////////
5981cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger
5991cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    class AutoClipRestore : ::GrNoncopyable {
6001cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    public:
6011cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger        AutoClipRestore(GrDrawTarget* target) {
6021cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger            fTarget = target;
6031cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger            fClip = fTarget->getClip();
6041cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger        }
6051cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger
6061cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger        ~AutoClipRestore() {
6071cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger            fTarget->setClip(fClip);
6081cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger        }
6091cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    private:
6101cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger        GrDrawTarget* fTarget;
6111cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger        GrClip        fClip;
6121cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    };
6131cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger
6141cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    ////////////////////////////////////////////////////////////////////////////
6151cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger
6161cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    class AutoGeometryPush : ::GrNoncopyable {
6171cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    public:
6181cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger        AutoGeometryPush(GrDrawTarget* target) {
6191cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger            GrAssert(NULL != target);
6201cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger            fTarget = target;
6211cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger            target->pushGeometrySource();
6221cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger        }
6231cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger        ~AutoGeometryPush() {
6241cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger            fTarget->popGeometrySource();
6251cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger        }
6261cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    private:
6271cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger        GrDrawTarget* fTarget;
6281cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    };
6291cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger
6301cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    ////////////////////////////////////////////////////////////////////////////
6311cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    // Helpers for picking apart vertex layouts
6321cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger
6331cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    /**
6341cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger     * Helper function to compute the size of a vertex from a vertex layout
6351cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger     * @return size of a single vertex.
6361cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger     */
6371cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    static size_t VertexSize(GrVertexLayout vertexLayout);
6381cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger
6391cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    /**
6401cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger     * Helper function for determining the index of texture coordinates that
6411cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger     * is input for a texture stage. Note that a stage may instead use positions
6421cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger     * as texture coordinates, in which case the result of the function is
6431cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger     * indistinguishable from the case when the stage is disabled.
6441cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger     *
6451cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger     * @param stage         the stage to query
6461cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger     * @param vertexLayout  layout to query
6471cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger     *
6481cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger     * @return the texture coordinate index or -1 if the stage doesn't use
6491cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger     *         separate (non-position) texture coordinates.
6501cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger     */
6511cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    static int VertexTexCoordsForStage(int stage, GrVertexLayout vertexLayout);
6521cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger
6531cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    /**
6541cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger     * Helper function to compute the offset of texture coordinates in a vertex
6551cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger     * @return offset of texture coordinates in vertex layout or -1 if the
6561cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger     *         layout has no texture coordinates. Will be 0 if positions are
6571cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger     *         used as texture coordinates for the stage.
6581cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger     */
6591cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    static int VertexStageCoordOffset(int stage, GrVertexLayout vertexLayout);
6601cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger
6611cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    /**
6621cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger     * Helper function to compute the offset of the color in a vertex
6631cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger     * @return offset of color in vertex layout or -1 if the
6641cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger     *         layout has no color.
6651cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger     */
6661cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    static int VertexColorOffset(GrVertexLayout vertexLayout);
6671cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger
6681cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    /**
6691cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger     * Helper function to compute the offset of the coverage in a vertex
6701cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger     * @return offset of coverage in vertex layout or -1 if the
6711cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger     *         layout has no coverage.
6721cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger     */
6731cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    static int VertexCoverageOffset(GrVertexLayout vertexLayout);
6741cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger
6751cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger     /**
6761cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger      * Helper function to compute the offset of the edge pts in a vertex
6771cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger      * @return offset of edge in vertex layout or -1 if the
6781cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger      *         layout has no edge.
6791cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger      */
6801cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger     static int VertexEdgeOffset(GrVertexLayout vertexLayout);
6811cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger
6821cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    /**
6831cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger     * Helper function to determine if vertex layout contains explicit texture
6841cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger     * coordinates of some index.
6851cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger     *
6861cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger     * @param coordIndex    the tex coord index to query
6871cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger     * @param vertexLayout  layout to query
6881cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger     *
6891cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger     * @return true if vertex specifies texture coordinates for the index,
6901cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger     *              false otherwise.
6911cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger     */
6921cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    static bool VertexUsesTexCoordIdx(int coordIndex,
6931cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger                                      GrVertexLayout vertexLayout);
6941cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger
6951cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    /**
6961cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger     * Helper function to determine if vertex layout contains either explicit or
6971cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger     * implicit texture coordinates for a stage.
6981cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger     *
6991cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger     * @param stage         the stage to query
7001cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger     * @param vertexLayout  layout to query
7011cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger     *
7021cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger     * @return true if vertex specifies texture coordinates for the stage,
7031cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger     *              false otherwise.
7041cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger     */
7051cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    static bool VertexUsesStage(int stage, GrVertexLayout vertexLayout);
7061cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger
7071cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    /**
7081cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger     * Helper function to compute the size of each vertex and the offsets of
7091cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger     * texture coordinates and color. Determines tex coord offsets by tex coord
7101cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger     * index rather than by stage. (Each stage can be mapped to any t.c. index
7111cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger     * by StageTexCoordVertexLayoutBit.)
7121cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger     *
7131cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger     * @param vertexLayout          the layout to query
7141cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger     * @param texCoordOffsetsByIdx  after return it is the offset of each
7151cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger     *                              tex coord index in the vertex or -1 if
7161cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger     *                              index isn't used. (optional)
7171cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger     * @param colorOffset           after return it is the offset of the
7181cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger     *                              color field in each vertex, or -1 if
7191cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger     *                              there aren't per-vertex colors. (optional)
7201cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger     * @param coverageOffset        after return it is the offset of the
7211cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger     *                              coverage field in each vertex, or -1 if
7221cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger     *                              there aren't per-vertex coeverages.
7231cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger     *                              (optional)
7241cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger     * @param edgeOffset            after return it is the offset of the
7251cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger     *                              edge eq field in each vertex, or -1 if
7261cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger     *                              there aren't per-vertex edge equations.
7271cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger     *                              (optional)
7281cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger     * @return size of a single vertex
7291cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger     */
7301cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    static int VertexSizeAndOffsetsByIdx(GrVertexLayout vertexLayout,
7311cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger                   int texCoordOffsetsByIdx[GrDrawState::kMaxTexCoords],
7321cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger                   int *colorOffset,
7331cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger                   int *coverageOffset,
7341cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger                   int* edgeOffset);
7351cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger
7361cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    /**
7371cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger     * Helper function to compute the size of each vertex and the offsets of
7381cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger     * texture coordinates and color. Determines tex coord offsets by stage
7391cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger     * rather than by index. (Each stage can be mapped to any t.c. index
7401cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger     * by StageTexCoordVertexLayoutBit.) If a stage uses positions for
7411cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger     * tex coords then that stage's offset will be 0 (positions are always at 0).
7421cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger     *
7431cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger     * @param vertexLayout              the layout to query
7441cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger     * @param texCoordOffsetsByStage    after return it is the offset of each
7451cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger     *                                  tex coord index in the vertex or -1 if
7461cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger     *                                  index isn't used. (optional)
7471cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger     * @param colorOffset               after return it is the offset of the
7481cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger     *                                  color field in each vertex, or -1 if
7491cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger     *                                  there aren't per-vertex colors.
7501cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger     *                                  (optional)
7511cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger     * @param coverageOffset            after return it is the offset of the
7521cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger     *                                  coverage field in each vertex, or -1 if
7531cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger     *                                  there aren't per-vertex coeverages.
7541cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger     *                                  (optional)
7551cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger     * @param edgeOffset                after return it is the offset of the
7561cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger     *                                  edge eq field in each vertex, or -1 if
7571cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger     *                                  there aren't per-vertex edge equations.
7581cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger     *                                  (optional)
7591cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger     * @return size of a single vertex
7601cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger     */
7611cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    static int VertexSizeAndOffsetsByStage(GrVertexLayout vertexLayout,
7621cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger                   int texCoordOffsetsByStage[GrDrawState::kNumStages],
7631cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger                   int* colorOffset,
7641cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger                   int* coverageOffset,
7651cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger                   int* edgeOffset);
7661cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger
7671cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    /**
7681cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger     * Accessing positions, texture coords, or colors, of a vertex within an
7691cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger     * array is a hassle involving casts and simple math. These helpers exist
7701cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger     * to keep GrDrawTarget clients' code a bit nicer looking.
7711cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger     */
7721cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger
7731cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    /**
7741cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger     * Gets a pointer to a GrPoint of a vertex's position or texture
7751cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger     * coordinate.
7761cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger     * @param vertices      the vetex array
7771cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger     * @param vertexIndex   the index of the vertex in the array
7781cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger     * @param vertexSize    the size of each vertex in the array
7791cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger     * @param offset        the offset in bytes of the vertex component.
7801cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger     *                      Defaults to zero (corresponding to vertex position)
7811cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger     * @return pointer to the vertex component as a GrPoint
7821cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger     */
7831cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    static GrPoint* GetVertexPoint(void* vertices,
7841cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger                                   int vertexIndex,
7851cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger                                   int vertexSize,
7861cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger                                   int offset = 0) {
7871cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger        intptr_t start = GrTCast<intptr_t>(vertices);
7881cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger        return GrTCast<GrPoint*>(start + offset +
7891cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger                                 vertexIndex * vertexSize);
7901cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    }
7911cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    static const GrPoint* GetVertexPoint(const void* vertices,
7921cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger                                         int vertexIndex,
7931cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger                                         int vertexSize,
7941cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger                                         int offset = 0) {
7951cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger        intptr_t start = GrTCast<intptr_t>(vertices);
7961cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger        return GrTCast<const GrPoint*>(start + offset +
7971cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger                                       vertexIndex * vertexSize);
7981cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    }
7991cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger
8001cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    /**
8011cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger     * Gets a pointer to a GrColor inside a vertex within a vertex array.
8021cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger     * @param vertices      the vetex array
8031cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger     * @param vertexIndex   the index of the vertex in the array
8041cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger     * @param vertexSize    the size of each vertex in the array
8051cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger     * @param offset        the offset in bytes of the vertex color
8061cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger     * @return pointer to the vertex component as a GrColor
8071cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger     */
8081cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    static GrColor* GetVertexColor(void* vertices,
8091cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger                                   int vertexIndex,
8101cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger                                   int vertexSize,
8111cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger                                   int offset) {
8121cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger        intptr_t start = GrTCast<intptr_t>(vertices);
8131cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger        return GrTCast<GrColor*>(start + offset +
8141cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger                                 vertexIndex * vertexSize);
8151cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    }
8161cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    static const GrColor* GetVertexColor(const void* vertices,
8171cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger                                         int vertexIndex,
8181cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger                                         int vertexSize,
8191cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger                                         int offset) {
8201cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger        const intptr_t start = GrTCast<intptr_t>(vertices);
8211cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger        return GrTCast<const GrColor*>(start + offset +
8221cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger                                       vertexIndex * vertexSize);
8231cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    }
8241cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger
8251cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    static void VertexLayoutUnitTest();
8261cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger
8271cab2921ab279367f8206cdadc9259d12e603548Derek Sollenbergerprotected:
8281cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger
8291cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    /**
8301cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger     * Optimizations for blending / coverage to be applied based on the current
8311cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger     * state.
8321cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger     * Subclasses that actually draw (as opposed to those that just buffer for
8331cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger     * playback) must implement the flags that replace the output color.
8341cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger     */
8351cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    enum BlendOptFlags {
8361cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger        /**
8371cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger         * No optimization
8381cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger         */
8391cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger        kNone_BlendOpt = 0,
8401cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger        /**
8411cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger         * Don't draw at all
8421cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger         */
8431cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger        kSkipDraw_BlendOptFlag = 0x2,
8441cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger        /**
8451cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger         * Emit the src color, disable HW blending (replace dst with src)
8461cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger         */
8471cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger        kDisableBlend_BlendOptFlag = 0x4,
8481cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger        /**
8491cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger         * The coverage value does not have to be computed separately from
8501cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger         * alpha, the the output color can be the modulation of the two.
8511cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger         */
8521cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger        kCoverageAsAlpha_BlendOptFlag = 0x1,
8531cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger        /**
8541cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger         * Instead of emitting a src color, emit coverage in the alpha channel
8551cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger         * and r,g,b are "don't cares".
8561cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger         */
8571cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger        kEmitCoverage_BlendOptFlag = 0x10,
8581cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger        /**
8591cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger         * Emit transparent black instead of the src color, no need to compute
8601cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger         * coverage.
8611cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger         */
8621cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger        kEmitTransBlack_BlendOptFlag = 0x8,
8631cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    };
8641cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    GR_DECL_BITFIELD_OPS_FRIENDS(BlendOptFlags);
8651cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger
8661cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    // Determines what optimizations can be applied based on the blend.
8671cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    // The coeffecients may have to be tweaked in order for the optimization
8681cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    // to work. srcCoeff and dstCoeff are optional params that receive the
8691cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    // tweaked coeffecients.
8701cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    // Normally the function looks at the current state to see if coverage
8711cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    // is enabled. By setting forceCoverage the caller can speculatively
8721cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    // determine the blend optimizations that would be used if there was
8731cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    // partial pixel coverage
8741cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    BlendOptFlags getBlendOpts(bool forceCoverage = false,
8751cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger                               GrBlendCoeff* srcCoeff = NULL,
8761cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger                               GrBlendCoeff* dstCoeff = NULL) const;
8771cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger
8781cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    // determine if src alpha is guaranteed to be one for all src pixels
8791cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    bool srcAlphaWillBeOne() const;
8801cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger
8811cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    enum GeometrySrcType {
8821cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger        kNone_GeometrySrcType,     //<! src has not been specified
8831cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger        kReserved_GeometrySrcType, //<! src was set using reserve*Space
8841cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger        kArray_GeometrySrcType,    //<! src was set using set*SourceToArray
8851cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger        kBuffer_GeometrySrcType    //<! src was set using set*SourceToBuffer
8861cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    };
8871cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger
8881cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    struct GeometrySrcState {
8891cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger        GeometrySrcType         fVertexSrc;
8901cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger        union {
8911cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger            // valid if src type is buffer
8921cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger            const GrVertexBuffer*   fVertexBuffer;
8931cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger            // valid if src type is reserved or array
8941cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger            int                     fVertexCount;
8951cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger        };
8961cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger
8971cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger        GeometrySrcType         fIndexSrc;
8981cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger        union {
8991cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger            // valid if src type is buffer
9001cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger            const GrIndexBuffer*    fIndexBuffer;
9011cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger            // valid if src type is reserved or array
9021cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger            int                     fIndexCount;
9031cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger        };
9041cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger
9051cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger        GrVertexLayout          fVertexLayout;
9061cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    };
9071cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger
9081cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    // given a vertex layout and a draw state, will a stage be used?
9091cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    static bool StageWillBeUsed(int stage, GrVertexLayout layout,
9101cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger                                const GrDrawState& state) {
9111cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger        return NULL != state.getTexture(stage) &&
9121cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger               VertexUsesStage(stage, layout);
9131cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    }
9141cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger
9151cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    bool isStageEnabled(int stage) const {
9161cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger        return StageWillBeUsed(stage, this->getGeomSrc().fVertexLayout,
9171cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger                               fCurrDrawState);
9181cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    }
9191cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger
9201cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    StageMask enabledStages() const {
9211cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger        StageMask mask = 0;
9221cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger        for (int s = 0; s < GrDrawState::kNumStages; ++s) {
9231cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger            mask |= this->isStageEnabled(s) ? 1 : 0;
9241cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger        }
9251cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger        return mask;
9261cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    }
9271cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger
9281cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    // Helpers for GrDrawTarget subclasses that won't have private access to
9291cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    // SavedDrawState but need to peek at the state values.
9304f1dae40e24d57d647db01443b8bf2410514b8b5Derek Sollenberger    static GrDrawState& accessSavedDrawState(SavedDrawState& sds) {
9314f1dae40e24d57d647db01443b8bf2410514b8b5Derek Sollenberger        return *sds.fState.get();
9324f1dae40e24d57d647db01443b8bf2410514b8b5Derek Sollenberger    }
9334f1dae40e24d57d647db01443b8bf2410514b8b5Derek Sollenberger    static const GrDrawState& accessSavedDrawState(const SavedDrawState& sds){
9344f1dae40e24d57d647db01443b8bf2410514b8b5Derek Sollenberger        return *sds.fState.get();
9354f1dae40e24d57d647db01443b8bf2410514b8b5Derek Sollenberger    }
9361cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger
9371cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    // implemented by subclass to allocate space for reserved geom
9381cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    virtual bool onReserveVertexSpace(GrVertexLayout vertexLayout,
9391cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger                                      int vertexCount,
9401cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger                                      void** vertices) = 0;
9411cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    virtual bool onReserveIndexSpace(int indexCount, void** indices) = 0;
9421cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    // implemented by subclass to handle release of reserved geom space
9431cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    virtual void releaseReservedVertexSpace() = 0;
9441cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    virtual void releaseReservedIndexSpace() = 0;
9451cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    // subclass must consume array contents when set
9461cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    virtual void onSetVertexSourceToArray(const void* vertexArray,
9471cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger                                          int vertexCount) = 0;
9481cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    virtual void onSetIndexSourceToArray(const void* indexArray,
9491cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger                                         int indexCount) = 0;
9501cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    // subclass is notified that geom source will be set away from an array
9511cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    virtual void releaseVertexArray() = 0;
9521cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    virtual void releaseIndexArray() = 0;
9531cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    // subclass overrides to be notified just before geo src state
9541cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    // is pushed/popped.
9551cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    virtual void geometrySourceWillPush() = 0;
9561cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    virtual void geometrySourceWillPop(const GeometrySrcState& restoredState) = 0;
9571cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    // subclass called to perform drawing
9581cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    virtual void onDrawIndexed(GrPrimitiveType type,
9591cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger                               int startVertex,
9601cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger                               int startIndex,
9611cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger                               int vertexCount,
9621cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger                               int indexCount) = 0;
9631cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    virtual void onDrawNonIndexed(GrPrimitiveType type,
9641cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger                                  int startVertex,
9651cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger                                  int vertexCount) = 0;
9661cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    // subclass overrides to be notified when clip is set. Must call
9671cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    // INHERITED::clipwillBeSet
9681cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    virtual void clipWillBeSet(const GrClip& clip);
9691cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger
9701cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    // Helpers for drawRect, protected so subclasses that override drawRect
9711cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    // can use them.
9721cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    static GrVertexLayout GetRectVertexLayout(StageMask stageEnableBitfield,
9731cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger                                              const GrRect* srcRects[]);
9741cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger
9751cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    static void SetRectVertices(const GrRect& rect,
9761cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger                                const GrMatrix* matrix,
9771cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger                                const GrRect* srcRects[],
9781cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger                                const GrMatrix* srcMatrices[],
9791cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger                                GrVertexLayout layout,
9801cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger                                void* vertices);
9811cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger
9821cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    // accessor for derived classes
9831cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    const GeometrySrcState& getGeomSrc() const {
9841cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger        return fGeoSrcStateStack.back();
9851cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    }
9861cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger
9871cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    GrClip fClip;
9881cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger
9891cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    GrDrawState fCurrDrawState;
9901cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger
9911cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    Caps fCaps;
9921cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger
9931cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    // subclasses must call this in their destructors to ensure all vertex
9941cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    // and index sources have been released (including those held by
9951cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    // pushGeometrySource())
9961cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    void releaseGeometry();
9971cab2921ab279367f8206cdadc9259d12e603548Derek Sollenbergerprivate:
9981cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    // called by drawIndexed and drawNonIndexed. Use a negative indexCount to
9991cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    // indicate non-indexed drawing.
10001cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    bool checkDraw(GrPrimitiveType type, int startVertex,
10011cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger                   int startIndex, int vertexCount,
10021cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger                   int indexCount) const;
10031cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    // called when setting a new vert/idx source to unref prev vb/ib
10041cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    void releasePreviousVertexSource();
10051cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    void releasePreviousIndexSource();
10061cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger
10071cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    enum {
10081cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger        kPreallocGeoSrcStateStackCnt = 4,
10091cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    };
10101cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    SkSTArray<kPreallocGeoSrcStateStackCnt,
10111cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger              GeometrySrcState, true>           fGeoSrcStateStack;
10121cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger
10131cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger};
10141cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger
10151cab2921ab279367f8206cdadc9259d12e603548Derek SollenbergerGR_MAKE_BITFIELD_OPS(GrDrawTarget::BlendOptFlags);
10161cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger
10171cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger#endif
1018