1649e0451708b72d467e3a0ea4a71720699330c12mtklein/*
2649e0451708b72d467e3a0ea4a71720699330c12mtklein * Copyright 2015 Google Inc.
3649e0451708b72d467e3a0ea4a71720699330c12mtklein *
4649e0451708b72d467e3a0ea4a71720699330c12mtklein * Use of this source code is governed by a BSD-style license that can be
5649e0451708b72d467e3a0ea4a71720699330c12mtklein * found in the LICENSE file.
6649e0451708b72d467e3a0ea4a71720699330c12mtklein */
7649e0451708b72d467e3a0ea4a71720699330c12mtklein
8649e0451708b72d467e3a0ea4a71720699330c12mtklein// A benchmark designed to isolate the constant overheads of picture recording.
9f559de433890e55d3cce909fac2e0d1fb17327fdmtklein// We record an empty picture and a picture with one draw op to force memory allocation.
10649e0451708b72d467e3a0ea4a71720699330c12mtklein
11649e0451708b72d467e3a0ea4a71720699330c12mtklein#include "Benchmark.h"
12649e0451708b72d467e3a0ea4a71720699330c12mtklein#include "SkCanvas.h"
13649e0451708b72d467e3a0ea4a71720699330c12mtklein#include "SkPictureRecorder.h"
14649e0451708b72d467e3a0ea4a71720699330c12mtklein
15f559de433890e55d3cce909fac2e0d1fb17327fdmtkleintemplate <bool kDraw>
16649e0451708b72d467e3a0ea4a71720699330c12mtkleinstruct PictureOverheadBench : public Benchmark {
17f559de433890e55d3cce909fac2e0d1fb17327fdmtklein    const char* onGetName() override {
18f559de433890e55d3cce909fac2e0d1fb17327fdmtklein        return kDraw ? "picture_overhead_draw" : "picture_overhead_nodraw";
19f559de433890e55d3cce909fac2e0d1fb17327fdmtklein    }
20649e0451708b72d467e3a0ea4a71720699330c12mtklein    bool isSuitableFor(Backend backend) override { return backend == kNonRendering_Backend; }
21649e0451708b72d467e3a0ea4a71720699330c12mtklein
22649e0451708b72d467e3a0ea4a71720699330c12mtklein    void onDraw(const int loops, SkCanvas*) override {
23649e0451708b72d467e3a0ea4a71720699330c12mtklein        SkPictureRecorder rec;
24649e0451708b72d467e3a0ea4a71720699330c12mtklein        for (int i = 0; i < loops; i++) {
25f559de433890e55d3cce909fac2e0d1fb17327fdmtklein            rec.beginRecording(SkRect::MakeWH(2000,3000));
26f559de433890e55d3cce909fac2e0d1fb17327fdmtklein            if (kDraw) {
27f559de433890e55d3cce909fac2e0d1fb17327fdmtklein                rec.getRecordingCanvas()->drawRect(SkRect::MakeXYWH(10, 10, 1000, 1000), SkPaint());
28f559de433890e55d3cce909fac2e0d1fb17327fdmtklein            }
29649e0451708b72d467e3a0ea4a71720699330c12mtklein            SkAutoTUnref<SkPicture> pic(rec.endRecordingAsPicture());
30649e0451708b72d467e3a0ea4a71720699330c12mtklein        }
31649e0451708b72d467e3a0ea4a71720699330c12mtklein    }
32649e0451708b72d467e3a0ea4a71720699330c12mtklein};
33f559de433890e55d3cce909fac2e0d1fb17327fdmtklein
34f559de433890e55d3cce909fac2e0d1fb17327fdmtkleinDEF_BENCH(return (new PictureOverheadBench<false>);)
35f559de433890e55d3cce909fac2e0d1fb17327fdmtkleinDEF_BENCH(return (new PictureOverheadBench< true>);)
36