| Index: include/gpu/GrTBackendProcessorFactory.h | 
| diff --git a/include/gpu/GrTBackendProcessorFactory.h b/include/gpu/GrTBackendProcessorFactory.h | 
| new file mode 100644 | 
| index 0000000000000000000000000000000000000000..c67f508f5d5da6cb9209eb2066a23b64e87d8e29 | 
| --- /dev/null | 
| +++ b/include/gpu/GrTBackendProcessorFactory.h | 
| @@ -0,0 +1,101 @@ | 
| +/* | 
| + * 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 GrTBackendProcessorFactory_DEFINED | 
| +#define GrTBackendProcessorFactory_DEFINED | 
| + | 
| +#include "GrBackendProcessorFactory.h" | 
| +#include "gl/GrGLProgramEffects.h" | 
| + | 
| +/** | 
| + * Implements GrBackendEffectFactory for a GrProcessor subclass as a singleton. This can be used by | 
| + * most GrProcessor subclasses to implement the GrProcessor::getFactory() method: | 
| + * | 
| + * const GrBackendEffectFactory& MyEffect::getFactory() const { | 
| + *     return GrTBackendEffectFactory<MyEffect>::getInstance(); | 
| + * } | 
| + * | 
| + * Using this class requires that the GrProcessor subclass always produces the same GrGLProcessor | 
| + * subclass. Additionally, it adds the following requirements to the GrProcessor and GrGLProcessor | 
| + * subclasses: | 
| + * | 
| + * 1. The GrGLProcessor used by GrProcessor subclass MyEffect must be named or typedef'ed to | 
| + *    MyEffect::GLProcessor. | 
| + * 2. MyEffect::GLProcessor must have a static function: | 
| + *      EffectKey GenKey(const GrProcessor, const GrGLCaps&) | 
| + *    which generates a key that maps 1 to 1 with code variations emitted by | 
| + *    MyEffect::GLProcessor::emitCode(). | 
| + * 3. MyEffect must have a static function: | 
| + *      const char* Name() | 
| + *    which returns a human-readable name for the effect. | 
| + */ | 
| +template <class ProcessorClass, class BackEnd, class ProcessorBase, class GLProcessorBase> | 
| +class GrTBackendProcessorFactory : public BackEnd { | 
| +public: | 
| +    typedef typename ProcessorClass::GLProcessor GLProcessor; | 
| + | 
| +    /** Returns a human-readable name for the effect. Implemented using GLProcessor::Name as | 
| +     *  described in this class's comment. */ | 
| +    virtual const char* name() const SK_OVERRIDE { return ProcessorClass::Name(); } | 
| + | 
| + | 
| +    /** Implemented using GLProcessor::GenKey as described in this class's comment. */ | 
| +    virtual void getGLProcessorKey(const GrProcessor& effect, | 
| +                                   const GrGLCaps& caps, | 
| +                                   GrProcessorKeyBuilder* b) const SK_OVERRIDE { | 
| +        GLProcessor::GenKey(effect, caps, b); | 
| +    } | 
| + | 
| +    /** Returns a new instance of the appropriate *GL* implementation class | 
| +        for the given GrProcessor; caller is responsible for deleting | 
| +        the object. */ | 
| +    virtual GLProcessorBase* createGLInstance(const ProcessorBase& effect) const SK_OVERRIDE { | 
| +        return SkNEW_ARGS(GLProcessor, (*this, effect)); | 
| +    } | 
| + | 
| +    /** This class is a singleton. This function returns the single instance. */ | 
| +    static const BackEnd& getInstance() { | 
| +        static SkAlignedSTStorage<1, GrTBackendProcessorFactory> gInstanceMem; | 
| +        static const GrTBackendProcessorFactory* gInstance; | 
| +        if (!gInstance) { | 
| +            gInstance = SkNEW_PLACEMENT(gInstanceMem.get(), | 
| +                                        GrTBackendProcessorFactory); | 
| +        } | 
| +        return *gInstance; | 
| +    } | 
| + | 
| +protected: | 
| +    GrTBackendProcessorFactory() {} | 
| +}; | 
| + | 
| +/* | 
| + * Every effect so far derives from one of the following subclasses of GrTBackendProcessorFactory. | 
| + * All of this machinery is necessary to ensure that creatGLInstace is typesafe and does not | 
| + * require any casting | 
| + */ | 
| +template <class ProcessorClass> | 
| +class GrTBackendGeometryProcessorFactory | 
| +        : public GrTBackendProcessorFactory<ProcessorClass, | 
| +                                            GrBackendGeometryProcessorFactory, | 
| +                                            GrGeometryProcessor, | 
| +                                            GrGLGeometryProcessor> { | 
| +protected: | 
| +    GrTBackendGeometryProcessorFactory() {} | 
| +}; | 
| + | 
| +template <class ProcessorClass> | 
| +class GrTBackendFragmentProcessorFactory | 
| +        : public GrTBackendProcessorFactory<ProcessorClass, | 
| +                                           GrBackendFragmentProcessorFactory, | 
| +                                           GrFragmentProcessor, | 
| +                                           GrGLFragmentProcessor> { | 
| +protected: | 
| +    GrTBackendFragmentProcessorFactory() {} | 
| +}; | 
| + | 
| + | 
| +#endif | 
|  |