aboutsummaryrefslogtreecommitdiffhomepage
path: root/tools/skpbench/skpbench.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'tools/skpbench/skpbench.cpp')
-rw-r--r--tools/skpbench/skpbench.cpp74
1 files changed, 55 insertions, 19 deletions
diff --git a/tools/skpbench/skpbench.cpp b/tools/skpbench/skpbench.cpp
index 399bf6cdb2..55fbc00980 100644
--- a/tools/skpbench/skpbench.cpp
+++ b/tools/skpbench/skpbench.cpp
@@ -37,10 +37,17 @@
#include "picture_utils.h"
#include "sk_tool_utils.h"
+#ifdef SK_XML
+#include "SkDOM.h"
+#include "../experimental/svg/model/SkSVGDOM.h"
+#endif
+
+
/**
- * This is a minimalist program whose sole purpose is to open an skp file, benchmark it on a single
- * config, and exit. It is intended to be used through skpbench.py rather than invoked directly.
- * Limiting the entire process to a single config/skp pair helps to keep the results repeatable.
+ * This is a minimalist program whose sole purpose is to open a .skp or .svg file, benchmark it on a
+ * single config, and exit. It is intended to be used through skpbench.py rather than invoked
+ * directly. Limiting the entire process to a single config/skp pair helps to keep the results
+ * repeatable.
*
* No tiling, looping, or other fanciness is used; it just draws the skp whole into a size-matched
* render target and syncs the GPU after each draw.
@@ -57,7 +64,7 @@ DEFINE_int32(duration, 5000, "number of milliseconds to run the benchmark");
DEFINE_int32(sampleMs, 50, "minimum duration of a sample");
DEFINE_bool(gpuClock, false, "time on the gpu clock (gpu work only)");
DEFINE_bool(fps, false, "use fps instead of ms");
-DEFINE_string(skp, "", "path to a single .skp file, or 'warmup' for a builtin warmup run");
+DEFINE_string(src, "", "path to a single .skp or .svg file, or 'warmup' for a builtin warmup run");
DEFINE_string(png, "", "if set, save a .png proof to disk at this file location");
DEFINE_int32(verbosity, 4, "level of verbosity (0=none to 5=debug)");
DEFINE_bool(suppressHeader, false, "don't print a header row before the results");
@@ -108,6 +115,7 @@ enum class ExitErr {
static void draw_skp_and_flush(SkCanvas*, const SkPicture*);
static sk_sp<SkPicture> create_warmup_skp();
+static sk_sp<SkPicture> create_skp_from_svg(SkStream*, const char* filename);
static bool mkdir_p(const SkString& name);
static SkString join(const SkCommandLineFlags::StringArray&);
static void exitf(ExitErr, const char* format, ...);
@@ -337,36 +345,41 @@ int main(int argc, char** argv) {
}
// Parse the skp.
- if (FLAGS_skp.count() != 1) {
- exitf(ExitErr::kUsage, "invalid skp '%s': must specify a single skp file, or 'warmup'",
- join(FLAGS_skp).c_str());
+ if (FLAGS_src.count() != 1) {
+ exitf(ExitErr::kUsage,
+ "invalid input '%s': must specify a single .skp or .svg file, or 'warmup'",
+ join(FLAGS_src).c_str());
}
SkGraphics::Init();
sk_sp<SkPicture> skp;
- SkString skpname;
- if (0 == strcmp(FLAGS_skp[0], "warmup")) {
+ SkString srcname;
+ if (0 == strcmp(FLAGS_src[0], "warmup")) {
skp = create_warmup_skp();
- skpname = "warmup";
+ srcname = "warmup";
} else {
- const char* skpfile = FLAGS_skp[0];
- std::unique_ptr<SkStream> skpstream(SkStream::MakeFromFile(skpfile));
- if (!skpstream) {
- exitf(ExitErr::kIO, "failed to open skp file %s", skpfile);
+ SkString srcfile(FLAGS_src[0]);
+ std::unique_ptr<SkStream> srcstream(SkStream::MakeFromFile(srcfile.c_str()));
+ if (!srcstream) {
+ exitf(ExitErr::kIO, "failed to open file %s", srcfile.c_str());
+ }
+ if (srcfile.endsWith(".svg")) {
+ skp = create_skp_from_svg(srcstream.get(), srcfile.c_str());
+ } else {
+ skp = SkPicture::MakeFromStream(srcstream.get());
}
- skp = SkPicture::MakeFromStream(skpstream.get());
if (!skp) {
- exitf(ExitErr::kData, "failed to parse skp file %s", skpfile);
+ exitf(ExitErr::kData, "failed to parse file %s", srcfile.c_str());
}
- skpname = SkOSPath::Basename(skpfile);
+ srcname = SkOSPath::Basename(srcfile.c_str());
}
int width = SkTMin(SkScalarCeilToInt(skp->cullRect().width()), 2048),
height = SkTMin(SkScalarCeilToInt(skp->cullRect().height()), 2048);
if (FLAGS_verbosity >= 3 &&
(width != skp->cullRect().width() || height != skp->cullRect().height())) {
fprintf(stderr, "%s is too large (%ix%i), cropping to %ix%i.\n",
- skpname.c_str(), SkScalarCeilToInt(skp->cullRect().width()),
+ srcname.c_str(), SkScalarCeilToInt(skp->cullRect().width()),
SkScalarCeilToInt(skp->cullRect().height()), width, height);
}
@@ -448,7 +461,7 @@ int main(int argc, char** argv) {
run_gpu_time_benchmark(testCtx->gpuTimer(), testCtx->fenceSync(), canvas, skp.get(),
&samples);
}
- print_result(samples, config->getTag().c_str(), skpname.c_str());
+ print_result(samples, config->getTag().c_str(), srcname.c_str());
// Save a proof (if one was requested).
if (!FLAGS_png.isEmpty()) {
@@ -499,6 +512,29 @@ static sk_sp<SkPicture> create_warmup_skp() {
return recorder.finishRecordingAsPicture();
}
+static sk_sp<SkPicture> create_skp_from_svg(SkStream* stream, const char* filename) {
+#ifdef SK_XML
+ SkDOM xml;
+ if (!xml.build(*stream)) {
+ exitf(ExitErr::kData, "failed to parse xml in file %s", filename);
+ }
+ sk_sp<SkSVGDOM> svg = SkSVGDOM::MakeFromDOM(xml);
+ if (!svg) {
+ exitf(ExitErr::kData, "failed to build svg dom from file %s", filename);
+ }
+
+ static constexpr SkRect bounds{0, 0, 1200, 1200};
+ SkPictureRecorder recorder;
+ SkCanvas* recording = recorder.beginRecording(bounds);
+
+ svg->setContainerSize(SkSize::Make(recording->getBaseLayerSize()));
+ svg->render(recording);
+
+ return recorder.finishRecordingAsPicture();
+#endif
+ exitf(ExitErr::kData, "SK_XML is disabled; cannot open svg file %s", filename);
+}
+
bool mkdir_p(const SkString& dirname) {
if (dirname.isEmpty()) {
return true;