xref: /aosp_15_r20/external/skia/src/gpu/ganesh/GrProcessorUnitTest.h (revision c8dee2aa9b3f27cf6c858bd81872bdeb2c07ed17)
1*c8dee2aaSAndroid Build Coastguard Worker /*
2*c8dee2aaSAndroid Build Coastguard Worker  * Copyright 2012 Google Inc.
3*c8dee2aaSAndroid Build Coastguard Worker  *
4*c8dee2aaSAndroid Build Coastguard Worker  * Use of this source code is governed by a BSD-style license that can be
5*c8dee2aaSAndroid Build Coastguard Worker  * found in the LICENSE file.
6*c8dee2aaSAndroid Build Coastguard Worker  */
7*c8dee2aaSAndroid Build Coastguard Worker 
8*c8dee2aaSAndroid Build Coastguard Worker #ifndef GrProcessorUnitTest_DEFINED
9*c8dee2aaSAndroid Build Coastguard Worker #define GrProcessorUnitTest_DEFINED
10*c8dee2aaSAndroid Build Coastguard Worker 
11*c8dee2aaSAndroid Build Coastguard Worker #include "include/core/SkTypes.h"
12*c8dee2aaSAndroid Build Coastguard Worker 
13*c8dee2aaSAndroid Build Coastguard Worker #if defined(GPU_TEST_UTILS)
14*c8dee2aaSAndroid Build Coastguard Worker 
15*c8dee2aaSAndroid Build Coastguard Worker #include "include/core/SkString.h"
16*c8dee2aaSAndroid Build Coastguard Worker #include "include/private/base/SkNoncopyable.h"
17*c8dee2aaSAndroid Build Coastguard Worker #include "include/private/base/SkTArray.h"
18*c8dee2aaSAndroid Build Coastguard Worker #include "src/gpu/ganesh/GrFragmentProcessor.h"
19*c8dee2aaSAndroid Build Coastguard Worker #include "src/gpu/ganesh/GrSurfaceProxyView.h"  // IWYU pragma: keep
20*c8dee2aaSAndroid Build Coastguard Worker 
21*c8dee2aaSAndroid Build Coastguard Worker #include <memory>
22*c8dee2aaSAndroid Build Coastguard Worker #include <tuple>
23*c8dee2aaSAndroid Build Coastguard Worker 
24*c8dee2aaSAndroid Build Coastguard Worker class GrCaps;
25*c8dee2aaSAndroid Build Coastguard Worker class GrGeometryProcessor;
26*c8dee2aaSAndroid Build Coastguard Worker class GrProcessorTestData;
27*c8dee2aaSAndroid Build Coastguard Worker class GrProxyProvider;
28*c8dee2aaSAndroid Build Coastguard Worker class GrRecordingContext;
29*c8dee2aaSAndroid Build Coastguard Worker class GrXPFactory;
30*c8dee2aaSAndroid Build Coastguard Worker class SkArenaAlloc;
31*c8dee2aaSAndroid Build Coastguard Worker class SkRandom;
32*c8dee2aaSAndroid Build Coastguard Worker enum SkAlphaType : int;
33*c8dee2aaSAndroid Build Coastguard Worker enum class GrColorType;
34*c8dee2aaSAndroid Build Coastguard Worker 
35*c8dee2aaSAndroid Build Coastguard Worker namespace GrProcessorUnitTest {
36*c8dee2aaSAndroid Build Coastguard Worker 
37*c8dee2aaSAndroid Build Coastguard Worker /** This allows parent FPs to implement a test create with known leaf children in order to avoid
38*c8dee2aaSAndroid Build Coastguard Worker  *  creating an unbounded FP tree which may overflow various shader limits.
39*c8dee2aaSAndroid Build Coastguard Worker  *  MakeOptionalChildFP is the same as MakeChildFP, but can return null.
40*c8dee2aaSAndroid Build Coastguard Worker  */
41*c8dee2aaSAndroid Build Coastguard Worker std::unique_ptr<GrFragmentProcessor> MakeChildFP(GrProcessorTestData*);
42*c8dee2aaSAndroid Build Coastguard Worker std::unique_ptr<GrFragmentProcessor> MakeOptionalChildFP(GrProcessorTestData*);
43*c8dee2aaSAndroid Build Coastguard Worker 
44*c8dee2aaSAndroid Build Coastguard Worker }  // namespace GrProcessorUnitTest
45*c8dee2aaSAndroid Build Coastguard Worker 
46*c8dee2aaSAndroid Build Coastguard Worker /** GrProcessorTestData is an argument struct to TestCreate functions
47*c8dee2aaSAndroid Build Coastguard Worker  *  fTextures are valid textures that can optionally be used to construct
48*c8dee2aaSAndroid Build Coastguard Worker  *  TextureSampler. The first texture has a RGBA8 format and the second has Alpha8 format for the
49*c8dee2aaSAndroid Build Coastguard Worker  *  specific backend API. TestCreate functions are also free to create additional textures using
50*c8dee2aaSAndroid Build Coastguard Worker  *  the GrContext.
51*c8dee2aaSAndroid Build Coastguard Worker  */
52*c8dee2aaSAndroid Build Coastguard Worker class GrProcessorTestData {
53*c8dee2aaSAndroid Build Coastguard Worker public:
54*c8dee2aaSAndroid Build Coastguard Worker     using ViewInfo = std::tuple<GrSurfaceProxyView, GrColorType, SkAlphaType>;
55*c8dee2aaSAndroid Build Coastguard Worker 
56*c8dee2aaSAndroid Build Coastguard Worker     GrProcessorTestData(SkRandom* random, GrRecordingContext* context, int maxTreeDepth,
57*c8dee2aaSAndroid Build Coastguard Worker                         int numViews, const ViewInfo views[]);
58*c8dee2aaSAndroid Build Coastguard Worker     GrProcessorTestData(SkRandom* random, GrRecordingContext* context, int maxTreeDepth,
59*c8dee2aaSAndroid Build Coastguard Worker                         int numViews, const ViewInfo views[],
60*c8dee2aaSAndroid Build Coastguard Worker                         std::unique_ptr<GrFragmentProcessor> inputFP);
61*c8dee2aaSAndroid Build Coastguard Worker     GrProcessorTestData(const GrProcessorTestData&) = delete;
62*c8dee2aaSAndroid Build Coastguard Worker     ~GrProcessorTestData();
63*c8dee2aaSAndroid Build Coastguard Worker 
context()64*c8dee2aaSAndroid Build Coastguard Worker     GrRecordingContext* context() { return fContext; }
65*c8dee2aaSAndroid Build Coastguard Worker     GrProxyProvider* proxyProvider();
66*c8dee2aaSAndroid Build Coastguard Worker     const GrCaps* caps();
allocator()67*c8dee2aaSAndroid Build Coastguard Worker     SkArenaAlloc* allocator() { return fArena.get(); }
68*c8dee2aaSAndroid Build Coastguard Worker     std::unique_ptr<GrFragmentProcessor> inputFP();
69*c8dee2aaSAndroid Build Coastguard Worker 
70*c8dee2aaSAndroid Build Coastguard Worker     ViewInfo randomView();
71*c8dee2aaSAndroid Build Coastguard Worker     ViewInfo randomAlphaOnlyView();
72*c8dee2aaSAndroid Build Coastguard Worker 
73*c8dee2aaSAndroid Build Coastguard Worker     SkRandom* fRandom;
74*c8dee2aaSAndroid Build Coastguard Worker     int fCurrentTreeDepth = 0;
75*c8dee2aaSAndroid Build Coastguard Worker     int fMaxTreeDepth = 1;
76*c8dee2aaSAndroid Build Coastguard Worker 
77*c8dee2aaSAndroid Build Coastguard Worker private:
78*c8dee2aaSAndroid Build Coastguard Worker     GrRecordingContext* fContext;
79*c8dee2aaSAndroid Build Coastguard Worker     skia_private::TArray<ViewInfo> fViews;
80*c8dee2aaSAndroid Build Coastguard Worker     std::unique_ptr<SkArenaAlloc> fArena;
81*c8dee2aaSAndroid Build Coastguard Worker     std::unique_ptr<GrFragmentProcessor> fInputFP;
82*c8dee2aaSAndroid Build Coastguard Worker };
83*c8dee2aaSAndroid Build Coastguard Worker 
84*c8dee2aaSAndroid Build Coastguard Worker template <class ProcessorSmartPtr>
85*c8dee2aaSAndroid Build Coastguard Worker class GrProcessorTestFactory : private SkNoncopyable {
86*c8dee2aaSAndroid Build Coastguard Worker public:
87*c8dee2aaSAndroid Build Coastguard Worker     using MakeProc = ProcessorSmartPtr (*)(GrProcessorTestData*);
88*c8dee2aaSAndroid Build Coastguard Worker 
89*c8dee2aaSAndroid Build Coastguard Worker     GrProcessorTestFactory(MakeProc makeProc, const char* name);
90*c8dee2aaSAndroid Build Coastguard Worker 
91*c8dee2aaSAndroid Build Coastguard Worker     /** Pick a random factory function and create a processor.  */
92*c8dee2aaSAndroid Build Coastguard Worker     static ProcessorSmartPtr Make(GrProcessorTestData* data);
93*c8dee2aaSAndroid Build Coastguard Worker 
94*c8dee2aaSAndroid Build Coastguard Worker     /** Use factory function at Index idx to create a processor. */
95*c8dee2aaSAndroid Build Coastguard Worker     static ProcessorSmartPtr MakeIdx(int idx, GrProcessorTestData* data);
96*c8dee2aaSAndroid Build Coastguard Worker 
97*c8dee2aaSAndroid Build Coastguard Worker     /** Number of registered factory functions */
98*c8dee2aaSAndroid Build Coastguard Worker     static int Count();
99*c8dee2aaSAndroid Build Coastguard Worker 
100*c8dee2aaSAndroid Build Coastguard Worker private:
101*c8dee2aaSAndroid Build Coastguard Worker     /** A test function which verifies the count of factories. */
102*c8dee2aaSAndroid Build Coastguard Worker     static void VerifyFactoryCount();
103*c8dee2aaSAndroid Build Coastguard Worker     static skia_private::TArray<GrProcessorTestFactory<ProcessorSmartPtr>*, true>* GetFactories();
104*c8dee2aaSAndroid Build Coastguard Worker 
105*c8dee2aaSAndroid Build Coastguard Worker     MakeProc fMakeProc;
106*c8dee2aaSAndroid Build Coastguard Worker     SkString fName;
107*c8dee2aaSAndroid Build Coastguard Worker };
108*c8dee2aaSAndroid Build Coastguard Worker 
109*c8dee2aaSAndroid Build Coastguard Worker using GrFragmentProcessorTestFactory = GrProcessorTestFactory<std::unique_ptr<GrFragmentProcessor>>;
110*c8dee2aaSAndroid Build Coastguard Worker using GrGeometryProcessorTestFactory = GrProcessorTestFactory<GrGeometryProcessor*>;
111*c8dee2aaSAndroid Build Coastguard Worker 
112*c8dee2aaSAndroid Build Coastguard Worker class GrXPFactoryTestFactory : private SkNoncopyable {
113*c8dee2aaSAndroid Build Coastguard Worker public:
114*c8dee2aaSAndroid Build Coastguard Worker     using GetFn = const GrXPFactory*(GrProcessorTestData*);
115*c8dee2aaSAndroid Build Coastguard Worker 
116*c8dee2aaSAndroid Build Coastguard Worker     GrXPFactoryTestFactory(GetFn* getProc);
117*c8dee2aaSAndroid Build Coastguard Worker 
118*c8dee2aaSAndroid Build Coastguard Worker     static const GrXPFactory* Get(GrProcessorTestData* data);
119*c8dee2aaSAndroid Build Coastguard Worker 
120*c8dee2aaSAndroid Build Coastguard Worker private:
121*c8dee2aaSAndroid Build Coastguard Worker     /** A test function which verifies the count of factories. */
122*c8dee2aaSAndroid Build Coastguard Worker     static void VerifyFactoryCount();
123*c8dee2aaSAndroid Build Coastguard Worker     static skia_private::TArray<GrXPFactoryTestFactory*, true>* GetFactories();
124*c8dee2aaSAndroid Build Coastguard Worker 
125*c8dee2aaSAndroid Build Coastguard Worker     GetFn* fGetProc;
126*c8dee2aaSAndroid Build Coastguard Worker };
127*c8dee2aaSAndroid Build Coastguard Worker 
128*c8dee2aaSAndroid Build Coastguard Worker #if SK_ALLOW_STATIC_GLOBAL_INITIALIZERS
129*c8dee2aaSAndroid Build Coastguard Worker 
130*c8dee2aaSAndroid Build Coastguard Worker /** GrProcessor subclasses should insert this macro in their declaration to be included in the
131*c8dee2aaSAndroid Build Coastguard Worker  *  program generation unit test.
132*c8dee2aaSAndroid Build Coastguard Worker  */
133*c8dee2aaSAndroid Build Coastguard Worker #define GR_DECLARE_GEOMETRY_PROCESSOR_TEST                                \
134*c8dee2aaSAndroid Build Coastguard Worker     [[maybe_unused]] static GrGeometryProcessorTestFactory* gTestFactory; \
135*c8dee2aaSAndroid Build Coastguard Worker     static GrGeometryProcessor* TestCreate(GrProcessorTestData*);
136*c8dee2aaSAndroid Build Coastguard Worker 
137*c8dee2aaSAndroid Build Coastguard Worker #define GR_DECLARE_FRAGMENT_PROCESSOR_TEST                                \
138*c8dee2aaSAndroid Build Coastguard Worker     [[maybe_unused]] static GrFragmentProcessorTestFactory* gTestFactory; \
139*c8dee2aaSAndroid Build Coastguard Worker     static std::unique_ptr<GrFragmentProcessor> TestCreate(GrProcessorTestData*);
140*c8dee2aaSAndroid Build Coastguard Worker 
141*c8dee2aaSAndroid Build Coastguard Worker #define GR_DECLARE_XP_FACTORY_TEST                                \
142*c8dee2aaSAndroid Build Coastguard Worker     [[maybe_unused]] static GrXPFactoryTestFactory* gTestFactory; \
143*c8dee2aaSAndroid Build Coastguard Worker     static const GrXPFactory* TestGet(GrProcessorTestData*);
144*c8dee2aaSAndroid Build Coastguard Worker 
145*c8dee2aaSAndroid Build Coastguard Worker /** GrProcessor subclasses should insert this macro in their implementation file. They must then
146*c8dee2aaSAndroid Build Coastguard Worker  *  also implement this static function:
147*c8dee2aaSAndroid Build Coastguard Worker  *      GrProcessor* TestCreate(GrProcessorTestData*);
148*c8dee2aaSAndroid Build Coastguard Worker  */
149*c8dee2aaSAndroid Build Coastguard Worker #define GR_DEFINE_FRAGMENT_PROCESSOR_TEST(Effect)          \
150*c8dee2aaSAndroid Build Coastguard Worker     GrFragmentProcessorTestFactory* Effect::gTestFactory = \
151*c8dee2aaSAndroid Build Coastguard Worker             new GrFragmentProcessorTestFactory(Effect::TestCreate, #Effect);
152*c8dee2aaSAndroid Build Coastguard Worker 
153*c8dee2aaSAndroid Build Coastguard Worker #define GR_DEFINE_GEOMETRY_PROCESSOR_TEST(Effect)          \
154*c8dee2aaSAndroid Build Coastguard Worker     GrGeometryProcessorTestFactory* Effect::gTestFactory = \
155*c8dee2aaSAndroid Build Coastguard Worker             new GrGeometryProcessorTestFactory(Effect::TestCreate, #Effect);
156*c8dee2aaSAndroid Build Coastguard Worker 
157*c8dee2aaSAndroid Build Coastguard Worker #define GR_DEFINE_XP_FACTORY_TEST(Factory) \
158*c8dee2aaSAndroid Build Coastguard Worker     GrXPFactoryTestFactory* Factory::gTestFactory = new GrXPFactoryTestFactory(Factory::TestGet);
159*c8dee2aaSAndroid Build Coastguard Worker 
160*c8dee2aaSAndroid Build Coastguard Worker #else // !SK_ALLOW_STATIC_GLOBAL_INITIALIZERS
161*c8dee2aaSAndroid Build Coastguard Worker 
162*c8dee2aaSAndroid Build Coastguard Worker // The unit test relies on static initializers. Just declare the TestCreate function so that
163*c8dee2aaSAndroid Build Coastguard Worker // its definitions will compile.
164*c8dee2aaSAndroid Build Coastguard Worker #define GR_DECLARE_FRAGMENT_PROCESSOR_TEST                                                         \
165*c8dee2aaSAndroid Build Coastguard Worker     static std::unique_ptr<GrFragmentProcessor> TestCreate(GrProcessorTestData*);
166*c8dee2aaSAndroid Build Coastguard Worker #define GR_DEFINE_FRAGMENT_PROCESSOR_TEST(X)
167*c8dee2aaSAndroid Build Coastguard Worker 
168*c8dee2aaSAndroid Build Coastguard Worker // The unit test relies on static initializers. Just declare the TestCreate function so that
169*c8dee2aaSAndroid Build Coastguard Worker // its definitions will compile.
170*c8dee2aaSAndroid Build Coastguard Worker #define GR_DECLARE_GEOMETRY_PROCESSOR_TEST                                                         \
171*c8dee2aaSAndroid Build Coastguard Worker     static GrGeometryProcessor* TestCreate(GrProcessorTestData*);
172*c8dee2aaSAndroid Build Coastguard Worker #define GR_DEFINE_GEOMETRY_PROCESSOR_TEST(X)
173*c8dee2aaSAndroid Build Coastguard Worker 
174*c8dee2aaSAndroid Build Coastguard Worker // The unit test relies on static initializers. Just declare the TestGet function so that
175*c8dee2aaSAndroid Build Coastguard Worker // its definitions will compile.
176*c8dee2aaSAndroid Build Coastguard Worker #define GR_DECLARE_XP_FACTORY_TEST                                                                 \
177*c8dee2aaSAndroid Build Coastguard Worker     const GrXPFactory* TestGet(GrProcessorTestData*);
178*c8dee2aaSAndroid Build Coastguard Worker #define GR_DEFINE_XP_FACTORY_TEST(X)
179*c8dee2aaSAndroid Build Coastguard Worker 
180*c8dee2aaSAndroid Build Coastguard Worker #endif  // !SK_ALLOW_STATIC_GLOBAL_INITIALIZERS
181*c8dee2aaSAndroid Build Coastguard Worker #else   // defined(GPU_TEST_UTILS)
182*c8dee2aaSAndroid Build Coastguard Worker     #define GR_DECLARE_GEOMETRY_PROCESSOR_TEST
183*c8dee2aaSAndroid Build Coastguard Worker     #define GR_DECLARE_FRAGMENT_PROCESSOR_TEST
184*c8dee2aaSAndroid Build Coastguard Worker     #define GR_DECLARE_XP_FACTORY_TEST
185*c8dee2aaSAndroid Build Coastguard Worker     #define GR_DEFINE_FRAGMENT_PROCESSOR_TEST(...)
186*c8dee2aaSAndroid Build Coastguard Worker     #define GR_DEFINE_GEOMETRY_PROCESSOR_TEST(...)
187*c8dee2aaSAndroid Build Coastguard Worker     #define GR_DEFINE_XP_FACTORY_TEST(...)
188*c8dee2aaSAndroid Build Coastguard Worker     #define GR_DECLARE_FRAGMENT_PROCESSOR_TEST
189*c8dee2aaSAndroid Build Coastguard Worker     #define GR_DEFINE_FRAGMENT_PROCESSOR_TEST(...)
190*c8dee2aaSAndroid Build Coastguard Worker     #define GR_DECLARE_GEOMETRY_PROCESSOR_TEST
191*c8dee2aaSAndroid Build Coastguard Worker     #define GR_DEFINE_GEOMETRY_PROCESSOR_TEST(...)
192*c8dee2aaSAndroid Build Coastguard Worker     #define GR_DECLARE_XP_FACTORY_TEST
193*c8dee2aaSAndroid Build Coastguard Worker     #define GR_DEFINE_XP_FACTORY_TEST(...)
194*c8dee2aaSAndroid Build Coastguard Worker #endif  // defined(GPU_TEST_UTILS)
195*c8dee2aaSAndroid Build Coastguard Worker #endif  // GrProcessorUnitTest_DEFINED
196