Home | History | Annotate | Download | only in bench
      1 /*
      2  * Copyright 2014 Google Inc.
      3  *
      4  * Use of this source code is governed by a BSD-style license that can be
      5  * found in the LICENSE file.
      6  */
      7 
      8 #include "RecordingBench.h"
      9 #include "SkBBHFactory.h"
     10 #include "SkLiteDL.h"
     11 #include "SkLiteRecorder.h"
     12 #include "SkPictureRecorder.h"
     13 
     14 PictureCentricBench::PictureCentricBench(const char* name, const SkPicture* pic) : fName(name) {
     15     // Flatten the source picture in case it's trivially nested (useless for timing).
     16     SkPictureRecorder rec;
     17     pic->playback(rec.beginRecording(pic->cullRect(), nullptr,
     18                                      SkPictureRecorder::kPlaybackDrawPicture_RecordFlag));
     19     fSrc = rec.finishRecordingAsPicture();
     20 }
     21 
     22 const char* PictureCentricBench::onGetName() {
     23     return fName.c_str();
     24 }
     25 
     26 bool PictureCentricBench::isSuitableFor(Backend backend) {
     27     return backend == kNonRendering_Backend;
     28 }
     29 
     30 SkIPoint PictureCentricBench::onGetSize() {
     31     return SkIPoint::Make(SkScalarCeilToInt(fSrc->cullRect().width()),
     32                           SkScalarCeilToInt(fSrc->cullRect().height()));
     33 }
     34 
     35 ///////////////////////////////////////////////////////////////////////////////////////////////////
     36 
     37 RecordingBench::RecordingBench(const char* name, const SkPicture* pic, bool useBBH, bool lite)
     38     : INHERITED(name, pic)
     39     , fUseBBH(useBBH)
     40 {
     41     // If we're recording into an SkLiteDL, also record _from_ one.
     42     if (lite) {
     43         fDL.reset(new SkLiteDL());
     44         SkLiteRecorder r;
     45         r.reset(fDL.get(), fSrc->cullRect().roundOut());
     46         fSrc->playback(&r);
     47     }
     48 }
     49 
     50 void RecordingBench::onDraw(int loops, SkCanvas*) {
     51     if (fDL) {
     52         SkLiteRecorder rec;
     53         while (loops --> 0) {
     54             SkLiteDL dl;
     55             rec.reset(&dl, fSrc->cullRect().roundOut());
     56             fDL->draw(&rec);
     57         }
     58 
     59     } else {
     60         SkRTreeFactory factory;
     61         SkPictureRecorder recorder;
     62         while (loops --> 0) {
     63             fSrc->playback(recorder.beginRecording(fSrc->cullRect(), fUseBBH ? &factory : nullptr));
     64             (void)recorder.finishRecordingAsPicture();
     65         }
     66     }
     67 }
     68 
     69 ///////////////////////////////////////////////////////////////////////////////////////////////////
     70 #include "SkSerialProcs.h"
     71 
     72 DeserializePictureBench::DeserializePictureBench(const char* name, sk_sp<SkData> data)
     73     : fName(name)
     74     , fEncodedPicture(std::move(data))
     75 {}
     76 
     77 const char* DeserializePictureBench::onGetName() {
     78     return fName.c_str();
     79 }
     80 
     81 bool DeserializePictureBench::isSuitableFor(Backend backend) {
     82     return backend == kNonRendering_Backend;
     83 }
     84 
     85 SkIPoint DeserializePictureBench::onGetSize() {
     86     return SkIPoint::Make(128, 128);
     87 }
     88 
     89 void DeserializePictureBench::onDraw(int loops, SkCanvas*) {
     90     for (int i = 0; i < loops; ++i) {
     91         SkPicture::MakeFromData(fEncodedPicture.get());
     92     }
     93 }
     94