1fd731ce804cd3223318f3feee2c98404890b65f2mtklein/*
2fd731ce804cd3223318f3feee2c98404890b65f2mtklein * Copyright 2014 Google Inc.
3fd731ce804cd3223318f3feee2c98404890b65f2mtklein *
4fd731ce804cd3223318f3feee2c98404890b65f2mtklein * Use of this source code is governed by a BSD-style license that can be
5fd731ce804cd3223318f3feee2c98404890b65f2mtklein * found in the LICENSE file.
6fd731ce804cd3223318f3feee2c98404890b65f2mtklein */
7fd731ce804cd3223318f3feee2c98404890b65f2mtklein
8fd731ce804cd3223318f3feee2c98404890b65f2mtklein#include "RecordingBench.h"
9fd731ce804cd3223318f3feee2c98404890b65f2mtklein#include "SkBBHFactory.h"
108c1a4f80d9b2aeb039623128a23223233842fc71mtklein#include "SkLiteDL.h"
118c1a4f80d9b2aeb039623128a23223233842fc71mtklein#include "SkLiteRecorder.h"
12fd731ce804cd3223318f3feee2c98404890b65f2mtklein#include "SkPictureRecorder.h"
13fd731ce804cd3223318f3feee2c98404890b65f2mtklein
149cdd2abc30520d6f425afbc2d7bd7b15f8b11ba1Mike ReedPictureCentricBench::PictureCentricBench(const char* name, const SkPicture* pic) : fName(name) {
158c1a4f80d9b2aeb039623128a23223233842fc71mtklein    // Flatten the source picture in case it's trivially nested (useless for timing).
168c1a4f80d9b2aeb039623128a23223233842fc71mtklein    SkPictureRecorder rec;
178c1a4f80d9b2aeb039623128a23223233842fc71mtklein    pic->playback(rec.beginRecording(pic->cullRect(), nullptr,
188c1a4f80d9b2aeb039623128a23223233842fc71mtklein                                     SkPictureRecorder::kPlaybackDrawPicture_RecordFlag));
198c1a4f80d9b2aeb039623128a23223233842fc71mtklein    fSrc = rec.finishRecordingAsPicture();
208c1a4f80d9b2aeb039623128a23223233842fc71mtklein}
21fd731ce804cd3223318f3feee2c98404890b65f2mtklein
229cdd2abc30520d6f425afbc2d7bd7b15f8b11ba1Mike Reedconst char* PictureCentricBench::onGetName() {
23fd731ce804cd3223318f3feee2c98404890b65f2mtklein    return fName.c_str();
24fd731ce804cd3223318f3feee2c98404890b65f2mtklein}
25fd731ce804cd3223318f3feee2c98404890b65f2mtklein
269cdd2abc30520d6f425afbc2d7bd7b15f8b11ba1Mike Reedbool PictureCentricBench::isSuitableFor(Backend backend) {
27fd731ce804cd3223318f3feee2c98404890b65f2mtklein    return backend == kNonRendering_Backend;
28fd731ce804cd3223318f3feee2c98404890b65f2mtklein}
29fd731ce804cd3223318f3feee2c98404890b65f2mtklein
309cdd2abc30520d6f425afbc2d7bd7b15f8b11ba1Mike ReedSkIPoint PictureCentricBench::onGetSize() {
31fd731ce804cd3223318f3feee2c98404890b65f2mtklein    return SkIPoint::Make(SkScalarCeilToInt(fSrc->cullRect().width()),
32fd731ce804cd3223318f3feee2c98404890b65f2mtklein                          SkScalarCeilToInt(fSrc->cullRect().height()));
33fd731ce804cd3223318f3feee2c98404890b65f2mtklein}
34fd731ce804cd3223318f3feee2c98404890b65f2mtklein
359cdd2abc30520d6f425afbc2d7bd7b15f8b11ba1Mike Reed///////////////////////////////////////////////////////////////////////////////////////////////////
369cdd2abc30520d6f425afbc2d7bd7b15f8b11ba1Mike Reed
379cdd2abc30520d6f425afbc2d7bd7b15f8b11ba1Mike ReedRecordingBench::RecordingBench(const char* name, const SkPicture* pic, bool useBBH, bool lite)
389cdd2abc30520d6f425afbc2d7bd7b15f8b11ba1Mike Reed    : INHERITED(name, pic)
399cdd2abc30520d6f425afbc2d7bd7b15f8b11ba1Mike Reed    , fUseBBH(useBBH)
409cdd2abc30520d6f425afbc2d7bd7b15f8b11ba1Mike Reed{
419cdd2abc30520d6f425afbc2d7bd7b15f8b11ba1Mike Reed    // If we're recording into an SkLiteDL, also record _from_ one.
429cdd2abc30520d6f425afbc2d7bd7b15f8b11ba1Mike Reed    if (lite) {
43d7875f57bd5f17ac27f1cb2ace25224299ff2389Derek Sollenberger        fDL.reset(new SkLiteDL());
449cdd2abc30520d6f425afbc2d7bd7b15f8b11ba1Mike Reed        SkLiteRecorder r;
45d7875f57bd5f17ac27f1cb2ace25224299ff2389Derek Sollenberger        r.reset(fDL.get(), fSrc->cullRect().roundOut());
469cdd2abc30520d6f425afbc2d7bd7b15f8b11ba1Mike Reed        fSrc->playback(&r);
479cdd2abc30520d6f425afbc2d7bd7b15f8b11ba1Mike Reed    }
489cdd2abc30520d6f425afbc2d7bd7b15f8b11ba1Mike Reed}
499cdd2abc30520d6f425afbc2d7bd7b15f8b11ba1Mike Reed
50a1ebeb25e9acfcd801e089e063311d716b83b8a5mtkleinvoid RecordingBench::onDraw(int loops, SkCanvas*) {
511d65fe293241cfeb405b1724371d6c532bcee55fmtklein    if (fDL) {
528c1a4f80d9b2aeb039623128a23223233842fc71mtklein        SkLiteRecorder rec;
538c1a4f80d9b2aeb039623128a23223233842fc71mtklein        while (loops --> 0) {
54d7875f57bd5f17ac27f1cb2ace25224299ff2389Derek Sollenberger            SkLiteDL dl;
55d7875f57bd5f17ac27f1cb2ace25224299ff2389Derek Sollenberger            rec.reset(&dl, fSrc->cullRect().roundOut());
561d65fe293241cfeb405b1724371d6c532bcee55fmtklein            fDL->draw(&rec);
578c1a4f80d9b2aeb039623128a23223233842fc71mtklein        }
588c1a4f80d9b2aeb039623128a23223233842fc71mtklein
598c1a4f80d9b2aeb039623128a23223233842fc71mtklein    } else {
608c1a4f80d9b2aeb039623128a23223233842fc71mtklein        SkRTreeFactory factory;
61fd731ce804cd3223318f3feee2c98404890b65f2mtklein        SkPictureRecorder recorder;
628c1a4f80d9b2aeb039623128a23223233842fc71mtklein        while (loops --> 0) {
638c1a4f80d9b2aeb039623128a23223233842fc71mtklein            fSrc->playback(recorder.beginRecording(fSrc->cullRect(), fUseBBH ? &factory : nullptr));
648c1a4f80d9b2aeb039623128a23223233842fc71mtklein            (void)recorder.finishRecordingAsPicture();
658c1a4f80d9b2aeb039623128a23223233842fc71mtklein        }
66fd731ce804cd3223318f3feee2c98404890b65f2mtklein    }
67fd731ce804cd3223318f3feee2c98404890b65f2mtklein}
689cdd2abc30520d6f425afbc2d7bd7b15f8b11ba1Mike Reed
699cdd2abc30520d6f425afbc2d7bd7b15f8b11ba1Mike Reed///////////////////////////////////////////////////////////////////////////////////////////////////
709cdd2abc30520d6f425afbc2d7bd7b15f8b11ba1Mike Reed
719cdd2abc30520d6f425afbc2d7bd7b15f8b11ba1Mike Reed#include "SkPipe.h"
729cdd2abc30520d6f425afbc2d7bd7b15f8b11ba1Mike Reed#include "SkStream.h"
739cdd2abc30520d6f425afbc2d7bd7b15f8b11ba1Mike Reed
749cdd2abc30520d6f425afbc2d7bd7b15f8b11ba1Mike ReedPipingBench::PipingBench(const char* name, const SkPicture* pic) : INHERITED(name, pic) {
759cdd2abc30520d6f425afbc2d7bd7b15f8b11ba1Mike Reed    fName.prepend("pipe_");
769cdd2abc30520d6f425afbc2d7bd7b15f8b11ba1Mike Reed}
779cdd2abc30520d6f425afbc2d7bd7b15f8b11ba1Mike Reed
789cdd2abc30520d6f425afbc2d7bd7b15f8b11ba1Mike Reedvoid PipingBench::onDraw(int loops, SkCanvas*) {
799cdd2abc30520d6f425afbc2d7bd7b15f8b11ba1Mike Reed    SkDynamicMemoryWStream stream;
809cdd2abc30520d6f425afbc2d7bd7b15f8b11ba1Mike Reed    SkPipeSerializer serializer;
819cdd2abc30520d6f425afbc2d7bd7b15f8b11ba1Mike Reed
829cdd2abc30520d6f425afbc2d7bd7b15f8b11ba1Mike Reed    while (loops --> 0) {
839cdd2abc30520d6f425afbc2d7bd7b15f8b11ba1Mike Reed        fSrc->playback(serializer.beginWrite(fSrc->cullRect(), &stream));
849cdd2abc30520d6f425afbc2d7bd7b15f8b11ba1Mike Reed        serializer.endWrite();
859cdd2abc30520d6f425afbc2d7bd7b15f8b11ba1Mike Reed        stream.reset();
869cdd2abc30520d6f425afbc2d7bd7b15f8b11ba1Mike Reed    }
879cdd2abc30520d6f425afbc2d7bd7b15f8b11ba1Mike Reed}
88e45ff46a6587ac0e481a62a85cc42b1a0865d856Mike Reed
89e45ff46a6587ac0e481a62a85cc42b1a0865d856Mike Reed///////////////////////////////////////////////////////////////////////////////////////////////////
90e45ff46a6587ac0e481a62a85cc42b1a0865d856Mike Reed#include "SkSerialProcs.h"
91e45ff46a6587ac0e481a62a85cc42b1a0865d856Mike Reed
92e45ff46a6587ac0e481a62a85cc42b1a0865d856Mike ReedDeserializePictureBench::DeserializePictureBench(const char* name, sk_sp<SkData> data)
93e45ff46a6587ac0e481a62a85cc42b1a0865d856Mike Reed    : fName(name)
94e45ff46a6587ac0e481a62a85cc42b1a0865d856Mike Reed    , fEncodedPicture(std::move(data))
95e45ff46a6587ac0e481a62a85cc42b1a0865d856Mike Reed{}
96e45ff46a6587ac0e481a62a85cc42b1a0865d856Mike Reed
97e45ff46a6587ac0e481a62a85cc42b1a0865d856Mike Reedconst char* DeserializePictureBench::onGetName() {
98e45ff46a6587ac0e481a62a85cc42b1a0865d856Mike Reed    return fName.c_str();
99e45ff46a6587ac0e481a62a85cc42b1a0865d856Mike Reed}
100e45ff46a6587ac0e481a62a85cc42b1a0865d856Mike Reed
101e45ff46a6587ac0e481a62a85cc42b1a0865d856Mike Reedbool DeserializePictureBench::isSuitableFor(Backend backend) {
102e45ff46a6587ac0e481a62a85cc42b1a0865d856Mike Reed    return backend == kNonRendering_Backend;
103e45ff46a6587ac0e481a62a85cc42b1a0865d856Mike Reed}
104e45ff46a6587ac0e481a62a85cc42b1a0865d856Mike Reed
105e45ff46a6587ac0e481a62a85cc42b1a0865d856Mike ReedSkIPoint DeserializePictureBench::onGetSize() {
106e45ff46a6587ac0e481a62a85cc42b1a0865d856Mike Reed    return SkIPoint::Make(128, 128);
107e45ff46a6587ac0e481a62a85cc42b1a0865d856Mike Reed}
108e45ff46a6587ac0e481a62a85cc42b1a0865d856Mike Reed
109e45ff46a6587ac0e481a62a85cc42b1a0865d856Mike Reedvoid DeserializePictureBench::onDraw(int loops, SkCanvas*) {
110e45ff46a6587ac0e481a62a85cc42b1a0865d856Mike Reed    for (int i = 0; i < loops; ++i) {
11147fdf6c85ee8151c14529e5322d63636c36ecdb8Mike Reed        SkPicture::MakeFromData(fEncodedPicture.get());
112e45ff46a6587ac0e481a62a85cc42b1a0865d856Mike Reed    }
113e45ff46a6587ac0e481a62a85cc42b1a0865d856Mike Reed}
114