| Index: src/gpu/GrDrawState.h
|
| ===================================================================
|
| --- src/gpu/GrDrawState.h (revision 8462)
|
| +++ src/gpu/GrDrawState.h (working copy)
|
| @@ -23,11 +23,6 @@
|
| #include "SkMatrix.h"
|
| #include "SkXfermode.h"
|
|
|
| -/**
|
| - * Type used to describe how attributes bind to program usage
|
| - */
|
| -typedef int GrAttribBindings;
|
| -
|
| class GrDrawState : public GrRefCnt {
|
| public:
|
| SK_DECLARE_INST_COUNT(GrDrawState)
|
| @@ -45,8 +40,8 @@
|
| * coverage rather than as input to the src/dst color blend step.
|
| *
|
| * The input color to the first enabled color-stage is either the constant color or interpolated
|
| - * per-vertex colors, depending upon GrAttribBindings. The input to the first coverage stage is
|
| - * either a constant coverage (usually full-coverage) or interpolated per-vertex coverage.
|
| + * per-vertex colors. The input to the first coverage stage is either a constant coverage
|
| + * (usually full-coverage) or interpolated per-vertex coverage.
|
| *
|
| * See the documentation of kCoverageDrawing_StateBit for information about disabling the
|
| * the color / coverage distinction.
|
| @@ -62,9 +57,6 @@
|
| };
|
|
|
| GrDrawState() {
|
| -#if GR_DEBUG
|
| - VertexAttributesUnitTest();
|
| -#endif
|
| this->reset();
|
| }
|
|
|
| @@ -115,53 +107,72 @@
|
| ////
|
|
|
| enum {
|
| - kVertexAttribCnt = 6,
|
| + kMaxVertexAttribCnt = kLast_GrVertexAttribBinding + 4,
|
| };
|
|
|
| /**
|
| - * The format of vertices is represented as an array of vertex attribute
|
| - * pair, with each pair representing the type of the attribute and the
|
| - * offset in the vertex structure (see GrVertexAttrib, above).
|
| + * The format of vertices is represented as an array of GrVertexAttribs, with each representing
|
| + * the type of the attribute, its offset, and semantic binding (see GrVertexAttrib in
|
| + * GrTypesPriv.h).
|
| *
|
| - * This will only set up the vertex geometry. To bind the attributes in
|
| - * the shaders, attribute indices and attribute bindings need to be set
|
| - * as well.
|
| + * The mapping of attributes with kEffect bindings to GrEffect inputs is specified when
|
| + * setEffect is called.
|
| */
|
|
|
| /**
|
| * Sets vertex attributes for next draw.
|
| *
|
| * @param attribs the array of vertex attributes to set.
|
| - * @param count the number of attributes being set.
|
| - * limited to a count of kVertexAttribCnt.
|
| + * @param count the number of attributes being set, limited to kMaxVertexAttribCnt.
|
| */
|
| void setVertexAttribs(const GrVertexAttrib attribs[], int count);
|
|
|
| - const GrVertexAttrib* getVertexAttribs() const { return fVertexAttribs.begin(); }
|
| - int getVertexAttribCount() const { return fVertexAttribs.count(); }
|
| + const GrVertexAttrib* getVertexAttribs() const { return fCommon.fVertexAttribs.begin(); }
|
| + int getVertexAttribCount() const { return fCommon.fVertexAttribs.count(); }
|
|
|
| size_t getVertexSize() const;
|
|
|
| /**
|
| - * Sets default vertex attributes for next draw.
|
| - *
|
| - * This will also set default vertex attribute indices and bindings
|
| + * Sets default vertex attributes for next draw. The default is a single attribute:
|
| + * {kVec2f_GrVertexAttribType, 0, kPosition_GrVertexAttribType}
|
| */
|
| void setDefaultVertexAttribs();
|
|
|
| - bool validateVertexAttribs() const;
|
| + /**
|
| + * Getters for index into getVertexAttribs() for particular bindings. -1 is returned if the
|
| + * binding does not appear in the current attribs. These bindings should appear only once in
|
| + * the attrib array.
|
| + */
|
|
|
| - ////////////////////////////////////////////////////////////////////////////
|
| - // Helpers for picking apart vertex attributes
|
| + int positionAttributeIndex() const {
|
| + return fCommon.fFixedFunctionVertexAttribIndices[kPosition_GrVertexAttribBinding];
|
| + }
|
| + int localCoordAttributeIndex() const {
|
| + return fCommon.fFixedFunctionVertexAttribIndices[kLocalCoord_GrVertexAttribBinding];
|
| + }
|
| + int colorVertexAttributeIndex() const {
|
| + return fCommon.fFixedFunctionVertexAttribIndices[kColor_GrVertexAttribBinding];
|
| + }
|
| + int coverageVertexAttributeIndex() const {
|
| + return fCommon.fFixedFunctionVertexAttribIndices[kCoverage_GrVertexAttribBinding];
|
| + }
|
|
|
| - // helper array to let us check the expected so we know what bound attrib indices
|
| - // we care about
|
| - static const size_t kVertexAttribSizes[kGrVertexAttribTypeCount];
|
| + bool hasLocalCoordAttribute() const {
|
| + return -1 != fCommon.fFixedFunctionVertexAttribIndices[kLocalCoord_GrVertexAttribBinding];
|
| + }
|
| + bool hasColorVertexAttribute() const {
|
| + return -1 != fCommon.fFixedFunctionVertexAttribIndices[kColor_GrVertexAttribBinding];
|
| + }
|
| + bool hasCoverageVertexAttribute() const {
|
| + return -1 != fCommon.fFixedFunctionVertexAttribIndices[kCoverage_GrVertexAttribBinding];
|
| + }
|
|
|
| + bool validateVertexAttribs() const;
|
| +
|
| /**
|
| - * Accessing positions, texture coords, or colors, of a vertex within an
|
| - * array is a hassle involving casts and simple math. These helpers exist
|
| - * to keep GrDrawTarget clients' code a bit nicer looking.
|
| + * Accessing positions, local coords, or colors, of a vertex within an array is a hassle
|
| + * involving casts and simple math. These helpers exist to keep GrDrawTarget clients' code a bit
|
| + * nicer looking.
|
| */
|
|
|
| /**
|
| @@ -218,114 +229,19 @@
|
|
|
| /// @}
|
|
|
| - ///////////////////////////////////////////////////////////////////////////
|
| - /// @name Attribute Bindings
|
| - ////
|
| -
|
| /**
|
| - * The vertex data used by the current program is represented as a bitfield
|
| - * of flags. Programs always use positions and may also use texture
|
| - * coordinates, per-vertex colors, per-vertex coverage and edge data. The
|
| - * local coords accessible by effects may either come from positions or
|
| - * be specified explicitly.
|
| - */
|
| -
|
| - /**
|
| - * Additional Bits that can be specified in GrAttribBindings.
|
| - */
|
| - enum AttribBindingsBits {
|
| - /** explicit local coords are provided (instead of using pre-view-matrix positions) */
|
| - kLocalCoords_AttribBindingsBit = 0x1,
|
| - /* program uses colors (GrColor) */
|
| - kColor_AttribBindingsBit = 0x2,
|
| - /* program uses coverage (GrColor)
|
| - */
|
| - kCoverage_AttribBindingsBit = 0x4,
|
| - // for below assert
|
| - kDummyAttribBindingsBit,
|
| - kHighAttribBindingsBit = kDummyAttribBindingsBit - 1
|
| - };
|
| - // make sure we haven't exceeded the number of bits in GrAttribBindings.
|
| - GR_STATIC_ASSERT(kHighAttribBindingsBit < ((uint64_t)1 << 8*sizeof(GrAttribBindings)));
|
| -
|
| - enum AttribBindings {
|
| - kDefault_AttribBindings = 0
|
| - };
|
| -
|
| - /**
|
| - * Sets attribute bindings for next draw.
|
| - *
|
| - * @param bindings the attribute bindings to set.
|
| - */
|
| - void setAttribBindings(GrAttribBindings bindings) { fCommon.fAttribBindings = bindings; }
|
| -
|
| - GrAttribBindings getAttribBindings() const { return fCommon.fAttribBindings; }
|
| -
|
| - ////////////////////////////////////////////////////////////////////////////
|
| - // Helpers for picking apart attribute bindings
|
| -
|
| - /**
|
| * Determines whether src alpha is guaranteed to be one for all src pixels
|
| */
|
| - bool srcAlphaWillBeOne(GrAttribBindings) const;
|
| + bool srcAlphaWillBeOne() const;
|
|
|
| /**
|
| * Determines whether the output coverage is guaranteed to be one for all pixels hit by a draw.
|
| */
|
| - bool hasSolidCoverage(GrAttribBindings) const;
|
| + bool hasSolidCoverage() const;
|
|
|
| - static void VertexAttributesUnitTest();
|
| -
|
| /// @}
|
|
|
| ///////////////////////////////////////////////////////////////////////////
|
| - /// @name Vertex Attribute Indices
|
| - ////
|
| -
|
| - /**
|
| - * Vertex attribute indices map the data set in the vertex attribute array
|
| - * to the bindings specified in the attribute bindings. Each binding type
|
| - * has an associated index in the attribute array. This index is used to
|
| - * look up the vertex attribute data from the array, and potentially as the
|
| - * attribute index if we're binding attributes in GL.
|
| - *
|
| - * Indices which do not have active attribute bindings will be ignored.
|
| - */
|
| -
|
| - enum AttribIndex {
|
| - kPosition_AttribIndex = 0,
|
| - kColor_AttribIndex,
|
| - kCoverage_AttribIndex,
|
| - kLocalCoords_AttribIndex,
|
| -
|
| - kLast_AttribIndex = kLocalCoords_AttribIndex
|
| - };
|
| - static const int kAttribIndexCount = kLast_AttribIndex + 1;
|
| -
|
| - // these are used when vertex color and coverage isn't set
|
| - enum {
|
| - kColorOverrideAttribIndexValue = GrDrawState::kVertexAttribCnt,
|
| - kCoverageOverrideAttribIndexValue = GrDrawState::kVertexAttribCnt+1,
|
| - };
|
| -
|
| - ////////////////////////////////////////////////////////////////////////////
|
| - // Helpers to set attribute indices. These should match the index in the
|
| - // current attribute index array.
|
| -
|
| - /**
|
| - * Sets index for next draw. This is used to look up the offset
|
| - * from the current vertex attribute array and to bind the attributes.
|
| - *
|
| - * @param index the attribute index we're setting
|
| - * @param value the value of the index
|
| - */
|
| - void setAttribIndex(AttribIndex index, int value) { fAttribIndices[index] = value; }
|
| -
|
| - int getAttribIndex(AttribIndex index) const { return fAttribIndices[index]; }
|
| -
|
| - /// @}
|
| -
|
| - ///////////////////////////////////////////////////////////////////////////
|
| /// @name Color
|
| ////
|
|
|
| @@ -1068,15 +984,6 @@
|
| if (fRenderTarget.get() != s.fRenderTarget.get() || fCommon != s.fCommon) {
|
| return false;
|
| }
|
| - if (fVertexAttribs != s.fVertexAttribs) {
|
| - return false;
|
| - }
|
| - for (int i = 0; i < kAttribIndexCount; ++i) {
|
| - if ((i == kPosition_AttribIndex || s.fCommon.fAttribBindings & (1 << i)) &&
|
| - fAttribIndices[i] != s.fAttribIndices[i]) {
|
| - return false;
|
| - }
|
| - }
|
| for (int i = 0; i < kNumStages; i++) {
|
| bool enabled = this->isStageEnabled(i);
|
| if (enabled != s.isStageEnabled(i)) {
|
| @@ -1093,10 +1000,6 @@
|
| GrDrawState& operator= (const GrDrawState& s) {
|
| this->setRenderTarget(s.fRenderTarget.get());
|
| fCommon = s.fCommon;
|
| - fVertexAttribs = s.fVertexAttribs;
|
| - for (int i = 0; i < kAttribIndexCount; i++) {
|
| - fAttribIndices[i] = s.fAttribIndices[i];
|
| - }
|
| for (int i = 0; i < kNumStages; i++) {
|
| if (s.isStageEnabled(i)) {
|
| this->fStages[i] = s.fStages[i];
|
| @@ -1110,33 +1013,44 @@
|
| /** Fields that are identical in GrDrawState and GrDrawState::DeferredState. */
|
| struct CommonState {
|
| // These fields are roughly sorted by decreasing likelihood of being different in op==
|
| - GrColor fColor;
|
| - GrAttribBindings fAttribBindings;
|
| - SkMatrix fViewMatrix;
|
| - GrBlendCoeff fSrcBlend;
|
| - GrBlendCoeff fDstBlend;
|
| - GrColor fBlendConstant;
|
| - uint32_t fFlagBits;
|
| - GrStencilSettings fStencilSettings;
|
| - int fFirstCoverageStage;
|
| - GrColor fCoverage;
|
| - SkXfermode::Mode fColorFilterMode;
|
| - GrColor fColorFilterColor;
|
| - DrawFace fDrawFace;
|
| + GrColor fColor;
|
| + SkMatrix fViewMatrix;
|
| + GrBlendCoeff fSrcBlend;
|
| + GrBlendCoeff fDstBlend;
|
| + GrColor fBlendConstant;
|
| + uint32_t fFlagBits;
|
| + GrVertexAttribArray<kMaxVertexAttribCnt> fVertexAttribs;
|
| + GrStencilSettings fStencilSettings;
|
| + int fFirstCoverageStage;
|
| + GrColor fCoverage;
|
| + SkXfermode::Mode fColorFilterMode;
|
| + GrColor fColorFilterColor;
|
| + DrawFace fDrawFace;
|
| +
|
| + // This is simply a different representation of info in fVertexAttribs and thus does
|
| + // not need to be compared in op==.
|
| + int fFixedFunctionVertexAttribIndices[kGrFixedFunctionVertexAttribBindingCnt];
|
| +
|
| + GR_STATIC_ASSERT(kGrVertexAttribBindingCnt <= 8*sizeof(uint32_t));
|
| +
|
| bool operator== (const CommonState& other) const {
|
| - return fColor == other.fColor &&
|
| - fAttribBindings == other.fAttribBindings &&
|
| - fViewMatrix.cheapEqualTo(other.fViewMatrix) &&
|
| - fSrcBlend == other.fSrcBlend &&
|
| - fDstBlend == other.fDstBlend &&
|
| - fBlendConstant == other.fBlendConstant &&
|
| - fFlagBits == other.fFlagBits &&
|
| - fStencilSettings == other.fStencilSettings &&
|
| - fFirstCoverageStage == other.fFirstCoverageStage &&
|
| - fCoverage == other.fCoverage &&
|
| - fColorFilterMode == other.fColorFilterMode &&
|
| - fColorFilterColor == other.fColorFilterColor &&
|
| - fDrawFace == other.fDrawFace;
|
| + bool result = fColor == other.fColor &&
|
| + fViewMatrix.cheapEqualTo(other.fViewMatrix) &&
|
| + fSrcBlend == other.fSrcBlend &&
|
| + fDstBlend == other.fDstBlend &&
|
| + fBlendConstant == other.fBlendConstant &&
|
| + fFlagBits == other.fFlagBits &&
|
| + fVertexAttribs == other.fVertexAttribs &&
|
| + fStencilSettings == other.fStencilSettings &&
|
| + fFirstCoverageStage == other.fFirstCoverageStage &&
|
| + fCoverage == other.fCoverage &&
|
| + fColorFilterMode == other.fColorFilterMode &&
|
| + fColorFilterColor == other.fColorFilterColor &&
|
| + fDrawFace == other.fDrawFace;
|
| + GrAssert(!result || 0 == memcmp(fFixedFunctionVertexAttribIndices,
|
| + other.fFixedFunctionVertexAttribIndices,
|
| + sizeof(fFixedFunctionVertexAttribIndices)));
|
| + return result;
|
| }
|
| bool operator!= (const CommonState& other) const { return !(*this == other); }
|
| };
|
| @@ -1169,10 +1083,6 @@
|
| // TODO: Here we will copy the GrRenderTarget pointer without taking a ref.
|
| fRenderTarget = drawState.fRenderTarget.get();
|
| SkSafeRef(fRenderTarget);
|
| - fVertexAttribs = drawState.fVertexAttribs;
|
| - for (int i = 0; i < kAttribIndexCount; i++) {
|
| - fAttribIndices[i] = drawState.fAttribIndices[i];
|
| - }
|
| // Here we ref the effects directly rather than the effect-refs. TODO: When the effect-
|
| // ref gets fully unref'ed it will cause the underlying effect to unref its resources
|
| // and recycle them to the cache (if no one else is holding a ref to the resources).
|
| @@ -1186,10 +1096,6 @@
|
| GrAssert(fInitialized);
|
| drawState->fCommon = fCommon;
|
| drawState->setRenderTarget(fRenderTarget);
|
| - drawState->fVertexAttribs = fVertexAttribs;
|
| - for (int i = 0; i < kAttribIndexCount; i++) {
|
| - drawState->fAttribIndices[i] = fAttribIndices[i];
|
| - }
|
| for (int i = 0; i < kNumStages; ++i) {
|
| fStages[i].restoreTo(&drawState->fStages[i]);
|
| }
|
| @@ -1199,16 +1105,6 @@
|
| if (fRenderTarget != state.fRenderTarget.get() || fCommon != state.fCommon) {
|
| return false;
|
| }
|
| - for (int i = 0; i < kAttribIndexCount; ++i) {
|
| - if ((i == kPosition_AttribIndex ||
|
| - state.fCommon.fAttribBindings & kAttribIndexMasks[i]) &&
|
| - fAttribIndices[i] != state.fAttribIndices[i]) {
|
| - return false;
|
| - }
|
| - }
|
| - if (fVertexAttribs != state.fVertexAttribs) {
|
| - return false;
|
| - }
|
| for (int i = 0; i < kNumStages; ++i) {
|
| if (!fStages[i].isEqual(state.fStages[i])) {
|
| return false;
|
| @@ -1220,22 +1116,15 @@
|
| private:
|
| GrRenderTarget* fRenderTarget;
|
| CommonState fCommon;
|
| - int fAttribIndices[kAttribIndexCount];
|
| - GrVertexAttribArray<kVertexAttribCnt> fVertexAttribs;
|
| GrEffectStage::DeferredStage fStages[kNumStages];
|
|
|
| GR_DEBUGCODE(bool fInitialized;)
|
| };
|
|
|
| private:
|
| - // helper array to let us check the current bindings so we know what bound attrib indices
|
| - // we care about
|
| - static const GrAttribBindings kAttribIndexMasks[kAttribIndexCount];
|
|
|
| SkAutoTUnref<GrRenderTarget> fRenderTarget;
|
| CommonState fCommon;
|
| - int fAttribIndices[kAttribIndexCount];
|
| - GrVertexAttribArray<kVertexAttribCnt> fVertexAttribs;
|
| GrEffectStage fStages[kNumStages];
|
|
|
| typedef GrRefCnt INHERITED;
|
|
|