1cb93a386Sopenharmony_ci/*
2cb93a386Sopenharmony_ci * Copyright 2018 Google Inc.
3cb93a386Sopenharmony_ci *
4cb93a386Sopenharmony_ci * Use of this source code is governed by a BSD-style license that can be
5cb93a386Sopenharmony_ci * found in the LICENSE file.
6cb93a386Sopenharmony_ci */
7cb93a386Sopenharmony_ci
8cb93a386Sopenharmony_ci#ifndef skqp_DEFINED
9cb93a386Sopenharmony_ci#define skqp_DEFINED
10cb93a386Sopenharmony_ci
11cb93a386Sopenharmony_ci#include <cstdint>
12cb93a386Sopenharmony_ci#include <memory>
13cb93a386Sopenharmony_ci#include <string>
14cb93a386Sopenharmony_ci#include <tuple>
15cb93a386Sopenharmony_ci#include <unordered_set>
16cb93a386Sopenharmony_ci#include <unordered_map>
17cb93a386Sopenharmony_ci#include <vector>
18cb93a386Sopenharmony_ci
19cb93a386Sopenharmony_ciclass SkData;
20cb93a386Sopenharmony_citemplate <typename T> class sk_sp;
21cb93a386Sopenharmony_ci
22cb93a386Sopenharmony_cinamespace skiagm {
23cb93a386Sopenharmony_ciclass GM;
24cb93a386Sopenharmony_ci}  // namespace skiagm
25cb93a386Sopenharmony_ci
26cb93a386Sopenharmony_cinamespace skiatest {
27cb93a386Sopenharmony_cistruct Test;
28cb93a386Sopenharmony_ci}  // namespace skiatest
29cb93a386Sopenharmony_ci
30cb93a386Sopenharmony_ciclass SkStreamAsset;
31cb93a386Sopenharmony_ci
32cb93a386Sopenharmony_ci////////////////////////////////////////////////////////////////////////////////
33cb93a386Sopenharmony_ciclass SkQPAssetManager {
34cb93a386Sopenharmony_cipublic:
35cb93a386Sopenharmony_ci    SkQPAssetManager() {}
36cb93a386Sopenharmony_ci    virtual ~SkQPAssetManager() {}
37cb93a386Sopenharmony_ci    virtual sk_sp<SkData> open(const char* path) = 0;
38cb93a386Sopenharmony_ciprivate:
39cb93a386Sopenharmony_ci    SkQPAssetManager(const SkQPAssetManager&) = delete;
40cb93a386Sopenharmony_ci    SkQPAssetManager& operator=(const SkQPAssetManager&) = delete;
41cb93a386Sopenharmony_ci};
42cb93a386Sopenharmony_ci
43cb93a386Sopenharmony_ciclass SkQP {
44cb93a386Sopenharmony_cipublic:
45cb93a386Sopenharmony_ci    enum class SkiaBackend {
46cb93a386Sopenharmony_ci        kGL,
47cb93a386Sopenharmony_ci        kGLES,
48cb93a386Sopenharmony_ci        kVulkan,
49cb93a386Sopenharmony_ci    };
50cb93a386Sopenharmony_ci    using GMFactory = std::unique_ptr<skiagm::GM> (*)();
51cb93a386Sopenharmony_ci    using UnitTest = const skiatest::Test*;
52cb93a386Sopenharmony_ci
53cb93a386Sopenharmony_ci    ////////////////////////////////////////////////////////////////////////////
54cb93a386Sopenharmony_ci
55cb93a386Sopenharmony_ci    /** These functions provide a descriptive name for the given value.*/
56cb93a386Sopenharmony_ci    static std::string GetGMName(GMFactory);
57cb93a386Sopenharmony_ci    static const char* GetUnitTestName(UnitTest);
58cb93a386Sopenharmony_ci    static const char* GetBackendName(SkiaBackend);
59cb93a386Sopenharmony_ci
60cb93a386Sopenharmony_ci    SkQP();
61cb93a386Sopenharmony_ci    ~SkQP();
62cb93a386Sopenharmony_ci
63cb93a386Sopenharmony_ci    /**
64cb93a386Sopenharmony_ci        Initialize Skia and the SkQP.  Should be executed only once.
65cb93a386Sopenharmony_ci
66cb93a386Sopenharmony_ci        @param assetManager - provides assets for the models.  Does not take ownership.
67cb93a386Sopenharmony_ci        @param renderTests - file containing list of render tests.
68cb93a386Sopenharmony_ci        @param reportDirectory - where to write out report.
69cb93a386Sopenharmony_ci    */
70cb93a386Sopenharmony_ci    void init(SkQPAssetManager* assetManager, const char* renderTests, const char* reportDirectory);
71cb93a386Sopenharmony_ci
72cb93a386Sopenharmony_ci    struct RenderOutcome {
73cb93a386Sopenharmony_ci        // All three values will be 0 if the test passes.
74cb93a386Sopenharmony_ci        int fMaxError = 0;        // maximum error of all pixel.
75cb93a386Sopenharmony_ci        int fBadPixelCount = 0;   // number of pixels with non-zero error.
76cb93a386Sopenharmony_ci        int64_t fTotalError = 0;  // sum of error for all bad pixels.
77cb93a386Sopenharmony_ci    };
78cb93a386Sopenharmony_ci
79cb93a386Sopenharmony_ci    /**
80cb93a386Sopenharmony_ci        @return render outcome and error string.  Only errors running or
81cb93a386Sopenharmony_ci                evaluating the GM will result in a non-empty error string.
82cb93a386Sopenharmony_ci    */
83cb93a386Sopenharmony_ci    std::tuple<RenderOutcome, std::string> evaluateGM(SkiaBackend, GMFactory);
84cb93a386Sopenharmony_ci
85cb93a386Sopenharmony_ci    /** @return a (hopefully empty) list of errors produced by this unit test.  */
86cb93a386Sopenharmony_ci    std::vector<std::string> executeTest(UnitTest);
87cb93a386Sopenharmony_ci
88cb93a386Sopenharmony_ci    /** Call this after running all checks to write a report into the given
89cb93a386Sopenharmony_ci        report directory. */
90cb93a386Sopenharmony_ci    void makeReport();
91cb93a386Sopenharmony_ci
92cb93a386Sopenharmony_ci    /** @return a list of backends that this version of SkQP supports.  */
93cb93a386Sopenharmony_ci    const std::vector<SkiaBackend>& getSupportedBackends() const { return fSupportedBackends; }
94cb93a386Sopenharmony_ci    /** @return a list of all Skia GMs in lexicographic order.  */
95cb93a386Sopenharmony_ci    const std::vector<GMFactory>& getGMs() const { return fGMs; }
96cb93a386Sopenharmony_ci    /** @return a list of all Skia GPU unit tests in lexicographic order.  */
97cb93a386Sopenharmony_ci    const std::vector<UnitTest>& getUnitTests() const { return fUnitTests; }
98cb93a386Sopenharmony_ci    ////////////////////////////////////////////////////////////////////////////
99cb93a386Sopenharmony_ci
100cb93a386Sopenharmony_ciprivate:
101cb93a386Sopenharmony_ci    struct RenderResult {
102cb93a386Sopenharmony_ci        SkiaBackend fBackend;
103cb93a386Sopenharmony_ci        GMFactory fGM;
104cb93a386Sopenharmony_ci        RenderOutcome fOutcome;
105cb93a386Sopenharmony_ci   };
106cb93a386Sopenharmony_ci    struct UnitTestResult {
107cb93a386Sopenharmony_ci        UnitTest fUnitTest;
108cb93a386Sopenharmony_ci        std::vector<std::string> fErrors;
109cb93a386Sopenharmony_ci    };
110cb93a386Sopenharmony_ci    std::vector<RenderResult> fRenderResults;
111cb93a386Sopenharmony_ci    std::vector<UnitTestResult> fUnitTestResults;
112cb93a386Sopenharmony_ci    std::vector<SkiaBackend> fSupportedBackends;
113cb93a386Sopenharmony_ci    SkQPAssetManager* fAssetManager = nullptr;
114cb93a386Sopenharmony_ci    std::string fReportDirectory;
115cb93a386Sopenharmony_ci    std::vector<UnitTest> fUnitTests;
116cb93a386Sopenharmony_ci    std::vector<GMFactory> fGMs;
117cb93a386Sopenharmony_ci    std::unordered_map<std::string, int64_t> fGMThresholds;
118cb93a386Sopenharmony_ci
119cb93a386Sopenharmony_ci    SkQP(const SkQP&) = delete;
120cb93a386Sopenharmony_ci    SkQP& operator=(const SkQP&) = delete;
121cb93a386Sopenharmony_ci};
122cb93a386Sopenharmony_ci#endif  // skqp_DEFINED
123cb93a386Sopenharmony_ci
124