| Index: src/gpu/GrDrawState.h
|
| diff --git a/src/gpu/GrDrawState.h b/src/gpu/GrDrawState.h
|
| index cc1df05ec31b03bc6fd14766857ee07addea950c..dcd6ff9aaf8459f03ee68ec12b65c7e38311c02c 100644
|
| --- a/src/gpu/GrDrawState.h
|
| +++ b/src/gpu/GrDrawState.h
|
| @@ -8,20 +8,18 @@
|
| #ifndef GrDrawState_DEFINED
|
| #define GrDrawState_DEFINED
|
|
|
| +#include "GrRODrawState.h"
|
| +
|
| #include "GrBlend.h"
|
| -#include "GrColor.h"
|
| -#include "GrEffectStage.h"
|
| -#include "GrStencil.h"
|
| #include "effects/GrSimpleTextureEffect.h"
|
|
|
| -#include "SkMatrix.h"
|
| -
|
| -class GrDrawTargetCaps;
|
| -class GrPaint;
|
| -class GrRenderTarget;
|
| -class GrTexture;
|
| -
|
| -class GrDrawState : public SkRefCnt {
|
| +/**
|
| + * Modifiable subclass derived from GrRODrawState. The majority of the data that represents a draw
|
| + * state is stored in the parent class. GrDrawState contains methods for setting, adding to, etc.
|
| + * various data members of the draw state. This class is used to configure the state used when
|
| + * issuing draws via GrDrawTarget.
|
| + */
|
| +class GrDrawState : public GrRODrawState {
|
| public:
|
| SK_DECLARE_INST_COUNT(GrDrawState)
|
|
|
| @@ -69,10 +67,6 @@ public:
|
| /// @name Vertex Attributes
|
| ////
|
|
|
| - enum {
|
| - kMaxVertexAttribCnt = kLast_GrVertexAttribBinding + 4,
|
| - };
|
| -
|
| /**
|
| * 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
|
| @@ -90,11 +84,6 @@ public:
|
| this->setVertexAttribs(A, count);
|
| }
|
|
|
| - const GrVertexAttrib* getVertexAttribs() const { return fVAPtr; }
|
| - int getVertexAttribCount() const { return fVACount; }
|
| -
|
| - size_t getVertexSize() const;
|
| -
|
| /**
|
| * Sets default vertex attributes for next draw. The default is a single attribute:
|
| * {kVec2f_GrVertexAttribType, 0, kPosition_GrVertexAttribType}
|
| @@ -102,37 +91,6 @@ public:
|
| void setDefaultVertexAttribs();
|
|
|
| /**
|
| - * 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.
|
| - */
|
| -
|
| - int positionAttributeIndex() const {
|
| - return fFixedFunctionVertexAttribIndices[kPosition_GrVertexAttribBinding];
|
| - }
|
| - int localCoordAttributeIndex() const {
|
| - return fFixedFunctionVertexAttribIndices[kLocalCoord_GrVertexAttribBinding];
|
| - }
|
| - int colorVertexAttributeIndex() const {
|
| - return fFixedFunctionVertexAttribIndices[kColor_GrVertexAttribBinding];
|
| - }
|
| - int coverageVertexAttributeIndex() const {
|
| - return fFixedFunctionVertexAttribIndices[kCoverage_GrVertexAttribBinding];
|
| - }
|
| -
|
| - bool hasLocalCoordAttribute() const {
|
| - return -1 != fFixedFunctionVertexAttribIndices[kLocalCoord_GrVertexAttribBinding];
|
| - }
|
| - bool hasColorVertexAttribute() const {
|
| - return -1 != fFixedFunctionVertexAttribIndices[kColor_GrVertexAttribBinding];
|
| - }
|
| - bool hasCoverageVertexAttribute() const {
|
| - return -1 != fFixedFunctionVertexAttribIndices[kCoverage_GrVertexAttribBinding];
|
| - }
|
| -
|
| - bool validateVertexAttribs() const;
|
| -
|
| - /**
|
| * Helper to save/restore vertex attribs
|
| */
|
| class AutoVertexAttribRestore {
|
| @@ -150,16 +108,6 @@ public:
|
| /// @}
|
|
|
| /**
|
| - * Determines whether src alpha is guaranteed to be one for all src pixels
|
| - */
|
| - bool srcAlphaWillBeOne() const;
|
| -
|
| - /**
|
| - * Determines whether the output coverage is guaranteed to be one for all pixels hit by a draw.
|
| - */
|
| - bool hasSolidCoverage() const;
|
| -
|
| - /**
|
| * Depending on features available in the underlying 3D API and the color blend mode requested
|
| * it may or may not be possible to correctly blend with fractional pixel coverage generated by
|
| * the fragment shader.
|
| @@ -187,8 +135,6 @@ public:
|
| this->invalidateBlendOptFlags();
|
| }
|
|
|
| - GrColor getColor() const { return fColor; }
|
| -
|
| /**
|
| * Sets the color to be used for the next draw to be
|
| * (r,g,b,a) = (alpha, alpha, alpha, alpha).
|
| @@ -213,12 +159,6 @@ public:
|
| this->invalidateBlendOptFlags();
|
| }
|
|
|
| - uint8_t getCoverage() const { return fCoverage; }
|
| -
|
| - GrColor getCoverageColor() const {
|
| - return GrColorPackRGBA(fCoverage, fCoverage, fCoverage, fCoverage);
|
| - }
|
| -
|
| /// @}
|
|
|
| ///////////////////////////////////////////////////////////////////////////
|
| @@ -302,18 +242,6 @@ public:
|
| int fCoverageEffectCnt;
|
| };
|
|
|
| - int numColorStages() const { return fColorStages.count(); }
|
| - int numCoverageStages() const { return fCoverageStages.count(); }
|
| - int numTotalStages() const { return this->numColorStages() + this->numCoverageStages(); }
|
| -
|
| - const GrEffectStage& getColorStage(int stageIdx) const { return fColorStages[stageIdx]; }
|
| - const GrEffectStage& getCoverageStage(int stageIdx) const { return fCoverageStages[stageIdx]; }
|
| -
|
| - /**
|
| - * Checks whether any of the effects will read the dst pixel color.
|
| - */
|
| - bool willEffectReadDstColor() const;
|
| -
|
| /// @}
|
|
|
| ///////////////////////////////////////////////////////////////////////////
|
| @@ -347,15 +275,6 @@ public:
|
| #endif
|
| }
|
|
|
| - GrBlendCoeff getSrcBlendCoeff() const { return fSrcBlend; }
|
| - GrBlendCoeff getDstBlendCoeff() const { return fDstBlend; }
|
| -
|
| - void getDstBlendCoeff(GrBlendCoeff* srcBlendCoeff,
|
| - GrBlendCoeff* dstBlendCoeff) const {
|
| - *srcBlendCoeff = fSrcBlend;
|
| - *dstBlendCoeff = fDstBlend;
|
| - }
|
| -
|
| /**
|
| * Sets the blending function constant referenced by the following blending
|
| * coefficients:
|
| @@ -372,63 +291,6 @@ public:
|
| }
|
|
|
| /**
|
| - * Retrieves the last value set by setBlendConstant()
|
| - * @return the blending constant value
|
| - */
|
| - GrColor getBlendConstant() const { return fBlendConstant; }
|
| -
|
| - /**
|
| - * Determines whether multiplying the computed per-pixel color by the pixel's fractional
|
| - * coverage before the blend will give the correct final destination color. In general it
|
| - * will not as coverage is applied after blending.
|
| - */
|
| - bool canTweakAlphaForCoverage() const;
|
| -
|
| - /**
|
| - * Optimizations for blending / coverage to that can be applied based on the current state.
|
| - */
|
| - enum BlendOptFlags {
|
| - /**
|
| - * No optimization
|
| - */
|
| - kNone_BlendOpt = 0,
|
| - /**
|
| - * Don't draw at all
|
| - */
|
| - kSkipDraw_BlendOptFlag = 0x1,
|
| - /**
|
| - * The coverage value does not have to be computed separately from alpha, the the output
|
| - * color can be the modulation of the two.
|
| - */
|
| - kCoverageAsAlpha_BlendOptFlag = 0x2,
|
| - /**
|
| - * Instead of emitting a src color, emit coverage in the alpha channel and r,g,b are
|
| - * "don't cares".
|
| - */
|
| - kEmitCoverage_BlendOptFlag = 0x4,
|
| - /**
|
| - * Emit transparent black instead of the src color, no need to compute coverage.
|
| - */
|
| - kEmitTransBlack_BlendOptFlag = 0x8,
|
| - /**
|
| - * Flag used to invalidate the cached BlendOptFlags, OptSrcCoeff, and OptDstCoeff cached by
|
| - * the get BlendOpts function.
|
| - */
|
| - kInvalid_BlendOptFlag = 1 << 31,
|
| - };
|
| - GR_DECL_BITFIELD_OPS_FRIENDS(BlendOptFlags);
|
| -
|
| - void invalidateBlendOptFlags() {
|
| - fBlendOptFlags = kInvalid_BlendOptFlag;
|
| - }
|
| -
|
| - /**
|
| - * We don't use suplied vertex color attributes if our blend mode is EmitCoverage or
|
| - * EmitTransBlack
|
| - */
|
| - bool canIgnoreColorAttribute() const;
|
| -
|
| - /**
|
| * Determines what optimizations can be applied based on the blend. The coefficients may have
|
| * to be tweaked in order for the optimization to work. srcCoeff and dstCoeff are optional
|
| * params that receive the tweaked coefficients. Normally the function looks at the current
|
| @@ -445,6 +307,13 @@ public:
|
| GrBlendCoeff* srcCoeff = NULL,
|
| GrBlendCoeff* dstCoeff = NULL) const;
|
|
|
| + /**
|
| + * We don't use suplied vertex color attributes if our blend mode is EmitCoverage or
|
| + * EmitTransBlack
|
| + */
|
| + bool canIgnoreColorAttribute() const;
|
| +
|
| +
|
| /// @}
|
|
|
| ///////////////////////////////////////////////////////////////////////////
|
| @@ -457,34 +326,6 @@ public:
|
| */
|
| bool setIdentityViewMatrix();
|
|
|
| - /**
|
| - * Retrieves the current view matrix
|
| - * @return the current view matrix.
|
| - */
|
| - const SkMatrix& getViewMatrix() const { return fViewMatrix; }
|
| -
|
| - /**
|
| - * Retrieves the inverse of the current view matrix.
|
| - *
|
| - * If the current view matrix is invertible, return true, and if matrix
|
| - * is non-null, copy the inverse into it. If the current view matrix is
|
| - * non-invertible, return false and ignore the matrix parameter.
|
| - *
|
| - * @param matrix if not null, will receive a copy of the current inverse.
|
| - */
|
| - bool getViewInverse(SkMatrix* matrix) const {
|
| - // TODO: determine whether we really need to leave matrix unmodified
|
| - // at call sites when inversion fails.
|
| - SkMatrix inverse;
|
| - if (fViewMatrix.invert(&inverse)) {
|
| - if (matrix) {
|
| - *matrix = inverse;
|
| - }
|
| - return true;
|
| - }
|
| - return false;
|
| - }
|
| -
|
| ////////////////////////////////////////////////////////////////////////////
|
|
|
| /**
|
| @@ -535,14 +376,6 @@ public:
|
| */
|
| void setRenderTarget(GrRenderTarget* target) { fRenderTarget.reset(SkSafeRef(target)); }
|
|
|
| - /**
|
| - * Retrieves the currently set render-target.
|
| - *
|
| - * @return The currently set render target.
|
| - */
|
| - const GrRenderTarget* getRenderTarget() const { return fRenderTarget.get(); }
|
| - GrRenderTarget* getRenderTarget() { return fRenderTarget.get(); }
|
| -
|
| class AutoRenderTargetRestore : public ::SkNoncopyable {
|
| public:
|
| AutoRenderTargetRestore() : fDrawState(NULL), fSavedTarget(NULL) {}
|
| @@ -603,8 +436,6 @@ public:
|
| this->invalidateBlendOptFlags();
|
| }
|
|
|
| - const GrStencilSettings& getStencil() const { return fStencilSettings; }
|
| -
|
| GrStencilSettings* stencil() { return &fStencilSettings; }
|
|
|
| /// @}
|
| @@ -613,46 +444,6 @@ public:
|
| /// @name State Flags
|
| ////
|
|
|
| - /**
|
| - * Flags that affect rendering. Controlled using enable/disableState(). All
|
| - * default to disabled.
|
| - */
|
| - enum StateBits {
|
| - /**
|
| - * Perform dithering. TODO: Re-evaluate whether we need this bit
|
| - */
|
| - kDither_StateBit = 0x01,
|
| - /**
|
| - * Perform HW anti-aliasing. This means either HW FSAA, if supported by the render target,
|
| - * or smooth-line rendering if a line primitive is drawn and line smoothing is supported by
|
| - * the 3D API.
|
| - */
|
| - kHWAntialias_StateBit = 0x02,
|
| - /**
|
| - * Draws will respect the clip, otherwise the clip is ignored.
|
| - */
|
| - kClip_StateBit = 0x04,
|
| - /**
|
| - * Disables writing to the color buffer. Useful when performing stencil
|
| - * operations.
|
| - */
|
| - kNoColorWrites_StateBit = 0x08,
|
| -
|
| - /**
|
| - * Usually coverage is applied after color blending. The color is blended using the coeffs
|
| - * specified by setBlendFunc(). The blended color is then combined with dst using coeffs
|
| - * of src_coverage, 1-src_coverage. Sometimes we are explicitly drawing a coverage mask. In
|
| - * this case there is no distinction between coverage and color and the caller needs direct
|
| - * control over the blend coeffs. When set, there will be a single blend step controlled by
|
| - * setBlendFunc() which will use coverage*color as the src color.
|
| - */
|
| - kCoverageDrawing_StateBit = 0x10,
|
| -
|
| - // Users of the class may add additional bits to the vector
|
| - kDummyStateBit,
|
| - kLastPublicStateBit = kDummyStateBit-1,
|
| - };
|
| -
|
| void resetStateFlags() {
|
| fFlagBits = 0;
|
| this->invalidateBlendOptFlags();
|
| @@ -692,28 +483,12 @@ public:
|
| }
|
| }
|
|
|
| - bool isStateFlagEnabled(uint32_t stateBit) const { return 0 != (stateBit & fFlagBits); }
|
| -
|
| - bool isDitherState() const { return 0 != (fFlagBits & kDither_StateBit); }
|
| - bool isHWAntialiasState() const { return 0 != (fFlagBits & kHWAntialias_StateBit); }
|
| - bool isClipState() const { return 0 != (fFlagBits & kClip_StateBit); }
|
| - bool isColorWriteDisabled() const { return 0 != (fFlagBits & kNoColorWrites_StateBit); }
|
| - bool isCoverageDrawing() const { return 0 != (fFlagBits & kCoverageDrawing_StateBit); }
|
| -
|
| /// @}
|
|
|
| ///////////////////////////////////////////////////////////////////////////
|
| /// @name Face Culling
|
| ////
|
|
|
| - enum DrawFace {
|
| - kInvalid_DrawFace = -1,
|
| -
|
| - kBoth_DrawFace,
|
| - kCCW_DrawFace,
|
| - kCW_DrawFace,
|
| - };
|
| -
|
| /**
|
| * Controls whether clockwise, counterclockwise, or both faces are drawn.
|
| * @param face the face(s) to draw.
|
| @@ -723,13 +498,6 @@ public:
|
| fDrawFace = face;
|
| }
|
|
|
| - /**
|
| - * Gets whether the target is drawing clockwise, counterclockwise,
|
| - * or both faces.
|
| - * @return the current draw face(s).
|
| - */
|
| - DrawFace getDrawFace() const { return fDrawFace; }
|
| -
|
| /// @}
|
|
|
| ///////////////////////////////////////////////////////////////////////////
|
| @@ -769,38 +537,23 @@ public:
|
| private:
|
| void onReset(const SkMatrix* initialViewMatrix);
|
|
|
| + /**
|
| + * Determines whether src alpha is guaranteed to be one for all src pixels
|
| + */
|
| + bool srcAlphaWillBeOne() const;
|
| +
|
| + /**
|
| + * Helper function for getBlendOpts.
|
| + */
|
| BlendOptFlags calcBlendOpts(bool forceCoverage = false,
|
| GrBlendCoeff* srcCoeff = NULL,
|
| GrBlendCoeff* dstCoeff = NULL) const;
|
|
|
| - // These fields are roughly sorted by decreasing likelihood of being different in op==
|
| - SkAutoTUnref<GrRenderTarget> fRenderTarget;
|
| - GrColor fColor;
|
| - SkMatrix fViewMatrix;
|
| - GrBlendCoeff fSrcBlend;
|
| - GrBlendCoeff fDstBlend;
|
| - GrColor fBlendConstant;
|
| - uint32_t fFlagBits;
|
| - const GrVertexAttrib* fVAPtr;
|
| - int fVACount;
|
| - size_t fVertexSize;
|
| - GrStencilSettings fStencilSettings;
|
| - uint8_t fCoverage;
|
| - DrawFace fDrawFace;
|
| -
|
| - typedef SkSTArray<4, GrEffectStage> EffectStageArray;
|
| - EffectStageArray fColorStages;
|
| - EffectStageArray fCoverageStages;
|
| + void invalidateBlendOptFlags() {
|
| + fBlendOptFlags = kInvalid_BlendOptFlag;
|
| + }
|
|
|
| uint32_t fHints;
|
| -
|
| - mutable GrBlendCoeff fOptSrcBlend;
|
| - mutable GrBlendCoeff fOptDstBlend;
|
| - mutable BlendOptFlags fBlendOptFlags;
|
| -
|
| - // This is simply a different representation of info in fVertexAttribs and thus does
|
| - // not need to be compared in op==.
|
| - int fFixedFunctionVertexAttribIndices[kGrFixedFunctionVertexAttribBindingCnt];
|
|
|
| // Some of the auto restore objects assume that no effects are removed during their lifetime.
|
| // This is used to assert that this condition holds.
|
| @@ -814,9 +567,7 @@ private:
|
| */
|
| void setVertexAttribs(const GrVertexAttrib attribs[], int count);
|
|
|
| - typedef SkRefCnt INHERITED;
|
| + typedef GrRODrawState INHERITED;
|
| };
|
|
|
| -GR_MAKE_BITFIELD_OPS(GrDrawState::BlendOptFlags);
|
| -
|
| #endif
|
|
|