blob: 9a2f3ca820d5ebdeb9afd0e2f0dc79ba25deb800 [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"
9#include "BenchTimer.h"
10#include "PictureBenchmark.h"
11#include "SkCanvas.h"
12#include "SkPicture.h"
13#include "SkString.h"
14#include "picture_utils.h"
15
16namespace sk_tools {
17
keyar@chromium.org77a55222012-08-20 15:03:47 +000018BenchTimer* PictureBenchmark::setupTimer() {
19#if SK_SUPPORT_GPU
20 PictureRenderer* renderer = getRenderer();
21
22 if (renderer != NULL && renderer->isUsingGpuDevice()) {
23 return new BenchTimer(renderer->getGLContext());
24 } else {
25 return new BenchTimer(NULL);
26 }
27#else
28 return new BenchTimer(NULL);
29#endif
30}
31
keyar@chromium.org163b5672012-08-01 17:53:29 +000032void PipePictureBenchmark::run(SkPicture* pict) {
keyar@chromium.org9d696c02012-08-07 17:11:33 +000033 SkASSERT(pict);
keyar@chromium.org78a35c52012-08-20 15:03:44 +000034 if (NULL == pict) {
keyar@chromium.org9d696c02012-08-07 17:11:33 +000035 return;
36 }
keyar@chromium.org163b5672012-08-01 17:53:29 +000037
keyar@chromium.orgfe6391a2012-08-20 15:03:41 +000038 fRenderer.init(pict);
keyar@chromium.org163b5672012-08-01 17:53:29 +000039
40 // We throw this away to remove first time effects (such as paging in this
41 // program)
keyar@chromium.orgfe6391a2012-08-20 15:03:41 +000042 fRenderer.render();
keyar@chromium.org163b5672012-08-01 17:53:29 +000043
keyar@chromium.org77a55222012-08-20 15:03:47 +000044 BenchTimer* timer = this->setupTimer();
45
46 timer->start();
keyar@chromium.org163b5672012-08-01 17:53:29 +000047 for (int i = 0; i < fRepeats; ++i) {
keyar@chromium.orgfe6391a2012-08-20 15:03:41 +000048 fRenderer.render();
keyar@chromium.org163b5672012-08-01 17:53:29 +000049 }
keyar@chromium.org77a55222012-08-20 15:03:47 +000050 timer->end();
keyar@chromium.org163b5672012-08-01 17:53:29 +000051
keyar@chromium.orgfe6391a2012-08-20 15:03:41 +000052 fRenderer.end();
keyar@chromium.org9d696c02012-08-07 17:11:33 +000053
keyar@chromium.org77a55222012-08-20 15:03:47 +000054 SkDebugf("pipe: msecs = %6.2f", timer->fWall / fRepeats);
keyar@chromium.orgfe6391a2012-08-20 15:03:41 +000055 if (fRenderer.isUsingGpuDevice()) {
keyar@chromium.org77a55222012-08-20 15:03:47 +000056 SkDebugf(" gmsecs = %6.2f", timer->fGpu / fRepeats);
keyar@chromium.orgfe6391a2012-08-20 15:03:41 +000057 }
58 SkDebugf("\n");
keyar@chromium.org77a55222012-08-20 15:03:47 +000059
60 delete timer;
keyar@chromium.org163b5672012-08-01 17:53:29 +000061}
62
63void RecordPictureBenchmark::run(SkPicture* pict) {
keyar@chromium.org9d696c02012-08-07 17:11:33 +000064 SkASSERT(pict);
keyar@chromium.org78a35c52012-08-20 15:03:44 +000065 if (NULL == pict) {
keyar@chromium.org9d696c02012-08-07 17:11:33 +000066 return;
67 }
68
keyar@chromium.org77a55222012-08-20 15:03:47 +000069 BenchTimer* timer = setupTimer();
keyar@chromium.org163b5672012-08-01 17:53:29 +000070 double wall_time = 0;
71
72 for (int i = 0; i < fRepeats + 1; ++i) {
73 SkPicture replayer;
74 SkCanvas* recorder = replayer.beginRecording(pict->width(), pict->height());
75
keyar@chromium.org77a55222012-08-20 15:03:47 +000076 timer->start();
keyar@chromium.org163b5672012-08-01 17:53:29 +000077 recorder->drawPicture(*pict);
keyar@chromium.org77a55222012-08-20 15:03:47 +000078 timer->end();
keyar@chromium.org163b5672012-08-01 17:53:29 +000079
80 // We want to ignore first time effects
81 if (i > 0) {
keyar@chromium.org77a55222012-08-20 15:03:47 +000082 wall_time += timer->fWall;
keyar@chromium.org163b5672012-08-01 17:53:29 +000083 }
84 }
85
86 SkDebugf("record: msecs = %6.5f\n", wall_time / fRepeats);
87}
88
89void SimplePictureBenchmark::run(SkPicture* pict) {
keyar@chromium.org9d696c02012-08-07 17:11:33 +000090 SkASSERT(pict);
keyar@chromium.org78a35c52012-08-20 15:03:44 +000091 if (NULL == pict) {
keyar@chromium.org9d696c02012-08-07 17:11:33 +000092 return;
93 }
keyar@chromium.org163b5672012-08-01 17:53:29 +000094
keyar@chromium.orgfe6391a2012-08-20 15:03:41 +000095 fRenderer.init(pict);
keyar@chromium.org163b5672012-08-01 17:53:29 +000096
97 // We throw this away to remove first time effects (such as paging in this
98 // program)
keyar@chromium.orgfe6391a2012-08-20 15:03:41 +000099 fRenderer.render();
keyar@chromium.org163b5672012-08-01 17:53:29 +0000100
keyar@chromium.org77a55222012-08-20 15:03:47 +0000101 BenchTimer* timer = this->setupTimer();
102
103 timer->start();
keyar@chromium.org163b5672012-08-01 17:53:29 +0000104 for (int i = 0; i < fRepeats; ++i) {
keyar@chromium.orgfe6391a2012-08-20 15:03:41 +0000105 fRenderer.render();
keyar@chromium.org163b5672012-08-01 17:53:29 +0000106 }
keyar@chromium.org77a55222012-08-20 15:03:47 +0000107 timer->end();
keyar@chromium.org163b5672012-08-01 17:53:29 +0000108
keyar@chromium.orgfe6391a2012-08-20 15:03:41 +0000109 fRenderer.end();
keyar@chromium.org9d696c02012-08-07 17:11:33 +0000110
keyar@chromium.org77a55222012-08-20 15:03:47 +0000111 SkDebugf("simple: msecs = %6.2f", timer->fWall / fRepeats);
keyar@chromium.orgfe6391a2012-08-20 15:03:41 +0000112 if (fRenderer.isUsingGpuDevice()) {
keyar@chromium.org77a55222012-08-20 15:03:47 +0000113 SkDebugf(" gmsecs = %6.2f", timer->fGpu / fRepeats);
keyar@chromium.orgfe6391a2012-08-20 15:03:41 +0000114 }
115 SkDebugf("\n");
keyar@chromium.org77a55222012-08-20 15:03:47 +0000116
117 delete timer;
keyar@chromium.org163b5672012-08-01 17:53:29 +0000118}
119
120void TiledPictureBenchmark::run(SkPicture* pict) {
keyar@chromium.org9d696c02012-08-07 17:11:33 +0000121 SkASSERT(pict);
keyar@chromium.org78a35c52012-08-20 15:03:44 +0000122 if (NULL == pict) {
keyar@chromium.org9d696c02012-08-07 17:11:33 +0000123 return;
124 }
125
keyar@chromium.orgfe6391a2012-08-20 15:03:41 +0000126 fRenderer.init(pict);
keyar@chromium.org163b5672012-08-01 17:53:29 +0000127
128 // We throw this away to remove first time effects (such as paging in this
129 // program)
keyar@chromium.orgfe6391a2012-08-20 15:03:41 +0000130 fRenderer.drawTiles();
keyar@chromium.org163b5672012-08-01 17:53:29 +0000131
keyar@chromium.org77a55222012-08-20 15:03:47 +0000132 BenchTimer* timer = setupTimer();
133 timer->start();
keyar@chromium.org163b5672012-08-01 17:53:29 +0000134 for (int i = 0; i < fRepeats; ++i) {
keyar@chromium.orgfe6391a2012-08-20 15:03:41 +0000135 fRenderer.drawTiles();
keyar@chromium.org163b5672012-08-01 17:53:29 +0000136 }
keyar@chromium.org77a55222012-08-20 15:03:47 +0000137 timer->end();
keyar@chromium.org163b5672012-08-01 17:53:29 +0000138
keyar@chromium.orgfe6391a2012-08-20 15:03:41 +0000139 fRenderer.end();
keyar@chromium.org9d696c02012-08-07 17:11:33 +0000140
keyar@chromium.orgfe6391a2012-08-20 15:03:41 +0000141 SkDebugf("%i_tiles_%ix%i: msecs = %6.2f", fRenderer.numTiles(), fRenderer.getTileWidth(),
keyar@chromium.org77a55222012-08-20 15:03:47 +0000142 fRenderer.getTileHeight(), timer->fWall / fRepeats);
keyar@chromium.orgfe6391a2012-08-20 15:03:41 +0000143 if (fRenderer.isUsingGpuDevice()) {
keyar@chromium.org77a55222012-08-20 15:03:47 +0000144 SkDebugf(" gmsecs = %6.2f", timer->fGpu / fRepeats);
keyar@chromium.orgfe6391a2012-08-20 15:03:41 +0000145 }
146 SkDebugf("\n");
keyar@chromium.org163b5672012-08-01 17:53:29 +0000147}
148
149void UnflattenPictureBenchmark::run(SkPicture* pict) {
keyar@chromium.org9d696c02012-08-07 17:11:33 +0000150 SkASSERT(pict);
keyar@chromium.org78a35c52012-08-20 15:03:44 +0000151 if (NULL == pict) {
keyar@chromium.org9d696c02012-08-07 17:11:33 +0000152 return;
153 }
154
keyar@chromium.org77a55222012-08-20 15:03:47 +0000155 BenchTimer* timer = setupTimer();
keyar@chromium.org163b5672012-08-01 17:53:29 +0000156 double wall_time = 0;
157
158 for (int i = 0; i < fRepeats + 1; ++i) {
159 SkPicture replayer;
160 SkCanvas* recorder = replayer.beginRecording(pict->width(), pict->height());
161
162 recorder->drawPicture(*pict);
163
keyar@chromium.org77a55222012-08-20 15:03:47 +0000164 timer->start();
keyar@chromium.org163b5672012-08-01 17:53:29 +0000165 replayer.endRecording();
keyar@chromium.org77a55222012-08-20 15:03:47 +0000166 timer->end();
keyar@chromium.org163b5672012-08-01 17:53:29 +0000167
168 // We want to ignore first time effects
169 if (i > 0) {
keyar@chromium.org77a55222012-08-20 15:03:47 +0000170 wall_time += timer->fWall;
keyar@chromium.org163b5672012-08-01 17:53:29 +0000171 }
172 }
173
174 SkDebugf("unflatten: msecs = %6.4f\n", wall_time / fRepeats);
175}
176
177}