diff -r 000000000000 -r 6474c204b198 gfx/skia/trunk/include/gpu/GrDrawEffect.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/gfx/skia/trunk/include/gpu/GrDrawEffect.h Wed Dec 31 06:09:35 2014 +0100 @@ -0,0 +1,50 @@ + +#ifndef GrDrawEffect_DEFINED +#define GrDrawEffect_DEFINED + +#include "GrEffectStage.h" + +/** + * This class is used to communicate the particular GrEffect used in a draw to the backend-specific + * effect subclass (e.g. GrGLEffect). It is used to by the backend-specific class to generate a + * cache key for the effect, generate code on a program cache miss, and to upload uniform values to + * the program. + * In addition to the effect, it also communicates any changes between the relationship between + * the view matrix and local coordinate system since the effect was installed in its GrDrawState. + * The typical use case is that sometime after an effect was installed a decision was made to draw + * in device coordinates (i.e. use an identity view-matrix). In such a case the GrDrawEffect's + * coord-change-matrix would be the inverse of the view matrix that was set when the effect was + * installed. + */ +class GrDrawEffect { +public: + GrDrawEffect(const GrEffectStage& stage, bool explicitLocalCoords) + : fEffectStage(&stage) + , fExplicitLocalCoords(explicitLocalCoords) { + SkASSERT(NULL != fEffectStage); + SkASSERT(NULL != fEffectStage->getEffect()); + } + const GrEffectRef* effect() const { return fEffectStage->getEffect(); } + + template + const T& castEffect() const { return *static_cast(this->effect()->get()); } + + const SkMatrix& getCoordChangeMatrix() const { + if (fExplicitLocalCoords) { + return SkMatrix::I(); + } else { + return fEffectStage->getCoordChangeMatrix(); + } + } + + bool programHasExplicitLocalCoords() const { return fExplicitLocalCoords; } + + const int* getVertexAttribIndices() const { return fEffectStage->getVertexAttribIndices(); } + int getVertexAttribIndexCount() const { return fEffectStage->getVertexAttribIndexCount(); } + +private: + const GrEffectStage* fEffectStage; + bool fExplicitLocalCoords; +}; + +#endif