blob: f63d087ccc9b64f78d5953b705db4bcf64678935 [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
8#include "SkTypes.h"
scroggo@google.com9a412522012-09-07 15:21:18 +00009#include "SkBenchLogger.h"
keyar@chromium.org163b5672012-08-01 17:53:29 +000010#include "BenchTimer.h"
11#include "PictureBenchmark.h"
12#include "SkCanvas.h"
13#include "SkPicture.h"
14#include "SkString.h"
15#include "picture_utils.h"
scroggo@google.com9a412522012-09-07 15:21:18 +000016#include "TimerData.h"
keyar@chromium.org163b5672012-08-01 17:53:29 +000017
18namespace sk_tools {
19
keyar@chromium.org77a55222012-08-20 15:03:47 +000020BenchTimer* PictureBenchmark::setupTimer() {
21#if SK_SUPPORT_GPU
22 PictureRenderer* renderer = getRenderer();
23
24 if (renderer != NULL && renderer->isUsingGpuDevice()) {
keyar@chromium.org941844b2012-08-20 15:03:54 +000025 return SkNEW_ARGS(BenchTimer, (renderer->getGLContext()));
keyar@chromium.org77a55222012-08-20 15:03:47 +000026 } else {
keyar@chromium.org941844b2012-08-20 15:03:54 +000027 return SkNEW_ARGS(BenchTimer, (NULL));
keyar@chromium.org77a55222012-08-20 15:03:47 +000028 }
29#else
keyar@chromium.org941844b2012-08-20 15:03:54 +000030 return SkNEW_ARGS(BenchTimer, (NULL));
keyar@chromium.org77a55222012-08-20 15:03:47 +000031#endif
32}
33
scroggo@google.com9a412522012-09-07 15:21:18 +000034void PictureBenchmark::logProgress(const char msg[]) {
35 if (fLogger != NULL) {
36 fLogger->logProgress(msg);
37 }
38}
39
40void PictureBenchmark::run(SkPicture* pict) {
keyar@chromium.org9d696c02012-08-07 17:11:33 +000041 SkASSERT(pict);
keyar@chromium.org78a35c52012-08-20 15:03:44 +000042 if (NULL == pict) {
keyar@chromium.org9d696c02012-08-07 17:11:33 +000043 return;
44 }
keyar@chromium.org163b5672012-08-01 17:53:29 +000045
scroggo@google.com9a412522012-09-07 15:21:18 +000046 PictureRenderer* renderer = this->getRenderer();
47 SkASSERT(renderer != NULL);
48 if (NULL == renderer) {
49 return;
50 }
51 renderer->init(pict);
keyar@chromium.org163b5672012-08-01 17:53:29 +000052
53 // We throw this away to remove first time effects (such as paging in this
54 // program)
scroggo@google.com9a412522012-09-07 15:21:18 +000055 renderer->setup();
56 renderer->render(false);
57 renderer->resetState();
keyar@chromium.org163b5672012-08-01 17:53:29 +000058
keyar@chromium.org77a55222012-08-20 15:03:47 +000059 BenchTimer* timer = this->setupTimer();
scroggo@google.com9a412522012-09-07 15:21:18 +000060 bool usingGpu = false;
keyar@chromium.orgf8a513f2012-08-20 15:03:52 +000061#if SK_SUPPORT_GPU
scroggo@google.com9a412522012-09-07 15:21:18 +000062 usingGpu = renderer->isUsingGpuDevice();
keyar@chromium.orgf8a513f2012-08-20 15:03:52 +000063#endif
keyar@chromium.org77a55222012-08-20 15:03:47 +000064
scroggo@google.com9a412522012-09-07 15:21:18 +000065 TimerData timerData(renderer->getPerIterTimeFormat(), renderer->getNormalTimeFormat());
keyar@chromium.org163b5672012-08-01 17:53:29 +000066 for (int i = 0; i < fRepeats; ++i) {
scroggo@google.com9a412522012-09-07 15:21:18 +000067 renderer->setup();
keyar@chromium.org163b5672012-08-01 17:53:29 +000068
keyar@chromium.org77a55222012-08-20 15:03:47 +000069 timer->start();
scroggo@google.com9a412522012-09-07 15:21:18 +000070 renderer->render(false);
71 timer->truncatedEnd();
72
73 // Finishes gl context
74 renderer->resetState();
keyar@chromium.org77a55222012-08-20 15:03:47 +000075 timer->end();
keyar@chromium.org163b5672012-08-01 17:53:29 +000076
scroggo@google.com9a412522012-09-07 15:21:18 +000077 timerData.appendTimes(timer, fRepeats - 1 == i);
keyar@chromium.org163b5672012-08-01 17:53:29 +000078 }
79
scroggo@google.com9a412522012-09-07 15:21:18 +000080 // FIXME: Pass these options on the command line.
81 bool logPerIter = false;
82 bool printMin = false;
83 const char* configName = usingGpu ? "gpu" : "raster";
84 bool showWallTime = true;
85 bool showTruncatedWallTime = false;
86 bool showCpuTime = false;
87 bool showTruncatedCpuTime = false;
88 SkString result = timerData.getResult(logPerIter, printMin, fRepeats,
89 configName, showWallTime, showTruncatedWallTime,
90 showCpuTime, showTruncatedCpuTime, usingGpu);
91 result.append("\n");
92 this->logProgress(result.c_str());
keyar@chromium.org378c97f2012-08-20 15:04:09 +000093
scroggo@google.com9a412522012-09-07 15:21:18 +000094 renderer->end();
keyar@chromium.org378c97f2012-08-20 15:04:09 +000095 SkDELETE(timer);
keyar@chromium.org163b5672012-08-01 17:53:29 +000096}
97
98}