1*c8dee2aaSAndroid Build Coastguard Worker /* 2*c8dee2aaSAndroid Build Coastguard Worker * Copyright 2015 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 DMSrcSink_DEFINED 9*c8dee2aaSAndroid Build Coastguard Worker #define DMSrcSink_DEFINED 10*c8dee2aaSAndroid Build Coastguard Worker 11*c8dee2aaSAndroid Build Coastguard Worker #include "gm/gm.h" 12*c8dee2aaSAndroid Build Coastguard Worker #include "include/core/SkBitmap.h" 13*c8dee2aaSAndroid Build Coastguard Worker #include "include/core/SkCanvas.h" 14*c8dee2aaSAndroid Build Coastguard Worker #include "include/core/SkPicture.h" 15*c8dee2aaSAndroid Build Coastguard Worker #include "include/docs/SkMultiPictureDocument.h" 16*c8dee2aaSAndroid Build Coastguard Worker #include "include/gpu/graphite/PrecompileContext.h" 17*c8dee2aaSAndroid Build Coastguard Worker #include "tools/flags/CommonFlagsConfig.h" 18*c8dee2aaSAndroid Build Coastguard Worker #include "tools/gpu/MemoryCache.h" 19*c8dee2aaSAndroid Build Coastguard Worker 20*c8dee2aaSAndroid Build Coastguard Worker #include <functional> 21*c8dee2aaSAndroid Build Coastguard Worker 22*c8dee2aaSAndroid Build Coastguard Worker #if !defined (SK_DISABLE_LEGACY_TESTS) 23*c8dee2aaSAndroid Build Coastguard Worker #include "include/gpu/graphite/ContextOptions.h" 24*c8dee2aaSAndroid Build Coastguard Worker #include "tools/graphite/TestOptions.h" 25*c8dee2aaSAndroid Build Coastguard Worker #endif 26*c8dee2aaSAndroid Build Coastguard Worker 27*c8dee2aaSAndroid Build Coastguard Worker //#define TEST_VIA_SVG 28*c8dee2aaSAndroid Build Coastguard Worker 29*c8dee2aaSAndroid Build Coastguard Worker namespace skiagm::verifiers { 30*c8dee2aaSAndroid Build Coastguard Worker class VerifierList; 31*c8dee2aaSAndroid Build Coastguard Worker } 32*c8dee2aaSAndroid Build Coastguard Worker namespace DM { 33*c8dee2aaSAndroid Build Coastguard Worker 34*c8dee2aaSAndroid Build Coastguard Worker // This is just convenience. It lets you use either return "foo" or return SkStringPrintf(...). 35*c8dee2aaSAndroid Build Coastguard Worker struct ImplicitString : public SkString { 36*c8dee2aaSAndroid Build Coastguard Worker template <typename T> ImplicitStringImplicitString37*c8dee2aaSAndroid Build Coastguard Worker ImplicitString(const T& s) : SkString(s) {} ImplicitStringImplicitString38*c8dee2aaSAndroid Build Coastguard Worker ImplicitString() : SkString("") {} 39*c8dee2aaSAndroid Build Coastguard Worker }; 40*c8dee2aaSAndroid Build Coastguard Worker typedef ImplicitString Name; 41*c8dee2aaSAndroid Build Coastguard Worker typedef ImplicitString Path; 42*c8dee2aaSAndroid Build Coastguard Worker 43*c8dee2aaSAndroid Build Coastguard Worker class Result { 44*c8dee2aaSAndroid Build Coastguard Worker public: 45*c8dee2aaSAndroid Build Coastguard Worker enum class Status : int { Ok, Fatal, Skip }; 46*c8dee2aaSAndroid Build Coastguard Worker Result(Status status,SkString msg)47*c8dee2aaSAndroid Build Coastguard Worker Result(Status status, SkString msg) : fMsg(std::move(msg)), fStatus(status) {} 48*c8dee2aaSAndroid Build Coastguard Worker 49*c8dee2aaSAndroid Build Coastguard Worker Result(const Result&) = default; 50*c8dee2aaSAndroid Build Coastguard Worker Result& operator=(const Result&) = default; 51*c8dee2aaSAndroid Build Coastguard Worker Ok()52*c8dee2aaSAndroid Build Coastguard Worker static Result Ok() { return Result{Status::Ok, {}}; } 53*c8dee2aaSAndroid Build Coastguard Worker Fatal(const char * fmt,...)54*c8dee2aaSAndroid Build Coastguard Worker static Result Fatal(const char* fmt, ...) SK_PRINTF_LIKE(1, 2) { 55*c8dee2aaSAndroid Build Coastguard Worker SkString msg; 56*c8dee2aaSAndroid Build Coastguard Worker va_list args; 57*c8dee2aaSAndroid Build Coastguard Worker va_start(args, fmt); 58*c8dee2aaSAndroid Build Coastguard Worker msg.printVAList(fmt, args); 59*c8dee2aaSAndroid Build Coastguard Worker va_end(args); 60*c8dee2aaSAndroid Build Coastguard Worker 61*c8dee2aaSAndroid Build Coastguard Worker return Result{Status::Fatal, std::move(msg)}; 62*c8dee2aaSAndroid Build Coastguard Worker } 63*c8dee2aaSAndroid Build Coastguard Worker Skip(const char * fmt,...)64*c8dee2aaSAndroid Build Coastguard Worker static Result Skip(const char* fmt, ...) SK_PRINTF_LIKE(1, 2) { 65*c8dee2aaSAndroid Build Coastguard Worker SkString msg; 66*c8dee2aaSAndroid Build Coastguard Worker va_list args; 67*c8dee2aaSAndroid Build Coastguard Worker va_start(args, fmt); 68*c8dee2aaSAndroid Build Coastguard Worker msg.printVAList(fmt, args); 69*c8dee2aaSAndroid Build Coastguard Worker va_end(args); 70*c8dee2aaSAndroid Build Coastguard Worker 71*c8dee2aaSAndroid Build Coastguard Worker return Result{Status::Skip, std::move(msg)}; 72*c8dee2aaSAndroid Build Coastguard Worker } 73*c8dee2aaSAndroid Build Coastguard Worker isOk()74*c8dee2aaSAndroid Build Coastguard Worker bool isOk() { return fStatus == Status::Ok; } isFatal()75*c8dee2aaSAndroid Build Coastguard Worker bool isFatal() { return fStatus == Status::Fatal; } isSkip()76*c8dee2aaSAndroid Build Coastguard Worker bool isSkip() { return fStatus == Status::Skip; } 77*c8dee2aaSAndroid Build Coastguard Worker c_str()78*c8dee2aaSAndroid Build Coastguard Worker const char* c_str() const { return fMsg.c_str(); } status()79*c8dee2aaSAndroid Build Coastguard Worker Status status() const { return fStatus; } 80*c8dee2aaSAndroid Build Coastguard Worker 81*c8dee2aaSAndroid Build Coastguard Worker private: 82*c8dee2aaSAndroid Build Coastguard Worker SkString fMsg; 83*c8dee2aaSAndroid Build Coastguard Worker Status fStatus; 84*c8dee2aaSAndroid Build Coastguard Worker }; 85*c8dee2aaSAndroid Build Coastguard Worker 86*c8dee2aaSAndroid Build Coastguard Worker struct SinkFlags { 87*c8dee2aaSAndroid Build Coastguard Worker enum Type { kNull, kGPU, kVector, kRaster } type; 88*c8dee2aaSAndroid Build Coastguard Worker enum Approach { kDirect, kIndirect } approach; 89*c8dee2aaSAndroid Build Coastguard Worker enum Multisampled { kNotMultisampled, kMultisampled } multisampled; 90*c8dee2aaSAndroid Build Coastguard Worker SinkFlags(Type t, Approach a, Multisampled ms = kNotMultisampled) typeSinkFlags91*c8dee2aaSAndroid Build Coastguard Worker : type(t), approach(a), multisampled(ms) {} 92*c8dee2aaSAndroid Build Coastguard Worker }; 93*c8dee2aaSAndroid Build Coastguard Worker 94*c8dee2aaSAndroid Build Coastguard Worker struct Src { 95*c8dee2aaSAndroid Build Coastguard Worker using GraphiteTestContext = skiatest::graphite::GraphiteTestContext; 96*c8dee2aaSAndroid Build Coastguard Worker ~SrcSrc97*c8dee2aaSAndroid Build Coastguard Worker virtual ~Src() {} 98*c8dee2aaSAndroid Build Coastguard Worker [[nodiscard]] virtual Result draw(SkCanvas* canvas, GraphiteTestContext*) const = 0; 99*c8dee2aaSAndroid Build Coastguard Worker virtual SkISize size() const = 0; 100*c8dee2aaSAndroid Build Coastguard Worker virtual Name name() const = 0; modifyGrContextOptionsSrc101*c8dee2aaSAndroid Build Coastguard Worker virtual void modifyGrContextOptions(GrContextOptions*) const {} modifyGraphiteContextOptionsSrc102*c8dee2aaSAndroid Build Coastguard Worker virtual void modifyGraphiteContextOptions(skgpu::graphite::ContextOptions*) const {} vetoSrc103*c8dee2aaSAndroid Build Coastguard Worker virtual bool veto(SinkFlags) const { return false; } 104*c8dee2aaSAndroid Build Coastguard Worker pageCountSrc105*c8dee2aaSAndroid Build Coastguard Worker virtual int pageCount() const { return 1; } drawSrc106*c8dee2aaSAndroid Build Coastguard Worker [[nodiscard]] virtual Result draw([[maybe_unused]] int page, 107*c8dee2aaSAndroid Build Coastguard Worker SkCanvas* canvas, 108*c8dee2aaSAndroid Build Coastguard Worker GraphiteTestContext* graphiteTestContext) const { 109*c8dee2aaSAndroid Build Coastguard Worker return this->draw(canvas, graphiteTestContext); 110*c8dee2aaSAndroid Build Coastguard Worker } sizeSrc111*c8dee2aaSAndroid Build Coastguard Worker virtual SkISize size([[maybe_unused]] int page) const { return this->size(); } 112*c8dee2aaSAndroid Build Coastguard Worker // Force Tasks using this Src to run on the main thread? serialSrc113*c8dee2aaSAndroid Build Coastguard Worker virtual bool serial() const { return false; } 114*c8dee2aaSAndroid Build Coastguard Worker }; 115*c8dee2aaSAndroid Build Coastguard Worker 116*c8dee2aaSAndroid Build Coastguard Worker struct Sink { ~SinkSink117*c8dee2aaSAndroid Build Coastguard Worker virtual ~Sink() {} 118*c8dee2aaSAndroid Build Coastguard Worker // You may write to either the bitmap or stream. If you write to log, we'll print that out. 119*c8dee2aaSAndroid Build Coastguard Worker [[nodiscard]] virtual Result draw(const Src&, SkBitmap*, SkWStream*, SkString* log) const = 0; 120*c8dee2aaSAndroid Build Coastguard Worker 121*c8dee2aaSAndroid Build Coastguard Worker // Override the color space of this Sink, after creation setColorSpaceSink122*c8dee2aaSAndroid Build Coastguard Worker virtual void setColorSpace(sk_sp<SkColorSpace>) {} 123*c8dee2aaSAndroid Build Coastguard Worker 124*c8dee2aaSAndroid Build Coastguard Worker // Force Tasks using this Sink to run on the main thread? serialSink125*c8dee2aaSAndroid Build Coastguard Worker virtual bool serial() const { return false; } 126*c8dee2aaSAndroid Build Coastguard Worker 127*c8dee2aaSAndroid Build Coastguard Worker // File extension for the content draw() outputs, e.g. "png", "pdf". 128*c8dee2aaSAndroid Build Coastguard Worker virtual const char* fileExtension() const = 0; 129*c8dee2aaSAndroid Build Coastguard Worker 130*c8dee2aaSAndroid Build Coastguard Worker virtual SinkFlags flags() const = 0; 131*c8dee2aaSAndroid Build Coastguard Worker 132*c8dee2aaSAndroid Build Coastguard Worker /** Returns the color type and space used by the sink. */ colorInfoSink133*c8dee2aaSAndroid Build Coastguard Worker virtual SkColorInfo colorInfo() const { return SkColorInfo(); } 134*c8dee2aaSAndroid Build Coastguard Worker }; 135*c8dee2aaSAndroid Build Coastguard Worker 136*c8dee2aaSAndroid Build Coastguard Worker /*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*/ 137*c8dee2aaSAndroid Build Coastguard Worker 138*c8dee2aaSAndroid Build Coastguard Worker class GMSrc : public Src { 139*c8dee2aaSAndroid Build Coastguard Worker public: 140*c8dee2aaSAndroid Build Coastguard Worker explicit GMSrc(skiagm::GMFactory); 141*c8dee2aaSAndroid Build Coastguard Worker 142*c8dee2aaSAndroid Build Coastguard Worker Result draw(SkCanvas*, GraphiteTestContext*) const override; 143*c8dee2aaSAndroid Build Coastguard Worker SkISize size() const override; 144*c8dee2aaSAndroid Build Coastguard Worker Name name() const override; 145*c8dee2aaSAndroid Build Coastguard Worker void modifyGrContextOptions(GrContextOptions* options) const override; 146*c8dee2aaSAndroid Build Coastguard Worker #if defined(SK_GRAPHITE) 147*c8dee2aaSAndroid Build Coastguard Worker void modifyGraphiteContextOptions(skgpu::graphite::ContextOptions*) const override; 148*c8dee2aaSAndroid Build Coastguard Worker #endif 149*c8dee2aaSAndroid Build Coastguard Worker 150*c8dee2aaSAndroid Build Coastguard Worker private: 151*c8dee2aaSAndroid Build Coastguard Worker skiagm::GMFactory fFactory; 152*c8dee2aaSAndroid Build Coastguard Worker }; 153*c8dee2aaSAndroid Build Coastguard Worker 154*c8dee2aaSAndroid Build Coastguard Worker class CodecSrc : public Src { 155*c8dee2aaSAndroid Build Coastguard Worker public: 156*c8dee2aaSAndroid Build Coastguard Worker enum Mode { 157*c8dee2aaSAndroid Build Coastguard Worker kCodec_Mode, 158*c8dee2aaSAndroid Build Coastguard Worker // We choose to test only one mode with zero initialized memory. 159*c8dee2aaSAndroid Build Coastguard Worker // This will exercise all of the interesting cases in SkSwizzler 160*c8dee2aaSAndroid Build Coastguard Worker // without doubling the size of our test suite. 161*c8dee2aaSAndroid Build Coastguard Worker kCodecZeroInit_Mode, 162*c8dee2aaSAndroid Build Coastguard Worker kScanline_Mode, 163*c8dee2aaSAndroid Build Coastguard Worker kStripe_Mode, // Tests the skipping of scanlines 164*c8dee2aaSAndroid Build Coastguard Worker kCroppedScanline_Mode, // Tests (jpeg) cropped scanline optimization 165*c8dee2aaSAndroid Build Coastguard Worker kSubset_Mode, // For codecs that support subsets directly. 166*c8dee2aaSAndroid Build Coastguard Worker kAnimated_Mode, // For codecs that support animation. 167*c8dee2aaSAndroid Build Coastguard Worker }; 168*c8dee2aaSAndroid Build Coastguard Worker enum DstColorType { 169*c8dee2aaSAndroid Build Coastguard Worker kGetFromCanvas_DstColorType, 170*c8dee2aaSAndroid Build Coastguard Worker kGrayscale_Always_DstColorType, 171*c8dee2aaSAndroid Build Coastguard Worker kNonNative8888_Always_DstColorType, 172*c8dee2aaSAndroid Build Coastguard Worker }; 173*c8dee2aaSAndroid Build Coastguard Worker CodecSrc(Path, Mode, DstColorType, SkAlphaType, float); 174*c8dee2aaSAndroid Build Coastguard Worker 175*c8dee2aaSAndroid Build Coastguard Worker Result draw(SkCanvas*, GraphiteTestContext*) const override; 176*c8dee2aaSAndroid Build Coastguard Worker SkISize size() const override; 177*c8dee2aaSAndroid Build Coastguard Worker Name name() const override; veto(SinkFlags)178*c8dee2aaSAndroid Build Coastguard Worker bool veto(SinkFlags) const override; 179*c8dee2aaSAndroid Build Coastguard Worker bool serial() const override { return fRunSerially; } 180*c8dee2aaSAndroid Build Coastguard Worker private: 181*c8dee2aaSAndroid Build Coastguard Worker Path fPath; 182*c8dee2aaSAndroid Build Coastguard Worker Mode fMode; 183*c8dee2aaSAndroid Build Coastguard Worker DstColorType fDstColorType; 184*c8dee2aaSAndroid Build Coastguard Worker SkAlphaType fDstAlphaType; 185*c8dee2aaSAndroid Build Coastguard Worker float fScale; 186*c8dee2aaSAndroid Build Coastguard Worker bool fRunSerially; 187*c8dee2aaSAndroid Build Coastguard Worker }; 188*c8dee2aaSAndroid Build Coastguard Worker 189*c8dee2aaSAndroid Build Coastguard Worker class AndroidCodecSrc : public Src { 190*c8dee2aaSAndroid Build Coastguard Worker public: 191*c8dee2aaSAndroid Build Coastguard Worker AndroidCodecSrc(Path, CodecSrc::DstColorType, SkAlphaType, int sampleSize); 192*c8dee2aaSAndroid Build Coastguard Worker 193*c8dee2aaSAndroid Build Coastguard Worker Result draw(SkCanvas*, GraphiteTestContext*) const override; 194*c8dee2aaSAndroid Build Coastguard Worker SkISize size() const override; 195*c8dee2aaSAndroid Build Coastguard Worker Name name() const override; veto(SinkFlags)196*c8dee2aaSAndroid Build Coastguard Worker bool veto(SinkFlags) const override; 197*c8dee2aaSAndroid Build Coastguard Worker bool serial() const override { return fRunSerially; } 198*c8dee2aaSAndroid Build Coastguard Worker private: 199*c8dee2aaSAndroid Build Coastguard Worker Path fPath; 200*c8dee2aaSAndroid Build Coastguard Worker CodecSrc::DstColorType fDstColorType; 201*c8dee2aaSAndroid Build Coastguard Worker SkAlphaType fDstAlphaType; 202*c8dee2aaSAndroid Build Coastguard Worker int fSampleSize; 203*c8dee2aaSAndroid Build Coastguard Worker bool fRunSerially; 204*c8dee2aaSAndroid Build Coastguard Worker }; 205*c8dee2aaSAndroid Build Coastguard Worker 206*c8dee2aaSAndroid Build Coastguard Worker #ifdef SK_ENABLE_ANDROID_UTILS 207*c8dee2aaSAndroid Build Coastguard Worker // Allows for testing of various implementations of Android's BitmapRegionDecoder 208*c8dee2aaSAndroid Build Coastguard Worker class BRDSrc : public Src { 209*c8dee2aaSAndroid Build Coastguard Worker public: 210*c8dee2aaSAndroid Build Coastguard Worker enum Mode { 211*c8dee2aaSAndroid Build Coastguard Worker // Decode the entire image as one region. 212*c8dee2aaSAndroid Build Coastguard Worker kFullImage_Mode, 213*c8dee2aaSAndroid Build Coastguard Worker // Splits the image into multiple regions using a divisor and decodes the regions 214*c8dee2aaSAndroid Build Coastguard Worker // separately. Also, this test adds a border of a few pixels to each of the regions 215*c8dee2aaSAndroid Build Coastguard Worker // that it is decoding. This tests the behavior when a client asks for a region that 216*c8dee2aaSAndroid Build Coastguard Worker // does not fully fit in the image. 217*c8dee2aaSAndroid Build Coastguard Worker kDivisor_Mode, 218*c8dee2aaSAndroid Build Coastguard Worker }; 219*c8dee2aaSAndroid Build Coastguard Worker 220*c8dee2aaSAndroid Build Coastguard Worker BRDSrc(Path, Mode, CodecSrc::DstColorType, uint32_t); 221*c8dee2aaSAndroid Build Coastguard Worker 222*c8dee2aaSAndroid Build Coastguard Worker Result draw(SkCanvas*, GraphiteTestContext*) const override; 223*c8dee2aaSAndroid Build Coastguard Worker SkISize size() const override; 224*c8dee2aaSAndroid Build Coastguard Worker Name name() const override; 225*c8dee2aaSAndroid Build Coastguard Worker bool veto(SinkFlags) const override; 226*c8dee2aaSAndroid Build Coastguard Worker private: 227*c8dee2aaSAndroid Build Coastguard Worker Path fPath; 228*c8dee2aaSAndroid Build Coastguard Worker Mode fMode; 229*c8dee2aaSAndroid Build Coastguard Worker CodecSrc::DstColorType fDstColorType; 230*c8dee2aaSAndroid Build Coastguard Worker uint32_t fSampleSize; 231*c8dee2aaSAndroid Build Coastguard Worker }; 232*c8dee2aaSAndroid Build Coastguard Worker #endif 233*c8dee2aaSAndroid Build Coastguard Worker 234*c8dee2aaSAndroid Build Coastguard Worker class ImageGenSrc : public Src { 235*c8dee2aaSAndroid Build Coastguard Worker public: 236*c8dee2aaSAndroid Build Coastguard Worker enum Mode { 237*c8dee2aaSAndroid Build Coastguard Worker kCodec_Mode, // Use CodecImageGenerator 238*c8dee2aaSAndroid Build Coastguard Worker kPlatform_Mode, // Uses CG or WIC 239*c8dee2aaSAndroid Build Coastguard Worker }; 240*c8dee2aaSAndroid Build Coastguard Worker ImageGenSrc(Path, Mode, SkAlphaType, bool); 241*c8dee2aaSAndroid Build Coastguard Worker 242*c8dee2aaSAndroid Build Coastguard Worker Result draw(SkCanvas*, GraphiteTestContext*) const override; 243*c8dee2aaSAndroid Build Coastguard Worker SkISize size() const override; 244*c8dee2aaSAndroid Build Coastguard Worker Name name() const override; veto(SinkFlags)245*c8dee2aaSAndroid Build Coastguard Worker bool veto(SinkFlags) const override; 246*c8dee2aaSAndroid Build Coastguard Worker bool serial() const override { return fRunSerially; } 247*c8dee2aaSAndroid Build Coastguard Worker private: 248*c8dee2aaSAndroid Build Coastguard Worker Path fPath; 249*c8dee2aaSAndroid Build Coastguard Worker Mode fMode; 250*c8dee2aaSAndroid Build Coastguard Worker SkAlphaType fDstAlphaType; 251*c8dee2aaSAndroid Build Coastguard Worker bool fIsGpu; 252*c8dee2aaSAndroid Build Coastguard Worker bool fRunSerially; 253*c8dee2aaSAndroid Build Coastguard Worker }; 254*c8dee2aaSAndroid Build Coastguard Worker 255*c8dee2aaSAndroid Build Coastguard Worker class ColorCodecSrc : public Src { 256*c8dee2aaSAndroid Build Coastguard Worker public: 257*c8dee2aaSAndroid Build Coastguard Worker ColorCodecSrc(Path, bool decode_to_dst); 258*c8dee2aaSAndroid Build Coastguard Worker 259*c8dee2aaSAndroid Build Coastguard Worker Result draw(SkCanvas*, GraphiteTestContext*) const override; 260*c8dee2aaSAndroid Build Coastguard Worker SkISize size() const override; 261*c8dee2aaSAndroid Build Coastguard Worker Name name() const override; 262*c8dee2aaSAndroid Build Coastguard Worker bool veto(SinkFlags) const override; 263*c8dee2aaSAndroid Build Coastguard Worker private: 264*c8dee2aaSAndroid Build Coastguard Worker Path fPath; 265*c8dee2aaSAndroid Build Coastguard Worker bool fDecodeToDst; 266*c8dee2aaSAndroid Build Coastguard Worker }; 267*c8dee2aaSAndroid Build Coastguard Worker 268*c8dee2aaSAndroid Build Coastguard Worker class SKPSrc : public Src { 269*c8dee2aaSAndroid Build Coastguard Worker public: 270*c8dee2aaSAndroid Build Coastguard Worker explicit SKPSrc(Path path); 271*c8dee2aaSAndroid Build Coastguard Worker 272*c8dee2aaSAndroid Build Coastguard Worker Result draw(SkCanvas*, GraphiteTestContext*) const override; 273*c8dee2aaSAndroid Build Coastguard Worker SkISize size() const override; 274*c8dee2aaSAndroid Build Coastguard Worker Name name() const override; 275*c8dee2aaSAndroid Build Coastguard Worker private: 276*c8dee2aaSAndroid Build Coastguard Worker Path fPath; 277*c8dee2aaSAndroid Build Coastguard Worker }; 278*c8dee2aaSAndroid Build Coastguard Worker 279*c8dee2aaSAndroid Build Coastguard Worker // This class extracts all the paths from an SKP and then removes unwanted paths according to the 280*c8dee2aaSAndroid Build Coastguard Worker // provided l/r trail. It then just draws the remaining paths. (Non-path draws are thrown out.) It 281*c8dee2aaSAndroid Build Coastguard Worker // is useful for finding a reduced repo case for path drawing bugs. 282*c8dee2aaSAndroid Build Coastguard Worker class BisectSrc : public SKPSrc { 283*c8dee2aaSAndroid Build Coastguard Worker public: 284*c8dee2aaSAndroid Build Coastguard Worker explicit BisectSrc(Path path, const char* trail); 285*c8dee2aaSAndroid Build Coastguard Worker 286*c8dee2aaSAndroid Build Coastguard Worker Result draw(SkCanvas*, GraphiteTestContext*) const override; 287*c8dee2aaSAndroid Build Coastguard Worker 288*c8dee2aaSAndroid Build Coastguard Worker private: 289*c8dee2aaSAndroid Build Coastguard Worker SkString fTrail; 290*c8dee2aaSAndroid Build Coastguard Worker 291*c8dee2aaSAndroid Build Coastguard Worker using INHERITED = SKPSrc; 292*c8dee2aaSAndroid Build Coastguard Worker }; 293*c8dee2aaSAndroid Build Coastguard Worker 294*c8dee2aaSAndroid Build Coastguard Worker #if defined(SK_ENABLE_SKOTTIE) 295*c8dee2aaSAndroid Build Coastguard Worker class SkottieSrc final : public Src { 296*c8dee2aaSAndroid Build Coastguard Worker public: 297*c8dee2aaSAndroid Build Coastguard Worker explicit SkottieSrc(Path path); 298*c8dee2aaSAndroid Build Coastguard Worker 299*c8dee2aaSAndroid Build Coastguard Worker Result draw(SkCanvas*, GraphiteTestContext*) const override; 300*c8dee2aaSAndroid Build Coastguard Worker SkISize size() const override; 301*c8dee2aaSAndroid Build Coastguard Worker Name name() const override; 302*c8dee2aaSAndroid Build Coastguard Worker bool veto(SinkFlags) const override; 303*c8dee2aaSAndroid Build Coastguard Worker 304*c8dee2aaSAndroid Build Coastguard Worker private: 305*c8dee2aaSAndroid Build Coastguard Worker // Generates a kTileCount x kTileCount filmstrip with evenly distributed frames. 306*c8dee2aaSAndroid Build Coastguard Worker inline static constexpr int kTileCount = 5; 307*c8dee2aaSAndroid Build Coastguard Worker 308*c8dee2aaSAndroid Build Coastguard Worker // Fit kTileCount x kTileCount frames to a 1000x1000 film strip. 309*c8dee2aaSAndroid Build Coastguard Worker inline static constexpr SkScalar kTargetSize = 1000; 310*c8dee2aaSAndroid Build Coastguard Worker inline static constexpr SkScalar kTileSize = kTargetSize / kTileCount; 311*c8dee2aaSAndroid Build Coastguard Worker 312*c8dee2aaSAndroid Build Coastguard Worker Path fPath; 313*c8dee2aaSAndroid Build Coastguard Worker }; 314*c8dee2aaSAndroid Build Coastguard Worker #endif 315*c8dee2aaSAndroid Build Coastguard Worker 316*c8dee2aaSAndroid Build Coastguard Worker #if defined(SK_ENABLE_SVG) 317*c8dee2aaSAndroid Build Coastguard Worker } // namespace DM 318*c8dee2aaSAndroid Build Coastguard Worker 319*c8dee2aaSAndroid Build Coastguard Worker class SkSVGDOM; 320*c8dee2aaSAndroid Build Coastguard Worker 321*c8dee2aaSAndroid Build Coastguard Worker namespace DM { 322*c8dee2aaSAndroid Build Coastguard Worker 323*c8dee2aaSAndroid Build Coastguard Worker class SVGSrc : public Src { 324*c8dee2aaSAndroid Build Coastguard Worker public: 325*c8dee2aaSAndroid Build Coastguard Worker explicit SVGSrc(Path path); 326*c8dee2aaSAndroid Build Coastguard Worker 327*c8dee2aaSAndroid Build Coastguard Worker Result draw(SkCanvas*, GraphiteTestContext*) const override; 328*c8dee2aaSAndroid Build Coastguard Worker SkISize size() const override; 329*c8dee2aaSAndroid Build Coastguard Worker Name name() const override; 330*c8dee2aaSAndroid Build Coastguard Worker bool veto(SinkFlags) const override; 331*c8dee2aaSAndroid Build Coastguard Worker 332*c8dee2aaSAndroid Build Coastguard Worker private: 333*c8dee2aaSAndroid Build Coastguard Worker Name fName; 334*c8dee2aaSAndroid Build Coastguard Worker sk_sp<SkSVGDOM> fDom; 335*c8dee2aaSAndroid Build Coastguard Worker SkScalar fScale; 336*c8dee2aaSAndroid Build Coastguard Worker 337*c8dee2aaSAndroid Build Coastguard Worker using INHERITED = Src; 338*c8dee2aaSAndroid Build Coastguard Worker }; 339*c8dee2aaSAndroid Build Coastguard Worker #endif // SK_ENABLE_SVG 340*c8dee2aaSAndroid Build Coastguard Worker /*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*/ 341*c8dee2aaSAndroid Build Coastguard Worker 342*c8dee2aaSAndroid Build Coastguard Worker class MSKPSrc : public Src { 343*c8dee2aaSAndroid Build Coastguard Worker public: 344*c8dee2aaSAndroid Build Coastguard Worker explicit MSKPSrc(Path path); 345*c8dee2aaSAndroid Build Coastguard Worker 346*c8dee2aaSAndroid Build Coastguard Worker int pageCount() const override; 347*c8dee2aaSAndroid Build Coastguard Worker Result draw(SkCanvas* c, GraphiteTestContext*) const override; 348*c8dee2aaSAndroid Build Coastguard Worker Result draw(int, SkCanvas*, GraphiteTestContext*) const override; 349*c8dee2aaSAndroid Build Coastguard Worker SkISize size() const override; 350*c8dee2aaSAndroid Build Coastguard Worker SkISize size(int) const override; 351*c8dee2aaSAndroid Build Coastguard Worker Name name() const override; 352*c8dee2aaSAndroid Build Coastguard Worker 353*c8dee2aaSAndroid Build Coastguard Worker private: 354*c8dee2aaSAndroid Build Coastguard Worker Path fPath; 355*c8dee2aaSAndroid Build Coastguard Worker mutable skia_private::TArray<SkDocumentPage> fPages; 356*c8dee2aaSAndroid Build Coastguard Worker }; 357*c8dee2aaSAndroid Build Coastguard Worker 358*c8dee2aaSAndroid Build Coastguard Worker /*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*/ 359*c8dee2aaSAndroid Build Coastguard Worker 360*c8dee2aaSAndroid Build Coastguard Worker class NullSink : public Sink { 361*c8dee2aaSAndroid Build Coastguard Worker public: NullSink()362*c8dee2aaSAndroid Build Coastguard Worker NullSink() {} 363*c8dee2aaSAndroid Build Coastguard Worker 364*c8dee2aaSAndroid Build Coastguard Worker Result draw(const Src& src, SkBitmap*, SkWStream*, SkString*) const override; fileExtension()365*c8dee2aaSAndroid Build Coastguard Worker const char* fileExtension() const override { return ""; } flags()366*c8dee2aaSAndroid Build Coastguard Worker SinkFlags flags() const override { return SinkFlags{ SinkFlags::kNull, SinkFlags::kDirect }; } 367*c8dee2aaSAndroid Build Coastguard Worker }; 368*c8dee2aaSAndroid Build Coastguard Worker 369*c8dee2aaSAndroid Build Coastguard Worker class GPUSink : public Sink { 370*c8dee2aaSAndroid Build Coastguard Worker public: 371*c8dee2aaSAndroid Build Coastguard Worker GPUSink(const SkCommandLineConfigGpu*, const GrContextOptions&); 372*c8dee2aaSAndroid Build Coastguard Worker 373*c8dee2aaSAndroid Build Coastguard Worker Result draw(const Src&, SkBitmap*, SkWStream*, SkString*) const override; 374*c8dee2aaSAndroid Build Coastguard Worker Result onDraw(const Src&, SkBitmap*, SkWStream*, SkString*, 375*c8dee2aaSAndroid Build Coastguard Worker const GrContextOptions& baseOptions, 376*c8dee2aaSAndroid Build Coastguard Worker std::function<void(GrDirectContext*)> initContext = nullptr, 377*c8dee2aaSAndroid Build Coastguard Worker std::function<SkCanvas*(SkCanvas*)> wrapCanvas = nullptr) const; 378*c8dee2aaSAndroid Build Coastguard Worker contextType()379*c8dee2aaSAndroid Build Coastguard Worker skgpu::ContextType contextType() const { return fContextType; } contextOverrides()380*c8dee2aaSAndroid Build Coastguard Worker const sk_gpu_test::GrContextFactory::ContextOverrides& contextOverrides() const { 381*c8dee2aaSAndroid Build Coastguard Worker return fContextOverrides; 382*c8dee2aaSAndroid Build Coastguard Worker } surfType()383*c8dee2aaSAndroid Build Coastguard Worker SkCommandLineConfigGpu::SurfType surfType() const { return fSurfType; } serial()384*c8dee2aaSAndroid Build Coastguard Worker bool serial() const override { return true; } fileExtension()385*c8dee2aaSAndroid Build Coastguard Worker const char* fileExtension() const override { return "png"; } flags()386*c8dee2aaSAndroid Build Coastguard Worker SinkFlags flags() const override { 387*c8dee2aaSAndroid Build Coastguard Worker SinkFlags::Multisampled ms = fSampleCount > 1 ? SinkFlags::kMultisampled 388*c8dee2aaSAndroid Build Coastguard Worker : SinkFlags::kNotMultisampled; 389*c8dee2aaSAndroid Build Coastguard Worker return SinkFlags{ SinkFlags::kGPU, SinkFlags::kDirect, ms }; 390*c8dee2aaSAndroid Build Coastguard Worker } baseContextOptions()391*c8dee2aaSAndroid Build Coastguard Worker const GrContextOptions& baseContextOptions() const { return fBaseContextOptions; } setColorSpace(sk_sp<SkColorSpace> colorSpace)392*c8dee2aaSAndroid Build Coastguard Worker void setColorSpace(sk_sp<SkColorSpace> colorSpace) override { fColorSpace = colorSpace; } colorInfo()393*c8dee2aaSAndroid Build Coastguard Worker SkColorInfo colorInfo() const override { 394*c8dee2aaSAndroid Build Coastguard Worker return SkColorInfo(fColorType, fAlphaType, fColorSpace); 395*c8dee2aaSAndroid Build Coastguard Worker } 396*c8dee2aaSAndroid Build Coastguard Worker 397*c8dee2aaSAndroid Build Coastguard Worker protected: 398*c8dee2aaSAndroid Build Coastguard Worker sk_sp<SkSurface> createDstSurface(GrDirectContext*, SkISize size) const; 399*c8dee2aaSAndroid Build Coastguard Worker bool readBack(SkSurface*, SkBitmap* dst) const; 400*c8dee2aaSAndroid Build Coastguard Worker 401*c8dee2aaSAndroid Build Coastguard Worker private: 402*c8dee2aaSAndroid Build Coastguard Worker skgpu::ContextType fContextType; 403*c8dee2aaSAndroid Build Coastguard Worker sk_gpu_test::GrContextFactory::ContextOverrides fContextOverrides; 404*c8dee2aaSAndroid Build Coastguard Worker SkCommandLineConfigGpu::SurfType fSurfType; 405*c8dee2aaSAndroid Build Coastguard Worker int fSampleCount; 406*c8dee2aaSAndroid Build Coastguard Worker uint32_t fSurfaceFlags; 407*c8dee2aaSAndroid Build Coastguard Worker SkColorType fColorType; 408*c8dee2aaSAndroid Build Coastguard Worker SkAlphaType fAlphaType; 409*c8dee2aaSAndroid Build Coastguard Worker sk_sp<SkColorSpace> fColorSpace; 410*c8dee2aaSAndroid Build Coastguard Worker GrContextOptions fBaseContextOptions; 411*c8dee2aaSAndroid Build Coastguard Worker sk_gpu_test::MemoryCache fMemoryCache; 412*c8dee2aaSAndroid Build Coastguard Worker }; 413*c8dee2aaSAndroid Build Coastguard Worker 414*c8dee2aaSAndroid Build Coastguard Worker // Wrap a gpu canvas in one that routes all text draws through Slugs. 415*c8dee2aaSAndroid Build Coastguard Worker // Note that text blobs that have an RSXForm aren't converted. 416*c8dee2aaSAndroid Build Coastguard Worker class GPUSlugSink : public GPUSink { 417*c8dee2aaSAndroid Build Coastguard Worker public: 418*c8dee2aaSAndroid Build Coastguard Worker GPUSlugSink(const SkCommandLineConfigGpu*, const GrContextOptions&); 419*c8dee2aaSAndroid Build Coastguard Worker 420*c8dee2aaSAndroid Build Coastguard Worker Result draw(const Src&, SkBitmap*, SkWStream*, SkString*) const override; 421*c8dee2aaSAndroid Build Coastguard Worker }; 422*c8dee2aaSAndroid Build Coastguard Worker 423*c8dee2aaSAndroid Build Coastguard Worker class GPUSerializeSlugSink : public GPUSink { 424*c8dee2aaSAndroid Build Coastguard Worker public: 425*c8dee2aaSAndroid Build Coastguard Worker GPUSerializeSlugSink(const SkCommandLineConfigGpu*, const GrContextOptions&); 426*c8dee2aaSAndroid Build Coastguard Worker 427*c8dee2aaSAndroid Build Coastguard Worker Result draw(const Src&, SkBitmap*, SkWStream*, SkString*) const override; 428*c8dee2aaSAndroid Build Coastguard Worker }; 429*c8dee2aaSAndroid Build Coastguard Worker 430*c8dee2aaSAndroid Build Coastguard Worker class GPURemoteSlugSink : public GPUSink { 431*c8dee2aaSAndroid Build Coastguard Worker public: 432*c8dee2aaSAndroid Build Coastguard Worker GPURemoteSlugSink(const SkCommandLineConfigGpu*, const GrContextOptions&); 433*c8dee2aaSAndroid Build Coastguard Worker 434*c8dee2aaSAndroid Build Coastguard Worker Result draw(const Src&, SkBitmap*, SkWStream*, SkString*) const override; 435*c8dee2aaSAndroid Build Coastguard Worker }; 436*c8dee2aaSAndroid Build Coastguard Worker 437*c8dee2aaSAndroid Build Coastguard Worker class GPUPersistentCacheTestingSink : public GPUSink { 438*c8dee2aaSAndroid Build Coastguard Worker public: 439*c8dee2aaSAndroid Build Coastguard Worker GPUPersistentCacheTestingSink(const SkCommandLineConfigGpu*, const GrContextOptions&); 440*c8dee2aaSAndroid Build Coastguard Worker 441*c8dee2aaSAndroid Build Coastguard Worker Result draw(const Src&, SkBitmap*, SkWStream*, SkString*) const override; 442*c8dee2aaSAndroid Build Coastguard Worker fileExtension()443*c8dee2aaSAndroid Build Coastguard Worker const char* fileExtension() const override { 444*c8dee2aaSAndroid Build Coastguard Worker // Suppress writing out results from this config - we just want to do our matching test 445*c8dee2aaSAndroid Build Coastguard Worker return nullptr; 446*c8dee2aaSAndroid Build Coastguard Worker } 447*c8dee2aaSAndroid Build Coastguard Worker 448*c8dee2aaSAndroid Build Coastguard Worker private: 449*c8dee2aaSAndroid Build Coastguard Worker int fCacheType; 450*c8dee2aaSAndroid Build Coastguard Worker 451*c8dee2aaSAndroid Build Coastguard Worker using INHERITED = GPUSink; 452*c8dee2aaSAndroid Build Coastguard Worker }; 453*c8dee2aaSAndroid Build Coastguard Worker 454*c8dee2aaSAndroid Build Coastguard Worker class GPUPrecompileTestingSink : public GPUSink { 455*c8dee2aaSAndroid Build Coastguard Worker public: 456*c8dee2aaSAndroid Build Coastguard Worker GPUPrecompileTestingSink(const SkCommandLineConfigGpu*, const GrContextOptions&); 457*c8dee2aaSAndroid Build Coastguard Worker 458*c8dee2aaSAndroid Build Coastguard Worker Result draw(const Src&, SkBitmap*, SkWStream*, SkString*) const override; 459*c8dee2aaSAndroid Build Coastguard Worker fileExtension()460*c8dee2aaSAndroid Build Coastguard Worker const char* fileExtension() const override { 461*c8dee2aaSAndroid Build Coastguard Worker // Suppress writing out results from this config - we just want to do our matching test 462*c8dee2aaSAndroid Build Coastguard Worker return nullptr; 463*c8dee2aaSAndroid Build Coastguard Worker } 464*c8dee2aaSAndroid Build Coastguard Worker 465*c8dee2aaSAndroid Build Coastguard Worker private: 466*c8dee2aaSAndroid Build Coastguard Worker using INHERITED = GPUSink; 467*c8dee2aaSAndroid Build Coastguard Worker }; 468*c8dee2aaSAndroid Build Coastguard Worker 469*c8dee2aaSAndroid Build Coastguard Worker // This sink attempts to better simulate the Chrome DDL use-case. It: 470*c8dee2aaSAndroid Build Coastguard Worker // creates the DDLs on separate recording threads 471*c8dee2aaSAndroid Build Coastguard Worker // performs all the GPU work on a separate GPU thread 472*c8dee2aaSAndroid Build Coastguard Worker // In the future this should be expanded to: 473*c8dee2aaSAndroid Build Coastguard Worker // upload on a utility thread w/ access to a shared context 474*c8dee2aaSAndroid Build Coastguard Worker // compile the programs on the utility thread 475*c8dee2aaSAndroid Build Coastguard Worker // perform fine grained scheduling of gpu tasks based on their image and program prerequisites 476*c8dee2aaSAndroid Build Coastguard Worker // create a single "compositing" DDL that is replayed last 477*c8dee2aaSAndroid Build Coastguard Worker class GPUDDLSink : public GPUSink { 478*c8dee2aaSAndroid Build Coastguard Worker public: 479*c8dee2aaSAndroid Build Coastguard Worker GPUDDLSink(const SkCommandLineConfigGpu*, const GrContextOptions&); 480*c8dee2aaSAndroid Build Coastguard Worker 481*c8dee2aaSAndroid Build Coastguard Worker Result draw(const Src&, SkBitmap*, SkWStream*, SkString*) const override; 482*c8dee2aaSAndroid Build Coastguard Worker 483*c8dee2aaSAndroid Build Coastguard Worker private: 484*c8dee2aaSAndroid Build Coastguard Worker Result ddlDraw(const Src&, 485*c8dee2aaSAndroid Build Coastguard Worker sk_sp<SkSurface> dstSurface, 486*c8dee2aaSAndroid Build Coastguard Worker SkTaskGroup* recordingTaskGroup, 487*c8dee2aaSAndroid Build Coastguard Worker SkTaskGroup* gpuTaskGroup, 488*c8dee2aaSAndroid Build Coastguard Worker sk_gpu_test::TestContext* gpuTestCtx, 489*c8dee2aaSAndroid Build Coastguard Worker GrDirectContext* gpuThreadCtx) const; 490*c8dee2aaSAndroid Build Coastguard Worker 491*c8dee2aaSAndroid Build Coastguard Worker std::unique_ptr<SkExecutor> fRecordingExecutor; 492*c8dee2aaSAndroid Build Coastguard Worker std::unique_ptr<SkExecutor> fGPUExecutor; 493*c8dee2aaSAndroid Build Coastguard Worker 494*c8dee2aaSAndroid Build Coastguard Worker using INHERITED = GPUSink; 495*c8dee2aaSAndroid Build Coastguard Worker }; 496*c8dee2aaSAndroid Build Coastguard Worker 497*c8dee2aaSAndroid Build Coastguard Worker class PDFSink : public Sink { 498*c8dee2aaSAndroid Build Coastguard Worker public: PDFSink(bool pdfa,SkScalar rasterDpi)499*c8dee2aaSAndroid Build Coastguard Worker PDFSink(bool pdfa, SkScalar rasterDpi) : fPDFA(pdfa), fRasterDpi(rasterDpi) {} 500*c8dee2aaSAndroid Build Coastguard Worker Result draw(const Src&, SkBitmap*, SkWStream*, SkString*) const override; fileExtension()501*c8dee2aaSAndroid Build Coastguard Worker const char* fileExtension() const override { return "pdf"; } flags()502*c8dee2aaSAndroid Build Coastguard Worker SinkFlags flags() const override { return SinkFlags{ SinkFlags::kVector, SinkFlags::kDirect }; } 503*c8dee2aaSAndroid Build Coastguard Worker 504*c8dee2aaSAndroid Build Coastguard Worker bool fPDFA; 505*c8dee2aaSAndroid Build Coastguard Worker SkScalar fRasterDpi; 506*c8dee2aaSAndroid Build Coastguard Worker }; 507*c8dee2aaSAndroid Build Coastguard Worker 508*c8dee2aaSAndroid Build Coastguard Worker class XPSSink : public Sink { 509*c8dee2aaSAndroid Build Coastguard Worker public: 510*c8dee2aaSAndroid Build Coastguard Worker XPSSink(); 511*c8dee2aaSAndroid Build Coastguard Worker 512*c8dee2aaSAndroid Build Coastguard Worker Result draw(const Src&, SkBitmap*, SkWStream*, SkString*) const override; fileExtension()513*c8dee2aaSAndroid Build Coastguard Worker const char* fileExtension() const override { return "xps"; } flags()514*c8dee2aaSAndroid Build Coastguard Worker SinkFlags flags() const override { return SinkFlags{ SinkFlags::kVector, SinkFlags::kDirect }; } 515*c8dee2aaSAndroid Build Coastguard Worker }; 516*c8dee2aaSAndroid Build Coastguard Worker 517*c8dee2aaSAndroid Build Coastguard Worker class RasterSink : public Sink { 518*c8dee2aaSAndroid Build Coastguard Worker public: 519*c8dee2aaSAndroid Build Coastguard Worker explicit RasterSink(SkColorType); 520*c8dee2aaSAndroid Build Coastguard Worker 521*c8dee2aaSAndroid Build Coastguard Worker Result draw(const Src&, SkBitmap*, SkWStream*, SkString*) const override; fileExtension()522*c8dee2aaSAndroid Build Coastguard Worker const char* fileExtension() const override { return "png"; } flags()523*c8dee2aaSAndroid Build Coastguard Worker SinkFlags flags() const override { return SinkFlags{ SinkFlags::kRaster, SinkFlags::kDirect }; } setColorSpace(sk_sp<SkColorSpace> colorSpace)524*c8dee2aaSAndroid Build Coastguard Worker void setColorSpace(sk_sp<SkColorSpace> colorSpace) override { fColorSpace = colorSpace; } 525*c8dee2aaSAndroid Build Coastguard Worker colorInfo()526*c8dee2aaSAndroid Build Coastguard Worker SkColorInfo colorInfo() const override { 527*c8dee2aaSAndroid Build Coastguard Worker // If there's an appropriate alpha type for this color type, use it, otherwise use premul. 528*c8dee2aaSAndroid Build Coastguard Worker SkAlphaType alphaType = kPremul_SkAlphaType; 529*c8dee2aaSAndroid Build Coastguard Worker (void)SkColorTypeValidateAlphaType(fColorType, alphaType, &alphaType); 530*c8dee2aaSAndroid Build Coastguard Worker 531*c8dee2aaSAndroid Build Coastguard Worker return SkColorInfo(fColorType, alphaType, fColorSpace); 532*c8dee2aaSAndroid Build Coastguard Worker } 533*c8dee2aaSAndroid Build Coastguard Worker 534*c8dee2aaSAndroid Build Coastguard Worker private: 535*c8dee2aaSAndroid Build Coastguard Worker SkColorType fColorType; 536*c8dee2aaSAndroid Build Coastguard Worker sk_sp<SkColorSpace> fColorSpace; 537*c8dee2aaSAndroid Build Coastguard Worker }; 538*c8dee2aaSAndroid Build Coastguard Worker 539*c8dee2aaSAndroid Build Coastguard Worker class SKPSink : public Sink { 540*c8dee2aaSAndroid Build Coastguard Worker public: 541*c8dee2aaSAndroid Build Coastguard Worker SKPSink(); 542*c8dee2aaSAndroid Build Coastguard Worker 543*c8dee2aaSAndroid Build Coastguard Worker Result draw(const Src&, SkBitmap*, SkWStream*, SkString*) const override; fileExtension()544*c8dee2aaSAndroid Build Coastguard Worker const char* fileExtension() const override { return "skp"; } flags()545*c8dee2aaSAndroid Build Coastguard Worker SinkFlags flags() const override { return SinkFlags{ SinkFlags::kVector, SinkFlags::kDirect }; } 546*c8dee2aaSAndroid Build Coastguard Worker }; 547*c8dee2aaSAndroid Build Coastguard Worker 548*c8dee2aaSAndroid Build Coastguard Worker class DebugSink : public Sink { 549*c8dee2aaSAndroid Build Coastguard Worker public: 550*c8dee2aaSAndroid Build Coastguard Worker Result draw(const Src&, SkBitmap*, SkWStream*, SkString*) const override; fileExtension()551*c8dee2aaSAndroid Build Coastguard Worker const char* fileExtension() const override { return "json"; } flags()552*c8dee2aaSAndroid Build Coastguard Worker SinkFlags flags() const override { return SinkFlags{ SinkFlags::kVector, SinkFlags::kDirect }; } 553*c8dee2aaSAndroid Build Coastguard Worker }; 554*c8dee2aaSAndroid Build Coastguard Worker 555*c8dee2aaSAndroid Build Coastguard Worker class SVGSink : public Sink { 556*c8dee2aaSAndroid Build Coastguard Worker public: 557*c8dee2aaSAndroid Build Coastguard Worker SVGSink(int pageIndex = 0); 558*c8dee2aaSAndroid Build Coastguard Worker 559*c8dee2aaSAndroid Build Coastguard Worker Result draw(const Src&, SkBitmap*, SkWStream*, SkString*) const override; fileExtension()560*c8dee2aaSAndroid Build Coastguard Worker const char* fileExtension() const override { return "svg"; } flags()561*c8dee2aaSAndroid Build Coastguard Worker SinkFlags flags() const override { return SinkFlags{ SinkFlags::kVector, SinkFlags::kDirect }; } 562*c8dee2aaSAndroid Build Coastguard Worker 563*c8dee2aaSAndroid Build Coastguard Worker private: 564*c8dee2aaSAndroid Build Coastguard Worker int fPageIndex; 565*c8dee2aaSAndroid Build Coastguard Worker }; 566*c8dee2aaSAndroid Build Coastguard Worker 567*c8dee2aaSAndroid Build Coastguard Worker #if defined(SK_GRAPHITE) 568*c8dee2aaSAndroid Build Coastguard Worker 569*c8dee2aaSAndroid Build Coastguard Worker class GraphiteSink : public Sink { 570*c8dee2aaSAndroid Build Coastguard Worker public: 571*c8dee2aaSAndroid Build Coastguard Worker GraphiteSink(const SkCommandLineConfigGraphite*, const skiatest::graphite::TestOptions&); 572*c8dee2aaSAndroid Build Coastguard Worker 573*c8dee2aaSAndroid Build Coastguard Worker Result draw(const Src&, SkBitmap*, SkWStream*, SkString*) const override; serial()574*c8dee2aaSAndroid Build Coastguard Worker bool serial() const override { return true; } fileExtension()575*c8dee2aaSAndroid Build Coastguard Worker const char* fileExtension() const override { return "png"; } flags()576*c8dee2aaSAndroid Build Coastguard Worker SinkFlags flags() const override { return SinkFlags{SinkFlags::kGPU, SinkFlags::kDirect}; } setColorSpace(sk_sp<SkColorSpace> colorSpace)577*c8dee2aaSAndroid Build Coastguard Worker void setColorSpace(sk_sp<SkColorSpace> colorSpace) override { fColorSpace = colorSpace; } colorInfo()578*c8dee2aaSAndroid Build Coastguard Worker SkColorInfo colorInfo() const override { 579*c8dee2aaSAndroid Build Coastguard Worker return SkColorInfo(fColorType, fAlphaType, fColorSpace); 580*c8dee2aaSAndroid Build Coastguard Worker } 581*c8dee2aaSAndroid Build Coastguard Worker 582*c8dee2aaSAndroid Build Coastguard Worker protected: 583*c8dee2aaSAndroid Build Coastguard Worker sk_sp<SkSurface> makeSurface(skgpu::graphite::Recorder*, SkISize) const; 584*c8dee2aaSAndroid Build Coastguard Worker 585*c8dee2aaSAndroid Build Coastguard Worker skiatest::graphite::TestOptions fOptions; 586*c8dee2aaSAndroid Build Coastguard Worker skgpu::ContextType fContextType; 587*c8dee2aaSAndroid Build Coastguard Worker SkColorType fColorType; 588*c8dee2aaSAndroid Build Coastguard Worker SkAlphaType fAlphaType; 589*c8dee2aaSAndroid Build Coastguard Worker sk_sp<SkColorSpace> fColorSpace; 590*c8dee2aaSAndroid Build Coastguard Worker }; 591*c8dee2aaSAndroid Build Coastguard Worker 592*c8dee2aaSAndroid Build Coastguard Worker #if defined(SK_ENABLE_PRECOMPILE) 593*c8dee2aaSAndroid Build Coastguard Worker // In general this sink: 594*c8dee2aaSAndroid Build Coastguard Worker // renders a gm, skp or svg (in drawSrc) 595*c8dee2aaSAndroid Build Coastguard Worker // collects all the UniqueKeys | 596*c8dee2aaSAndroid Build Coastguard Worker // clears the pipeline cache | (in resetAndRecreatePipelines) 597*c8dee2aaSAndroid Build Coastguard Worker // recreates the pipelines from the UniqueKeys | 598*c8dee2aaSAndroid Build Coastguard Worker // renders a second time (in drawSrc) 599*c8dee2aaSAndroid Build Coastguard Worker // asserts that no new pipelines were created 600*c8dee2aaSAndroid Build Coastguard Worker class GraphitePrecompileTestingSink : public GraphiteSink { 601*c8dee2aaSAndroid Build Coastguard Worker public: 602*c8dee2aaSAndroid Build Coastguard Worker GraphitePrecompileTestingSink(const SkCommandLineConfigGraphite*, 603*c8dee2aaSAndroid Build Coastguard Worker const skiatest::graphite::TestOptions&); 604*c8dee2aaSAndroid Build Coastguard Worker ~GraphitePrecompileTestingSink() override; 605*c8dee2aaSAndroid Build Coastguard Worker 606*c8dee2aaSAndroid Build Coastguard Worker Result draw(const Src&, SkBitmap*, SkWStream*, SkString*) const override; 607*c8dee2aaSAndroid Build Coastguard Worker fileExtension()608*c8dee2aaSAndroid Build Coastguard Worker const char* fileExtension() const override { 609*c8dee2aaSAndroid Build Coastguard Worker // Suppress writing out results from this config - we just want to check that 610*c8dee2aaSAndroid Build Coastguard Worker // the precompilation API is expressive enough and prepopulates the cache. 611*c8dee2aaSAndroid Build Coastguard Worker // If desired, this could be updated to save the result of the precompiled rendering. 612*c8dee2aaSAndroid Build Coastguard Worker // However; if all the keys match, as is expected, the images should always match. 613*c8dee2aaSAndroid Build Coastguard Worker return nullptr; 614*c8dee2aaSAndroid Build Coastguard Worker } 615*c8dee2aaSAndroid Build Coastguard Worker 616*c8dee2aaSAndroid Build Coastguard Worker private: 617*c8dee2aaSAndroid Build Coastguard Worker Result drawSrc(const Src&, 618*c8dee2aaSAndroid Build Coastguard Worker skgpu::graphite::Context*, 619*c8dee2aaSAndroid Build Coastguard Worker skiatest::graphite::GraphiteTestContext*) const; 620*c8dee2aaSAndroid Build Coastguard Worker Result resetAndRecreatePipelines() const; 621*c8dee2aaSAndroid Build Coastguard Worker 622*c8dee2aaSAndroid Build Coastguard Worker mutable std::unique_ptr<skgpu::graphite::Recorder> fRecorder; 623*c8dee2aaSAndroid Build Coastguard Worker mutable std::unique_ptr<skgpu::graphite::PrecompileContext> fPrecompileContext; 624*c8dee2aaSAndroid Build Coastguard Worker }; 625*c8dee2aaSAndroid Build Coastguard Worker #endif // SK_ENABLE_PRECOMPILE 626*c8dee2aaSAndroid Build Coastguard Worker #endif // SK_GRAPHITE 627*c8dee2aaSAndroid Build Coastguard Worker 628*c8dee2aaSAndroid Build Coastguard Worker /*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*/ 629*c8dee2aaSAndroid Build Coastguard Worker 630*c8dee2aaSAndroid Build Coastguard Worker class Via : public Sink { 631*c8dee2aaSAndroid Build Coastguard Worker public: Via(Sink * sink)632*c8dee2aaSAndroid Build Coastguard Worker explicit Via(Sink* sink) : fSink(sink) {} fileExtension()633*c8dee2aaSAndroid Build Coastguard Worker const char* fileExtension() const override { return fSink->fileExtension(); } serial()634*c8dee2aaSAndroid Build Coastguard Worker bool serial() const override { return fSink->serial(); } flags()635*c8dee2aaSAndroid Build Coastguard Worker SinkFlags flags() const override { 636*c8dee2aaSAndroid Build Coastguard Worker SinkFlags flags = fSink->flags(); 637*c8dee2aaSAndroid Build Coastguard Worker flags.approach = SinkFlags::kIndirect; 638*c8dee2aaSAndroid Build Coastguard Worker return flags; 639*c8dee2aaSAndroid Build Coastguard Worker } setColorSpace(sk_sp<SkColorSpace> colorSpace)640*c8dee2aaSAndroid Build Coastguard Worker void setColorSpace(sk_sp<SkColorSpace> colorSpace) override { 641*c8dee2aaSAndroid Build Coastguard Worker fSink->setColorSpace(colorSpace); 642*c8dee2aaSAndroid Build Coastguard Worker } 643*c8dee2aaSAndroid Build Coastguard Worker protected: 644*c8dee2aaSAndroid Build Coastguard Worker std::unique_ptr<Sink> fSink; 645*c8dee2aaSAndroid Build Coastguard Worker }; 646*c8dee2aaSAndroid Build Coastguard Worker 647*c8dee2aaSAndroid Build Coastguard Worker class ViaMatrix : public Via { 648*c8dee2aaSAndroid Build Coastguard Worker public: 649*c8dee2aaSAndroid Build Coastguard Worker ViaMatrix(SkMatrix, Sink*); 650*c8dee2aaSAndroid Build Coastguard Worker Result draw(const Src&, SkBitmap*, SkWStream*, SkString*) const override; 651*c8dee2aaSAndroid Build Coastguard Worker 652*c8dee2aaSAndroid Build Coastguard Worker private: 653*c8dee2aaSAndroid Build Coastguard Worker const SkMatrix fMatrix; 654*c8dee2aaSAndroid Build Coastguard Worker }; 655*c8dee2aaSAndroid Build Coastguard Worker 656*c8dee2aaSAndroid Build Coastguard Worker class ViaUpright : public Via { 657*c8dee2aaSAndroid Build Coastguard Worker public: 658*c8dee2aaSAndroid Build Coastguard Worker ViaUpright(SkMatrix, Sink*); 659*c8dee2aaSAndroid Build Coastguard Worker Result draw(const Src&, SkBitmap*, SkWStream*, SkString*) const override; 660*c8dee2aaSAndroid Build Coastguard Worker 661*c8dee2aaSAndroid Build Coastguard Worker private: 662*c8dee2aaSAndroid Build Coastguard Worker const SkMatrix fMatrix; 663*c8dee2aaSAndroid Build Coastguard Worker }; 664*c8dee2aaSAndroid Build Coastguard Worker 665*c8dee2aaSAndroid Build Coastguard Worker class ViaSerialization : public Via { 666*c8dee2aaSAndroid Build Coastguard Worker public: ViaSerialization(Sink * sink)667*c8dee2aaSAndroid Build Coastguard Worker explicit ViaSerialization(Sink* sink) : Via(sink) {} 668*c8dee2aaSAndroid Build Coastguard Worker Result draw(const Src&, SkBitmap*, SkWStream*, SkString*) const override; 669*c8dee2aaSAndroid Build Coastguard Worker }; 670*c8dee2aaSAndroid Build Coastguard Worker 671*c8dee2aaSAndroid Build Coastguard Worker class ViaPicture : public Via { 672*c8dee2aaSAndroid Build Coastguard Worker public: ViaPicture(Sink * sink)673*c8dee2aaSAndroid Build Coastguard Worker explicit ViaPicture(Sink* sink) : Via(sink) {} 674*c8dee2aaSAndroid Build Coastguard Worker Result draw(const Src&, SkBitmap*, SkWStream*, SkString*) const override; 675*c8dee2aaSAndroid Build Coastguard Worker }; 676*c8dee2aaSAndroid Build Coastguard Worker 677*c8dee2aaSAndroid Build Coastguard Worker class ViaRuntimeBlend : public Via { 678*c8dee2aaSAndroid Build Coastguard Worker public: ViaRuntimeBlend(Sink * sink)679*c8dee2aaSAndroid Build Coastguard Worker explicit ViaRuntimeBlend(Sink* sink) : Via(sink) {} 680*c8dee2aaSAndroid Build Coastguard Worker Result draw(const Src&, SkBitmap*, SkWStream*, SkString*) const override; 681*c8dee2aaSAndroid Build Coastguard Worker }; 682*c8dee2aaSAndroid Build Coastguard Worker 683*c8dee2aaSAndroid Build Coastguard Worker class ViaSVG : public Via { 684*c8dee2aaSAndroid Build Coastguard Worker public: ViaSVG(Sink * sink)685*c8dee2aaSAndroid Build Coastguard Worker explicit ViaSVG(Sink* sink) : Via(sink) {} 686*c8dee2aaSAndroid Build Coastguard Worker Result draw(const Src&, SkBitmap*, SkWStream*, SkString*) const override; 687*c8dee2aaSAndroid Build Coastguard Worker }; 688*c8dee2aaSAndroid Build Coastguard Worker 689*c8dee2aaSAndroid Build Coastguard Worker } // namespace DM 690*c8dee2aaSAndroid Build Coastguard Worker 691*c8dee2aaSAndroid Build Coastguard Worker #endif//DMSrcSink_DEFINED 692