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