Home | History | Annotate | Download | only in gpu
      1 /*
      2  * Copyright 2012 Google Inc.
      3  *
      4  * Use of this source code is governed by a BSD-style license that can be
      5  * found in the LICENSE file.
      6  */
      7 
      8 #ifndef GrEffectUnitTest_DEFINED
      9 #define GrEffectUnitTest_DEFINED
     10 
     11 #include "GrNoncopyable.h"
     12 #include "SkRandom.h"
     13 #include "SkTArray.h"
     14 
     15 class SkMatrix;
     16 class GrDrawTargetCaps;
     17 
     18 namespace GrEffectUnitTest {
     19 // Used to access the dummy textures in TestCreate procs.
     20 enum {
     21     kSkiaPMTextureIdx = 0,
     22     kAlphaTextureIdx = 1,
     23 };
     24 
     25 /**
     26  * A helper for use in GrEffect::TestCreate functions.
     27  */
     28 const SkMatrix& TestMatrix(SkMWCRandom*);
     29 
     30 }
     31 
     32 #if SK_ALLOW_STATIC_GLOBAL_INITIALIZERS
     33 
     34 class GrContext;
     35 class GrEffectRef;
     36 class GrTexture;
     37 
     38 class GrEffectTestFactory : GrNoncopyable {
     39 public:
     40 
     41     typedef GrEffectRef* (*CreateProc)(SkMWCRandom*,
     42                                        GrContext*,
     43                                        const GrDrawTargetCaps& caps,
     44                                        GrTexture* dummyTextures[]);
     45 
     46     GrEffectTestFactory(CreateProc createProc) {
     47         fCreateProc = createProc;
     48         GetFactories()->push_back(this);
     49     }
     50 
     51     static GrEffectRef* CreateStage(SkMWCRandom* random,
     52                                     GrContext* context,
     53                                     const GrDrawTargetCaps& caps,
     54                                     GrTexture* dummyTextures[]) {
     55         uint32_t idx = random->nextRangeU(0, GetFactories()->count() - 1);
     56         GrEffectTestFactory* factory = (*GetFactories())[idx];
     57         return factory->fCreateProc(random, context, caps, dummyTextures);
     58     }
     59 
     60 private:
     61     CreateProc fCreateProc;
     62     static SkTArray<GrEffectTestFactory*, true>* GetFactories();
     63 };
     64 
     65 /** GrEffect subclasses should insert this macro in their declaration to be included in the
     66  *  program generation unit test.
     67  */
     68 #define GR_DECLARE_EFFECT_TEST                                                      \
     69     static GrEffectTestFactory gTestFactory;                                        \
     70     static GrEffectRef* TestCreate(SkMWCRandom*,                                    \
     71                                    GrContext*,                                      \
     72                                    const GrDrawTargetCaps&,                         \
     73                                    GrTexture* dummyTextures[2])
     74 
     75 /** GrEffect subclasses should insert this macro in their implementation file. They must then
     76  *  also implement this static function:
     77  *      GrEffect* TestCreate(SkMWCRandom*,
     78  *                           GrContext*,
     79  *                           const GrDrawTargetCaps&,
     80  *                           GrTexture* dummyTextures[2]);
     81  * dummyTextures[] are valid textures that can optionally be used to construct GrTextureAccesses.
     82  * The first texture has config kSkia8888_GrPixelConfig and the second has
     83  * kAlpha_8_GrPixelConfig. TestCreate functions are also free to create additional textures using
     84  * the GrContext.
     85  */
     86 #define GR_DEFINE_EFFECT_TEST(Effect)                                               \
     87     GrEffectTestFactory Effect :: gTestFactory(Effect :: TestCreate)
     88 
     89 #else // !SK_ALLOW_STATIC_GLOBAL_INITIALIZERS
     90 
     91 // The unit test relies on static initializers. Just declare the TestCreate function so that
     92 // its definitions will compile.
     93 #define GR_DECLARE_EFFECT_TEST                                                      \
     94     static GrEffectRef* TestCreate(SkMWCRandom*,                                    \
     95                                    GrContext*,                                      \
     96                                    const GrDrawTargetCaps&,                         \
     97                                    GrTexture* dummyTextures[2])
     98 #define GR_DEFINE_EFFECT_TEST(X)
     99 
    100 #endif // !SK_ALLOW_STATIC_GLOBAL_INITIALIZERS
    101 #endif
    102