From c78188896e28a4ae49e406a7422b345ae177dafe Mon Sep 17 00:00:00 2001 From: "bsalomon@google.com" Date: Wed, 20 Mar 2013 19:19:53 +0000 Subject: Attempt to reland 8264-5 with warning-as-error fixes. git-svn-id: http://skia.googlecode.com/svn/trunk@8272 2bbb7eff-a529-9590-31e7-b0007b416f81 --- include/gpu/GrDrawEffect.h | 51 ++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 51 insertions(+) create mode 100644 include/gpu/GrDrawEffect.h (limited to 'include/gpu/GrDrawEffect.h') diff --git a/include/gpu/GrDrawEffect.h b/include/gpu/GrDrawEffect.h new file mode 100644 index 0000000000..005de417ee --- /dev/null +++ b/include/gpu/GrDrawEffect.h @@ -0,0 +1,51 @@ + +#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. GrGLEffectMatrix is a handy class that implements a local coordinate matrix that + * automatically accounts for the coord-change matrix. + */ +class GrDrawEffect { +public: + GrDrawEffect(const GrEffectStage& stage, bool explicitLocalCoords) + : fEffectStage(&stage) + , fExplicitLocalCoords(explicitLocalCoords) { + GrAssert(NULL != fEffectStage); + GrAssert(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 -- cgit v1.2.3