| /* | |
| * Copyright 2022 Rive | |
| */ | |
| #pragma once | |
| #include "common/frame_runner.hpp" | |
| #include <functional> | |
| #include <string> | |
| #include <vector> | |
| namespace rivegm | |
| { | |
| class GM; | |
| } | |
| class GMRunner : public FrameRunner | |
| { | |
| public: | |
| bool rendersIntoHostTarget() const override { return false; } | |
| bool parseArgs(int argc, const char* const argv[], LaunchOptions& options) | |
| override; | |
| void init() override; | |
| bool doFrame() override; | |
| void setVerbose(bool verbose) { m_verbose = verbose; } | |
| int parityFailures() const { return m_parityFailures; } | |
| private: | |
| void dumpGM(rivegm::GM* gm, const std::string& gmName); | |
| void runParityGM( | |
| const std::vector<std::function<rivegm::GM*(void)>>& makers, | |
| const std::string& name); | |
| bool m_verbose = false; | |
| int m_loopCount = 1; | |
| std::string m_match; | |
| bool m_interactive = false; | |
| int m_pngThreads = 2; | |
| size_t m_nextGM = 0; | |
| size_t m_nextParityGM = 0; | |
| int m_parityFailures = 0; | |
| // Zero demands byte identical frames. Atomic backends rasterize in a | |
| // nondeterministic order run to run, so they get the same small tolerance | |
| // the golden diffs allow instead of exactness no two of their frames ever | |
| // had. | |
| int m_parityMaxChannelDiff = 0; | |
| }; |