blob: a6e1ed23be3d468766389901438512dd1c7b30f1 [file] [log] [blame]
joshualittb0a8a372014-09-23 09:50:21 -07001/*
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 GrProcessorUnitTest_DEFINED
9#define GrProcessorUnitTest_DEFINED
10
Mike Kleinc0bd9f92019-04-23 12:05:21 -050011#include "include/core/SkTypes.h"
Hal Canary6f6961e2017-01-31 13:50:44 -050012
13#if GR_TEST_UTILS
14
Mike Kleinc0bd9f92019-04-23 12:05:21 -050015#include "include/private/SkTArray.h"
Robert Phillips7cd0bfe2019-11-20 16:08:10 -050016#include "src/core/SkArenaAlloc.h"
Mike Kleinc0bd9f92019-04-23 12:05:21 -050017#include "src/gpu/GrTestUtils.h"
Greg Danielf91aeb22019-06-18 09:58:02 -040018#include "src/gpu/GrTextureProxy.h"
joshualittb0a8a372014-09-23 09:50:21 -070019
Brian Salomon766098d2019-12-18 10:41:58 -050020#include <tuple>
21
joshualittb0a8a372014-09-23 09:50:21 -070022class SkMatrix;
bsalomon4b91f762015-05-19 09:29:46 -070023class GrCaps;
Robert Phillips1afd4cd2018-01-08 13:40:32 -050024class GrProxyProvider;
Brian Salomoneebe7352020-12-09 16:37:04 -050025class GrSurfaceDrawContext;
Brian Salomon766098d2019-12-18 10:41:58 -050026class GrProcessorTestData;
Mike Reedd4706732016-11-15 16:44:34 -050027class GrTexture;
Brian Salomona1633922017-01-09 11:46:10 -050028class GrXPFactory;
Brian Salomon1c053642017-07-24 10:16:19 -040029class GrGeometryProcessor;
joshualittb0a8a372014-09-23 09:50:21 -070030
31namespace GrProcessorUnitTest {
bsalomon506c8022015-09-14 13:16:26 -070032
joshualittb0a8a372014-09-23 09:50:21 -070033// Used to access the dummy textures in TestCreate procs.
34enum {
35 kSkiaPMTextureIdx = 0,
36 kAlphaTextureIdx = 1,
37};
38
bsalomon506c8022015-09-14 13:16:26 -070039/** This allows parent FPs to implement a test create with known leaf children in order to avoid
John Stiles87d0a2f2020-08-10 13:12:41 -040040 * creating an unbounded FP tree which may overflow various shader limits.
41 * MakeOptionalChildFP is the same as MakeChildFP, but can return null.
42 */
Brian Salomonaff329b2017-08-11 09:40:37 -040043std::unique_ptr<GrFragmentProcessor> MakeChildFP(GrProcessorTestData*);
John Stiles87d0a2f2020-08-10 13:12:41 -040044std::unique_ptr<GrFragmentProcessor> MakeOptionalChildFP(GrProcessorTestData*);
bsalomon506c8022015-09-14 13:16:26 -070045
John Stilesa6841be2020-08-06 14:11:56 -040046} // namespace GrProcessorUnitTest
joshualitt2e3b3e32014-12-09 13:31:14 -080047
John Stiles87d0a2f2020-08-10 13:12:41 -040048/** GrProcessorTestData is an argument struct to TestCreate functions
49 * fTextures are valid textures that can optionally be used to construct
50 * TextureSampler. The first texture has a RGBA8 format and the second has Alpha8 format for the
51 * specific backend API. TestCreate functions are also free to create additional textures using
52 * the GrContext.
joshualitt0067ff52015-07-08 14:26:19 -070053 */
Brian Salomon766098d2019-12-18 10:41:58 -050054class GrProcessorTestData {
55public:
Greg Daniel026a60c2020-02-12 10:53:51 -050056 using ViewInfo = std::tuple<GrSurfaceProxyView, GrColorType, SkAlphaType>;
John Stilese911ce52020-07-17 13:32:27 -040057
John Stiles87d0a2f2020-08-10 13:12:41 -040058 GrProcessorTestData(SkRandom* random, GrRecordingContext* context, int maxTreeDepth,
John Stiles278b4a62020-07-17 16:44:49 -040059 int numViews, const ViewInfo views[]);
John Stiles87d0a2f2020-08-10 13:12:41 -040060 GrProcessorTestData(SkRandom* random, GrRecordingContext* context, int maxTreeDepth,
John Stiles6609cb62020-07-17 14:52:12 -040061 int numViews, const ViewInfo views[],
John Stiles278b4a62020-07-17 16:44:49 -040062 std::unique_ptr<GrFragmentProcessor> inputFP);
John Stilese911ce52020-07-17 13:32:27 -040063 GrProcessorTestData(const GrProcessorTestData&) = delete;
64 ~GrProcessorTestData();
Robert Phillips757914d2017-01-25 15:48:30 -050065
Robert Phillips4e105e22020-07-16 09:18:50 -040066 GrRecordingContext* context() { return fContext; }
Robert Phillips1afd4cd2018-01-08 13:40:32 -050067 GrProxyProvider* proxyProvider();
Robert Phillips296b1cc2017-03-15 10:42:12 -040068 const GrCaps* caps();
Robert Phillips7cd0bfe2019-11-20 16:08:10 -050069 SkArenaAlloc* allocator() { return fArena.get(); }
John Stiles6609cb62020-07-17 14:52:12 -040070 std::unique_ptr<GrFragmentProcessor> inputFP();
Robert Phillips757914d2017-01-25 15:48:30 -050071
Greg Daniel026a60c2020-02-12 10:53:51 -050072 ViewInfo randomView();
73 ViewInfo randomAlphaOnlyView();
Brian Salomon766098d2019-12-18 10:41:58 -050074
75 SkRandom* fRandom;
John Stiles87d0a2f2020-08-10 13:12:41 -040076 int fCurrentTreeDepth = 0;
77 int fMaxTreeDepth = 1;
Brian Salomon766098d2019-12-18 10:41:58 -050078
Robert Phillips757914d2017-01-25 15:48:30 -050079private:
Robert Phillips4e105e22020-07-16 09:18:50 -040080 GrRecordingContext* fContext;
Greg Daniel026a60c2020-02-12 10:53:51 -050081 SkTArray<ViewInfo> fViews;
Robert Phillips7cd0bfe2019-11-20 16:08:10 -050082 std::unique_ptr<SkArenaAlloc> fArena;
John Stilese911ce52020-07-17 13:32:27 -040083 std::unique_ptr<GrFragmentProcessor> fInputFP;
joshualitt0067ff52015-07-08 14:26:19 -070084};
85
joshualittb0a8a372014-09-23 09:50:21 -070086class GrProcessor;
87class GrTexture;
88
Brian Salomon1c053642017-07-24 10:16:19 -040089template <class ProcessorSmartPtr>
90class GrProcessorTestFactory : private SkNoncopyable {
joshualittb0a8a372014-09-23 09:50:21 -070091public:
Brian Salomon1c053642017-07-24 10:16:19 -040092 using MakeProc = ProcessorSmartPtr (*)(GrProcessorTestData*);
joshualittb0a8a372014-09-23 09:50:21 -070093
John Stiles7c7a7e52020-07-24 17:03:04 -040094 GrProcessorTestFactory(MakeProc makeProc, const char* name);
joshualittb0a8a372014-09-23 09:50:21 -070095
bsalomonb5b60322015-09-14 12:26:33 -070096 /** Pick a random factory function and create a processor. */
John Stileseac4ad72020-07-17 15:46:20 -040097 static ProcessorSmartPtr Make(GrProcessorTestData* data);
bsalomonb5b60322015-09-14 12:26:33 -070098
99 /** Use factory function at Index idx to create a processor. */
John Stileseac4ad72020-07-17 15:46:20 -0400100 static ProcessorSmartPtr MakeIdx(int idx, GrProcessorTestData* data);
101
102 /** Number of registered factory functions */
103 static int Count();
joshualittb0a8a372014-09-23 09:50:21 -0700104
Brian Salomona1633922017-01-09 11:46:10 -0500105private:
John Stileseac4ad72020-07-17 15:46:20 -0400106 /** A test function which verifies the count of factories. */
joshualitt9e87fa72014-10-09 13:12:35 -0700107 static void VerifyFactoryCount();
John Stileseac4ad72020-07-17 15:46:20 -0400108 static SkTArray<GrProcessorTestFactory<ProcessorSmartPtr>*, true>* GetFactories();
joshualitt9e87fa72014-10-09 13:12:35 -0700109
bungeman06ca8ec2016-06-09 08:01:03 -0700110 MakeProc fMakeProc;
John Stiles7c7a7e52020-07-24 17:03:04 -0400111 SkString fName;
joshualittb0a8a372014-09-23 09:50:21 -0700112};
113
Brian Salomonaff329b2017-08-11 09:40:37 -0400114using GrFragmentProcessorTestFactory = GrProcessorTestFactory<std::unique_ptr<GrFragmentProcessor>>;
Robert Phillips7cd0bfe2019-11-20 16:08:10 -0500115using GrGeometryProcessorTestFactory = GrProcessorTestFactory<GrGeometryProcessor*>;
Brian Salomon1c053642017-07-24 10:16:19 -0400116
Brian Salomona1633922017-01-09 11:46:10 -0500117class GrXPFactoryTestFactory : private SkNoncopyable {
118public:
119 using GetFn = const GrXPFactory*(GrProcessorTestData*);
120
John Stileseac4ad72020-07-17 15:46:20 -0400121 GrXPFactoryTestFactory(GetFn* getProc);
Brian Salomona1633922017-01-09 11:46:10 -0500122
John Stileseac4ad72020-07-17 15:46:20 -0400123 static const GrXPFactory* Get(GrProcessorTestData* data);
Brian Salomona1633922017-01-09 11:46:10 -0500124
125private:
John Stileseac4ad72020-07-17 15:46:20 -0400126 /** A test function which verifies the count of factories. */
Brian Salomona1633922017-01-09 11:46:10 -0500127 static void VerifyFactoryCount();
John Stileseac4ad72020-07-17 15:46:20 -0400128 static SkTArray<GrXPFactoryTestFactory*, true>* GetFactories();
Brian Salomona1633922017-01-09 11:46:10 -0500129
130 GetFn* fGetProc;
Brian Salomona1633922017-01-09 11:46:10 -0500131};
132
Ben Wagnerf1344ac2019-05-10 15:01:53 -0400133#if SK_ALLOW_STATIC_GLOBAL_INITIALIZERS
134
joshualittb0a8a372014-09-23 09:50:21 -0700135/** GrProcessor subclasses should insert this macro in their declaration to be included in the
136 * program generation unit test.
137 */
Brian Salomon1c053642017-07-24 10:16:19 -0400138#define GR_DECLARE_GEOMETRY_PROCESSOR_TEST \
139 static GrGeometryProcessorTestFactory gTestFactory SK_UNUSED; \
Robert Phillips7cd0bfe2019-11-20 16:08:10 -0500140 static GrGeometryProcessor* TestCreate(GrProcessorTestData*);
joshualittb0a8a372014-09-23 09:50:21 -0700141
Brian Salomon1c053642017-07-24 10:16:19 -0400142#define GR_DECLARE_FRAGMENT_PROCESSOR_TEST \
143 static GrFragmentProcessorTestFactory gTestFactory SK_UNUSED; \
Brian Salomonaff329b2017-08-11 09:40:37 -0400144 static std::unique_ptr<GrFragmentProcessor> TestCreate(GrProcessorTestData*);
joshualittb0a8a372014-09-23 09:50:21 -0700145
egdanielc2304142014-12-11 13:15:13 -0800146#define GR_DECLARE_XP_FACTORY_TEST \
Brian Salomona1633922017-01-09 11:46:10 -0500147 static GrXPFactoryTestFactory gTestFactory SK_UNUSED; \
Brian Salomon0c26a9d2017-07-06 10:09:38 -0400148 static const GrXPFactory* TestGet(GrProcessorTestData*);
egdanielc2304142014-12-11 13:15:13 -0800149
joshualittb0a8a372014-09-23 09:50:21 -0700150/** GrProcessor subclasses should insert this macro in their implementation file. They must then
151 * also implement this static function:
joshualitt0067ff52015-07-08 14:26:19 -0700152 * GrProcessor* TestCreate(GrProcessorTestData*);
joshualittb0a8a372014-09-23 09:50:21 -0700153 */
Brian Salomon1c053642017-07-24 10:16:19 -0400154#define GR_DEFINE_FRAGMENT_PROCESSOR_TEST(Effect) \
John Stiles7c7a7e52020-07-24 17:03:04 -0400155 GrFragmentProcessorTestFactory Effect::gTestFactory(Effect::TestCreate, #Effect)
Brian Salomon003312a2017-01-09 16:00:33 +0000156
Brian Salomon1c053642017-07-24 10:16:19 -0400157#define GR_DEFINE_GEOMETRY_PROCESSOR_TEST(Effect) \
John Stiles7c7a7e52020-07-24 17:03:04 -0400158 GrGeometryProcessorTestFactory Effect::gTestFactory(Effect::TestCreate, #Effect)
Brian Salomona1633922017-01-09 11:46:10 -0500159
160#define GR_DEFINE_XP_FACTORY_TEST(Factory) \
161 GrXPFactoryTestFactory Factory::gTestFactory(Factory::TestGet)
joshualittb0a8a372014-09-23 09:50:21 -0700162
163#else // !SK_ALLOW_STATIC_GLOBAL_INITIALIZERS
164
165// The unit test relies on static initializers. Just declare the TestCreate function so that
166// its definitions will compile.
167#define GR_DECLARE_FRAGMENT_PROCESSOR_TEST \
Brian Salomonaff329b2017-08-11 09:40:37 -0400168 static std::unique_ptr<GrFragmentProcessor> TestCreate(GrProcessorTestData*);
joshualittb0a8a372014-09-23 09:50:21 -0700169#define GR_DEFINE_FRAGMENT_PROCESSOR_TEST(X)
170
171// The unit test relies on static initializers. Just declare the TestCreate function so that
172// its definitions will compile.
173#define GR_DECLARE_GEOMETRY_PROCESSOR_TEST \
Robert Phillips7cd0bfe2019-11-20 16:08:10 -0500174 static GrGeometryProcessor* TestCreate(GrProcessorTestData*);
joshualittb0a8a372014-09-23 09:50:21 -0700175#define GR_DEFINE_GEOMETRY_PROCESSOR_TEST(X)
176
Brian Salomona1633922017-01-09 11:46:10 -0500177// The unit test relies on static initializers. Just declare the TestGet function so that
178// its definitions will compile.
179#define GR_DECLARE_XP_FACTORY_TEST \
Brian Salomon0c26a9d2017-07-06 10:09:38 -0400180 const GrXPFactory* TestGet(GrProcessorTestData*);
Brian Salomona1633922017-01-09 11:46:10 -0500181#define GR_DEFINE_XP_FACTORY_TEST(X)
182
Hal Canary6f6961e2017-01-31 13:50:44 -0500183#endif // !SK_ALLOW_STATIC_GLOBAL_INITIALIZERS
184#else // GR_TEST_UTILS
185 #define GR_DECLARE_GEOMETRY_PROCESSOR_TEST
186 #define GR_DECLARE_FRAGMENT_PROCESSOR_TEST
187 #define GR_DECLARE_XP_FACTORY_TEST
188 #define GR_DEFINE_FRAGMENT_PROCESSOR_TEST(...)
189 #define GR_DEFINE_GEOMETRY_PROCESSOR_TEST(...)
190 #define GR_DEFINE_XP_FACTORY_TEST(...)
191 #define GR_DECLARE_FRAGMENT_PROCESSOR_TEST
192 #define GR_DEFINE_FRAGMENT_PROCESSOR_TEST(...)
193 #define GR_DECLARE_GEOMETRY_PROCESSOR_TEST
194 #define GR_DEFINE_GEOMETRY_PROCESSOR_TEST(...)
195 #define GR_DECLARE_XP_FACTORY_TEST
196 #define GR_DEFINE_XP_FACTORY_TEST(...)
197#endif // GR_TEST_UTILS
198#endif // GrProcessorUnitTest_DEFINED