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