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