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 |