| /* |
| * Copyright 2018 Google Inc. |
| * |
| * Use of this source code is governed by a BSD-style license that can be |
| * found in the LICENSE file. |
| */ |
| |
| #ifndef skqp_DEFINED |
| #define skqp_DEFINED |
| |
| #include <cstdint> |
| #include <memory> |
| #include <string> |
| #include <tuple> |
| #include <unordered_set> |
| #include <unordered_map> |
| #include <vector> |
| |
| class SkData; |
| template <typename T> class sk_sp; |
| |
| namespace skiagm { |
| class GM; |
| } |
| |
| namespace skiatest { |
| struct Test; |
| } |
| |
| class SkStreamAsset; |
| |
| //////////////////////////////////////////////////////////////////////////////// |
| class SkQPAssetManager { |
| public: |
| SkQPAssetManager() {} |
| virtual ~SkQPAssetManager() {} |
| virtual sk_sp<SkData> open(const char* path) = 0; |
| private: |
| SkQPAssetManager(const SkQPAssetManager&) = delete; |
| SkQPAssetManager& operator=(const SkQPAssetManager&) = delete; |
| }; |
| |
| class SkQP { |
| public: |
| enum class SkiaBackend { |
| kGL, |
| kGLES, |
| kVulkan, |
| }; |
| using GMFactory = std::unique_ptr<skiagm::GM> (*)(); |
| using UnitTest = const skiatest::Test*; |
| |
| //////////////////////////////////////////////////////////////////////////// |
| |
| /** These functions provide a descriptive name for the given value.*/ |
| static std::string GetGMName(GMFactory); |
| static const char* GetUnitTestName(UnitTest); |
| static const char* GetBackendName(SkiaBackend); |
| |
| SkQP(); |
| ~SkQP(); |
| |
| /** |
| Initialize Skia and the SkQP. Should be executed only once. |
| |
| @param assetManager - provides assets for the models. Does not take ownership. |
| @param reportDirectory - where to write out report. |
| */ |
| void init(SkQPAssetManager* assetManager, const char* reportDirectory); |
| |
| struct RenderOutcome { |
| // All three values will be 0 if the test passes. |
| int fMaxError = 0; // maximum error of all pixel. |
| int fBadPixelCount = 0; // number of pixels with non-zero error. |
| int64_t fTotalError = 0; // sum of error for all bad pixels. |
| }; |
| |
| /** |
| @return render outcome and error string. Only errors running or |
| evaluating the GM will result in a non-empty error string. |
| */ |
| std::tuple<RenderOutcome, std::string> evaluateGM(SkiaBackend, GMFactory); |
| |
| /** @return a (hopefully empty) list of errors produced by this unit test. */ |
| std::vector<std::string> executeTest(UnitTest); |
| |
| /** Call this after running all checks to write a report into the given |
| report directory. */ |
| void makeReport(); |
| |
| /** @return a list of backends that this version of SkQP supports. */ |
| const std::vector<SkiaBackend>& getSupportedBackends() const { return fSupportedBackends; } |
| /** @return a list of all Skia GMs in lexicographic order. */ |
| const std::vector<GMFactory>& getGMs() const { return fGMs; } |
| /** @return a list of all Skia GPU unit tests in lexicographic order. */ |
| const std::vector<UnitTest>& getUnitTests() const { return fUnitTests; } |
| //////////////////////////////////////////////////////////////////////////// |
| |
| private: |
| struct RenderResult { |
| SkiaBackend fBackend; |
| GMFactory fGM; |
| RenderOutcome fOutcome; |
| }; |
| struct UnitTestResult { |
| UnitTest fUnitTest; |
| std::vector<std::string> fErrors; |
| }; |
| std::vector<RenderResult> fRenderResults; |
| std::vector<UnitTestResult> fUnitTestResults; |
| std::vector<SkiaBackend> fSupportedBackends; |
| SkQPAssetManager* fAssetManager = nullptr; |
| std::string fReportDirectory; |
| std::vector<UnitTest> fUnitTests; |
| std::vector<GMFactory> fGMs; |
| std::unordered_map<std::string, int64_t> fGMThresholds; |
| |
| SkQP(const SkQP&) = delete; |
| SkQP& operator=(const SkQP&) = delete; |
| }; |
| #endif // skqp_DEFINED |
| |