blob: 0ff31bbb5decc585e4fa5380b8073ab586a23110 [file] [log] [blame]
/*
* 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