1b0a8a377f832c59cee939ad721e1f87d378b7142joshualitt/*
2b0a8a377f832c59cee939ad721e1f87d378b7142joshualitt * Copyright 2012 Google Inc.
3b0a8a377f832c59cee939ad721e1f87d378b7142joshualitt *
4b0a8a377f832c59cee939ad721e1f87d378b7142joshualitt * Use of this source code is governed by a BSD-style license that can be
5b0a8a377f832c59cee939ad721e1f87d378b7142joshualitt * found in the LICENSE file.
6b0a8a377f832c59cee939ad721e1f87d378b7142joshualitt */
7b0a8a377f832c59cee939ad721e1f87d378b7142joshualitt
8b0a8a377f832c59cee939ad721e1f87d378b7142joshualitt#ifndef GrProcessorUnitTest_DEFINED
9b0a8a377f832c59cee939ad721e1f87d378b7142joshualitt#define GrProcessorUnitTest_DEFINED
10b0a8a377f832c59cee939ad721e1f87d378b7142joshualitt
11b0a8a377f832c59cee939ad721e1f87d378b7142joshualitt#include "SkRandom.h"
12b0a8a377f832c59cee939ad721e1f87d378b7142joshualitt#include "SkTArray.h"
13b0a8a377f832c59cee939ad721e1f87d378b7142joshualitt#include "SkTypes.h"
14b0a8a377f832c59cee939ad721e1f87d378b7142joshualitt
15b0a8a377f832c59cee939ad721e1f87d378b7142joshualittclass SkMatrix;
16b0a8a377f832c59cee939ad721e1f87d378b7142joshualittclass GrDrawTargetCaps;
17b0a8a377f832c59cee939ad721e1f87d378b7142joshualitt
18b0a8a377f832c59cee939ad721e1f87d378b7142joshualittnamespace GrProcessorUnitTest {
19b0a8a377f832c59cee939ad721e1f87d378b7142joshualitt// Used to access the dummy textures in TestCreate procs.
20b0a8a377f832c59cee939ad721e1f87d378b7142joshualittenum {
21b0a8a377f832c59cee939ad721e1f87d378b7142joshualitt    kSkiaPMTextureIdx = 0,
22b0a8a377f832c59cee939ad721e1f87d378b7142joshualitt    kAlphaTextureIdx = 1,
23b0a8a377f832c59cee939ad721e1f87d378b7142joshualitt};
24b0a8a377f832c59cee939ad721e1f87d378b7142joshualitt
25b0a8a377f832c59cee939ad721e1f87d378b7142joshualitt/**
26b0a8a377f832c59cee939ad721e1f87d378b7142joshualitt * A helper for use in GrProcessor::TestCreate functions.
27b0a8a377f832c59cee939ad721e1f87d378b7142joshualitt */
28b0a8a377f832c59cee939ad721e1f87d378b7142joshualittconst SkMatrix& TestMatrix(SkRandom*);
29b0a8a377f832c59cee939ad721e1f87d378b7142joshualitt
30b0a8a377f832c59cee939ad721e1f87d378b7142joshualitt}
31b0a8a377f832c59cee939ad721e1f87d378b7142joshualitt
32b0a8a377f832c59cee939ad721e1f87d378b7142joshualitt#if SK_ALLOW_STATIC_GLOBAL_INITIALIZERS
33b0a8a377f832c59cee939ad721e1f87d378b7142joshualitt
34b0a8a377f832c59cee939ad721e1f87d378b7142joshualittclass GrContext;
35b0a8a377f832c59cee939ad721e1f87d378b7142joshualittclass GrProcessor;
36b0a8a377f832c59cee939ad721e1f87d378b7142joshualittclass GrTexture;
37b0a8a377f832c59cee939ad721e1f87d378b7142joshualitt
38b0a8a377f832c59cee939ad721e1f87d378b7142joshualitttemplate <class Processor>
39b0a8a377f832c59cee939ad721e1f87d378b7142joshualittclass GrProcessorTestFactory : SkNoncopyable {
40b0a8a377f832c59cee939ad721e1f87d378b7142joshualittpublic:
41b0a8a377f832c59cee939ad721e1f87d378b7142joshualitt
42b0a8a377f832c59cee939ad721e1f87d378b7142joshualitt    typedef Processor* (*CreateProc)(SkRandom*,
43b0a8a377f832c59cee939ad721e1f87d378b7142joshualitt                                    GrContext*,
44b0a8a377f832c59cee939ad721e1f87d378b7142joshualitt                                    const GrDrawTargetCaps& caps,
45b0a8a377f832c59cee939ad721e1f87d378b7142joshualitt                                    GrTexture* dummyTextures[]);
46b0a8a377f832c59cee939ad721e1f87d378b7142joshualitt
47b0a8a377f832c59cee939ad721e1f87d378b7142joshualitt    GrProcessorTestFactory(CreateProc createProc) {
48b0a8a377f832c59cee939ad721e1f87d378b7142joshualitt        fCreateProc = createProc;
49b0a8a377f832c59cee939ad721e1f87d378b7142joshualitt        GetFactories()->push_back(this);
50b0a8a377f832c59cee939ad721e1f87d378b7142joshualitt    }
51b0a8a377f832c59cee939ad721e1f87d378b7142joshualitt
52b0a8a377f832c59cee939ad721e1f87d378b7142joshualitt    static Processor* CreateStage(SkRandom* random,
53b0a8a377f832c59cee939ad721e1f87d378b7142joshualitt                                 GrContext* context,
54b0a8a377f832c59cee939ad721e1f87d378b7142joshualitt                                 const GrDrawTargetCaps& caps,
55b0a8a377f832c59cee939ad721e1f87d378b7142joshualitt                                 GrTexture* dummyTextures[]) {
56b0a8a377f832c59cee939ad721e1f87d378b7142joshualitt        uint32_t idx = random->nextRangeU(0, GetFactories()->count() - 1);
57b0a8a377f832c59cee939ad721e1f87d378b7142joshualitt        GrProcessorTestFactory<Processor>* factory = (*GetFactories())[idx];
58b0a8a377f832c59cee939ad721e1f87d378b7142joshualitt        return factory->fCreateProc(random, context, caps, dummyTextures);
59b0a8a377f832c59cee939ad721e1f87d378b7142joshualitt    }
60b0a8a377f832c59cee939ad721e1f87d378b7142joshualitt
61b0a8a377f832c59cee939ad721e1f87d378b7142joshualittprivate:
62b0a8a377f832c59cee939ad721e1f87d378b7142joshualitt    CreateProc fCreateProc;
63b0a8a377f832c59cee939ad721e1f87d378b7142joshualitt
64b0a8a377f832c59cee939ad721e1f87d378b7142joshualitt    #if SK_ALLOW_STATIC_GLOBAL_INITIALIZERS
65b0a8a377f832c59cee939ad721e1f87d378b7142joshualitt    static SkTArray<GrProcessorTestFactory<Processor>*, true>* GetFactories() {
66b0a8a377f832c59cee939ad721e1f87d378b7142joshualitt        static SkTArray<GrProcessorTestFactory<Processor>*, true> gFactories;
67b0a8a377f832c59cee939ad721e1f87d378b7142joshualitt        return &gFactories;
68b0a8a377f832c59cee939ad721e1f87d378b7142joshualitt    }
69b0a8a377f832c59cee939ad721e1f87d378b7142joshualitt    #endif
70b0a8a377f832c59cee939ad721e1f87d378b7142joshualitt};
71b0a8a377f832c59cee939ad721e1f87d378b7142joshualitt
72b0a8a377f832c59cee939ad721e1f87d378b7142joshualitt/** GrProcessor subclasses should insert this macro in their declaration to be included in the
73b0a8a377f832c59cee939ad721e1f87d378b7142joshualitt *  program generation unit test.
74b0a8a377f832c59cee939ad721e1f87d378b7142joshualitt */
75b0a8a377f832c59cee939ad721e1f87d378b7142joshualitt
76b0a8a377f832c59cee939ad721e1f87d378b7142joshualitt#define GR_DECLARE_GEOMETRY_PROCESSOR_TEST                                                         \
77b0a8a377f832c59cee939ad721e1f87d378b7142joshualitt    static GrProcessorTestFactory<GrGeometryProcessor> gTestFactory;                               \
78b0a8a377f832c59cee939ad721e1f87d378b7142joshualitt    static GrGeometryProcessor* TestCreate(SkRandom*,                                              \
79b0a8a377f832c59cee939ad721e1f87d378b7142joshualitt                                GrContext*,                                                        \
80b0a8a377f832c59cee939ad721e1f87d378b7142joshualitt                                const GrDrawTargetCaps&,                                           \
81b0a8a377f832c59cee939ad721e1f87d378b7142joshualitt                                GrTexture* dummyTextures[2])
82b0a8a377f832c59cee939ad721e1f87d378b7142joshualitt
83b0a8a377f832c59cee939ad721e1f87d378b7142joshualitt#define GR_DECLARE_FRAGMENT_PROCESSOR_TEST                                                         \
84b0a8a377f832c59cee939ad721e1f87d378b7142joshualitt    static GrProcessorTestFactory<GrFragmentProcessor> gTestFactory;                               \
85b0a8a377f832c59cee939ad721e1f87d378b7142joshualitt    static GrFragmentProcessor* TestCreate(SkRandom*,                                              \
86b0a8a377f832c59cee939ad721e1f87d378b7142joshualitt                                GrContext*,                                                        \
87b0a8a377f832c59cee939ad721e1f87d378b7142joshualitt                                const GrDrawTargetCaps&,                                           \
88b0a8a377f832c59cee939ad721e1f87d378b7142joshualitt                                GrTexture* dummyTextures[2])
89b0a8a377f832c59cee939ad721e1f87d378b7142joshualitt
90b0a8a377f832c59cee939ad721e1f87d378b7142joshualitt/** GrProcessor subclasses should insert this macro in their implementation file. They must then
91b0a8a377f832c59cee939ad721e1f87d378b7142joshualitt *  also implement this static function:
92b0a8a377f832c59cee939ad721e1f87d378b7142joshualitt *      GrProcessor* TestCreate(SkRandom*,
93b0a8a377f832c59cee939ad721e1f87d378b7142joshualitt *                           GrContext*,
94b0a8a377f832c59cee939ad721e1f87d378b7142joshualitt *                           const GrDrawTargetCaps&,
95b0a8a377f832c59cee939ad721e1f87d378b7142joshualitt *                           GrTexture* dummyTextures[2]);
96b0a8a377f832c59cee939ad721e1f87d378b7142joshualitt * dummyTextures[] are valid textures that can optionally be used to construct GrTextureAccesses.
97b0a8a377f832c59cee939ad721e1f87d378b7142joshualitt * The first texture has config kSkia8888_GrPixelConfig and the second has
98b0a8a377f832c59cee939ad721e1f87d378b7142joshualitt * kAlpha_8_GrPixelConfig. TestCreate functions are also free to create additional textures using
99b0a8a377f832c59cee939ad721e1f87d378b7142joshualitt * the GrContext.
100b0a8a377f832c59cee939ad721e1f87d378b7142joshualitt */
101b0a8a377f832c59cee939ad721e1f87d378b7142joshualitt#define GR_DEFINE_FRAGMENT_PROCESSOR_TEST(Effect)                                                  \
102b0a8a377f832c59cee939ad721e1f87d378b7142joshualitt    GrProcessorTestFactory<GrFragmentProcessor> Effect :: gTestFactory(Effect :: TestCreate)
103b0a8a377f832c59cee939ad721e1f87d378b7142joshualitt
104b0a8a377f832c59cee939ad721e1f87d378b7142joshualitt#define GR_DEFINE_GEOMETRY_PROCESSOR_TEST(Effect)                                                  \
105b0a8a377f832c59cee939ad721e1f87d378b7142joshualitt    GrProcessorTestFactory<GrGeometryProcessor> Effect :: gTestFactory(Effect :: TestCreate)
106b0a8a377f832c59cee939ad721e1f87d378b7142joshualitt
107b0a8a377f832c59cee939ad721e1f87d378b7142joshualitt#else // !SK_ALLOW_STATIC_GLOBAL_INITIALIZERS
108b0a8a377f832c59cee939ad721e1f87d378b7142joshualitt
109b0a8a377f832c59cee939ad721e1f87d378b7142joshualitt// The unit test relies on static initializers. Just declare the TestCreate function so that
110b0a8a377f832c59cee939ad721e1f87d378b7142joshualitt// its definitions will compile.
111b0a8a377f832c59cee939ad721e1f87d378b7142joshualitt#define GR_DECLARE_FRAGMENT_PROCESSOR_TEST                                                         \
112b0a8a377f832c59cee939ad721e1f87d378b7142joshualitt    static GrFragmentProcessor* TestCreate(SkRandom*,                                              \
113b0a8a377f832c59cee939ad721e1f87d378b7142joshualitt                                GrContext*,                                                        \
114b0a8a377f832c59cee939ad721e1f87d378b7142joshualitt                                const GrDrawTargetCaps&,                                           \
115b0a8a377f832c59cee939ad721e1f87d378b7142joshualitt                                GrTexture* dummyTextures[2])
116b0a8a377f832c59cee939ad721e1f87d378b7142joshualitt#define GR_DEFINE_FRAGMENT_PROCESSOR_TEST(X)
117b0a8a377f832c59cee939ad721e1f87d378b7142joshualitt
118b0a8a377f832c59cee939ad721e1f87d378b7142joshualitt// The unit test relies on static initializers. Just declare the TestCreate function so that
119b0a8a377f832c59cee939ad721e1f87d378b7142joshualitt// its definitions will compile.
120b0a8a377f832c59cee939ad721e1f87d378b7142joshualitt#define GR_DECLARE_GEOMETRY_PROCESSOR_TEST                                                         \
121b0a8a377f832c59cee939ad721e1f87d378b7142joshualitt    static GrGeometryProcessor* TestCreate(SkRandom*,                                              \
122b0a8a377f832c59cee939ad721e1f87d378b7142joshualitt                                GrContext*,                                                        \
123b0a8a377f832c59cee939ad721e1f87d378b7142joshualitt                                const GrDrawTargetCaps&,                                           \
124b0a8a377f832c59cee939ad721e1f87d378b7142joshualitt                                GrTexture* dummyTextures[2])
125b0a8a377f832c59cee939ad721e1f87d378b7142joshualitt#define GR_DEFINE_GEOMETRY_PROCESSOR_TEST(X)
126b0a8a377f832c59cee939ad721e1f87d378b7142joshualitt
127b0a8a377f832c59cee939ad721e1f87d378b7142joshualitt#endif // !SK_ALLOW_STATIC_GLOBAL_INITIALIZERS
128b0a8a377f832c59cee939ad721e1f87d378b7142joshualitt#endif
129