1fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot/*
2fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot * Copyright 2011 Google Inc.
3fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot *
4fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot * Use of this source code is governed by a BSD-style license that can be
5fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot * found in the LICENSE file.
6fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot */
7fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot#ifndef skiatest_Test_DEFINED
8fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot#define skiatest_Test_DEFINED
9fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot
10fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot#include "../tools/Registry.h"
11fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot#include "SkClipOpPriv.h"
12fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot#include "SkString.h"
13fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot#include "SkTraceEvent.h"
14fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot#include "SkTypes.h"
15fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot
16fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot#if SK_SUPPORT_GPU
17fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot#include "GrContextFactory.h"
18fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot#else
19fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robotnamespace sk_gpu_test {
20fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robotclass GrContextFactory;
21fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robotclass ContextInfo;
22fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robotclass GLTestContext;
23fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot}  // namespace sk_gpu_test
24fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robotclass GrContext;
25fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robotstruct GrContextOptions;
26fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot#endif
27fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot
28fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robotnamespace skiatest {
29fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot
30fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team RobotSkString GetTmpDir();
31fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot
32fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robotstruct Failure {
33fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    Failure(const char* f, int l, const char* c, const SkString& m)
34fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot        : fileName(f), lineNo(l), condition(c), message(m) {}
35fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    const char* fileName;
36fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    int lineNo;
37fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    const char* condition;
38fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    SkString message;
39fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    SkString toString() const;
40fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot};
41fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot
42fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robotclass Reporter : SkNoncopyable {
43fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robotpublic:
44fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    virtual ~Reporter() {}
45fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    virtual void bumpTestCount();
46fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    virtual void reportFailed(const skiatest::Failure&) = 0;
47fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    virtual bool allowExtendedTest() const;
48fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    virtual bool verbose() const;
49fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    virtual void* stats() const { return nullptr; }
50fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot
51fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    void reportFailedWithContext(const skiatest::Failure& f) {
52fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot        SkString fullMessage = f.message;
53fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot        if (!fContextStack.empty()) {
54fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot            fullMessage.append(" [");
55fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot            for (int i = 0; i < fContextStack.count(); ++i) {
56fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot                if (i > 0) {
57fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot                    fullMessage.append(", ");
58fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot                }
59fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot                fullMessage.append(fContextStack[i]);
60fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot            }
61fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot            fullMessage.append("]");
62fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot        }
63fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot        this->reportFailed(skiatest::Failure(f.fileName, f.lineNo, f.condition, fullMessage));
64fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    }
65fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    void push(const SkString& message) {
66fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot        fContextStack.push_back(message);
67fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    }
68fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    void pop() {
69fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot        fContextStack.pop_back();
70fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    }
71fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot
72fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robotprivate:
73fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    SkTArray<SkString> fContextStack;
74fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot};
75fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot
76fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot#define REPORT_FAILURE(reporter, cond, message) \
77fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    reporter->reportFailedWithContext(skiatest::Failure(__FILE__, __LINE__, cond, message))
78fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot
79fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robotclass ReporterContext : SkNoncopyable {
80fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robotpublic:
81fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    ReporterContext(Reporter* reporter, const SkString& message) : fReporter(reporter) {
82fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot        fReporter->push(message);
83fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    }
84fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    ~ReporterContext() {
85fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot        fReporter->pop();
86fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    }
87fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot
88fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robotprivate:
89fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    Reporter* fReporter;
90fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot};
91fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot
92fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robottypedef void (*TestProc)(skiatest::Reporter*, const GrContextOptions&);
93fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robottypedef void (*ContextOptionsProc)(GrContextOptions*);
94fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot
95fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robotstruct Test {
96fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    Test(const char* n, bool g, TestProc p, ContextOptionsProc optionsProc = nullptr)
97fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot        : name(n), needsGpu(g), proc(p), fContextOptionsProc(optionsProc) {}
98fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    const char* name;
99fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    bool needsGpu;
100fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    TestProc proc;
101fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    ContextOptionsProc fContextOptionsProc;
102fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot
103fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    void modifyGrContextOptions(GrContextOptions* options) {
104fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot        if (fContextOptionsProc) {
105fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot            (*fContextOptionsProc)(options);
106fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot        }
107fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    }
108fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot
109fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    void run(skiatest::Reporter* r, const GrContextOptions& options) const {
110fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot        TRACE_EVENT1("test", TRACE_FUNC, "name", this->name/*these are static*/);
111fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot        this->proc(r, options);
112fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    }
113fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot};
114fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot
115fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robottypedef sk_tools::Registry<Test> TestRegistry;
116fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot
117fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot/*
118fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    Use the following macros to make use of the skiatest classes, e.g.
119fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot
120fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    #include "Test.h"
121fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot
122fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    DEF_TEST(TestName, reporter) {
123fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot        ...
124fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot        REPORTER_ASSERT(reporter, x == 15);
125fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot        ...
126fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot        REPORTER_ASSERT(reporter, x == 15, "x should be 15");
127fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot        ...
128fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot        if (x != 15) {
129fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot            ERRORF(reporter, "x should be 15, but is %d", x);
130fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot            return;
131fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot        }
132fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot        ...
133fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    }
134fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot*/
135fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot
136fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot#if SK_SUPPORT_GPU
137fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robotusing GrContextFactoryContextType = sk_gpu_test::GrContextFactory::ContextType;
138fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot#else
139fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robotusing GrContextFactoryContextType = int;
140fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot#endif
141fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot
142fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robottypedef void GrContextTestFn(Reporter*, const sk_gpu_test::ContextInfo&);
143fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robottypedef bool GrContextTypeFilterFn(GrContextFactoryContextType);
144fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot
145fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robotextern bool IsGLContextType(GrContextFactoryContextType);
146fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robotextern bool IsVulkanContextType(GrContextFactoryContextType);
147fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robotextern bool IsRenderingGLContextType(GrContextFactoryContextType);
148fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robotextern bool IsNullGLContextType(GrContextFactoryContextType);
149fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robotvoid RunWithGPUTestContexts(GrContextTestFn*, GrContextTypeFilterFn*, Reporter*,
150fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot                            const GrContextOptions&);
151fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot
152fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot/** Timer provides wall-clock duration since its creation. */
153fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robotclass Timer {
154fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robotpublic:
155fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    /** Starts the timer. */
156fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    Timer();
157fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot
158fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    /** Nanoseconds since creation. */
159fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    double elapsedNs() const;
160fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot
161fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    /** Milliseconds since creation. */
162fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    double elapsedMs() const;
163fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot
164fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    /** Milliseconds since creation as an integer.
165fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot        Behavior is undefined for durations longer than SK_MSecMax.
166fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    */
167fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    SkMSec elapsedMsInt() const;
168fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robotprivate:
169fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    double fStartNanos;
170fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot};
171fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot
172fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot}  // namespace skiatest
173fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot
174fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot#define REPORTER_ASSERT(r, cond, ...)                              \
175fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    do {                                                           \
176fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot        if (!(cond)) {                                             \
177fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot            REPORT_FAILURE(r, #cond, SkStringPrintf(__VA_ARGS__)); \
178fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot        }                                                          \
179fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    } while (0)
180fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot
181fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot#define ERRORF(r, ...)                                      \
182fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    do {                                                    \
183fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot        REPORT_FAILURE(r, "", SkStringPrintf(__VA_ARGS__)); \
184fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    } while (0)
185fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot
186fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot#define INFOF(REPORTER, ...)         \
187fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    do {                             \
188fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot        if ((REPORTER)->verbose()) { \
189fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot            SkDebugf(__VA_ARGS__);   \
190fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot        }                            \
191fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    } while (0)
192fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot
193fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot#define DEF_TEST(name, reporter)                                                          \
194fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    static void test_##name(skiatest::Reporter*, const GrContextOptions&);                \
195fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    skiatest::TestRegistry name##TestRegistry(skiatest::Test(#name, false, test_##name)); \
196fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    void test_##name(skiatest::Reporter* reporter, const GrContextOptions&)
197fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot
198fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot#define DEF_GPUTEST(name, reporter, options)                                             \
199fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    static void test_##name(skiatest::Reporter*, const GrContextOptions&);               \
200fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    skiatest::TestRegistry name##TestRegistry(skiatest::Test(#name, true, test_##name)); \
201fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    void test_##name(skiatest::Reporter* reporter, const GrContextOptions& options)
202fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot
203fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot#define DEF_GPUTEST_FOR_CONTEXTS(name, context_filter, reporter, context_info, options_filter)  \
204fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    static void test_##name(skiatest::Reporter*, const sk_gpu_test::ContextInfo& context_info); \
205fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    static void test_gpu_contexts_##name(skiatest::Reporter* reporter,                          \
206fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot                                         const GrContextOptions& options) {                     \
207fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot        skiatest::RunWithGPUTestContexts(test_##name, context_filter, reporter, options);       \
208fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    }                                                                                           \
209fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    skiatest::TestRegistry name##TestRegistry(                                                  \
210fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot            skiatest::Test(#name, true, test_gpu_contexts_##name, options_filter));             \
211fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    void test_##name(skiatest::Reporter* reporter, const sk_gpu_test::ContextInfo& context_info)
212fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot
213fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot#define DEF_GPUTEST_FOR_ALL_CONTEXTS(name, reporter, context_info)                          \
214fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot        DEF_GPUTEST_FOR_CONTEXTS(name, nullptr, reporter, context_info, nullptr)
215fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot
216fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot#define DEF_GPUTEST_FOR_RENDERING_CONTEXTS(name, reporter, context_info)                    \
217fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot        DEF_GPUTEST_FOR_CONTEXTS(name, sk_gpu_test::GrContextFactory::IsRenderingContext,   \
218fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot                                 reporter, context_info, nullptr)
219fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot#define DEF_GPUTEST_FOR_ALL_GL_CONTEXTS(name, reporter, context_info)                       \
220fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot        DEF_GPUTEST_FOR_CONTEXTS(name, &skiatest::IsGLContextType,                          \
221fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot                                 reporter, context_info, nullptr)
222fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot#define DEF_GPUTEST_FOR_GL_RENDERING_CONTEXTS(name, reporter, context_info)                 \
223fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot        DEF_GPUTEST_FOR_CONTEXTS(name, &skiatest::IsRenderingGLContextType,                 \
224fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot                                 reporter, context_info, nullptr)
225fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot#define DEF_GPUTEST_FOR_NULLGL_CONTEXT(name, reporter, context_info)                        \
226fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot        DEF_GPUTEST_FOR_CONTEXTS(name, &skiatest::IsNullGLContextType,                      \
227fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot                                 reporter, context_info, nullptr)
228fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot#define DEF_GPUTEST_FOR_VULKAN_CONTEXT(name, reporter, context_info)                        \
229fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot        DEF_GPUTEST_FOR_CONTEXTS(name, &skiatest::IsVulkanContextType,                      \
230fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot                                 reporter, context_info, nullptr)
231fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot
232fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot#define REQUIRE_PDF_DOCUMENT(TEST_NAME, REPORTER)                          \
233fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    do {                                                                   \
234fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot        SkDynamicMemoryWStream testStream;                                 \
235fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot        sk_sp<SkDocument> testDoc(SkDocument::MakePDF(&testStream));       \
236fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot        if (!testDoc) {                                                    \
237fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot            INFOF(REPORTER, "PDF disabled; %s test skipped.", #TEST_NAME); \
238fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot            return;                                                        \
239fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot        }                                                                  \
240fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    } while (false)
241fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot
242fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot#endif
243