1*c8dee2aaSAndroid Build Coastguard Worker /* 2*c8dee2aaSAndroid Build Coastguard Worker * Copyright 2011 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 #ifndef skiatest_Test_DEFINED 8*c8dee2aaSAndroid Build Coastguard Worker #define skiatest_Test_DEFINED 9*c8dee2aaSAndroid Build Coastguard Worker 10*c8dee2aaSAndroid Build Coastguard Worker #include "include/core/SkString.h" 11*c8dee2aaSAndroid Build Coastguard Worker #include "include/core/SkTypes.h" 12*c8dee2aaSAndroid Build Coastguard Worker #include "include/private/base/SkNoncopyable.h" 13*c8dee2aaSAndroid Build Coastguard Worker #include "include/private/base/SkTArray.h" 14*c8dee2aaSAndroid Build Coastguard Worker #include "src/core/SkTraceEvent.h" 15*c8dee2aaSAndroid Build Coastguard Worker #include "tests/CtsEnforcement.h" 16*c8dee2aaSAndroid Build Coastguard Worker #include "tests/TestType.h" 17*c8dee2aaSAndroid Build Coastguard Worker #include "tools/Registry.h" 18*c8dee2aaSAndroid Build Coastguard Worker #include "tools/timer/TimeUtils.h" 19*c8dee2aaSAndroid Build Coastguard Worker 20*c8dee2aaSAndroid Build Coastguard Worker #if defined(SK_GANESH) || defined(SK_GRAPHITE) 21*c8dee2aaSAndroid Build Coastguard Worker namespace skgpu { enum class ContextType; } 22*c8dee2aaSAndroid Build Coastguard Worker #endif 23*c8dee2aaSAndroid Build Coastguard Worker 24*c8dee2aaSAndroid Build Coastguard Worker #if defined(SK_GANESH) 25*c8dee2aaSAndroid Build Coastguard Worker #include "tools/gpu/GrContextFactory.h" // IWYU pragma: export (because it is used by a macro) 26*c8dee2aaSAndroid Build Coastguard Worker #else 27*c8dee2aaSAndroid Build Coastguard Worker namespace sk_gpu_test { class ContextInfo; } 28*c8dee2aaSAndroid Build Coastguard Worker #endif 29*c8dee2aaSAndroid Build Coastguard Worker 30*c8dee2aaSAndroid Build Coastguard Worker #include <atomic> 31*c8dee2aaSAndroid Build Coastguard Worker #include <cstdint> 32*c8dee2aaSAndroid Build Coastguard Worker #include <string> 33*c8dee2aaSAndroid Build Coastguard Worker 34*c8dee2aaSAndroid Build Coastguard Worker struct GrContextOptions; 35*c8dee2aaSAndroid Build Coastguard Worker 36*c8dee2aaSAndroid Build Coastguard Worker namespace skgpu::graphite { 37*c8dee2aaSAndroid Build Coastguard Worker class Context; 38*c8dee2aaSAndroid Build Coastguard Worker struct ContextOptions; 39*c8dee2aaSAndroid Build Coastguard Worker } 40*c8dee2aaSAndroid Build Coastguard Worker 41*c8dee2aaSAndroid Build Coastguard Worker namespace skiatest { 42*c8dee2aaSAndroid Build Coastguard Worker namespace graphite { 43*c8dee2aaSAndroid Build Coastguard Worker class GraphiteTestContext; 44*c8dee2aaSAndroid Build Coastguard Worker struct TestOptions; 45*c8dee2aaSAndroid Build Coastguard Worker } 46*c8dee2aaSAndroid Build Coastguard Worker 47*c8dee2aaSAndroid Build Coastguard Worker SkString GetTmpDir(); 48*c8dee2aaSAndroid Build Coastguard Worker 49*c8dee2aaSAndroid Build Coastguard Worker struct Failure { FailureFailure50*c8dee2aaSAndroid Build Coastguard Worker Failure(const char* f, int l, const char* c, const SkString& m) 51*c8dee2aaSAndroid Build Coastguard Worker : fileName(f), lineNo(l), condition(c), message(m) {} 52*c8dee2aaSAndroid Build Coastguard Worker const char* fileName; 53*c8dee2aaSAndroid Build Coastguard Worker int lineNo; 54*c8dee2aaSAndroid Build Coastguard Worker const char* condition; 55*c8dee2aaSAndroid Build Coastguard Worker SkString message; 56*c8dee2aaSAndroid Build Coastguard Worker SkString toString() const; 57*c8dee2aaSAndroid Build Coastguard Worker }; 58*c8dee2aaSAndroid Build Coastguard Worker 59*c8dee2aaSAndroid Build Coastguard Worker class Reporter : SkNoncopyable { 60*c8dee2aaSAndroid Build Coastguard Worker public: ~Reporter()61*c8dee2aaSAndroid Build Coastguard Worker virtual ~Reporter() {} 62*c8dee2aaSAndroid Build Coastguard Worker virtual void bumpTestCount(); 63*c8dee2aaSAndroid Build Coastguard Worker virtual void reportFailed(const skiatest::Failure&) = 0; 64*c8dee2aaSAndroid Build Coastguard Worker virtual bool allowExtendedTest() const; 65*c8dee2aaSAndroid Build Coastguard Worker virtual bool verbose() const; stats()66*c8dee2aaSAndroid Build Coastguard Worker virtual void* stats() const { return nullptr; } 67*c8dee2aaSAndroid Build Coastguard Worker 68*c8dee2aaSAndroid Build Coastguard Worker void reportFailedWithContext(const skiatest::Failure&); 69*c8dee2aaSAndroid Build Coastguard Worker 70*c8dee2aaSAndroid Build Coastguard Worker /** 71*c8dee2aaSAndroid Build Coastguard Worker * Show additional context (e.g. subtest name) on failure assertions. 72*c8dee2aaSAndroid Build Coastguard Worker */ push(const SkString & message)73*c8dee2aaSAndroid Build Coastguard Worker void push(const SkString& message) { 74*c8dee2aaSAndroid Build Coastguard Worker fContextStack.push_back(message); 75*c8dee2aaSAndroid Build Coastguard Worker } push(const std::string & message)76*c8dee2aaSAndroid Build Coastguard Worker void push(const std::string& message) { 77*c8dee2aaSAndroid Build Coastguard Worker fContextStack.push_back(SkString(message)); 78*c8dee2aaSAndroid Build Coastguard Worker } 79*c8dee2aaSAndroid Build Coastguard Worker 80*c8dee2aaSAndroid Build Coastguard Worker /** 81*c8dee2aaSAndroid Build Coastguard Worker * Remove additional context from failure assertions. 82*c8dee2aaSAndroid Build Coastguard Worker */ pop()83*c8dee2aaSAndroid Build Coastguard Worker void pop() { 84*c8dee2aaSAndroid Build Coastguard Worker fContextStack.pop_back(); 85*c8dee2aaSAndroid Build Coastguard Worker } 86*c8dee2aaSAndroid Build Coastguard Worker 87*c8dee2aaSAndroid Build Coastguard Worker private: 88*c8dee2aaSAndroid Build Coastguard Worker skia_private::TArray<SkString> fContextStack; 89*c8dee2aaSAndroid Build Coastguard Worker }; 90*c8dee2aaSAndroid Build Coastguard Worker 91*c8dee2aaSAndroid Build Coastguard Worker #define REPORT_FAILURE(reporter, cond, message) \ 92*c8dee2aaSAndroid Build Coastguard Worker reporter->reportFailedWithContext(skiatest::Failure(__FILE__, __LINE__, cond, message)) 93*c8dee2aaSAndroid Build Coastguard Worker 94*c8dee2aaSAndroid Build Coastguard Worker /** 95*c8dee2aaSAndroid Build Coastguard Worker * Use this stack-allocated object to push and then automatically pop the context 96*c8dee2aaSAndroid Build Coastguard Worker * (e.g. subtest name) for a test. 97*c8dee2aaSAndroid Build Coastguard Worker */ 98*c8dee2aaSAndroid Build Coastguard Worker class ReporterContext : SkNoncopyable { 99*c8dee2aaSAndroid Build Coastguard Worker public: ReporterContext(Reporter * reporter,const SkString & message)100*c8dee2aaSAndroid Build Coastguard Worker ReporterContext(Reporter* reporter, const SkString& message) : fReporter(reporter) { 101*c8dee2aaSAndroid Build Coastguard Worker fReporter->push(message); 102*c8dee2aaSAndroid Build Coastguard Worker } ReporterContext(Reporter * reporter,const std::string & message)103*c8dee2aaSAndroid Build Coastguard Worker ReporterContext(Reporter* reporter, const std::string& message) : fReporter(reporter) { 104*c8dee2aaSAndroid Build Coastguard Worker fReporter->push(message); 105*c8dee2aaSAndroid Build Coastguard Worker } ~ReporterContext()106*c8dee2aaSAndroid Build Coastguard Worker ~ReporterContext() { 107*c8dee2aaSAndroid Build Coastguard Worker fReporter->pop(); 108*c8dee2aaSAndroid Build Coastguard Worker } 109*c8dee2aaSAndroid Build Coastguard Worker 110*c8dee2aaSAndroid Build Coastguard Worker private: 111*c8dee2aaSAndroid Build Coastguard Worker Reporter* fReporter; 112*c8dee2aaSAndroid Build Coastguard Worker }; 113*c8dee2aaSAndroid Build Coastguard Worker 114*c8dee2aaSAndroid Build Coastguard Worker using CPUTestProc = void (*)(Reporter*); 115*c8dee2aaSAndroid Build Coastguard Worker using GaneshTestProc = void (*)(Reporter*, const GrContextOptions&); 116*c8dee2aaSAndroid Build Coastguard Worker using GaneshContextOptionsProc = void (*)(GrContextOptions*); 117*c8dee2aaSAndroid Build Coastguard Worker using GraphiteTestProc = void (*)(Reporter*, const graphite::TestOptions&); 118*c8dee2aaSAndroid Build Coastguard Worker using GraphiteContextOptionsProc = void (*)(skgpu::graphite::ContextOptions*); 119*c8dee2aaSAndroid Build Coastguard Worker 120*c8dee2aaSAndroid Build Coastguard Worker struct Test { MakeCPUTest121*c8dee2aaSAndroid Build Coastguard Worker static Test MakeCPU(const char* name, CPUTestProc proc) { 122*c8dee2aaSAndroid Build Coastguard Worker return Test{name, TestType::kCPU, CtsEnforcement::kNever, 123*c8dee2aaSAndroid Build Coastguard Worker proc, nullptr, nullptr, nullptr, nullptr}; 124*c8dee2aaSAndroid Build Coastguard Worker } 125*c8dee2aaSAndroid Build Coastguard Worker MakeCPUSerialTest126*c8dee2aaSAndroid Build Coastguard Worker static Test MakeCPUSerial(const char* name, CPUTestProc proc) { 127*c8dee2aaSAndroid Build Coastguard Worker return Test{name, TestType::kCPUSerial, CtsEnforcement::kNever, 128*c8dee2aaSAndroid Build Coastguard Worker proc, nullptr, nullptr, nullptr, nullptr}; 129*c8dee2aaSAndroid Build Coastguard Worker } 130*c8dee2aaSAndroid Build Coastguard Worker 131*c8dee2aaSAndroid Build Coastguard Worker static Test MakeGanesh(const char* name, 132*c8dee2aaSAndroid Build Coastguard Worker CtsEnforcement ctsEnforcement, 133*c8dee2aaSAndroid Build Coastguard Worker GaneshTestProc proc, 134*c8dee2aaSAndroid Build Coastguard Worker GaneshContextOptionsProc optionsProc = nullptr) { 135*c8dee2aaSAndroid Build Coastguard Worker return Test{name, TestType::kGanesh, ctsEnforcement, 136*c8dee2aaSAndroid Build Coastguard Worker nullptr, proc, nullptr, optionsProc, nullptr}; 137*c8dee2aaSAndroid Build Coastguard Worker } 138*c8dee2aaSAndroid Build Coastguard Worker 139*c8dee2aaSAndroid Build Coastguard Worker static Test MakeGraphite(const char* name, 140*c8dee2aaSAndroid Build Coastguard Worker CtsEnforcement ctsEnforcement, 141*c8dee2aaSAndroid Build Coastguard Worker GraphiteTestProc proc, 142*c8dee2aaSAndroid Build Coastguard Worker GraphiteContextOptionsProc optionsProc = nullptr) { 143*c8dee2aaSAndroid Build Coastguard Worker return Test{name, TestType::kGraphite, ctsEnforcement, 144*c8dee2aaSAndroid Build Coastguard Worker nullptr, nullptr, proc, nullptr, optionsProc}; 145*c8dee2aaSAndroid Build Coastguard Worker } 146*c8dee2aaSAndroid Build Coastguard Worker 147*c8dee2aaSAndroid Build Coastguard Worker const char* fName; 148*c8dee2aaSAndroid Build Coastguard Worker TestType fTestType; 149*c8dee2aaSAndroid Build Coastguard Worker CtsEnforcement fCTSEnforcement; 150*c8dee2aaSAndroid Build Coastguard Worker CPUTestProc fCPUProc = nullptr; 151*c8dee2aaSAndroid Build Coastguard Worker GaneshTestProc fGaneshProc = nullptr; 152*c8dee2aaSAndroid Build Coastguard Worker GraphiteTestProc fGraphiteProc = nullptr; 153*c8dee2aaSAndroid Build Coastguard Worker GaneshContextOptionsProc fGaneshContextOptionsProc = nullptr; 154*c8dee2aaSAndroid Build Coastguard Worker GraphiteContextOptionsProc fGraphiteContextOptionsProc = nullptr; 155*c8dee2aaSAndroid Build Coastguard Worker modifyGrContextOptionsTest156*c8dee2aaSAndroid Build Coastguard Worker void modifyGrContextOptions(GrContextOptions* options) { 157*c8dee2aaSAndroid Build Coastguard Worker if (fGaneshContextOptionsProc) { 158*c8dee2aaSAndroid Build Coastguard Worker (*fGaneshContextOptionsProc)(options); 159*c8dee2aaSAndroid Build Coastguard Worker } 160*c8dee2aaSAndroid Build Coastguard Worker } 161*c8dee2aaSAndroid Build Coastguard Worker modifyGraphiteContextOptionsTest162*c8dee2aaSAndroid Build Coastguard Worker void modifyGraphiteContextOptions(skgpu::graphite::ContextOptions* options) { 163*c8dee2aaSAndroid Build Coastguard Worker if (fGraphiteContextOptionsProc) { 164*c8dee2aaSAndroid Build Coastguard Worker (*fGraphiteContextOptionsProc)(options); 165*c8dee2aaSAndroid Build Coastguard Worker } 166*c8dee2aaSAndroid Build Coastguard Worker } 167*c8dee2aaSAndroid Build Coastguard Worker cpuTest168*c8dee2aaSAndroid Build Coastguard Worker void cpu(skiatest::Reporter* r) const { 169*c8dee2aaSAndroid Build Coastguard Worker SkASSERT(this->fTestType == TestType::kCPU || 170*c8dee2aaSAndroid Build Coastguard Worker this->fTestType == TestType::kCPUSerial); 171*c8dee2aaSAndroid Build Coastguard Worker TRACE_EVENT1("test_cpu", TRACE_FUNC, "name", this->fName/*these are static*/); 172*c8dee2aaSAndroid Build Coastguard Worker this->fCPUProc(r); 173*c8dee2aaSAndroid Build Coastguard Worker } 174*c8dee2aaSAndroid Build Coastguard Worker ganeshTest175*c8dee2aaSAndroid Build Coastguard Worker void ganesh(skiatest::Reporter* r, const GrContextOptions& options) const { 176*c8dee2aaSAndroid Build Coastguard Worker SkASSERT(this->fTestType == TestType::kGanesh); 177*c8dee2aaSAndroid Build Coastguard Worker TRACE_EVENT1("test_ganesh", TRACE_FUNC, "name", this->fName/*these are static*/); 178*c8dee2aaSAndroid Build Coastguard Worker this->fGaneshProc(r, options); 179*c8dee2aaSAndroid Build Coastguard Worker } 180*c8dee2aaSAndroid Build Coastguard Worker graphiteTest181*c8dee2aaSAndroid Build Coastguard Worker void graphite(skiatest::Reporter* r, const graphite::TestOptions& options) const { 182*c8dee2aaSAndroid Build Coastguard Worker SkASSERT(this->fTestType == TestType::kGraphite); 183*c8dee2aaSAndroid Build Coastguard Worker TRACE_EVENT1("test_graphite", TRACE_FUNC, "name", this->fName/*these are static*/); 184*c8dee2aaSAndroid Build Coastguard Worker this->fGraphiteProc(r, options); 185*c8dee2aaSAndroid Build Coastguard Worker } 186*c8dee2aaSAndroid Build Coastguard Worker 187*c8dee2aaSAndroid Build Coastguard Worker private: TestTest188*c8dee2aaSAndroid Build Coastguard Worker Test(const char* name, 189*c8dee2aaSAndroid Build Coastguard Worker TestType testType, 190*c8dee2aaSAndroid Build Coastguard Worker CtsEnforcement ctsEnforcement, 191*c8dee2aaSAndroid Build Coastguard Worker CPUTestProc cpuProc, 192*c8dee2aaSAndroid Build Coastguard Worker GaneshTestProc ganeshProc, 193*c8dee2aaSAndroid Build Coastguard Worker GraphiteTestProc graphiteProc, 194*c8dee2aaSAndroid Build Coastguard Worker GaneshContextOptionsProc ganeshOptionsProc, 195*c8dee2aaSAndroid Build Coastguard Worker GraphiteContextOptionsProc graphiteOptionsProc) 196*c8dee2aaSAndroid Build Coastguard Worker : fName(name) 197*c8dee2aaSAndroid Build Coastguard Worker , fTestType(testType) 198*c8dee2aaSAndroid Build Coastguard Worker , fCTSEnforcement(ctsEnforcement) 199*c8dee2aaSAndroid Build Coastguard Worker , fCPUProc(cpuProc) 200*c8dee2aaSAndroid Build Coastguard Worker , fGaneshProc(ganeshProc) 201*c8dee2aaSAndroid Build Coastguard Worker , fGraphiteProc(graphiteProc) 202*c8dee2aaSAndroid Build Coastguard Worker , fGaneshContextOptionsProc(ganeshOptionsProc) 203*c8dee2aaSAndroid Build Coastguard Worker , fGraphiteContextOptionsProc(graphiteOptionsProc) {} 204*c8dee2aaSAndroid Build Coastguard Worker }; 205*c8dee2aaSAndroid Build Coastguard Worker 206*c8dee2aaSAndroid Build Coastguard Worker using TestRegistry = sk_tools::Registry<Test>; 207*c8dee2aaSAndroid Build Coastguard Worker 208*c8dee2aaSAndroid Build Coastguard Worker #if defined(SK_GANESH) 209*c8dee2aaSAndroid Build Coastguard Worker using GpuContextType = skgpu::ContextType; 210*c8dee2aaSAndroid Build Coastguard Worker #else 211*c8dee2aaSAndroid Build Coastguard Worker using GpuContextType = nullptr_t; 212*c8dee2aaSAndroid Build Coastguard Worker #endif 213*c8dee2aaSAndroid Build Coastguard Worker 214*c8dee2aaSAndroid Build Coastguard Worker typedef void GrContextTestFn(Reporter*, const sk_gpu_test::ContextInfo&); 215*c8dee2aaSAndroid Build Coastguard Worker typedef bool ContextTypeFilterFn(GpuContextType); 216*c8dee2aaSAndroid Build Coastguard Worker 217*c8dee2aaSAndroid Build Coastguard Worker // We want to run the same test against potentially multiple Ganesh backends. Test runners should 218*c8dee2aaSAndroid Build Coastguard Worker // implement this function by calling the testFn with a fresh ContextInfo if that backend matches 219*c8dee2aaSAndroid Build Coastguard Worker // the provided filter. If filter is nullptr, then all compiled-in Ganesh backends should be used. 220*c8dee2aaSAndroid Build Coastguard Worker // The reporter and opts arguments are piped in from Test::run. 221*c8dee2aaSAndroid Build Coastguard Worker void RunWithGaneshTestContexts(GrContextTestFn* testFn, ContextTypeFilterFn* filter, 222*c8dee2aaSAndroid Build Coastguard Worker Reporter* reporter, const GrContextOptions& options); 223*c8dee2aaSAndroid Build Coastguard Worker 224*c8dee2aaSAndroid Build Coastguard Worker // These context filters should be implemented by test runners and return true if the backend was 225*c8dee2aaSAndroid Build Coastguard Worker // compiled in (i.e. is supported) and matches the criteria indicated by the name of the filter. 226*c8dee2aaSAndroid Build Coastguard Worker extern bool IsGLContextType(GpuContextType); 227*c8dee2aaSAndroid Build Coastguard Worker extern bool IsVulkanContextType(GpuContextType); 228*c8dee2aaSAndroid Build Coastguard Worker extern bool IsMetalContextType(GpuContextType); 229*c8dee2aaSAndroid Build Coastguard Worker extern bool IsDawnContextType(GpuContextType); 230*c8dee2aaSAndroid Build Coastguard Worker extern bool IsDirect3DContextType(GpuContextType); 231*c8dee2aaSAndroid Build Coastguard Worker extern bool IsMockContextType(GpuContextType); 232*c8dee2aaSAndroid Build Coastguard Worker 233*c8dee2aaSAndroid Build Coastguard Worker namespace graphite { 234*c8dee2aaSAndroid Build Coastguard Worker 235*c8dee2aaSAndroid Build Coastguard Worker using GraphiteTestFn = void(Reporter*, 236*c8dee2aaSAndroid Build Coastguard Worker skgpu::graphite::Context*, 237*c8dee2aaSAndroid Build Coastguard Worker skiatest::graphite::GraphiteTestContext*); 238*c8dee2aaSAndroid Build Coastguard Worker 239*c8dee2aaSAndroid Build Coastguard Worker void RunWithGraphiteTestContexts(GraphiteTestFn*, 240*c8dee2aaSAndroid Build Coastguard Worker ContextTypeFilterFn* filter, 241*c8dee2aaSAndroid Build Coastguard Worker Reporter*, 242*c8dee2aaSAndroid Build Coastguard Worker const TestOptions&); 243*c8dee2aaSAndroid Build Coastguard Worker 244*c8dee2aaSAndroid Build Coastguard Worker } // namespace graphite 245*c8dee2aaSAndroid Build Coastguard Worker 246*c8dee2aaSAndroid Build Coastguard Worker /** Timer provides wall-clock duration since its creation. */ 247*c8dee2aaSAndroid Build Coastguard Worker class Timer { 248*c8dee2aaSAndroid Build Coastguard Worker public: 249*c8dee2aaSAndroid Build Coastguard Worker /** Starts the timer. */ 250*c8dee2aaSAndroid Build Coastguard Worker Timer(); 251*c8dee2aaSAndroid Build Coastguard Worker 252*c8dee2aaSAndroid Build Coastguard Worker /** Nanoseconds since creation. */ 253*c8dee2aaSAndroid Build Coastguard Worker double elapsedNs() const; 254*c8dee2aaSAndroid Build Coastguard Worker 255*c8dee2aaSAndroid Build Coastguard Worker /** Milliseconds since creation. */ 256*c8dee2aaSAndroid Build Coastguard Worker double elapsedMs() const; 257*c8dee2aaSAndroid Build Coastguard Worker 258*c8dee2aaSAndroid Build Coastguard Worker /** Milliseconds since creation as an integer. 259*c8dee2aaSAndroid Build Coastguard Worker Behavior is undefined for durations longer than TimeUtils::MSecMax. 260*c8dee2aaSAndroid Build Coastguard Worker */ 261*c8dee2aaSAndroid Build Coastguard Worker TimeUtils::MSec elapsedMsInt() const; 262*c8dee2aaSAndroid Build Coastguard Worker private: 263*c8dee2aaSAndroid Build Coastguard Worker double fStartNanos; 264*c8dee2aaSAndroid Build Coastguard Worker }; 265*c8dee2aaSAndroid Build Coastguard Worker 266*c8dee2aaSAndroid Build Coastguard Worker } // namespace skiatest 267*c8dee2aaSAndroid Build Coastguard Worker 268*c8dee2aaSAndroid Build Coastguard Worker /* 269*c8dee2aaSAndroid Build Coastguard Worker Use the following macros to make use of the skiatest classes, e.g. 270*c8dee2aaSAndroid Build Coastguard Worker 271*c8dee2aaSAndroid Build Coastguard Worker #include "tests/Test.h" 272*c8dee2aaSAndroid Build Coastguard Worker 273*c8dee2aaSAndroid Build Coastguard Worker DEF_TEST(TestName, reporter) { 274*c8dee2aaSAndroid Build Coastguard Worker ... 275*c8dee2aaSAndroid Build Coastguard Worker REPORTER_ASSERT(reporter, x == 15); 276*c8dee2aaSAndroid Build Coastguard Worker ... 277*c8dee2aaSAndroid Build Coastguard Worker REPORTER_ASSERT(reporter, x == 15, "x should be 15"); 278*c8dee2aaSAndroid Build Coastguard Worker ... 279*c8dee2aaSAndroid Build Coastguard Worker if (x != 15) { 280*c8dee2aaSAndroid Build Coastguard Worker ERRORF(reporter, "x should be 15, but is %d", x); 281*c8dee2aaSAndroid Build Coastguard Worker return; 282*c8dee2aaSAndroid Build Coastguard Worker } 283*c8dee2aaSAndroid Build Coastguard Worker ... 284*c8dee2aaSAndroid Build Coastguard Worker } 285*c8dee2aaSAndroid Build Coastguard Worker */ 286*c8dee2aaSAndroid Build Coastguard Worker 287*c8dee2aaSAndroid Build Coastguard Worker #define REPORTER_ASSERT(r, cond, ...) \ 288*c8dee2aaSAndroid Build Coastguard Worker do { \ 289*c8dee2aaSAndroid Build Coastguard Worker if (!(cond)) { \ 290*c8dee2aaSAndroid Build Coastguard Worker REPORT_FAILURE(r, #cond, SkStringPrintf(__VA_ARGS__)); \ 291*c8dee2aaSAndroid Build Coastguard Worker } \ 292*c8dee2aaSAndroid Build Coastguard Worker } while (0) 293*c8dee2aaSAndroid Build Coastguard Worker 294*c8dee2aaSAndroid Build Coastguard Worker #define ERRORF(r, ...) \ 295*c8dee2aaSAndroid Build Coastguard Worker do { \ 296*c8dee2aaSAndroid Build Coastguard Worker REPORT_FAILURE(r, "", SkStringPrintf(__VA_ARGS__)); \ 297*c8dee2aaSAndroid Build Coastguard Worker } while (0) 298*c8dee2aaSAndroid Build Coastguard Worker 299*c8dee2aaSAndroid Build Coastguard Worker #define INFOF(REPORTER, ...) \ 300*c8dee2aaSAndroid Build Coastguard Worker do { \ 301*c8dee2aaSAndroid Build Coastguard Worker if ((REPORTER)->verbose()) { \ 302*c8dee2aaSAndroid Build Coastguard Worker SkDebugf(__VA_ARGS__); \ 303*c8dee2aaSAndroid Build Coastguard Worker } \ 304*c8dee2aaSAndroid Build Coastguard Worker } while (0) 305*c8dee2aaSAndroid Build Coastguard Worker 306*c8dee2aaSAndroid Build Coastguard Worker using skiatest::Test; 307*c8dee2aaSAndroid Build Coastguard Worker 308*c8dee2aaSAndroid Build Coastguard Worker #define DEF_CONDITIONAL_TEST(name, reporter, condition) \ 309*c8dee2aaSAndroid Build Coastguard Worker static void test_##name(skiatest::Reporter*); \ 310*c8dee2aaSAndroid Build Coastguard Worker skiatest::TestRegistry name##TestRegistry(Test::MakeCPU(#name, test_##name), condition); \ 311*c8dee2aaSAndroid Build Coastguard Worker void test_##name(skiatest::Reporter* reporter) 312*c8dee2aaSAndroid Build Coastguard Worker 313*c8dee2aaSAndroid Build Coastguard Worker #define DEF_TEST(name, reporter) DEF_CONDITIONAL_TEST(name, reporter, true) 314*c8dee2aaSAndroid Build Coastguard Worker 315*c8dee2aaSAndroid Build Coastguard Worker #define DEF_TEST_DISABLED(name, reporter) DEF_CONDITIONAL_TEST(name, reporter, false) 316*c8dee2aaSAndroid Build Coastguard Worker 317*c8dee2aaSAndroid Build Coastguard Worker #ifdef SK_BUILD_FOR_UNIX 318*c8dee2aaSAndroid Build Coastguard Worker #define UNIX_ONLY_TEST DEF_TEST 319*c8dee2aaSAndroid Build Coastguard Worker #else 320*c8dee2aaSAndroid Build Coastguard Worker #define UNIX_ONLY_TEST DEF_TEST_DISABLED 321*c8dee2aaSAndroid Build Coastguard Worker #endif 322*c8dee2aaSAndroid Build Coastguard Worker 323*c8dee2aaSAndroid Build Coastguard Worker #define DEF_SERIAL_TEST(name, reporter) \ 324*c8dee2aaSAndroid Build Coastguard Worker static void test_##name(skiatest::Reporter*); \ 325*c8dee2aaSAndroid Build Coastguard Worker skiatest::TestRegistry name##TestRegistry(Test::MakeCPUSerial(#name, test_##name)); \ 326*c8dee2aaSAndroid Build Coastguard Worker void test_##name(skiatest::Reporter* reporter) 327*c8dee2aaSAndroid Build Coastguard Worker 328*c8dee2aaSAndroid Build Coastguard Worker #define DEF_GRAPHITE_TEST(name, reporter, ctsEnforcement) \ 329*c8dee2aaSAndroid Build Coastguard Worker static void test_##name(skiatest::Reporter*); \ 330*c8dee2aaSAndroid Build Coastguard Worker static void test_graphite_##name(skiatest::Reporter* reporter, \ 331*c8dee2aaSAndroid Build Coastguard Worker const skiatest::graphite::TestOptions&) { \ 332*c8dee2aaSAndroid Build Coastguard Worker test_##name(reporter); \ 333*c8dee2aaSAndroid Build Coastguard Worker } \ 334*c8dee2aaSAndroid Build Coastguard Worker skiatest::TestRegistry name##TestRegistry(Test::MakeGraphite(#name, ctsEnforcement, \ 335*c8dee2aaSAndroid Build Coastguard Worker test_graphite_##name)); \ 336*c8dee2aaSAndroid Build Coastguard Worker void test_##name(skiatest::Reporter* reporter) 337*c8dee2aaSAndroid Build Coastguard Worker 338*c8dee2aaSAndroid Build Coastguard Worker #define DEF_CONDITIONAL_GRAPHITE_TEST_FOR_CONTEXTS( \ 339*c8dee2aaSAndroid Build Coastguard Worker name, context_filter, reporter, graphite_ctx, test_ctx, opt_filter, cond, ctsEnforcement) \ 340*c8dee2aaSAndroid Build Coastguard Worker static void test_##name(skiatest::Reporter*, skgpu::graphite::Context*, \ 341*c8dee2aaSAndroid Build Coastguard Worker skiatest::graphite::GraphiteTestContext*); \ 342*c8dee2aaSAndroid Build Coastguard Worker static void test_graphite_contexts_##name(skiatest::Reporter* _reporter, \ 343*c8dee2aaSAndroid Build Coastguard Worker const skiatest::graphite::TestOptions& options) { \ 344*c8dee2aaSAndroid Build Coastguard Worker skiatest::graphite::RunWithGraphiteTestContexts(test_##name, context_filter, \ 345*c8dee2aaSAndroid Build Coastguard Worker _reporter, options); \ 346*c8dee2aaSAndroid Build Coastguard Worker } \ 347*c8dee2aaSAndroid Build Coastguard Worker skiatest::TestRegistry name##TestRegistry( \ 348*c8dee2aaSAndroid Build Coastguard Worker Test::MakeGraphite(#name, ctsEnforcement, test_graphite_contexts_##name, opt_filter), \ 349*c8dee2aaSAndroid Build Coastguard Worker cond); \ 350*c8dee2aaSAndroid Build Coastguard Worker void test_##name(skiatest::Reporter* reporter, skgpu::graphite::Context* graphite_ctx, \ 351*c8dee2aaSAndroid Build Coastguard Worker skiatest::graphite::GraphiteTestContext* test_ctx) 352*c8dee2aaSAndroid Build Coastguard Worker 353*c8dee2aaSAndroid Build Coastguard Worker #define DEF_CONDITIONAL_GRAPHITE_TEST_FOR_ALL_CONTEXTS(name, reporter, graphite_ctx, \ 354*c8dee2aaSAndroid Build Coastguard Worker test_ctx, cond, ctsEnforcement) \ 355*c8dee2aaSAndroid Build Coastguard Worker DEF_CONDITIONAL_GRAPHITE_TEST_FOR_CONTEXTS(name, nullptr, reporter, graphite_ctx, test_ctx, \ 356*c8dee2aaSAndroid Build Coastguard Worker nullptr, cond, ctsEnforcement) 357*c8dee2aaSAndroid Build Coastguard Worker 358*c8dee2aaSAndroid Build Coastguard Worker #define DEF_CONDITIONAL_GRAPHITE_TEST_FOR_RENDERING_CONTEXTS( \ 359*c8dee2aaSAndroid Build Coastguard Worker name, reporter, graphite_context, test_context, cond, ctsEnforcement) \ 360*c8dee2aaSAndroid Build Coastguard Worker DEF_CONDITIONAL_GRAPHITE_TEST_FOR_CONTEXTS(name, \ 361*c8dee2aaSAndroid Build Coastguard Worker skgpu::IsRenderingContext, \ 362*c8dee2aaSAndroid Build Coastguard Worker reporter, \ 363*c8dee2aaSAndroid Build Coastguard Worker graphite_context, \ 364*c8dee2aaSAndroid Build Coastguard Worker test_context, \ 365*c8dee2aaSAndroid Build Coastguard Worker nullptr, \ 366*c8dee2aaSAndroid Build Coastguard Worker cond, \ 367*c8dee2aaSAndroid Build Coastguard Worker ctsEnforcement) 368*c8dee2aaSAndroid Build Coastguard Worker 369*c8dee2aaSAndroid Build Coastguard Worker #define DEF_GRAPHITE_TEST_FOR_CONTEXTS(name, context_filter, reporter, graphite_ctx, \ 370*c8dee2aaSAndroid Build Coastguard Worker test_ctx, ctsEnforcement) \ 371*c8dee2aaSAndroid Build Coastguard Worker DEF_CONDITIONAL_GRAPHITE_TEST_FOR_CONTEXTS(name, context_filter, reporter, graphite_ctx, \ 372*c8dee2aaSAndroid Build Coastguard Worker test_ctx, nullptr, true, ctsEnforcement) 373*c8dee2aaSAndroid Build Coastguard Worker 374*c8dee2aaSAndroid Build Coastguard Worker #define DEF_GRAPHITE_TEST_FOR_ALL_CONTEXTS(name, reporter, graphite_ctx, ctsEnforcement) \ 375*c8dee2aaSAndroid Build Coastguard Worker DEF_CONDITIONAL_GRAPHITE_TEST_FOR_ALL_CONTEXTS(name, reporter, graphite_ctx, \ 376*c8dee2aaSAndroid Build Coastguard Worker /*anonymous test_ctx*/, true, ctsEnforcement) 377*c8dee2aaSAndroid Build Coastguard Worker 378*c8dee2aaSAndroid Build Coastguard Worker #define DEF_GRAPHITE_TEST_FOR_RENDERING_CONTEXTS(name, reporter, graphite_context, ctsEnforcement) \ 379*c8dee2aaSAndroid Build Coastguard Worker DEF_CONDITIONAL_GRAPHITE_TEST_FOR_RENDERING_CONTEXTS( \ 380*c8dee2aaSAndroid Build Coastguard Worker name, reporter, graphite_context, /*anonymous test_ctx*/, true, ctsEnforcement) 381*c8dee2aaSAndroid Build Coastguard Worker 382*c8dee2aaSAndroid Build Coastguard Worker #define DEF_GRAPHITE_TEST_FOR_VULKAN_CONTEXT(name, reporter, graphite_context, ctsEnforcement) \ 383*c8dee2aaSAndroid Build Coastguard Worker DEF_GRAPHITE_TEST_FOR_CONTEXTS(name, skiatest::IsVulkanContextType, reporter, \ 384*c8dee2aaSAndroid Build Coastguard Worker graphite_context, /*anonymous test_ctx*/, ctsEnforcement) 385*c8dee2aaSAndroid Build Coastguard Worker 386*c8dee2aaSAndroid Build Coastguard Worker #define DEF_GRAPHITE_TEST_FOR_METAL_CONTEXT(name, reporter, graphite_context, test_context) \ 387*c8dee2aaSAndroid Build Coastguard Worker DEF_GRAPHITE_TEST_FOR_CONTEXTS(name, skiatest::IsMetalContextType, reporter, graphite_context, \ 388*c8dee2aaSAndroid Build Coastguard Worker test_context, CtsEnforcement::kNever) 389*c8dee2aaSAndroid Build Coastguard Worker 390*c8dee2aaSAndroid Build Coastguard Worker #define DEF_GRAPHITE_TEST_FOR_DAWN_CONTEXT(name, reporter, graphite_context, test_context) \ 391*c8dee2aaSAndroid Build Coastguard Worker DEF_GRAPHITE_TEST_FOR_CONTEXTS(name, skiatest::IsDawnContextType, reporter, graphite_context, \ 392*c8dee2aaSAndroid Build Coastguard Worker test_context, CtsEnforcement::kNever) 393*c8dee2aaSAndroid Build Coastguard Worker 394*c8dee2aaSAndroid Build Coastguard Worker #define DEF_GANESH_TEST(name, reporter, options, ctsEnforcement) \ 395*c8dee2aaSAndroid Build Coastguard Worker static void test_##name(skiatest::Reporter*, const GrContextOptions&); \ 396*c8dee2aaSAndroid Build Coastguard Worker skiatest::TestRegistry name##TestRegistry( \ 397*c8dee2aaSAndroid Build Coastguard Worker Test::MakeGanesh(#name, ctsEnforcement, test_##name, nullptr)); \ 398*c8dee2aaSAndroid Build Coastguard Worker void test_##name(skiatest::Reporter* reporter, const GrContextOptions& options) 399*c8dee2aaSAndroid Build Coastguard Worker 400*c8dee2aaSAndroid Build Coastguard Worker #define DEF_CONDITIONAL_GANESH_TEST_FOR_CONTEXTS( \ 401*c8dee2aaSAndroid Build Coastguard Worker name, context_filter, reporter, context_info, options_filter, condition, ctsEnforcement) \ 402*c8dee2aaSAndroid Build Coastguard Worker static void test_##name(skiatest::Reporter*, const sk_gpu_test::ContextInfo&); \ 403*c8dee2aaSAndroid Build Coastguard Worker static void test_gpu_contexts_##name(skiatest::Reporter* reporter, \ 404*c8dee2aaSAndroid Build Coastguard Worker const GrContextOptions& options) { \ 405*c8dee2aaSAndroid Build Coastguard Worker skiatest::RunWithGaneshTestContexts(test_##name, context_filter, reporter, options); \ 406*c8dee2aaSAndroid Build Coastguard Worker } \ 407*c8dee2aaSAndroid Build Coastguard Worker skiatest::TestRegistry name##TestRegistry( \ 408*c8dee2aaSAndroid Build Coastguard Worker Test::MakeGanesh(#name, ctsEnforcement, test_gpu_contexts_##name, options_filter), \ 409*c8dee2aaSAndroid Build Coastguard Worker condition); \ 410*c8dee2aaSAndroid Build Coastguard Worker void test_##name(skiatest::Reporter* reporter, const sk_gpu_test::ContextInfo& context_info) 411*c8dee2aaSAndroid Build Coastguard Worker 412*c8dee2aaSAndroid Build Coastguard Worker #define DEF_CONDITIONAL_GANESH_TEST_FOR_ALL_CONTEXTS( \ 413*c8dee2aaSAndroid Build Coastguard Worker name, reporter, context_info, condition, ctsEnforcement) \ 414*c8dee2aaSAndroid Build Coastguard Worker DEF_CONDITIONAL_GANESH_TEST_FOR_CONTEXTS( \ 415*c8dee2aaSAndroid Build Coastguard Worker name, nullptr, reporter, context_info, nullptr, condition, ctsEnforcement) 416*c8dee2aaSAndroid Build Coastguard Worker 417*c8dee2aaSAndroid Build Coastguard Worker #define DEF_CONDITIONAL_GANESH_TEST_FOR_RENDERING_CONTEXTS( \ 418*c8dee2aaSAndroid Build Coastguard Worker name, reporter, context_info, condition, ctsEnforcement) \ 419*c8dee2aaSAndroid Build Coastguard Worker DEF_CONDITIONAL_GANESH_TEST_FOR_CONTEXTS(name, \ 420*c8dee2aaSAndroid Build Coastguard Worker skgpu::IsRenderingContext, \ 421*c8dee2aaSAndroid Build Coastguard Worker reporter, \ 422*c8dee2aaSAndroid Build Coastguard Worker context_info, \ 423*c8dee2aaSAndroid Build Coastguard Worker nullptr, \ 424*c8dee2aaSAndroid Build Coastguard Worker condition, \ 425*c8dee2aaSAndroid Build Coastguard Worker ctsEnforcement) 426*c8dee2aaSAndroid Build Coastguard Worker 427*c8dee2aaSAndroid Build Coastguard Worker #define DEF_GANESH_TEST_FOR_CONTEXTS( \ 428*c8dee2aaSAndroid Build Coastguard Worker name, context_filter, reporter, context_info, options_filter, ctsEnforcement) \ 429*c8dee2aaSAndroid Build Coastguard Worker DEF_CONDITIONAL_GANESH_TEST_FOR_CONTEXTS( \ 430*c8dee2aaSAndroid Build Coastguard Worker name, context_filter, reporter, context_info, options_filter, true, ctsEnforcement) 431*c8dee2aaSAndroid Build Coastguard Worker 432*c8dee2aaSAndroid Build Coastguard Worker #define DEF_GANESH_TEST_FOR_ALL_CONTEXTS(name, reporter, context_info, ctsEnforcement) \ 433*c8dee2aaSAndroid Build Coastguard Worker DEF_GANESH_TEST_FOR_CONTEXTS(name, nullptr, reporter, context_info, nullptr, ctsEnforcement) 434*c8dee2aaSAndroid Build Coastguard Worker 435*c8dee2aaSAndroid Build Coastguard Worker #define DEF_GANESH_TEST_FOR_RENDERING_CONTEXTS(name, reporter, context_info, ctsEnforcement) \ 436*c8dee2aaSAndroid Build Coastguard Worker DEF_GANESH_TEST_FOR_CONTEXTS( \ 437*c8dee2aaSAndroid Build Coastguard Worker name, skgpu::IsRenderingContext, reporter, context_info, nullptr, ctsEnforcement) 438*c8dee2aaSAndroid Build Coastguard Worker 439*c8dee2aaSAndroid Build Coastguard Worker #define DEF_GANESH_TEST_FOR_ALL_GL_CONTEXTS(name, reporter, context_info, ctsEnforcement) \ 440*c8dee2aaSAndroid Build Coastguard Worker DEF_GANESH_TEST_FOR_CONTEXTS( \ 441*c8dee2aaSAndroid Build Coastguard Worker name, skiatest::IsGLContextType, reporter, context_info, nullptr, ctsEnforcement) 442*c8dee2aaSAndroid Build Coastguard Worker 443*c8dee2aaSAndroid Build Coastguard Worker #define DEF_GANESH_TEST_FOR_GL_CONTEXT(name, reporter, context_info, ctsEnforcement) \ 444*c8dee2aaSAndroid Build Coastguard Worker DEF_GANESH_TEST_FOR_CONTEXTS(name, \ 445*c8dee2aaSAndroid Build Coastguard Worker &skiatest::IsGLContextType, \ 446*c8dee2aaSAndroid Build Coastguard Worker reporter, \ 447*c8dee2aaSAndroid Build Coastguard Worker context_info, \ 448*c8dee2aaSAndroid Build Coastguard Worker nullptr, \ 449*c8dee2aaSAndroid Build Coastguard Worker ctsEnforcement) 450*c8dee2aaSAndroid Build Coastguard Worker 451*c8dee2aaSAndroid Build Coastguard Worker #define DEF_GANESH_TEST_FOR_MOCK_CONTEXT(name, reporter, context_info) \ 452*c8dee2aaSAndroid Build Coastguard Worker DEF_GANESH_TEST_FOR_CONTEXTS(name, \ 453*c8dee2aaSAndroid Build Coastguard Worker &skiatest::IsMockContextType, \ 454*c8dee2aaSAndroid Build Coastguard Worker reporter, \ 455*c8dee2aaSAndroid Build Coastguard Worker context_info, \ 456*c8dee2aaSAndroid Build Coastguard Worker nullptr, \ 457*c8dee2aaSAndroid Build Coastguard Worker CtsEnforcement::kNever) 458*c8dee2aaSAndroid Build Coastguard Worker 459*c8dee2aaSAndroid Build Coastguard Worker #define DEF_GANESH_TEST_FOR_VULKAN_CONTEXT(name, reporter, context_info, ctsEnforcement) \ 460*c8dee2aaSAndroid Build Coastguard Worker DEF_GANESH_TEST_FOR_CONTEXTS( \ 461*c8dee2aaSAndroid Build Coastguard Worker name, &skiatest::IsVulkanContextType, reporter, context_info, nullptr, ctsEnforcement) 462*c8dee2aaSAndroid Build Coastguard Worker 463*c8dee2aaSAndroid Build Coastguard Worker #define DEF_GANESH_TEST_FOR_METAL_CONTEXT(name, reporter, context_info) \ 464*c8dee2aaSAndroid Build Coastguard Worker DEF_GANESH_TEST_FOR_CONTEXTS(name, \ 465*c8dee2aaSAndroid Build Coastguard Worker &skiatest::IsMetalContextType, \ 466*c8dee2aaSAndroid Build Coastguard Worker reporter, \ 467*c8dee2aaSAndroid Build Coastguard Worker context_info, \ 468*c8dee2aaSAndroid Build Coastguard Worker nullptr, \ 469*c8dee2aaSAndroid Build Coastguard Worker CtsEnforcement::kNever) 470*c8dee2aaSAndroid Build Coastguard Worker #define DEF_GANESH_TEST_FOR_D3D_CONTEXT(name, reporter, context_info) \ 471*c8dee2aaSAndroid Build Coastguard Worker DEF_GANESH_TEST_FOR_CONTEXTS(name, \ 472*c8dee2aaSAndroid Build Coastguard Worker &skiatest::IsDirect3DContextType, \ 473*c8dee2aaSAndroid Build Coastguard Worker reporter, \ 474*c8dee2aaSAndroid Build Coastguard Worker context_info, \ 475*c8dee2aaSAndroid Build Coastguard Worker nullptr, \ 476*c8dee2aaSAndroid Build Coastguard Worker CtsEnforcement::kNever) 477*c8dee2aaSAndroid Build Coastguard Worker 478*c8dee2aaSAndroid Build Coastguard Worker #define DEF_GANESH_TEST_FOR_DAWN_CONTEXT(name, reporter, context_info) \ 479*c8dee2aaSAndroid Build Coastguard Worker DEF_GANESH_TEST_FOR_CONTEXTS(name, \ 480*c8dee2aaSAndroid Build Coastguard Worker &skiatest::IsDawnContextType, \ 481*c8dee2aaSAndroid Build Coastguard Worker reporter, \ 482*c8dee2aaSAndroid Build Coastguard Worker context_info, \ 483*c8dee2aaSAndroid Build Coastguard Worker nullptr, \ 484*c8dee2aaSAndroid Build Coastguard Worker CtsEnforcement::kNever) 485*c8dee2aaSAndroid Build Coastguard Worker 486*c8dee2aaSAndroid Build Coastguard Worker #define REQUIRE_PDF_DOCUMENT(TEST_NAME, REPORTER) \ 487*c8dee2aaSAndroid Build Coastguard Worker do { \ 488*c8dee2aaSAndroid Build Coastguard Worker SkNullWStream testStream; \ 489*c8dee2aaSAndroid Build Coastguard Worker auto testDoc = SkPDF::MakeDocument(&testStream); \ 490*c8dee2aaSAndroid Build Coastguard Worker if (!testDoc) { \ 491*c8dee2aaSAndroid Build Coastguard Worker INFOF(REPORTER, "PDF disabled; %s test skipped.", #TEST_NAME); \ 492*c8dee2aaSAndroid Build Coastguard Worker return; \ 493*c8dee2aaSAndroid Build Coastguard Worker } \ 494*c8dee2aaSAndroid Build Coastguard Worker } while (false) 495*c8dee2aaSAndroid Build Coastguard Worker 496*c8dee2aaSAndroid Build Coastguard Worker #endif 497