From d472620458e2383e6dd949f4e1aaf61160717ffe Mon Sep 17 00:00:00 2001 From: "bsalomon@google.com" Date: Fri, 3 Aug 2012 14:34:46 +0000 Subject: Registry-based unit test for custom effects Review URL: http://codereview.appspot.com/6447085/ git-svn-id: http://skia.googlecode.com/svn/trunk@4946 2bbb7eff-a529-9590-31e7-b0007b416f81 --- include/gpu/GrCustomStageUnitTest.h | 73 +++++++++++++++++++++++++++++++++++++ 1 file changed, 73 insertions(+) create mode 100644 include/gpu/GrCustomStageUnitTest.h (limited to 'include/gpu/GrCustomStageUnitTest.h') diff --git a/include/gpu/GrCustomStageUnitTest.h b/include/gpu/GrCustomStageUnitTest.h new file mode 100644 index 0000000000..9cbadf3a5b --- /dev/null +++ b/include/gpu/GrCustomStageUnitTest.h @@ -0,0 +1,73 @@ +/* + * 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 GrCustomStageUnitTest_DEFINED +#define GrCustomStageUnitTest_DEFINED + +#include "SkRandom.h" + +#if SK_ALLOW_STATIC_GLOBAL_INITIALIZERS + +class GrCustomStage; +class GrContext; +class GrTexture; + +class GrCustomStageTestFactory : GrNoncopyable { +public: + // Used to access the dummy textures in TestCreate procs. + enum { + kSkiaPMTextureIdx = 0, + kAlphaTextureIdx = 1, + }; + + typedef GrCustomStage* (*CreateProc)(SkRandom*, GrContext*, GrTexture* dummyTextures[]); + + GrCustomStageTestFactory(CreateProc createProc) { + fCreateProc = createProc; + GetFactories()->push_back(this); + } + + static GrCustomStage* CreateStage(SkRandom* random, + GrContext* context, + GrTexture* dummyTextures[]) { + uint32_t idx = random->nextRangeU(0, GetFactories()->count() - 1); + GrCustomStageTestFactory* factory = (*GetFactories())[idx]; + return factory->fCreateProc(random, context, dummyTextures); + } + +private: + CreateProc fCreateProc; + static SkTArray* GetFactories(); +}; + +/** GrCustomStage subclasses should insert this macro in their declaration to be included in the + * program generation unit test. + */ +#define GR_DECLARE_CUSTOM_STAGE_TEST \ + static GrCustomStageTestFactory gTestFactory; \ + static GrCustomStage* TestCreate(SkRandom*, GrContext*, GrTexture* dummyTextures[2]) + +/** GrCustomStage subclasses should insert this macro in their implemenation file. They must then + * also implement this static function: + * GrCustomStage* CreateStage(SkRandom*, GrContext*, GrTexture* dummyTextures[2]); + * dummyTextures[] are valied textures that they can optionally use for their texture accesses. The + * first texture has config kSkia8888_PM_GrPixelConfig and the second has kAlpha_8_GrPixelConfig. + * TestCreate functions are also free to create additional textures using the GrContext. + */ +#define GR_DEFINE_CUSTOM_STAGE_TEST(CustomStage) \ + GrCustomStageTestFactory CustomStage :: gTestFactory(CustomStage :: 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_CUSTOM_STAGE_TEST \ + static GrCustomStage* TestCreate(SkRandom*, GrContext*, GrTexture* dummyTextures[2]) +#define GR_DEFINE_CUSTOM_STAGE_TEST(X) + +#endif // !SK_ALLOW_STATIC_GLOBAL_INITIALIZERS +#endif \ No newline at end of file -- cgit v1.2.3