| Index: include/gpu/GrTBackendEffectFactory.h
|
| diff --git a/include/gpu/GrTBackendEffectFactory.h b/include/gpu/GrTBackendEffectFactory.h
|
| index cd4c0a49e96a40aa16622606027717aad03784d1..251e8c776877be577b0fa206ed616526fd81b1af 100644
|
| --- a/include/gpu/GrTBackendEffectFactory.h
|
| +++ b/include/gpu/GrTBackendEffectFactory.h
|
| @@ -13,7 +13,26 @@
|
| #include "gl/GrGLProgramEffects.h"
|
|
|
| /**
|
| - * Implements GrBackendEffectFactory for a GrEffect subclass as a singleton.
|
| + * Implements GrBackendEffectFactory for a GrEffect subclass as a singleton. This can be used by
|
| + * most GrEffect subclasses to implement the GrEffect::getFactory() method:
|
| + *
|
| + * const GrBackendEffectFactory& MyEffect::getFactory() const {
|
| + * return GrTBackendEffectFactory<MyEffect>::getInstance();
|
| + * }
|
| + *
|
| + * Using this class requires that the GrEffect subclass always produces the same GrGLEffect
|
| + * subclass. Additionally, It adds the following requirements to the GrEffect and GrGLEffect
|
| + * subclasses:
|
| + *
|
| + * 1. The GrGLEffect used by GrEffect subclass MyEffect must be named or typedef'ed to
|
| + * MyEffect::GLEffect.
|
| + * 2. MyEffect::GLEffect must have a static function:
|
| + * EffectKey GenKey(const GrDrawEffect, const GrGLCaps&)
|
| + * which generates a key that maps 1 to 1 with code variations emitted by
|
| + * MyEffect::GLEffect::emitCode().
|
| + * 3. MyEffect must have a static function:
|
| + * const char* Name()
|
| + * which returns a human-readable name for the effect.
|
| */
|
| template <typename EffectClass>
|
| class GrTBackendEffectFactory : public GrBackendEffectFactory {
|
| @@ -21,35 +40,17 @@ class GrTBackendEffectFactory : public GrBackendEffectFactory {
|
| public:
|
| typedef typename EffectClass::GLEffect GLEffect;
|
|
|
| - /** Returns a human-readable name that is accessible via GrEffect or
|
| - GrGLEffect and is consistent between the two of them.
|
| - */
|
| + /** Returns a human-readable name for the effect. Implemented using GLEffect::Name as described
|
| + * in this class's comment. */
|
| virtual const char* name() const SK_OVERRIDE { return EffectClass::Name(); }
|
|
|
| - /** Generates an effect's key. This enables caching of generated shaders. Part of the
|
| - id identifies the GrEffect subclass. The remainder is based on the aspects of the
|
| - GrEffect object's configuration that affect GLSL code generation. If this fails
|
| - then program generation should be aborted. Failure occurs if the effect uses more
|
| - transforms, attributes, or textures than the key has space for. */
|
| - virtual bool getGLEffectKey(const GrDrawEffect& drawEffect,
|
| +
|
| + /** Implemented using GLEffect::GenKey as described in this class's comment. */
|
| + virtual void getGLEffectKey(const GrDrawEffect& drawEffect,
|
| const GrGLCaps& caps,
|
| GrEffectKeyBuilder* b) const SK_OVERRIDE {
|
| - SkASSERT(kIllegalEffectClassID != fEffectClassID);
|
| EffectKey effectKey = GLEffect::GenKey(drawEffect, caps);
|
| - EffectKey textureKey = GrGLProgramEffects::GenTextureKey(drawEffect, caps);
|
| - EffectKey transformKey = GrGLProgramEffects::GenTransformKey(drawEffect);
|
| - EffectKey attribKey = GrGLProgramEffects::GenAttribKey(drawEffect);
|
| - static const uint32_t kMetaKeyInvalidMask = ~((uint32_t) SK_MaxU16);
|
| - if ((textureKey | transformKey | attribKey | fEffectClassID) & kMetaKeyInvalidMask) {
|
| - return false;
|
| - }
|
| -
|
| - // effectKey must be first because it is what will be returned by
|
| - // GrGLProgramDesc::EffectKeyProvider and passed to the GrGLEffect as its key.
|
| b->add32(effectKey);
|
| - b->add32(textureKey << 16 | transformKey);
|
| - b->add32(fEffectClassID << 16 | attribKey);
|
| - return true;
|
| }
|
|
|
| /** Returns a new instance of the appropriate *GL* implementation class
|
| @@ -59,8 +60,7 @@ public:
|
| return SkNEW_ARGS(GLEffect, (*this, drawEffect));
|
| }
|
|
|
| - /** This class is a singleton. This function returns the single instance.
|
| - */
|
| + /** This class is a singleton. This function returns the single instance. */
|
| static const GrBackendEffectFactory& getInstance() {
|
| static SkAlignedSTStorage<1, GrTBackendEffectFactory> gInstanceMem;
|
| static const GrTBackendEffectFactory* gInstance;
|
| @@ -72,9 +72,7 @@ public:
|
| }
|
|
|
| protected:
|
| - GrTBackendEffectFactory() {
|
| - fEffectClassID = GenID();
|
| - }
|
| + GrTBackendEffectFactory() {}
|
| };
|
|
|
| #endif
|
|
|