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