| Index: tools/vulkan/viewer/VulkanViewer.cpp
|
| diff --git a/tools/vulkan/viewer/VulkanViewer.cpp b/tools/vulkan/viewer/VulkanViewer.cpp
|
| index 5c6e780f95c4044ff7c49ead1cb96e10485c0cf0..55da5546f75623edf6893ead23eae2f1e9937177 100644
|
| --- a/tools/vulkan/viewer/VulkanViewer.cpp
|
| +++ b/tools/vulkan/viewer/VulkanViewer.cpp
|
| @@ -7,12 +7,14 @@
|
|
|
| #include "VulkanViewer.h"
|
|
|
| +#include "GMSlide.h"
|
| +#include "SKPSlide.h"
|
| +
|
| #include "SkCanvas.h"
|
| -#include "SkRandom.h"
|
| #include "SkCommonFlags.h"
|
| -
|
| -DEFINE_string(key, "",
|
| - "Space-separated key/value pairs to add to JSON identifying this builder.");
|
| +#include "SkOSFile.h"
|
| +#include "SkRandom.h"
|
| +#include "SkStream.h"
|
|
|
| Application* Application::Create(int argc, char** argv, void* platformData) {
|
| return new VulkanViewer(argc, argv, platformData);
|
| @@ -31,11 +33,35 @@ static void on_paint_handler(SkCanvas* canvas, void* userData) {
|
| return vv->onPaint(canvas);
|
| }
|
|
|
| -VulkanViewer::VulkanViewer(int argc, char** argv, void* platformData)
|
| - : fGMs(skiagm::GMRegistry::Head())
|
| - , fCurrentMeasurement(0) {
|
| +DEFINE_bool2(fullscreen, f, true, "Run fullscreen.");
|
| +DEFINE_string(key, "", "Space-separated key/value pairs to add to JSON identifying this builder.");
|
| +DEFINE_string2(match, m, nullptr,
|
| + "[~][^]substring[$] [...] of bench name to run.\n"
|
| + "Multiple matches may be separated by spaces.\n"
|
| + "~ causes a matching bench to always be skipped\n"
|
| + "^ requires the start of the bench to match\n"
|
| + "$ requires the end of the bench to match\n"
|
| + "^ and $ requires an exact match\n"
|
| + "If a bench does not match any list entry,\n"
|
| + "it is skipped unless some list entry starts with ~");
|
| +DEFINE_string(skps, "skps", "Directory to read skps from.");
|
| +
|
| +
|
| +
|
| +
|
| +
|
| +
|
| +VulkanViewer::VulkanViewer(int argc, char** argv, void* platformData) : fCurrentMeasurement(0) {
|
| memset(fMeasurements, 0, sizeof(fMeasurements));
|
|
|
| + SkDebugf("Command line arguments: ");
|
| + for (int i = 1; i < argc; ++i) {
|
| + SkDebugf("%s ", argv[i]);
|
| + }
|
| + SkDebugf("\n");
|
| +
|
| + SkCommandLineFlags::Parse(argc, argv);
|
| +
|
| fWindow = Window::CreateNativeWindow(platformData);
|
| fWindow->attach(Window::kVulkan_BackendType, 0, nullptr);
|
|
|
| @@ -43,36 +69,124 @@ VulkanViewer::VulkanViewer(int argc, char** argv, void* platformData)
|
| fWindow->registerKeyFunc(on_key_handler, this);
|
| fWindow->registerPaintFunc(on_paint_handler, this);
|
|
|
| - SkAutoTDelete<skiagm::GM> gm(fGMs->factory()(nullptr));
|
| + // set up slides
|
| + this->initSlides();
|
| +
|
| + // set up first frame
|
| SkString title("VulkanViewer: ");
|
| - title.append(gm->getName());
|
| + title.append(fSlides[0]->getName());
|
| + fCurrentSlide = 0;
|
| fWindow->setTitle(title.c_str());
|
| fWindow->show();
|
| }
|
|
|
| +static sk_sp<SkPicture> read_picture(const char path[]) {
|
| + if (SkCommandLineFlags::ShouldSkip(FLAGS_match, path)) {
|
| + return nullptr;
|
| + }
|
| +
|
| + SkAutoTDelete<SkStream> stream(SkStream::NewFromFile(path));
|
| + if (stream.get() == nullptr) {
|
| + SkDebugf("Could not read %s.\n", path);
|
| + return nullptr;
|
| + }
|
| +
|
| + auto pic = SkPicture::MakeFromStream(stream.get());
|
| + if (!pic) {
|
| + SkDebugf("Could not read %s as an SkPicture.\n", path);
|
| + }
|
| + return pic;
|
| +}
|
| +
|
| +
|
| +static sk_sp<SKPSlide> loadSKP(const SkString& path) {
|
| + sk_sp<SkPicture> pic = read_picture(path.c_str());
|
| + if (!pic) {
|
| + return nullptr;
|
| + }
|
| +
|
| + SkString name = SkOSPath::Basename(path.c_str());
|
| + return sk_sp<SKPSlide>(new SKPSlide(name.c_str(), pic));
|
| +}
|
| +
|
| +void VulkanViewer::initSlides() {
|
| + const skiagm::GMRegistry* gms(skiagm::GMRegistry::Head());
|
| + while (gms) {
|
| + SkAutoTDelete<skiagm::GM> gm(gms->factory()(nullptr));
|
| +
|
| + if (!SkCommandLineFlags::ShouldSkip(FLAGS_match, gm->getName())) {
|
| + sk_sp<Slide> slide(new GMSlide(gm.release()));
|
| + fSlides.push_back(slide);
|
| + }
|
| +
|
| + gms = gms->next();
|
| + }
|
| +
|
| + // reverse array
|
| + for (int i = 0; i < fSlides.count()/2; ++i) {
|
| + sk_sp<Slide> temp = fSlides[i];
|
| + fSlides[i] = fSlides[fSlides.count() - i - 1];
|
| + fSlides[fSlides.count() - i - 1] = temp;
|
| + }
|
| +
|
| + // SKPs
|
| + for (int i = 0; i < FLAGS_skps.count(); i++) {
|
| + if (SkStrEndsWith(FLAGS_skps[i], ".skp")) {
|
| + SkString path(FLAGS_skps[i]);
|
| + sk_sp<SKPSlide> slide = loadSKP(path);
|
| + if (slide) {
|
| + fSlides.push_back(slide);
|
| + }
|
| + } else {
|
| + SkOSFile::Iter it(FLAGS_skps[i], ".skp");
|
| + SkString path;
|
| + while (it.next(&path)) {
|
| + SkString skpName = SkOSPath::Join(FLAGS_skps[i], path.c_str());
|
| + sk_sp<SKPSlide> slide = loadSKP(skpName);
|
| + if (slide) {
|
| + fSlides.push_back(slide);
|
| + }
|
| + }
|
| + }
|
| + }
|
| +}
|
| +
|
| +
|
| VulkanViewer::~VulkanViewer() {
|
| fWindow->detach();
|
| delete fWindow;
|
| }
|
|
|
| bool VulkanViewer::onKey(Window::Key key, Window::InputState state, uint32_t modifiers) {
|
| - if (Window::kDown_InputState == state && (modifiers & Window::kFirstPress_ModifierKey) &&
|
| - key == Window::kRight_Key) {
|
| - fGMs = fGMs->next();
|
| - SkAutoTDelete<skiagm::GM> gm(fGMs->factory()(nullptr));
|
| - SkString title("VulkanViewer: ");
|
| - title.append(gm->getName());
|
| - fWindow->setTitle(title.c_str());
|
| + if (Window::kDown_InputState == state && (modifiers & Window::kFirstPress_ModifierKey)) {
|
| + if (key == Window::kRight_Key) {
|
| + fCurrentSlide++;
|
| + if (fCurrentSlide >= fSlides.count()) {
|
| + fCurrentSlide = 0;
|
| + }
|
| + SkString title("VulkanViewer: ");
|
| + title.append(fSlides[fCurrentSlide]->getName());
|
| + fWindow->setTitle(title.c_str());
|
| + } else if (key == Window::kLeft_Key) {
|
| + fCurrentSlide--;
|
| + if (fCurrentSlide < 0) {
|
| + fCurrentSlide = fSlides.count()-1;
|
| + }
|
| + SkString title("VulkanViewer: ");
|
| + title.append(fSlides[fCurrentSlide]->getName());
|
| + fWindow->setTitle(title.c_str());
|
| + }
|
| }
|
|
|
| return true;
|
| }
|
|
|
| void VulkanViewer::onPaint(SkCanvas* canvas) {
|
| - SkAutoTDelete<skiagm::GM> gm(fGMs->factory()(nullptr));
|
| +
|
| + canvas->clear(SK_ColorWHITE);
|
|
|
| canvas->save();
|
| - gm->draw(canvas);
|
| + fSlides[fCurrentSlide]->draw(canvas);
|
| canvas->restore();
|
|
|
| drawStats(canvas);
|
|
|