blob: e45c5e83893c20c782e91ba0a797a586bffcd71f [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()) {
keyar@chromium.org941844b2012-08-20 15:03:54 +000023 return SkNEW_ARGS(BenchTimer, (renderer->getGLContext()));
keyar@chromium.org77a55222012-08-20 15:03:47 +000024 } else {
keyar@chromium.org941844b2012-08-20 15:03:54 +000025 return SkNEW_ARGS(BenchTimer, (NULL));
keyar@chromium.org77a55222012-08-20 15:03:47 +000026 }
27#else
keyar@chromium.org941844b2012-08-20 15:03:54 +000028 return SkNEW_ARGS(BenchTimer, (NULL));
keyar@chromium.org77a55222012-08-20 15:03:47 +000029#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.orgf8a513f2012-08-20 15:03:52 +000043 fRenderer.resetState();
keyar@chromium.org163b5672012-08-01 17:53:29 +000044
keyar@chromium.org77a55222012-08-20 15:03:47 +000045 BenchTimer* timer = this->setupTimer();
keyar@chromium.orgf8a513f2012-08-20 15:03:52 +000046 double wall_time = 0;
47#if SK_SUPPORT_GPU
48 double gpu_time = 0;
49#endif
keyar@chromium.org77a55222012-08-20 15:03:47 +000050
keyar@chromium.org163b5672012-08-01 17:53:29 +000051 for (int i = 0; i < fRepeats; ++i) {
keyar@chromium.orgf8a513f2012-08-20 15:03:52 +000052 timer->start();
keyar@chromium.orgfe6391a2012-08-20 15:03:41 +000053 fRenderer.render();
keyar@chromium.orgf8a513f2012-08-20 15:03:52 +000054 timer->end();
55 fRenderer.resetState();
56
57 wall_time += timer->fWall;
58#if SK_SUPPORT_GPU
59 if (fRenderer.isUsingGpuDevice()) {
60 gpu_time += timer->fGpu;
61 }
62#endif
keyar@chromium.org163b5672012-08-01 17:53:29 +000063 }
keyar@chromium.org163b5672012-08-01 17:53:29 +000064
keyar@chromium.orgfe6391a2012-08-20 15:03:41 +000065 fRenderer.end();
keyar@chromium.org9d696c02012-08-07 17:11:33 +000066
keyar@chromium.orgf8a513f2012-08-20 15:03:52 +000067 SkDebugf("pipe: msecs = %6.2f", wall_time / fRepeats);
68#if SK_SUPPORT_GPU
keyar@chromium.orgfe6391a2012-08-20 15:03:41 +000069 if (fRenderer.isUsingGpuDevice()) {
keyar@chromium.orgf8a513f2012-08-20 15:03:52 +000070 SkDebugf(" gmsecs = %6.2f", gpu_time / fRepeats);
keyar@chromium.orgfe6391a2012-08-20 15:03:41 +000071 }
keyar@chromium.orgf8a513f2012-08-20 15:03:52 +000072#endif
keyar@chromium.orgfe6391a2012-08-20 15:03:41 +000073 SkDebugf("\n");
keyar@chromium.org77a55222012-08-20 15:03:47 +000074
keyar@chromium.org941844b2012-08-20 15:03:54 +000075 SkDELETE(timer);
keyar@chromium.org163b5672012-08-01 17:53:29 +000076}
77
78void RecordPictureBenchmark::run(SkPicture* pict) {
keyar@chromium.org9d696c02012-08-07 17:11:33 +000079 SkASSERT(pict);
keyar@chromium.org78a35c52012-08-20 15:03:44 +000080 if (NULL == pict) {
keyar@chromium.org9d696c02012-08-07 17:11:33 +000081 return;
82 }
83
keyar@chromium.org77a55222012-08-20 15:03:47 +000084 BenchTimer* timer = setupTimer();
keyar@chromium.org163b5672012-08-01 17:53:29 +000085 double wall_time = 0;
86
87 for (int i = 0; i < fRepeats + 1; ++i) {
88 SkPicture replayer;
89 SkCanvas* recorder = replayer.beginRecording(pict->width(), pict->height());
90
keyar@chromium.org77a55222012-08-20 15:03:47 +000091 timer->start();
keyar@chromium.org163b5672012-08-01 17:53:29 +000092 recorder->drawPicture(*pict);
keyar@chromium.org77a55222012-08-20 15:03:47 +000093 timer->end();
keyar@chromium.org163b5672012-08-01 17:53:29 +000094
95 // We want to ignore first time effects
96 if (i > 0) {
keyar@chromium.org77a55222012-08-20 15:03:47 +000097 wall_time += timer->fWall;
keyar@chromium.org163b5672012-08-01 17:53:29 +000098 }
99 }
100
101 SkDebugf("record: msecs = %6.5f\n", wall_time / fRepeats);
keyar@chromium.org378c97f2012-08-20 15:04:09 +0000102
103 SkDELETE(timer);
keyar@chromium.org163b5672012-08-01 17:53:29 +0000104}
105
106void SimplePictureBenchmark::run(SkPicture* pict) {
keyar@chromium.org9d696c02012-08-07 17:11:33 +0000107 SkASSERT(pict);
keyar@chromium.org78a35c52012-08-20 15:03:44 +0000108 if (NULL == pict) {
keyar@chromium.org9d696c02012-08-07 17:11:33 +0000109 return;
110 }
keyar@chromium.org163b5672012-08-01 17:53:29 +0000111
keyar@chromium.orgfe6391a2012-08-20 15:03:41 +0000112 fRenderer.init(pict);
keyar@chromium.org163b5672012-08-01 17:53:29 +0000113
114 // We throw this away to remove first time effects (such as paging in this
115 // program)
keyar@chromium.orgfe6391a2012-08-20 15:03:41 +0000116 fRenderer.render();
keyar@chromium.orgf8a513f2012-08-20 15:03:52 +0000117 fRenderer.resetState();
118
keyar@chromium.org163b5672012-08-01 17:53:29 +0000119
keyar@chromium.org77a55222012-08-20 15:03:47 +0000120 BenchTimer* timer = this->setupTimer();
keyar@chromium.orgf8a513f2012-08-20 15:03:52 +0000121 double wall_time = 0;
122#if SK_SUPPORT_GPU
123 double gpu_time = 0;
124#endif
keyar@chromium.org77a55222012-08-20 15:03:47 +0000125
keyar@chromium.org163b5672012-08-01 17:53:29 +0000126 for (int i = 0; i < fRepeats; ++i) {
keyar@chromium.orgf8a513f2012-08-20 15:03:52 +0000127 timer->start();
keyar@chromium.orgfe6391a2012-08-20 15:03:41 +0000128 fRenderer.render();
keyar@chromium.orgf8a513f2012-08-20 15:03:52 +0000129 timer->end();
130 fRenderer.resetState();
131
132 wall_time += timer->fWall;
133#if SK_SUPPORT_GPU
134 if (fRenderer.isUsingGpuDevice()) {
135 gpu_time += timer->fGpu;
136 }
137#endif
keyar@chromium.org163b5672012-08-01 17:53:29 +0000138 }
keyar@chromium.org163b5672012-08-01 17:53:29 +0000139
keyar@chromium.orgfe6391a2012-08-20 15:03:41 +0000140 fRenderer.end();
keyar@chromium.org9d696c02012-08-07 17:11:33 +0000141
keyar@chromium.orgf8a513f2012-08-20 15:03:52 +0000142 SkDebugf("simple: msecs = %6.2f", wall_time / fRepeats);
143#if SK_SUPPORT_GPU
keyar@chromium.orgfe6391a2012-08-20 15:03:41 +0000144 if (fRenderer.isUsingGpuDevice()) {
keyar@chromium.orgf8a513f2012-08-20 15:03:52 +0000145 SkDebugf(" gmsecs = %6.2f", gpu_time / fRepeats);
keyar@chromium.orgfe6391a2012-08-20 15:03:41 +0000146 }
keyar@chromium.orgf8a513f2012-08-20 15:03:52 +0000147#endif
keyar@chromium.orgfe6391a2012-08-20 15:03:41 +0000148 SkDebugf("\n");
keyar@chromium.org77a55222012-08-20 15:03:47 +0000149
keyar@chromium.org941844b2012-08-20 15:03:54 +0000150 SkDELETE(timer);
keyar@chromium.org163b5672012-08-01 17:53:29 +0000151}
152
153void TiledPictureBenchmark::run(SkPicture* pict) {
keyar@chromium.org9d696c02012-08-07 17:11:33 +0000154 SkASSERT(pict);
keyar@chromium.org78a35c52012-08-20 15:03:44 +0000155 if (NULL == pict) {
keyar@chromium.org9d696c02012-08-07 17:11:33 +0000156 return;
157 }
158
keyar@chromium.orgfe6391a2012-08-20 15:03:41 +0000159 fRenderer.init(pict);
keyar@chromium.org163b5672012-08-01 17:53:29 +0000160
161 // We throw this away to remove first time effects (such as paging in this
162 // program)
keyar@chromium.orgfe6391a2012-08-20 15:03:41 +0000163 fRenderer.drawTiles();
keyar@chromium.orgf8a513f2012-08-20 15:03:52 +0000164 fRenderer.resetState();
keyar@chromium.org163b5672012-08-01 17:53:29 +0000165
keyar@chromium.org77a55222012-08-20 15:03:47 +0000166 BenchTimer* timer = setupTimer();
keyar@chromium.orgf8a513f2012-08-20 15:03:52 +0000167 double wall_time = 0;
168#if SK_SUPPORT_GPU
169 double gpu_time = 0;
170#endif
171
keyar@chromium.org163b5672012-08-01 17:53:29 +0000172 for (int i = 0; i < fRepeats; ++i) {
keyar@chromium.orgf8a513f2012-08-20 15:03:52 +0000173 timer->start();
keyar@chromium.orgfe6391a2012-08-20 15:03:41 +0000174 fRenderer.drawTiles();
keyar@chromium.orgf8a513f2012-08-20 15:03:52 +0000175 timer->end();
176 fRenderer.resetState();
177
178 wall_time += timer->fWall;
179#if SK_SUPPORT_GPU
180 if (fRenderer.isUsingGpuDevice()) {
181 gpu_time += timer->fGpu;
182 }
183#endif
keyar@chromium.org163b5672012-08-01 17:53:29 +0000184 }
keyar@chromium.org163b5672012-08-01 17:53:29 +0000185
keyar@chromium.orgfe6391a2012-08-20 15:03:41 +0000186 fRenderer.end();
keyar@chromium.org9d696c02012-08-07 17:11:33 +0000187
keyar@chromium.orgfe6391a2012-08-20 15:03:41 +0000188 SkDebugf("%i_tiles_%ix%i: msecs = %6.2f", fRenderer.numTiles(), fRenderer.getTileWidth(),
keyar@chromium.orgf8a513f2012-08-20 15:03:52 +0000189 fRenderer.getTileHeight(), wall_time / fRepeats);
190#if SK_SUPPORT_GPU
keyar@chromium.orgfe6391a2012-08-20 15:03:41 +0000191 if (fRenderer.isUsingGpuDevice()) {
keyar@chromium.orgf8a513f2012-08-20 15:03:52 +0000192 SkDebugf(" gmsecs = %6.2f", gpu_time / fRepeats);
keyar@chromium.orgfe6391a2012-08-20 15:03:41 +0000193 }
keyar@chromium.orgf8a513f2012-08-20 15:03:52 +0000194#endif
keyar@chromium.orgfe6391a2012-08-20 15:03:41 +0000195 SkDebugf("\n");
keyar@chromium.org941844b2012-08-20 15:03:54 +0000196
197 SkDELETE(timer);
keyar@chromium.org163b5672012-08-01 17:53:29 +0000198}
199
200void UnflattenPictureBenchmark::run(SkPicture* pict) {
keyar@chromium.org9d696c02012-08-07 17:11:33 +0000201 SkASSERT(pict);
keyar@chromium.org78a35c52012-08-20 15:03:44 +0000202 if (NULL == pict) {
keyar@chromium.org9d696c02012-08-07 17:11:33 +0000203 return;
204 }
205
keyar@chromium.org77a55222012-08-20 15:03:47 +0000206 BenchTimer* timer = setupTimer();
keyar@chromium.org163b5672012-08-01 17:53:29 +0000207 double wall_time = 0;
208
209 for (int i = 0; i < fRepeats + 1; ++i) {
210 SkPicture replayer;
211 SkCanvas* recorder = replayer.beginRecording(pict->width(), pict->height());
212
213 recorder->drawPicture(*pict);
214
keyar@chromium.org77a55222012-08-20 15:03:47 +0000215 timer->start();
keyar@chromium.org163b5672012-08-01 17:53:29 +0000216 replayer.endRecording();
keyar@chromium.org77a55222012-08-20 15:03:47 +0000217 timer->end();
keyar@chromium.org163b5672012-08-01 17:53:29 +0000218
219 // We want to ignore first time effects
220 if (i > 0) {
keyar@chromium.org77a55222012-08-20 15:03:47 +0000221 wall_time += timer->fWall;
keyar@chromium.org163b5672012-08-01 17:53:29 +0000222 }
223 }
224
225 SkDebugf("unflatten: msecs = %6.4f\n", wall_time / fRepeats);
keyar@chromium.org378c97f2012-08-20 15:04:09 +0000226
227 SkDELETE(timer);
keyar@chromium.org163b5672012-08-01 17:53:29 +0000228}
229
230}