/* * Copyright 2012 Google Inc. * * Use of this source code is governed by a BSD-style license that can be * found in the LICENSE file. */ #ifndef GrTBackendEffectFactory_DEFINED #define GrTBackendEffectFactory_DEFINED #include "GrBackendEffectFactory.h" #include "gl/GrGLProgramEffects.h" /** * 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::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 GrEffect, 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 class GrTBackendEffectFactory : public GrBackendEffectFactory { public: typedef typename EffectClass::GLEffect GLEffect; /** 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(); } /** Implemented using GLEffect::GenKey as described in this class's comment. */ virtual void getGLEffectKey(const GrEffect& effect, const GrGLCaps& caps, GrEffectKeyBuilder* b) const SK_OVERRIDE { GLEffect::GenKey(effect, caps, b); } /** Returns a new instance of the appropriate *GL* implementation class for the given GrEffect; caller is responsible for deleting the object. */ virtual GrGLEffect* createGLInstance(const GrEffect& effect) const SK_OVERRIDE { return SkNEW_ARGS(GLEffect, (*this, effect)); } /** This class is a singleton. This function returns the single instance. */ static const GrBackendEffectFactory& getInstance() { static SkAlignedSTStorage<1, GrTBackendEffectFactory> gInstanceMem; static const GrTBackendEffectFactory* gInstance; if (!gInstance) { gInstance = SkNEW_PLACEMENT(gInstanceMem.get(), GrTBackendEffectFactory); } return *gInstance; } protected: GrTBackendEffectFactory() {} }; #endif