blob: ca7795f7b74b70795266e5f491f7423af064e4ab [file] [log] [blame]
keyar@chromium.org163b5672012-08-01 17:53:29 +00001/*
2 * Copyright 2012 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
scroggo@google.com9a412522012-09-07 15:21:18 +00008#include "SkBenchLogger.h"
keyar@chromium.org163b5672012-08-01 17:53:29 +00009#include "BenchTimer.h"
10#include "PictureBenchmark.h"
11#include "SkCanvas.h"
12#include "SkPicture.h"
13#include "SkString.h"
14#include "picture_utils.h"
scroggo@google.com9a412522012-09-07 15:21:18 +000015#include "TimerData.h"
keyar@chromium.org163b5672012-08-01 17:53:29 +000016
17namespace sk_tools {
18
scroggo@google.com5239c322012-09-11 19:15:32 +000019PictureBenchmark::PictureBenchmark()
20: fRepeats(1)
21, fLogger(NULL)
22, fRenderer(NULL)
23, fLogPerIter(false)
24, fPrintMin(false)
25, fShowWallTime(false)
26, fShowTruncatedWallTime(false)
27, fShowCpuTime(true)
28, fShowTruncatedCpuTime(false)
29, fShowGpuTime(false)
30{}
31
32PictureBenchmark::~PictureBenchmark() {
33 SkSafeUnref(fRenderer);
34}
35
keyar@chromium.org77a55222012-08-20 15:03:47 +000036BenchTimer* PictureBenchmark::setupTimer() {
37#if SK_SUPPORT_GPU
scroggo@google.com5239c322012-09-11 19:15:32 +000038 if (fRenderer != NULL && fRenderer->isUsingGpuDevice()) {
39 return SkNEW_ARGS(BenchTimer, (fRenderer->getGLContext()));
keyar@chromium.org77a55222012-08-20 15:03:47 +000040 } else {
keyar@chromium.org941844b2012-08-20 15:03:54 +000041 return SkNEW_ARGS(BenchTimer, (NULL));
keyar@chromium.org77a55222012-08-20 15:03:47 +000042 }
43#else
keyar@chromium.org941844b2012-08-20 15:03:54 +000044 return SkNEW_ARGS(BenchTimer, (NULL));
keyar@chromium.org77a55222012-08-20 15:03:47 +000045#endif
46}
47
scroggo@google.com9a412522012-09-07 15:21:18 +000048void PictureBenchmark::logProgress(const char msg[]) {
49 if (fLogger != NULL) {
50 fLogger->logProgress(msg);
51 }
52}
53
scroggo@google.com5239c322012-09-11 19:15:32 +000054PictureRenderer* PictureBenchmark::setRenderer(sk_tools::PictureRenderer* renderer) {
55 SkRefCnt_SafeAssign(fRenderer, renderer);
56 return renderer;
57}
58
scroggo@google.com9a412522012-09-07 15:21:18 +000059void PictureBenchmark::run(SkPicture* pict) {
keyar@chromium.org9d696c02012-08-07 17:11:33 +000060 SkASSERT(pict);
keyar@chromium.org78a35c52012-08-20 15:03:44 +000061 if (NULL == pict) {
keyar@chromium.org9d696c02012-08-07 17:11:33 +000062 return;
63 }
keyar@chromium.org163b5672012-08-01 17:53:29 +000064
scroggo@google.com5239c322012-09-11 19:15:32 +000065 SkASSERT(fRenderer != NULL);
66 if (NULL == fRenderer) {
scroggo@google.com9a412522012-09-07 15:21:18 +000067 return;
68 }
keyar@chromium.org163b5672012-08-01 17:53:29 +000069
scroggo@google.com5239c322012-09-11 19:15:32 +000070 fRenderer->init(pict);
71
72 // We throw this away to remove first time effects (such as paging in this program)
73 fRenderer->setup();
scroggo@google.com81f9d2e2012-09-20 14:54:21 +000074 fRenderer->render(NULL);
scroggo@google.com5239c322012-09-11 19:15:32 +000075 fRenderer->resetState();
keyar@chromium.org163b5672012-08-01 17:53:29 +000076
keyar@chromium.org77a55222012-08-20 15:03:47 +000077 BenchTimer* timer = this->setupTimer();
scroggo@google.com9a412522012-09-07 15:21:18 +000078 bool usingGpu = false;
keyar@chromium.orgf8a513f2012-08-20 15:03:52 +000079#if SK_SUPPORT_GPU
scroggo@google.com5239c322012-09-11 19:15:32 +000080 usingGpu = fRenderer->isUsingGpuDevice();
keyar@chromium.orgf8a513f2012-08-20 15:03:52 +000081#endif
keyar@chromium.org77a55222012-08-20 15:03:47 +000082
scroggo@google.com5239c322012-09-11 19:15:32 +000083 TimerData timerData(fRenderer->getPerIterTimeFormat(), fRenderer->getNormalTimeFormat());
keyar@chromium.org163b5672012-08-01 17:53:29 +000084 for (int i = 0; i < fRepeats; ++i) {
scroggo@google.com5239c322012-09-11 19:15:32 +000085 fRenderer->setup();
keyar@chromium.org163b5672012-08-01 17:53:29 +000086
keyar@chromium.org77a55222012-08-20 15:03:47 +000087 timer->start();
scroggo@google.com3686c9d2012-09-25 17:36:36 +000088 fRenderer->render(NULL);
scroggo@google.com9a412522012-09-07 15:21:18 +000089 timer->truncatedEnd();
90
91 // Finishes gl context
scroggo@google.com5239c322012-09-11 19:15:32 +000092 fRenderer->resetState();
keyar@chromium.org77a55222012-08-20 15:03:47 +000093 timer->end();
keyar@chromium.org163b5672012-08-01 17:53:29 +000094
scroggo@google.com9a412522012-09-07 15:21:18 +000095 timerData.appendTimes(timer, fRepeats - 1 == i);
keyar@chromium.org163b5672012-08-01 17:53:29 +000096 }
97
scroggo@google.com0a049b82012-11-02 22:01:26 +000098 SkString configName = fRenderer->getConfigName();
scroggo@google.com5239c322012-09-11 19:15:32 +000099 SkString result = timerData.getResult(fLogPerIter, fPrintMin, fRepeats,
scroggo@google.com0a049b82012-11-02 22:01:26 +0000100 configName.c_str(), fShowWallTime, fShowTruncatedWallTime,
scroggo@google.com5239c322012-09-11 19:15:32 +0000101 fShowCpuTime, fShowTruncatedCpuTime,
102 usingGpu && fShowGpuTime);
scroggo@google.com9a412522012-09-07 15:21:18 +0000103 result.append("\n");
104 this->logProgress(result.c_str());
keyar@chromium.org378c97f2012-08-20 15:04:09 +0000105
scroggo@google.com5239c322012-09-11 19:15:32 +0000106 fRenderer->end();
keyar@chromium.org378c97f2012-08-20 15:04:09 +0000107 SkDELETE(timer);
keyar@chromium.org163b5672012-08-01 17:53:29 +0000108}
109
110}