diff -r 000000000000 -r 6474c204b198 gfx/skia/trunk/include/gpu/GrEffectUnitTest.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/gfx/skia/trunk/include/gpu/GrEffectUnitTest.h Wed Dec 31 06:09:35 2014 +0100 @@ -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 GrEffectUnitTest_DEFINED +#define GrEffectUnitTest_DEFINED + +#include "SkRandom.h" +#include "SkTArray.h" +#include "SkTypes.h" + +class SkMatrix; +class GrDrawTargetCaps; + +namespace GrEffectUnitTest { +// Used to access the dummy textures in TestCreate procs. +enum { + kSkiaPMTextureIdx = 0, + kAlphaTextureIdx = 1, +}; + +/** + * A helper for use in GrEffect::TestCreate functions. + */ +const SkMatrix& TestMatrix(SkRandom*); + +} + +#if SK_ALLOW_STATIC_GLOBAL_INITIALIZERS + +class GrContext; +class GrEffectRef; +class GrTexture; + +class GrEffectTestFactory : public SkNoncopyable { +public: + + typedef GrEffectRef* (*CreateProc)(SkRandom*, + GrContext*, + const GrDrawTargetCaps& caps, + GrTexture* dummyTextures[]); + + GrEffectTestFactory(CreateProc createProc) { + fCreateProc = createProc; + GetFactories()->push_back(this); + } + + static GrEffectRef* CreateStage(SkRandom* random, + GrContext* context, + const GrDrawTargetCaps& caps, + GrTexture* dummyTextures[]) { + uint32_t idx = random->nextRangeU(0, GetFactories()->count() - 1); + GrEffectTestFactory* factory = (*GetFactories())[idx]; + return factory->fCreateProc(random, context, caps, dummyTextures); + } + +private: + CreateProc fCreateProc; + static SkTArray* GetFactories(); +}; + +/** GrEffect subclasses should insert this macro in their declaration to be included in the + * program generation unit test. + */ +#define GR_DECLARE_EFFECT_TEST \ + static GrEffectTestFactory gTestFactory; \ + static GrEffectRef* TestCreate(SkRandom*, \ + GrContext*, \ + const GrDrawTargetCaps&, \ + GrTexture* dummyTextures[2]) + +/** GrEffect subclasses should insert this macro in their implementation file. They must then + * also implement this static function: + * GrEffect* 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_EFFECT_TEST(Effect) \ + GrEffectTestFactory 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_EFFECT_TEST \ + static GrEffectRef* TestCreate(SkRandom*, \ + GrContext*, \ + const GrDrawTargetCaps&, \ + GrTexture* dummyTextures[2]) +#define GR_DEFINE_EFFECT_TEST(X) + +#endif // !SK_ALLOW_STATIC_GLOBAL_INITIALIZERS +#endif