xref: /aosp_15_r20/external/skia/gm/gm.h (revision c8dee2aa9b3f27cf6c858bd81872bdeb2c07ed17)
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 
8*c8dee2aaSAndroid Build Coastguard Worker #ifndef skiagm_DEFINED
9*c8dee2aaSAndroid Build Coastguard Worker #define skiagm_DEFINED
10*c8dee2aaSAndroid Build Coastguard Worker 
11*c8dee2aaSAndroid Build Coastguard Worker #include "include/core/SkColor.h"
12*c8dee2aaSAndroid Build Coastguard Worker #include "include/core/SkScalar.h"
13*c8dee2aaSAndroid Build Coastguard Worker #include "include/core/SkSize.h"
14*c8dee2aaSAndroid Build Coastguard Worker #include "include/core/SkString.h"
15*c8dee2aaSAndroid Build Coastguard Worker #include "include/core/SkTypes.h"
16*c8dee2aaSAndroid Build Coastguard Worker #include "include/private/base/SkMacros.h"
17*c8dee2aaSAndroid Build Coastguard Worker #include "tools/Registry.h"
18*c8dee2aaSAndroid Build Coastguard Worker 
19*c8dee2aaSAndroid Build Coastguard Worker #include <functional>
20*c8dee2aaSAndroid Build Coastguard Worker #include <map>
21*c8dee2aaSAndroid Build Coastguard Worker #include <memory>
22*c8dee2aaSAndroid Build Coastguard Worker 
23*c8dee2aaSAndroid Build Coastguard Worker class GrRecordingContext;
24*c8dee2aaSAndroid Build Coastguard Worker class SkCanvas;
25*c8dee2aaSAndroid Build Coastguard Worker class SkMetaData;
26*c8dee2aaSAndroid Build Coastguard Worker struct GrContextOptions;
27*c8dee2aaSAndroid Build Coastguard Worker 
28*c8dee2aaSAndroid Build Coastguard Worker namespace skiagm::verifiers {
29*c8dee2aaSAndroid Build Coastguard Worker class VerifierList;
30*c8dee2aaSAndroid Build Coastguard Worker }
31*c8dee2aaSAndroid Build Coastguard Worker 
32*c8dee2aaSAndroid Build Coastguard Worker namespace skgpu::graphite {
33*c8dee2aaSAndroid Build Coastguard Worker struct ContextOptions;
34*c8dee2aaSAndroid Build Coastguard Worker }
35*c8dee2aaSAndroid Build Coastguard Worker 
36*c8dee2aaSAndroid Build Coastguard Worker namespace skiatest::graphite {
37*c8dee2aaSAndroid Build Coastguard Worker class GraphiteTestContext;
38*c8dee2aaSAndroid Build Coastguard Worker }
39*c8dee2aaSAndroid Build Coastguard Worker 
40*c8dee2aaSAndroid Build Coastguard Worker #define DEF_GM(CODE)                                         \
41*c8dee2aaSAndroid Build Coastguard Worker     static skiagm::GMRegistry SK_MACRO_APPEND_COUNTER(REG_)( \
42*c8dee2aaSAndroid Build Coastguard Worker             []() { return std::unique_ptr<skiagm::GM>([]() { CODE; }()); });
43*c8dee2aaSAndroid Build Coastguard Worker 
44*c8dee2aaSAndroid Build Coastguard Worker // A Simple GM is a rendering test that does not store state between rendering calls or make use of
45*c8dee2aaSAndroid Build Coastguard Worker // the onOnceBeforeDraw() virtual; it consists of:
46*c8dee2aaSAndroid Build Coastguard Worker //   *   A name.
47*c8dee2aaSAndroid Build Coastguard Worker //   *   Prefered width and height.
48*c8dee2aaSAndroid Build Coastguard Worker //   *   Optionally, a background color (default is white).
49*c8dee2aaSAndroid Build Coastguard Worker //   *   A standalone function pointer that implements its onDraw method.
50*c8dee2aaSAndroid Build Coastguard Worker #define DEF_SIMPLE_GM(NAME, CANVAS, W, H) \
51*c8dee2aaSAndroid Build Coastguard Worker     DEF_SIMPLE_GM_BG_NAME(NAME, CANVAS, W, H, SK_ColorWHITE, SkString(#NAME))
52*c8dee2aaSAndroid Build Coastguard Worker #define DEF_SIMPLE_GM_BG(NAME, CANVAS, W, H, BGCOLOR) \
53*c8dee2aaSAndroid Build Coastguard Worker     DEF_SIMPLE_GM_BG_NAME(NAME, CANVAS, W, H, BGCOLOR, SkString(#NAME))
54*c8dee2aaSAndroid Build Coastguard Worker #define DEF_SIMPLE_GM_BG_NAME(NAME, CANVAS, W, H, BGCOLOR, NAME_STR) \
55*c8dee2aaSAndroid Build Coastguard Worker     static void SK_MACRO_CONCAT(NAME,_GM_inner)(SkCanvas*); \
56*c8dee2aaSAndroid Build Coastguard Worker     DEF_SIMPLE_GM_BG_NAME_CAN_FAIL(NAME, CANVAS,, W, H, BGCOLOR, NAME_STR) { \
57*c8dee2aaSAndroid Build Coastguard Worker         SK_MACRO_CONCAT(NAME,_GM_inner)(CANVAS); \
58*c8dee2aaSAndroid Build Coastguard Worker         return skiagm::DrawResult::kOk; \
59*c8dee2aaSAndroid Build Coastguard Worker     } \
60*c8dee2aaSAndroid Build Coastguard Worker     void SK_MACRO_CONCAT(NAME,_GM_inner)(SkCanvas* CANVAS)
61*c8dee2aaSAndroid Build Coastguard Worker 
62*c8dee2aaSAndroid Build Coastguard Worker #define DEF_SIMPLE_GM_CAN_FAIL(NAME, CANVAS, ERR_MSG, W, H) \
63*c8dee2aaSAndroid Build Coastguard Worker     DEF_SIMPLE_GM_BG_NAME_CAN_FAIL(NAME, CANVAS, ERR_MSG, W, H, SK_ColorWHITE, SkString(#NAME))
64*c8dee2aaSAndroid Build Coastguard Worker #define DEF_SIMPLE_GM_BG_CAN_FAIL(NAME, CANVAS, ERR_MSG, W, H, BGCOLOR) \
65*c8dee2aaSAndroid Build Coastguard Worker     DEF_SIMPLE_GM_BG_NAME_CAN_FAIL(NAME, CANVAS, ERR_MSG, W, H, BGCOLOR, SkString(#NAME))
66*c8dee2aaSAndroid Build Coastguard Worker #define DEF_SIMPLE_GM_BG_NAME_CAN_FAIL(NAME, CANVAS, ERR_MSG, W, H, BGCOLOR, NAME_STR) \
67*c8dee2aaSAndroid Build Coastguard Worker     static skiagm::DrawResult SK_MACRO_CONCAT(NAME,_GM)(SkCanvas*, SkString*); \
68*c8dee2aaSAndroid Build Coastguard Worker     DEF_GM(return new skiagm::SimpleGM(BGCOLOR, NAME_STR, {W,H}, SK_MACRO_CONCAT(NAME,_GM));) \
69*c8dee2aaSAndroid Build Coastguard Worker     skiagm::DrawResult SK_MACRO_CONCAT(NAME,_GM)(SkCanvas* CANVAS, SkString* ERR_MSG)
70*c8dee2aaSAndroid Build Coastguard Worker 
71*c8dee2aaSAndroid Build Coastguard Worker // Declares a function that dynamically registers GMs (e.g. based on some command-line flag). See
72*c8dee2aaSAndroid Build Coastguard Worker // the GMRegistererFnRegistry definition below for additional context.
73*c8dee2aaSAndroid Build Coastguard Worker #define DEF_GM_REGISTERER_FN(FN) \
74*c8dee2aaSAndroid Build Coastguard Worker     static skiagm::GMRegistererFnRegistry SK_MACRO_APPEND_COUNTER(REG_)(FN)
75*c8dee2aaSAndroid Build Coastguard Worker 
76*c8dee2aaSAndroid Build Coastguard Worker #if defined(SK_GANESH)
77*c8dee2aaSAndroid Build Coastguard Worker // A Simple GpuGM makes direct GPU calls. Its onDraw hook that includes GPU objects as params, and
78*c8dee2aaSAndroid Build Coastguard Worker // is only invoked on GPU configs. Non-GPU configs automatically draw a GPU-only message and abort.
79*c8dee2aaSAndroid Build Coastguard Worker #define DEF_SIMPLE_GPU_GM(NAME, GR_CONTEXT, CANVAS, W, H)                                         \
80*c8dee2aaSAndroid Build Coastguard Worker     DEF_SIMPLE_GPU_GM_BG(NAME, GR_CONTEXT, CANVAS, W, H, SK_ColorWHITE)
81*c8dee2aaSAndroid Build Coastguard Worker 
82*c8dee2aaSAndroid Build Coastguard Worker #define DEF_SIMPLE_GPU_GM_BG(NAME, GR_CONTEXT, CANVAS, W, H, BGCOLOR)                             \
83*c8dee2aaSAndroid Build Coastguard Worker     static void SK_MACRO_CONCAT(NAME,_GM_inner)(GrRecordingContext*, SkCanvas*);                  \
84*c8dee2aaSAndroid Build Coastguard Worker     DEF_SIMPLE_GPU_GM_BG_CAN_FAIL(NAME, GR_CONTEXT, CANVAS, /* ERR_MSG */, W, H, BGCOLOR) {       \
85*c8dee2aaSAndroid Build Coastguard Worker         SK_MACRO_CONCAT(NAME,_GM_inner)(GR_CONTEXT, CANVAS);                                      \
86*c8dee2aaSAndroid Build Coastguard Worker         return skiagm::DrawResult::kOk;                                                           \
87*c8dee2aaSAndroid Build Coastguard Worker     }                                                                                             \
88*c8dee2aaSAndroid Build Coastguard Worker     void SK_MACRO_CONCAT(NAME,_GM_inner)(GrRecordingContext* GR_CONTEXT, SkCanvas* CANVAS)
89*c8dee2aaSAndroid Build Coastguard Worker 
90*c8dee2aaSAndroid Build Coastguard Worker #define DEF_SIMPLE_GPU_GM_CAN_FAIL(NAME, GR_CONTEXT, CANVAS, ERR_MSG, W, H)                       \
91*c8dee2aaSAndroid Build Coastguard Worker     DEF_SIMPLE_GPU_GM_BG_CAN_FAIL(NAME, GR_CONTEXT, CANVAS, ERR_MSG, W, H, SK_ColorWHITE)
92*c8dee2aaSAndroid Build Coastguard Worker 
93*c8dee2aaSAndroid Build Coastguard Worker #define DEF_SIMPLE_GPU_GM_BG_CAN_FAIL(NAME, GR_CONTEXT, CANVAS, ERR_MSG, W, H, BGCOLOR)           \
94*c8dee2aaSAndroid Build Coastguard Worker     static skiagm::DrawResult SK_MACRO_CONCAT(NAME,_GM)(                                          \
95*c8dee2aaSAndroid Build Coastguard Worker         GrRecordingContext*, SkCanvas*, SkString*);                                               \
96*c8dee2aaSAndroid Build Coastguard Worker     DEF_GM(return new skiagm::SimpleGpuGM(BGCOLOR, SkString(#NAME), {W,H},                        \
97*c8dee2aaSAndroid Build Coastguard Worker                                           SK_MACRO_CONCAT(NAME,_GM));)                            \
98*c8dee2aaSAndroid Build Coastguard Worker     skiagm::DrawResult SK_MACRO_CONCAT(NAME,_GM)(                                                 \
99*c8dee2aaSAndroid Build Coastguard Worker             GrRecordingContext* GR_CONTEXT, SkCanvas* CANVAS, SkString* ERR_MSG)
100*c8dee2aaSAndroid Build Coastguard Worker #endif
101*c8dee2aaSAndroid Build Coastguard Worker 
102*c8dee2aaSAndroid Build Coastguard Worker namespace skiagm {
103*c8dee2aaSAndroid Build Coastguard Worker 
104*c8dee2aaSAndroid Build Coastguard Worker     enum class DrawResult {
105*c8dee2aaSAndroid Build Coastguard Worker         kOk,   // Test drew successfully.
106*c8dee2aaSAndroid Build Coastguard Worker         kFail, // Test failed to draw.
107*c8dee2aaSAndroid Build Coastguard Worker         kSkip  // Test is not applicable in this context and should be skipped.
108*c8dee2aaSAndroid Build Coastguard Worker     };
109*c8dee2aaSAndroid Build Coastguard Worker 
110*c8dee2aaSAndroid Build Coastguard Worker     class GM {
111*c8dee2aaSAndroid Build Coastguard Worker     public:
112*c8dee2aaSAndroid Build Coastguard Worker         using DrawResult = skiagm::DrawResult;
113*c8dee2aaSAndroid Build Coastguard Worker         using GraphiteTestContext = skiatest::graphite::GraphiteTestContext;
114*c8dee2aaSAndroid Build Coastguard Worker 
115*c8dee2aaSAndroid Build Coastguard Worker         GM(SkColor backgroundColor = SK_ColorWHITE);
116*c8dee2aaSAndroid Build Coastguard Worker         virtual ~GM();
117*c8dee2aaSAndroid Build Coastguard Worker 
118*c8dee2aaSAndroid Build Coastguard Worker         enum Mode {
119*c8dee2aaSAndroid Build Coastguard Worker             kGM_Mode,
120*c8dee2aaSAndroid Build Coastguard Worker             kSample_Mode,
121*c8dee2aaSAndroid Build Coastguard Worker             kBench_Mode,
122*c8dee2aaSAndroid Build Coastguard Worker         };
123*c8dee2aaSAndroid Build Coastguard Worker 
setMode(Mode mode)124*c8dee2aaSAndroid Build Coastguard Worker         void setMode(Mode mode) { fMode = mode; }
getMode()125*c8dee2aaSAndroid Build Coastguard Worker         Mode getMode() const { return fMode; }
126*c8dee2aaSAndroid Build Coastguard Worker 
127*c8dee2aaSAndroid Build Coastguard Worker         inline static constexpr char kErrorMsg_DrawSkippedGpuOnly[] =
128*c8dee2aaSAndroid Build Coastguard Worker                 "This test is for GPU configs only.";
129*c8dee2aaSAndroid Build Coastguard Worker 
130*c8dee2aaSAndroid Build Coastguard Worker         DrawResult gpuSetup(SkCanvas*, SkString* errorMsg, GraphiteTestContext* = nullptr);
131*c8dee2aaSAndroid Build Coastguard Worker         void gpuTeardown();
132*c8dee2aaSAndroid Build Coastguard Worker 
onceBeforeDraw()133*c8dee2aaSAndroid Build Coastguard Worker         void onceBeforeDraw() {
134*c8dee2aaSAndroid Build Coastguard Worker             if (!fHaveCalledOnceBeforeDraw) {
135*c8dee2aaSAndroid Build Coastguard Worker                 fHaveCalledOnceBeforeDraw = true;
136*c8dee2aaSAndroid Build Coastguard Worker                 this->onOnceBeforeDraw();
137*c8dee2aaSAndroid Build Coastguard Worker             }
138*c8dee2aaSAndroid Build Coastguard Worker         }
139*c8dee2aaSAndroid Build Coastguard Worker 
draw(SkCanvas * canvas)140*c8dee2aaSAndroid Build Coastguard Worker         DrawResult draw(SkCanvas* canvas) {
141*c8dee2aaSAndroid Build Coastguard Worker             SkString errorMsg;
142*c8dee2aaSAndroid Build Coastguard Worker             return this->draw(canvas, &errorMsg);
143*c8dee2aaSAndroid Build Coastguard Worker         }
144*c8dee2aaSAndroid Build Coastguard Worker         DrawResult draw(SkCanvas*, SkString* errorMsg);
145*c8dee2aaSAndroid Build Coastguard Worker 
146*c8dee2aaSAndroid Build Coastguard Worker         void drawBackground(SkCanvas*);
drawContent(SkCanvas * canvas)147*c8dee2aaSAndroid Build Coastguard Worker         DrawResult drawContent(SkCanvas* canvas) {
148*c8dee2aaSAndroid Build Coastguard Worker             SkString errorMsg;
149*c8dee2aaSAndroid Build Coastguard Worker             return this->drawContent(canvas, &errorMsg);
150*c8dee2aaSAndroid Build Coastguard Worker         }
151*c8dee2aaSAndroid Build Coastguard Worker         DrawResult drawContent(SkCanvas*, SkString* errorMsg);
152*c8dee2aaSAndroid Build Coastguard Worker 
153*c8dee2aaSAndroid Build Coastguard Worker         virtual SkISize getISize() = 0;
154*c8dee2aaSAndroid Build Coastguard Worker 
155*c8dee2aaSAndroid Build Coastguard Worker         virtual SkString getName() const = 0;
156*c8dee2aaSAndroid Build Coastguard Worker 
157*c8dee2aaSAndroid Build Coastguard Worker         virtual bool runAsBench() const;
158*c8dee2aaSAndroid Build Coastguard Worker 
width()159*c8dee2aaSAndroid Build Coastguard Worker         SkScalar width() {
160*c8dee2aaSAndroid Build Coastguard Worker             return SkIntToScalar(this->getISize().width());
161*c8dee2aaSAndroid Build Coastguard Worker         }
height()162*c8dee2aaSAndroid Build Coastguard Worker         SkScalar height() {
163*c8dee2aaSAndroid Build Coastguard Worker             return SkIntToScalar(this->getISize().height());
164*c8dee2aaSAndroid Build Coastguard Worker         }
165*c8dee2aaSAndroid Build Coastguard Worker 
getBGColor()166*c8dee2aaSAndroid Build Coastguard Worker         SkColor getBGColor() const { return fBGColor; }
167*c8dee2aaSAndroid Build Coastguard Worker         void setBGColor(SkColor);
168*c8dee2aaSAndroid Build Coastguard Worker 
169*c8dee2aaSAndroid Build Coastguard Worker         // helper: fill a rect in the specified color based on the GM's getISize bounds.
170*c8dee2aaSAndroid Build Coastguard Worker         void drawSizeBounds(SkCanvas*, SkColor);
171*c8dee2aaSAndroid Build Coastguard Worker 
172*c8dee2aaSAndroid Build Coastguard Worker         bool animate(double /*nanos*/);
173*c8dee2aaSAndroid Build Coastguard Worker         virtual bool onChar(SkUnichar);
174*c8dee2aaSAndroid Build Coastguard Worker 
getControls(SkMetaData * controls)175*c8dee2aaSAndroid Build Coastguard Worker         bool getControls(SkMetaData* controls) { return this->onGetControls(controls); }
setControls(const SkMetaData & controls)176*c8dee2aaSAndroid Build Coastguard Worker         void setControls(const SkMetaData& controls) { this->onSetControls(controls); }
177*c8dee2aaSAndroid Build Coastguard Worker 
modifyGrContextOptions(GrContextOptions *)178*c8dee2aaSAndroid Build Coastguard Worker         virtual void modifyGrContextOptions(GrContextOptions*) {}
modifyGraphiteContextOptions(skgpu::graphite::ContextOptions *)179*c8dee2aaSAndroid Build Coastguard Worker         virtual void modifyGraphiteContextOptions(skgpu::graphite::ContextOptions*) const {}
180*c8dee2aaSAndroid Build Coastguard Worker 
181*c8dee2aaSAndroid Build Coastguard Worker         // Convenience method to skip Bazel-only GMs from DM.
182*c8dee2aaSAndroid Build Coastguard Worker         //
183*c8dee2aaSAndroid Build Coastguard Worker         // As of Q3 2023, lovisolo@ is experimenting with reimplementing some DM behaviors as
184*c8dee2aaSAndroid Build Coastguard Worker         // smaller, independent Bazel targets. For example, file
185*c8dee2aaSAndroid Build Coastguard Worker         // //tools/testrunners/gm/BazelGMTestRunner.cpp provides a main function that can run GMs.
186*c8dee2aaSAndroid Build Coastguard Worker         // With this file, one can define multiple small Bazel tests to run groups of related GMs
187*c8dee2aaSAndroid Build Coastguard Worker         // with Bazel. However, GMs are only one kind of "source" supported by DM (see class
188*c8dee2aaSAndroid Build Coastguard Worker         // GMSrc). DM supports other kinds of sources as well, such as codecs (CodecSrc class) and
189*c8dee2aaSAndroid Build Coastguard Worker         // image generators (ImageGenSrc class). One possible strategy to support these sources in
190*c8dee2aaSAndroid Build Coastguard Worker         // our Bazel build is to turn them into GMs. For example, instead of using the CodecSrc
191*c8dee2aaSAndroid Build Coastguard Worker         // class from Bazel, we could have a GM subclass that takes an image as an input, decodes
192*c8dee2aaSAndroid Build Coastguard Worker         // it using a codec, and draws in on a canvas. Given that this overlaps with existing DM
193*c8dee2aaSAndroid Build Coastguard Worker         // functionality, we would mark such GMs as Bazel-only.
194*c8dee2aaSAndroid Build Coastguard Worker         //
195*c8dee2aaSAndroid Build Coastguard Worker         // Another possibility is to slowly replace all existing DM source types with just GMs.
196*c8dee2aaSAndroid Build Coastguard Worker         // This would lead to a simpler DM architecture where there is only one source type and
197*c8dee2aaSAndroid Build Coastguard Worker         // multiple sinks, as opposed to the current design with multiple sources and sinks.
198*c8dee2aaSAndroid Build Coastguard Worker         // Furthermore, it would simplify the migration to Bazel because it would allow us to
199*c8dee2aaSAndroid Build Coastguard Worker         // leverage existing work to run GMs with Bazel.
200*c8dee2aaSAndroid Build Coastguard Worker         //
201*c8dee2aaSAndroid Build Coastguard Worker         // TODO(lovisolo): Delete once it's no longer needed.
isBazelOnly()202*c8dee2aaSAndroid Build Coastguard Worker         virtual bool isBazelOnly() const { return false; }
203*c8dee2aaSAndroid Build Coastguard Worker 
204*c8dee2aaSAndroid Build Coastguard Worker         // Ignored by DM. Returns the set of Gold key/value pairs specific to this GM, such as the
205*c8dee2aaSAndroid Build Coastguard Worker         // GM name and corpus. GMs may define additional keys. For example, codec GMs define keys
206*c8dee2aaSAndroid Build Coastguard Worker         // for the parameters utilized to initialize the codec.
getGoldKeys()207*c8dee2aaSAndroid Build Coastguard Worker         virtual std::map<std::string, std::string> getGoldKeys() const {
208*c8dee2aaSAndroid Build Coastguard Worker             return std::map<std::string, std::string>{
209*c8dee2aaSAndroid Build Coastguard Worker                     {"name", getName().c_str()},
210*c8dee2aaSAndroid Build Coastguard Worker                     {"source_type", "gm"},
211*c8dee2aaSAndroid Build Coastguard Worker             };
212*c8dee2aaSAndroid Build Coastguard Worker         }
213*c8dee2aaSAndroid Build Coastguard Worker 
214*c8dee2aaSAndroid Build Coastguard Worker     protected:
215*c8dee2aaSAndroid Build Coastguard Worker         // onGpuSetup is called once before any other processing with a direct context.
onGpuSetup(SkCanvas *,SkString *,GraphiteTestContext *)216*c8dee2aaSAndroid Build Coastguard Worker         virtual DrawResult onGpuSetup(SkCanvas*, SkString*, GraphiteTestContext*) {
217*c8dee2aaSAndroid Build Coastguard Worker             return DrawResult::kOk;
218*c8dee2aaSAndroid Build Coastguard Worker         }
onGpuTeardown()219*c8dee2aaSAndroid Build Coastguard Worker         virtual void onGpuTeardown() {}
220*c8dee2aaSAndroid Build Coastguard Worker         virtual void onOnceBeforeDraw();
221*c8dee2aaSAndroid Build Coastguard Worker         virtual DrawResult onDraw(SkCanvas*, SkString* errorMsg);
222*c8dee2aaSAndroid Build Coastguard Worker         virtual void onDraw(SkCanvas*);
223*c8dee2aaSAndroid Build Coastguard Worker 
224*c8dee2aaSAndroid Build Coastguard Worker         virtual bool onAnimate(double /*nanos*/);
225*c8dee2aaSAndroid Build Coastguard Worker         virtual bool onGetControls(SkMetaData*);
226*c8dee2aaSAndroid Build Coastguard Worker         virtual void onSetControls(const SkMetaData&);
227*c8dee2aaSAndroid Build Coastguard Worker 
graphiteTestContext()228*c8dee2aaSAndroid Build Coastguard Worker         GraphiteTestContext* graphiteTestContext() const { return fGraphiteTestContext; }
229*c8dee2aaSAndroid Build Coastguard Worker 
230*c8dee2aaSAndroid Build Coastguard Worker     private:
231*c8dee2aaSAndroid Build Coastguard Worker         Mode fMode;
232*c8dee2aaSAndroid Build Coastguard Worker         SkColor    fBGColor;
233*c8dee2aaSAndroid Build Coastguard Worker         bool       fHaveCalledOnceBeforeDraw = false;
234*c8dee2aaSAndroid Build Coastguard Worker         bool       fGpuSetup = false;
235*c8dee2aaSAndroid Build Coastguard Worker         DrawResult fGpuSetupResult = DrawResult::kOk;
236*c8dee2aaSAndroid Build Coastguard Worker         GraphiteTestContext* fGraphiteTestContext;
237*c8dee2aaSAndroid Build Coastguard Worker     };
238*c8dee2aaSAndroid Build Coastguard Worker 
239*c8dee2aaSAndroid Build Coastguard Worker     using GMFactory = std::function<std::unique_ptr<skiagm::GM>()>;
240*c8dee2aaSAndroid Build Coastguard Worker     using GMRegistry = sk_tools::Registry<GMFactory>;
241*c8dee2aaSAndroid Build Coastguard Worker 
242*c8dee2aaSAndroid Build Coastguard Worker     // Adds a GM to the GMRegistry.
243*c8dee2aaSAndroid Build Coastguard Worker     void Register(skiagm::GM* gm);
244*c8dee2aaSAndroid Build Coastguard Worker 
245*c8dee2aaSAndroid Build Coastguard Worker     // Registry of functions that dynamically register GMs. Useful for GMs that are unknown at
246*c8dee2aaSAndroid Build Coastguard Worker     // compile time, such as those that are created from images in a directory (see e.g.
247*c8dee2aaSAndroid Build Coastguard Worker     // //gm/png_codec.cpp).
248*c8dee2aaSAndroid Build Coastguard Worker     //
249*c8dee2aaSAndroid Build Coastguard Worker     // A GMRegistererFn may call skiagm::Register() zero or more times to register GMs as needed.
250*c8dee2aaSAndroid Build Coastguard Worker     // It should return the empty string on success, or a human-friendly message in the case of
251*c8dee2aaSAndroid Build Coastguard Worker     // errors.
252*c8dee2aaSAndroid Build Coastguard Worker     //
253*c8dee2aaSAndroid Build Coastguard Worker     // Only used by //tools/testrunners/gm/BazelGMTestRunner.cpp for now.
254*c8dee2aaSAndroid Build Coastguard Worker     using GMRegistererFn = std::function<std::string()>;
255*c8dee2aaSAndroid Build Coastguard Worker     using GMRegistererFnRegistry = sk_tools::Registry<GMRegistererFn>;
256*c8dee2aaSAndroid Build Coastguard Worker 
257*c8dee2aaSAndroid Build Coastguard Worker #if defined(SK_GANESH)
258*c8dee2aaSAndroid Build Coastguard Worker     // A GpuGM replaces the onDraw method with one that also accepts GPU objects alongside the
259*c8dee2aaSAndroid Build Coastguard Worker     // SkCanvas. Its onDraw is only invoked on GPU configs; on non-GPU configs it will automatically
260*c8dee2aaSAndroid Build Coastguard Worker     // draw a GPU-only message and abort.
261*c8dee2aaSAndroid Build Coastguard Worker     class GpuGM : public GM {
262*c8dee2aaSAndroid Build Coastguard Worker     public:
GM(backgroundColor)263*c8dee2aaSAndroid Build Coastguard Worker         GpuGM(SkColor backgroundColor = SK_ColorWHITE) : GM(backgroundColor) {}
264*c8dee2aaSAndroid Build Coastguard Worker 
265*c8dee2aaSAndroid Build Coastguard Worker     private:
266*c8dee2aaSAndroid Build Coastguard Worker         using GM::onDraw;
267*c8dee2aaSAndroid Build Coastguard Worker         DrawResult onDraw(SkCanvas*, SkString* errorMsg) final;
268*c8dee2aaSAndroid Build Coastguard Worker 
269*c8dee2aaSAndroid Build Coastguard Worker         virtual DrawResult onDraw(GrRecordingContext*, SkCanvas*, SkString* errorMsg);
270*c8dee2aaSAndroid Build Coastguard Worker         virtual void onDraw(GrRecordingContext*, SkCanvas*);
271*c8dee2aaSAndroid Build Coastguard Worker     };
272*c8dee2aaSAndroid Build Coastguard Worker #endif
273*c8dee2aaSAndroid Build Coastguard Worker 
274*c8dee2aaSAndroid Build Coastguard Worker     // SimpleGM is intended for basic GMs that can define their entire implementation inside a
275*c8dee2aaSAndroid Build Coastguard Worker     // single "draw" function pointer.
276*c8dee2aaSAndroid Build Coastguard Worker     class SimpleGM : public GM {
277*c8dee2aaSAndroid Build Coastguard Worker     public:
278*c8dee2aaSAndroid Build Coastguard Worker         using DrawProc = DrawResult(*)(SkCanvas*, SkString*);
279*c8dee2aaSAndroid Build Coastguard Worker 
SimpleGM(SkColor bgColor,const SkString & name,const SkISize & size,DrawProc drawProc)280*c8dee2aaSAndroid Build Coastguard Worker         SimpleGM(SkColor bgColor, const SkString& name, const SkISize& size, DrawProc drawProc)
281*c8dee2aaSAndroid Build Coastguard Worker                 : GM(bgColor), fName(name), fSize(size), fDrawProc(drawProc) {}
282*c8dee2aaSAndroid Build Coastguard Worker 
283*c8dee2aaSAndroid Build Coastguard Worker         SkString getName() const override;
284*c8dee2aaSAndroid Build Coastguard Worker         SkISize getISize() override;
285*c8dee2aaSAndroid Build Coastguard Worker 
286*c8dee2aaSAndroid Build Coastguard Worker     private:
287*c8dee2aaSAndroid Build Coastguard Worker         DrawResult onDraw(SkCanvas* canvas, SkString* errorMsg) override;
288*c8dee2aaSAndroid Build Coastguard Worker 
289*c8dee2aaSAndroid Build Coastguard Worker         const SkString fName;
290*c8dee2aaSAndroid Build Coastguard Worker         const SkISize fSize;
291*c8dee2aaSAndroid Build Coastguard Worker         const DrawProc fDrawProc;
292*c8dee2aaSAndroid Build Coastguard Worker     };
293*c8dee2aaSAndroid Build Coastguard Worker 
294*c8dee2aaSAndroid Build Coastguard Worker #if defined(SK_GANESH)
295*c8dee2aaSAndroid Build Coastguard Worker     class SimpleGpuGM : public GpuGM {
296*c8dee2aaSAndroid Build Coastguard Worker     public:
297*c8dee2aaSAndroid Build Coastguard Worker         using DrawProc = DrawResult (*)(GrRecordingContext*, SkCanvas*, SkString* errorMsg);
298*c8dee2aaSAndroid Build Coastguard Worker 
SimpleGpuGM(SkColor bgColor,const SkString & name,const SkISize & size,DrawProc drawProc)299*c8dee2aaSAndroid Build Coastguard Worker         SimpleGpuGM(SkColor bgColor, const SkString& name, const SkISize& size, DrawProc drawProc)
300*c8dee2aaSAndroid Build Coastguard Worker                 : GpuGM(bgColor), fName(name), fSize(size), fDrawProc(drawProc) {}
301*c8dee2aaSAndroid Build Coastguard Worker 
302*c8dee2aaSAndroid Build Coastguard Worker         SkString getName() const override;
303*c8dee2aaSAndroid Build Coastguard Worker         SkISize getISize() override;
304*c8dee2aaSAndroid Build Coastguard Worker 
305*c8dee2aaSAndroid Build Coastguard Worker     private:
306*c8dee2aaSAndroid Build Coastguard Worker         DrawResult onDraw(GrRecordingContext*, SkCanvas*, SkString* errorMsg) override;
307*c8dee2aaSAndroid Build Coastguard Worker 
308*c8dee2aaSAndroid Build Coastguard Worker         const SkString fName;
309*c8dee2aaSAndroid Build Coastguard Worker         const SkISize fSize;
310*c8dee2aaSAndroid Build Coastguard Worker         const DrawProc fDrawProc;
311*c8dee2aaSAndroid Build Coastguard Worker     };
312*c8dee2aaSAndroid Build Coastguard Worker #endif
313*c8dee2aaSAndroid Build Coastguard Worker }  // namespace skiagm
314*c8dee2aaSAndroid Build Coastguard Worker 
315*c8dee2aaSAndroid Build Coastguard Worker void MarkGMGood(SkCanvas*, SkScalar x, SkScalar y);
316*c8dee2aaSAndroid Build Coastguard Worker void MarkGMBad (SkCanvas*, SkScalar x, SkScalar y);
317*c8dee2aaSAndroid Build Coastguard Worker 
318*c8dee2aaSAndroid Build Coastguard Worker #endif
319