/*
 * Copyright 2015 Google Inc.
 *
 * Use of this source code is governed by a BSD-style license that can be
 * found in the LICENSE file.
 */

// A benchmark designed to isolate the constant overheads of picture recording.
// We record an empty picture and a picture with one draw op to force memory allocation.

#include "Benchmark.h"
#include "SkCanvas.h"
#include "SkLiteDL.h"
#include "SkLiteRecorder.h"
#include "SkPictureRecorder.h"

template <int kDraws, bool kLite>
struct PictureOverheadBench : public Benchmark {
    PictureOverheadBench() {
        fName.appendf("picture_overhead_%d%s\n", kDraws, kLite ? "_lite" : "");
    }
    const char* onGetName() override { return fName.c_str(); }
    bool isSuitableFor(Backend backend) override { return backend == kNonRendering_Backend; }

    void onDraw(int loops, SkCanvas*) override {
        SkLiteRecorder lite;
        SkPictureRecorder rec;
        for (int i = 0; i < loops; i++) {
            SkRect bounds{0,0, 2000,3000};

            sk_sp<SkLiteDL> liteDL;
            SkCanvas* canvas;
            if (kLite) {
                liteDL = SkLiteDL::New(bounds);
                lite.reset(liteDL.get());
                canvas = &lite;
            } else {
                rec.beginRecording(bounds);
                canvas = rec.getRecordingCanvas();
            }

            for (int i = 0; i < kDraws; i++) {
                canvas->drawRect({10,10, 1000, 1000}, SkPaint{});
            }

            if (!kLite) {
                (void)rec.finishRecordingAsPicture();
            }
        }
    }

    SkString fName;
};

DEF_BENCH(return (new PictureOverheadBench<0, false>);)
DEF_BENCH(return (new PictureOverheadBench<1, false>);)
DEF_BENCH(return (new PictureOverheadBench<2, false>);)
DEF_BENCH(return (new PictureOverheadBench<10,false>);)
DEF_BENCH(return (new PictureOverheadBench<0,  true>);)
DEF_BENCH(return (new PictureOverheadBench<1,  true>);)
DEF_BENCH(return (new PictureOverheadBench<2,  true>);)
DEF_BENCH(return (new PictureOverheadBench<10, true>);)
