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