Index: include/gpu/GrProcessorUnitTest.h |
diff --git a/include/gpu/GrProcessorUnitTest.h b/include/gpu/GrProcessorUnitTest.h |
new file mode 100644 |
index 0000000000000000000000000000000000000000..04ab2d15eb4e574273979b513352973fe2dc7d8e |
--- /dev/null |
+++ b/include/gpu/GrProcessorUnitTest.h |
@@ -0,0 +1,128 @@ |
+/* |
+ * 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 GrProcessorUnitTest_DEFINED |
+#define GrProcessorUnitTest_DEFINED |
+ |
+#include "SkRandom.h" |
+#include "SkTArray.h" |
+#include "SkTypes.h" |
+ |
+class SkMatrix; |
+class GrDrawTargetCaps; |
+ |
+namespace GrProcessorUnitTest { |
+// Used to access the dummy textures in TestCreate procs. |
+enum { |
+ kSkiaPMTextureIdx = 0, |
+ kAlphaTextureIdx = 1, |
+}; |
+ |
+/** |
+ * A helper for use in GrProcessor::TestCreate functions. |
+ */ |
+const SkMatrix& TestMatrix(SkRandom*); |
+ |
+} |
+ |
+#if SK_ALLOW_STATIC_GLOBAL_INITIALIZERS |
+ |
+class GrContext; |
+class GrProcessor; |
+class GrTexture; |
+ |
+template <class Processor> |
+class GrProcessorTestFactory : SkNoncopyable { |
+public: |
+ |
+ typedef Processor* (*CreateProc)(SkRandom*, |
+ GrContext*, |
+ const GrDrawTargetCaps& caps, |
+ GrTexture* dummyTextures[]); |
+ |
+ GrProcessorTestFactory(CreateProc createProc) { |
+ fCreateProc = createProc; |
+ GetFactories()->push_back(this); |
+ } |
+ |
+ static Processor* CreateStage(SkRandom* random, |
+ GrContext* context, |
+ const GrDrawTargetCaps& caps, |
+ GrTexture* dummyTextures[]) { |
+ uint32_t idx = random->nextRangeU(0, GetFactories()->count() - 1); |
+ GrProcessorTestFactory<Processor>* factory = (*GetFactories())[idx]; |
+ return factory->fCreateProc(random, context, caps, dummyTextures); |
+ } |
+ |
+private: |
+ CreateProc fCreateProc; |
+ |
+ #if SK_ALLOW_STATIC_GLOBAL_INITIALIZERS |
+ static SkTArray<GrProcessorTestFactory<Processor>*, true>* GetFactories() { |
+ static SkTArray<GrProcessorTestFactory<Processor>*, true> gFactories; |
+ return &gFactories; |
+ } |
+ #endif |
+}; |
+ |
+/** GrProcessor subclasses should insert this macro in their declaration to be included in the |
+ * program generation unit test. |
+ */ |
+ |
+#define GR_DECLARE_GEOMETRY_PROCESSOR_TEST \ |
+ static GrProcessorTestFactory<GrGeometryProcessor> gTestFactory; \ |
+ static GrGeometryProcessor* TestCreate(SkRandom*, \ |
+ GrContext*, \ |
+ const GrDrawTargetCaps&, \ |
+ GrTexture* dummyTextures[2]) |
+ |
+#define GR_DECLARE_FRAGMENT_PROCESSOR_TEST \ |
+ static GrProcessorTestFactory<GrFragmentProcessor> gTestFactory; \ |
+ static GrFragmentProcessor* TestCreate(SkRandom*, \ |
+ GrContext*, \ |
+ const GrDrawTargetCaps&, \ |
+ GrTexture* dummyTextures[2]) |
+ |
+/** GrProcessor subclasses should insert this macro in their implementation file. They must then |
+ * also implement this static function: |
+ * GrProcessor* TestCreate(SkRandom*, |
+ * GrContext*, |
+ * const GrDrawTargetCaps&, |
+ * GrTexture* dummyTextures[2]); |
+ * dummyTextures[] are valid textures that can optionally be used to construct GrTextureAccesses. |
+ * The first texture has config kSkia8888_GrPixelConfig and the second has |
+ * kAlpha_8_GrPixelConfig. TestCreate functions are also free to create additional textures using |
+ * the GrContext. |
+ */ |
+#define GR_DEFINE_FRAGMENT_PROCESSOR_TEST(Effect) \ |
+ GrProcessorTestFactory<GrFragmentProcessor> Effect :: gTestFactory(Effect :: TestCreate) |
+ |
+#define GR_DEFINE_GEOMETRY_PROCESSOR_TEST(Effect) \ |
+ GrProcessorTestFactory<GrGeometryProcessor> Effect :: gTestFactory(Effect :: TestCreate) |
+ |
+#else // !SK_ALLOW_STATIC_GLOBAL_INITIALIZERS |
+ |
+// The unit test relies on static initializers. Just declare the TestCreate function so that |
+// its definitions will compile. |
+#define GR_DECLARE_FRAGMENT_PROCESSOR_TEST \ |
+ static GrFragmentProcessor* TestCreate(SkRandom*, \ |
+ GrContext*, \ |
+ const GrDrawTargetCaps&, \ |
+ GrTexture* dummyTextures[2]) |
+#define GR_DEFINE_FRAGMENT_PROCESSOR_TEST(X) |
+ |
+// The unit test relies on static initializers. Just declare the TestCreate function so that |
+// its definitions will compile. |
+#define GR_DECLARE_GEOMETRY_PROCESSOR_TEST \ |
+ static GrGeometryProcessor* TestCreate(SkRandom*, \ |
+ GrContext*, \ |
+ const GrDrawTargetCaps&, \ |
+ GrTexture* dummyTextures[2]) |
+#define GR_DEFINE_GEOMETRY_PROCESSOR_TEST(X) |
+ |
+#endif // !SK_ALLOW_STATIC_GLOBAL_INITIALIZERS |
+#endif |