Index: src/gpu/GrDrawState.h |
diff --git a/src/gpu/GrDrawState.h b/src/gpu/GrDrawState.h |
deleted file mode 100644 |
index 45fc574bde78c8b5a511d8223f5133f16efe9b6d..0000000000000000000000000000000000000000 |
--- a/src/gpu/GrDrawState.h |
+++ /dev/null |
@@ -1,463 +0,0 @@ |
-/* |
- * Copyright 2011 Google Inc. |
- * |
- * Use of this source code is governed by a BSD-style license that can be |
- * found in the LICENSE file. |
- */ |
- |
-#ifndef GrDrawState_DEFINED |
-#define GrDrawState_DEFINED |
- |
- |
-#include "GrBlend.h" |
-#include "GrDrawTargetCaps.h" |
-#include "GrGeometryProcessor.h" |
-#include "GrGpuResourceRef.h" |
-#include "GrFragmentStage.h" |
-#include "GrProcOptInfo.h" |
-#include "GrRenderTarget.h" |
-#include "GrStencil.h" |
-#include "GrXferProcessor.h" |
-#include "SkMatrix.h" |
-#include "effects/GrCoverageSetOpXP.h" |
-#include "effects/GrDisableColorXP.h" |
-#include "effects/GrPorterDuffXferProcessor.h" |
-#include "effects/GrSimpleTextureEffect.h" |
- |
-class GrDrawTargetCaps; |
-class GrPaint; |
-class GrTexture; |
- |
-class GrDrawState { |
-public: |
- GrDrawState(); |
- /** |
- * Copies another draw state. |
- **/ |
- GrDrawState(const GrDrawState& state) { |
- SkDEBUGCODE(fBlockEffectRemovalCnt = 0;) |
- *this = state; |
- } |
- |
- virtual ~GrDrawState(); |
- |
- /** |
- * Initializes the GrDrawState based on a GrPaint, view matrix and render target. Note that |
- * GrDrawState encompasses more than GrPaint. Aspects of GrDrawState that have no GrPaint |
- * equivalents are set to default values with the exception of vertex attribute state which |
- * is unmodified by this function and clipping which will be enabled. |
- */ |
- void setFromPaint(const GrPaint&, GrRenderTarget*); |
- |
- /// @} |
- |
- /** |
- * 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. |
- * |
- * This function considers the current draw state and the draw target's capabilities to |
- * determine whether coverage can be handled correctly. This function assumes that the caller |
- * intends to specify fractional pixel coverage via a primitive processor but may not have |
- * specified it yet. |
- */ |
- bool canUseFracCoveragePrimProc(GrColor color, const GrDrawTargetCaps& caps) const; |
- |
- /** |
- * This function returns true if the render target destination pixel values will be read for |
- * blending during draw. |
- */ |
- bool willBlendWithDst(const GrPrimitiveProcessor*) const; |
- |
- /////////////////////////////////////////////////////////////////////////// |
- /// @name Effect Stages |
- /// Each stage hosts a GrProcessor. The effect produces an output color or coverage in the |
- /// fragment shader. Its inputs are the output from the previous stage as well as some variables |
- /// available to it in the fragment and vertex shader (e.g. the vertex position, the dst color, |
- /// the fragment position, local coordinates). |
- /// |
- /// The stages are divided into two sets, color-computing and coverage-computing. The final |
- /// color stage produces the final pixel color. The coverage-computing stages function exactly |
- /// as the color-computing but the output of the final coverage stage is treated as a fractional |
- /// pixel coverage rather than as input to the src/dst color blend step. |
- /// |
- /// The input color to the first color-stage is either the constant color or interpolated |
- /// 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. |
- //// |
- |
- int numColorStages() const { return fColorStages.count(); } |
- int numCoverageStages() const { return fCoverageStages.count(); } |
- int numFragmentStages() const { return this->numColorStages() + this->numCoverageStages(); } |
- |
- const GrXPFactory* getXPFactory() const { |
- if (!fXPFactory) { |
- fXPFactory.reset(GrPorterDuffXPFactory::Create(SkXfermode::kSrc_Mode)); |
- } |
- return fXPFactory.get(); |
- } |
- |
- const GrFragmentStage& getColorStage(int idx) const { return fColorStages[idx]; } |
- const GrFragmentStage& getCoverageStage(int idx) const { return fCoverageStages[idx]; } |
- |
- /** |
- * Checks whether the xp will read the dst pixel color. |
- * TODO: remove when we have dstCpy contained inside of GrXP |
- */ |
- bool willEffectReadDstColor() const; |
- |
- /** |
- * The xfer processor factory. |
- */ |
- const GrXPFactory* setXPFactory(const GrXPFactory* xpFactory) { |
- fXPFactory.reset(SkRef(xpFactory)); |
- return xpFactory; |
- } |
- |
- void setPorterDuffXPFactory(SkXfermode::Mode mode) { |
- fXPFactory.reset(GrPorterDuffXPFactory::Create(mode)); |
- } |
- |
- void setPorterDuffXPFactory(GrBlendCoeff src, GrBlendCoeff dst) { |
- fXPFactory.reset(GrPorterDuffXPFactory::Create(src, dst)); |
- } |
- |
- void setCoverageSetOpXPFactory(SkRegion::Op regionOp, bool invertCoverage = false) { |
- fXPFactory.reset(GrCoverageSetOpXPFactory::Create(regionOp, invertCoverage)); |
- } |
- |
- void setDisableColorXPFactory() { |
- fXPFactory.reset(GrDisableColorXPFactory::Create()); |
- } |
- |
- const GrFragmentProcessor* addColorProcessor(const GrFragmentProcessor* effect) { |
- SkASSERT(effect); |
- SkNEW_APPEND_TO_TARRAY(&fColorStages, GrFragmentStage, (effect)); |
- fColorProcInfoValid = false; |
- return effect; |
- } |
- |
- const GrFragmentProcessor* addCoverageProcessor(const GrFragmentProcessor* effect) { |
- SkASSERT(effect); |
- SkNEW_APPEND_TO_TARRAY(&fCoverageStages, GrFragmentStage, (effect)); |
- fCoverageProcInfoValid = false; |
- return effect; |
- } |
- |
- /** |
- * Creates a GrSimpleTextureEffect that uses local coords as texture coordinates. |
- */ |
- void addColorTextureProcessor(GrTexture* texture, const SkMatrix& matrix) { |
- this->addColorProcessor(GrSimpleTextureEffect::Create(texture, matrix))->unref(); |
- } |
- |
- void addCoverageTextureProcessor(GrTexture* texture, const SkMatrix& matrix) { |
- this->addCoverageProcessor(GrSimpleTextureEffect::Create(texture, matrix))->unref(); |
- } |
- |
- void addColorTextureProcessor(GrTexture* texture, |
- const SkMatrix& matrix, |
- const GrTextureParams& params) { |
- this->addColorProcessor(GrSimpleTextureEffect::Create(texture, matrix, params))->unref(); |
- } |
- |
- void addCoverageTextureProcessor(GrTexture* texture, |
- const SkMatrix& matrix, |
- const GrTextureParams& params) { |
- this->addCoverageProcessor(GrSimpleTextureEffect::Create(texture, matrix, params))->unref(); |
- } |
- |
- /** |
- * When this object is destroyed it will remove any color/coverage effects from the draw state |
- * that were added after its constructor. |
- * |
- * This class has strange behavior around geometry processor. If there is a GP on the draw state |
- * it will assert that the GP is not modified until after the destructor of the ARE. If the |
- * draw state has a NULL GP when the ARE is constructed then it will reset it to null in the |
- * destructor. |
- * |
- * TODO: We'd prefer for the ARE to just save and restore the GP. However, this would add |
- * significant complexity to the multi-ref architecture for deferred drawing. Once GrDrawState |
- * and GrOptDrawState are fully separated then GrDrawState will never be in the deferred |
- * execution state and GrOptDrawState always will be (and will be immutable and therefore |
- * unable to have an ARE). At this point we can restore sanity and have the ARE save and restore |
- * the GP. |
- */ |
- class AutoRestoreEffects : public ::SkNoncopyable { |
- public: |
- AutoRestoreEffects() |
- : fDrawState(NULL) |
- , fColorEffectCnt(0) |
- , fCoverageEffectCnt(0) {} |
- |
- AutoRestoreEffects(GrDrawState* ds) |
- : fDrawState(NULL) |
- , fColorEffectCnt(0) |
- , fCoverageEffectCnt(0) { |
- this->set(ds); |
- } |
- |
- ~AutoRestoreEffects() { this->set(NULL); } |
- |
- void set(GrDrawState* ds); |
- |
- bool isSet() const { return SkToBool(fDrawState); } |
- |
- private: |
- GrDrawState* fDrawState; |
- int fColorEffectCnt; |
- int fCoverageEffectCnt; |
- }; |
- |
- /** |
- * AutoRestoreStencil |
- * |
- * This simple struct saves and restores the stencil settings |
- */ |
- class AutoRestoreStencil : public ::SkNoncopyable { |
- public: |
- AutoRestoreStencil() : fDrawState(NULL) {} |
- |
- AutoRestoreStencil(GrDrawState* ds) : fDrawState(NULL) { this->set(ds); } |
- |
- ~AutoRestoreStencil() { this->set(NULL); } |
- |
- void set(GrDrawState* ds) { |
- if (fDrawState) { |
- fDrawState->setStencil(fStencilSettings); |
- } |
- fDrawState = ds; |
- if (ds) { |
- fStencilSettings = ds->getStencil(); |
- } |
- } |
- |
- bool isSet() const { return SkToBool(fDrawState); } |
- |
- private: |
- GrDrawState* fDrawState; |
- GrStencilSettings fStencilSettings; |
- }; |
- |
- /// @} |
- |
- /////////////////////////////////////////////////////////////////////////// |
- /// @name Blending |
- //// |
- |
- /** |
- * 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; |
- |
- /// @} |
- |
- |
- /// @} |
- |
- /////////////////////////////////////////////////////////////////////////// |
- /// @name Render Target |
- //// |
- |
- /** |
- * Retrieves the currently set render-target. |
- * |
- * @return The currently set render target. |
- */ |
- GrRenderTarget* getRenderTarget() const { return fRenderTarget.get(); } |
- |
- /** |
- * Sets the render-target used at the next drawing call |
- * |
- * @param target The render target to set. |
- */ |
- void setRenderTarget(GrRenderTarget* target) { fRenderTarget.reset(SkSafeRef(target)); } |
- |
- /// @} |
- |
- /////////////////////////////////////////////////////////////////////////// |
- /// @name Stencil |
- //// |
- |
- const GrStencilSettings& getStencil() const { return fStencilSettings; } |
- |
- /** |
- * Sets the stencil settings to use for the next draw. |
- * Changing the clip has the side-effect of possibly zeroing |
- * out the client settable stencil bits. So multipass algorithms |
- * using stencil should not change the clip between passes. |
- * @param settings the stencil settings to use. |
- */ |
- void setStencil(const GrStencilSettings& settings) { fStencilSettings = settings; } |
- |
- /** |
- * Shortcut to disable stencil testing and ops. |
- */ |
- void disableStencil() { fStencilSettings.setDisabled(); } |
- |
- GrStencilSettings* stencil() { return &fStencilSettings; } |
- |
- /// @} |
- |
- /////////////////////////////////////////////////////////////////////////// |
- /// @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, |
- |
- kLast_StateBit = kClip_StateBit, |
- }; |
- |
- bool isClipState() const { return 0 != (fFlagBits & kClip_StateBit); } |
- bool isDither() const { return 0 != (fFlagBits & kDither_StateBit); } |
- bool isHWAntialias() const { return 0 != (fFlagBits & kHWAntialias_StateBit); } |
- |
- /** |
- * Enable render state settings. |
- * |
- * @param stateBits bitfield of StateBits specifying the states to enable |
- */ |
- void enableState(uint32_t stateBits) { fFlagBits |= stateBits; } |
- |
- /** |
- * Disable render state settings. |
- * |
- * @param stateBits bitfield of StateBits specifying the states to disable |
- */ |
- void disableState(uint32_t stateBits) { fFlagBits &= ~(stateBits); } |
- |
- /** |
- * Enable or disable stateBits based on a boolean. |
- * |
- * @param stateBits bitfield of StateBits to enable or disable |
- * @param enable if true enable stateBits, otherwise disable |
- */ |
- void setState(uint32_t stateBits, bool enable) { |
- if (enable) { |
- this->enableState(stateBits); |
- } else { |
- this->disableState(stateBits); |
- } |
- } |
- |
- /// @} |
- |
- /////////////////////////////////////////////////////////////////////////// |
- /// @name Face Culling |
- //// |
- |
- enum DrawFace { |
- kInvalid_DrawFace = -1, |
- |
- kBoth_DrawFace, |
- kCCW_DrawFace, |
- kCW_DrawFace, |
- }; |
- |
- /** |
- * Gets whether the target is drawing clockwise, counterclockwise, |
- * or both faces. |
- * @return the current draw face(s). |
- */ |
- DrawFace getDrawFace() const { return fDrawFace; } |
- |
- /** |
- * Controls whether clockwise, counterclockwise, or both faces are drawn. |
- * @param face the face(s) to draw. |
- */ |
- void setDrawFace(DrawFace face) { |
- SkASSERT(kInvalid_DrawFace != face); |
- fDrawFace = face; |
- } |
- |
- /// @} |
- |
- /////////////////////////////////////////////////////////////////////////// |
- |
- GrDrawState& operator= (const GrDrawState& that); |
- |
-private: |
- const GrProcOptInfo& colorProcInfo(const GrPrimitiveProcessor* pp) const { |
- this->calcColorInvariantOutput(pp); |
- return fColorProcInfo; |
- } |
- |
- const GrProcOptInfo& coverageProcInfo(const GrPrimitiveProcessor* pp) const { |
- this->calcCoverageInvariantOutput(pp); |
- return fCoverageProcInfo; |
- } |
- |
- /** |
- * If fColorProcInfoValid is false, function calculates the invariant output for the color |
- * stages and results are stored in fColorProcInfo. |
- */ |
- void calcColorInvariantOutput(const GrPrimitiveProcessor*) const; |
- |
- /** |
- * If fCoverageProcInfoValid is false, function calculates the invariant output for the coverage |
- * stages and results are stored in fCoverageProcInfo. |
- */ |
- void calcCoverageInvariantOutput(const GrPrimitiveProcessor*) const; |
- |
- /** |
- * If fColorProcInfoValid is false, function calculates the invariant output for the color |
- * stages and results are stored in fColorProcInfo. |
- */ |
- void calcColorInvariantOutput(GrColor) const; |
- |
- /** |
- * If fCoverageProcInfoValid is false, function calculates the invariant output for the coverage |
- * stages and results are stored in fCoverageProcInfo. |
- */ |
- void calcCoverageInvariantOutput(GrColor) const; |
- |
- // Some of the auto restore objects assume that no effects are removed during their lifetime. |
- // This is used to assert that this condition holds. |
- SkDEBUGCODE(int fBlockEffectRemovalCnt;) |
- |
- typedef SkSTArray<4, GrFragmentStage> FragmentStageArray; |
- |
- SkAutoTUnref<GrRenderTarget> fRenderTarget; |
- uint32_t fFlagBits; |
- GrStencilSettings fStencilSettings; |
- DrawFace fDrawFace; |
- mutable SkAutoTUnref<const GrXPFactory> fXPFactory; |
- FragmentStageArray fColorStages; |
- FragmentStageArray fCoverageStages; |
- |
- mutable GrProcOptInfo fColorProcInfo; |
- mutable GrProcOptInfo fCoverageProcInfo; |
- mutable bool fColorProcInfoValid; |
- mutable bool fCoverageProcInfoValid; |
- mutable GrColor fColorCache; |
- mutable GrColor fCoverageCache; |
- mutable const GrPrimitiveProcessor* fColorPrimProc; |
- mutable const GrPrimitiveProcessor* fCoveragePrimProc; |
- |
- friend class GrOptDrawState; |
-}; |
- |
-#endif |