blob: 4f7cbac2024741f25c44251c9cea83f1e9c258eb [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.orgdb9a5fb2012-08-21 17:57:59 +000065 SkString result;
66 result.printf("pipe: msecs = %6.2f", wall_time / fRepeats);
keyar@chromium.orgf8a513f2012-08-20 15:03:52 +000067#if SK_SUPPORT_GPU
keyar@chromium.orgfe6391a2012-08-20 15:03:41 +000068 if (fRenderer.isUsingGpuDevice()) {
keyar@chromium.orgdb9a5fb2012-08-21 17:57:59 +000069 result.appendf(" gmsecs = %6.2f", gpu_time / fRepeats);
keyar@chromium.orgfe6391a2012-08-20 15:03:41 +000070 }
keyar@chromium.orgf8a513f2012-08-20 15:03:52 +000071#endif
keyar@chromium.orgdb9a5fb2012-08-21 17:57:59 +000072 result.appendf("\n");
73 sk_tools::print_msg(result.c_str());
keyar@chromium.org77a55222012-08-20 15:03:47 +000074
keyar@chromium.orgdb9a5fb2012-08-21 17:57:59 +000075 fRenderer.end();
keyar@chromium.org941844b2012-08-20 15:03:54 +000076 SkDELETE(timer);
keyar@chromium.org163b5672012-08-01 17:53:29 +000077}
78
79void RecordPictureBenchmark::run(SkPicture* pict) {
keyar@chromium.org9d696c02012-08-07 17:11:33 +000080 SkASSERT(pict);
keyar@chromium.org78a35c52012-08-20 15:03:44 +000081 if (NULL == pict) {
keyar@chromium.org9d696c02012-08-07 17:11:33 +000082 return;
83 }
84
keyar@chromium.org77a55222012-08-20 15:03:47 +000085 BenchTimer* timer = setupTimer();
keyar@chromium.org163b5672012-08-01 17:53:29 +000086 double wall_time = 0;
87
88 for (int i = 0; i < fRepeats + 1; ++i) {
89 SkPicture replayer;
90 SkCanvas* recorder = replayer.beginRecording(pict->width(), pict->height());
91
keyar@chromium.org77a55222012-08-20 15:03:47 +000092 timer->start();
keyar@chromium.org163b5672012-08-01 17:53:29 +000093 recorder->drawPicture(*pict);
keyar@chromium.org77a55222012-08-20 15:03:47 +000094 timer->end();
keyar@chromium.org163b5672012-08-01 17:53:29 +000095
96 // We want to ignore first time effects
97 if (i > 0) {
keyar@chromium.org77a55222012-08-20 15:03:47 +000098 wall_time += timer->fWall;
keyar@chromium.org163b5672012-08-01 17:53:29 +000099 }
100 }
101
keyar@chromium.orgdb9a5fb2012-08-21 17:57:59 +0000102 SkString result;
103 result.printf("record: msecs = %6.5f\n", wall_time / fRepeats);
104 sk_tools::print_msg(result.c_str());
keyar@chromium.org378c97f2012-08-20 15:04:09 +0000105
106 SkDELETE(timer);
keyar@chromium.org163b5672012-08-01 17:53:29 +0000107}
108
109void SimplePictureBenchmark::run(SkPicture* pict) {
keyar@chromium.org9d696c02012-08-07 17:11:33 +0000110 SkASSERT(pict);
keyar@chromium.org78a35c52012-08-20 15:03:44 +0000111 if (NULL == pict) {
keyar@chromium.org9d696c02012-08-07 17:11:33 +0000112 return;
113 }
keyar@chromium.org163b5672012-08-01 17:53:29 +0000114
keyar@chromium.orgfe6391a2012-08-20 15:03:41 +0000115 fRenderer.init(pict);
keyar@chromium.org163b5672012-08-01 17:53:29 +0000116
117 // We throw this away to remove first time effects (such as paging in this
118 // program)
keyar@chromium.orgfe6391a2012-08-20 15:03:41 +0000119 fRenderer.render();
keyar@chromium.orgf8a513f2012-08-20 15:03:52 +0000120 fRenderer.resetState();
121
keyar@chromium.org163b5672012-08-01 17:53:29 +0000122
keyar@chromium.org77a55222012-08-20 15:03:47 +0000123 BenchTimer* timer = this->setupTimer();
keyar@chromium.orgf8a513f2012-08-20 15:03:52 +0000124 double wall_time = 0;
125#if SK_SUPPORT_GPU
126 double gpu_time = 0;
127#endif
keyar@chromium.org77a55222012-08-20 15:03:47 +0000128
keyar@chromium.org163b5672012-08-01 17:53:29 +0000129 for (int i = 0; i < fRepeats; ++i) {
keyar@chromium.orgf8a513f2012-08-20 15:03:52 +0000130 timer->start();
keyar@chromium.orgfe6391a2012-08-20 15:03:41 +0000131 fRenderer.render();
keyar@chromium.orgf8a513f2012-08-20 15:03:52 +0000132 timer->end();
133 fRenderer.resetState();
134
135 wall_time += timer->fWall;
136#if SK_SUPPORT_GPU
137 if (fRenderer.isUsingGpuDevice()) {
138 gpu_time += timer->fGpu;
139 }
140#endif
keyar@chromium.org163b5672012-08-01 17:53:29 +0000141 }
keyar@chromium.org163b5672012-08-01 17:53:29 +0000142
keyar@chromium.org9d696c02012-08-07 17:11:33 +0000143
keyar@chromium.orgdb9a5fb2012-08-21 17:57:59 +0000144 SkString result;
145 result.printf("simple: msecs = %6.2f", wall_time / fRepeats);
keyar@chromium.orgf8a513f2012-08-20 15:03:52 +0000146#if SK_SUPPORT_GPU
keyar@chromium.orgfe6391a2012-08-20 15:03:41 +0000147 if (fRenderer.isUsingGpuDevice()) {
keyar@chromium.orgdb9a5fb2012-08-21 17:57:59 +0000148 result.appendf(" gmsecs = %6.2f", gpu_time / fRepeats);
keyar@chromium.orgfe6391a2012-08-20 15:03:41 +0000149 }
keyar@chromium.orgf8a513f2012-08-20 15:03:52 +0000150#endif
keyar@chromium.orgdb9a5fb2012-08-21 17:57:59 +0000151 result.appendf("\n");
152 sk_tools::print_msg(result.c_str());
keyar@chromium.org77a55222012-08-20 15:03:47 +0000153
keyar@chromium.orgdb9a5fb2012-08-21 17:57:59 +0000154 fRenderer.end();
keyar@chromium.org941844b2012-08-20 15:03:54 +0000155 SkDELETE(timer);
keyar@chromium.org163b5672012-08-01 17:53:29 +0000156}
157
158void TiledPictureBenchmark::run(SkPicture* pict) {
keyar@chromium.org9d696c02012-08-07 17:11:33 +0000159 SkASSERT(pict);
keyar@chromium.org78a35c52012-08-20 15:03:44 +0000160 if (NULL == pict) {
keyar@chromium.org9d696c02012-08-07 17:11:33 +0000161 return;
162 }
163
keyar@chromium.orgfe6391a2012-08-20 15:03:41 +0000164 fRenderer.init(pict);
keyar@chromium.org163b5672012-08-01 17:53:29 +0000165
166 // We throw this away to remove first time effects (such as paging in this
167 // program)
keyar@chromium.orgfe6391a2012-08-20 15:03:41 +0000168 fRenderer.drawTiles();
keyar@chromium.orgf8a513f2012-08-20 15:03:52 +0000169 fRenderer.resetState();
keyar@chromium.org163b5672012-08-01 17:53:29 +0000170
keyar@chromium.org77a55222012-08-20 15:03:47 +0000171 BenchTimer* timer = setupTimer();
keyar@chromium.orgf8a513f2012-08-20 15:03:52 +0000172 double wall_time = 0;
173#if SK_SUPPORT_GPU
174 double gpu_time = 0;
175#endif
176
keyar@chromium.org163b5672012-08-01 17:53:29 +0000177 for (int i = 0; i < fRepeats; ++i) {
keyar@chromium.orgf8a513f2012-08-20 15:03:52 +0000178 timer->start();
keyar@chromium.orgfe6391a2012-08-20 15:03:41 +0000179 fRenderer.drawTiles();
keyar@chromium.orgf8a513f2012-08-20 15:03:52 +0000180 timer->end();
181 fRenderer.resetState();
182
183 wall_time += timer->fWall;
184#if SK_SUPPORT_GPU
185 if (fRenderer.isUsingGpuDevice()) {
186 gpu_time += timer->fGpu;
187 }
188#endif
keyar@chromium.org163b5672012-08-01 17:53:29 +0000189 }
keyar@chromium.org163b5672012-08-01 17:53:29 +0000190
keyar@chromium.orgdb9a5fb2012-08-21 17:57:59 +0000191 SkString result;
192 result.printf("%i_tiles_%ix%i: msecs = %6.2f", fRenderer.numTiles(), fRenderer.getTileWidth(),
193 fRenderer.getTileHeight(), wall_time / fRepeats);
keyar@chromium.orgf8a513f2012-08-20 15:03:52 +0000194#if SK_SUPPORT_GPU
keyar@chromium.orgfe6391a2012-08-20 15:03:41 +0000195 if (fRenderer.isUsingGpuDevice()) {
keyar@chromium.orgdb9a5fb2012-08-21 17:57:59 +0000196 result.appendf(" gmsecs = %6.2f", gpu_time / fRepeats);
keyar@chromium.orgfe6391a2012-08-20 15:03:41 +0000197 }
keyar@chromium.orgf8a513f2012-08-20 15:03:52 +0000198#endif
keyar@chromium.orgdb9a5fb2012-08-21 17:57:59 +0000199 result.appendf("\n");
200 sk_tools::print_msg(result.c_str());
keyar@chromium.org941844b2012-08-20 15:03:54 +0000201
keyar@chromium.orgdb9a5fb2012-08-21 17:57:59 +0000202 fRenderer.end();
keyar@chromium.org941844b2012-08-20 15:03:54 +0000203 SkDELETE(timer);
keyar@chromium.org163b5672012-08-01 17:53:29 +0000204}
205
206void UnflattenPictureBenchmark::run(SkPicture* pict) {
keyar@chromium.org9d696c02012-08-07 17:11:33 +0000207 SkASSERT(pict);
keyar@chromium.org78a35c52012-08-20 15:03:44 +0000208 if (NULL == pict) {
keyar@chromium.org9d696c02012-08-07 17:11:33 +0000209 return;
210 }
211
keyar@chromium.org77a55222012-08-20 15:03:47 +0000212 BenchTimer* timer = setupTimer();
keyar@chromium.org163b5672012-08-01 17:53:29 +0000213 double wall_time = 0;
214
215 for (int i = 0; i < fRepeats + 1; ++i) {
216 SkPicture replayer;
217 SkCanvas* recorder = replayer.beginRecording(pict->width(), pict->height());
218
219 recorder->drawPicture(*pict);
220
keyar@chromium.org77a55222012-08-20 15:03:47 +0000221 timer->start();
keyar@chromium.org163b5672012-08-01 17:53:29 +0000222 replayer.endRecording();
keyar@chromium.org77a55222012-08-20 15:03:47 +0000223 timer->end();
keyar@chromium.org163b5672012-08-01 17:53:29 +0000224
225 // We want to ignore first time effects
226 if (i > 0) {
keyar@chromium.org77a55222012-08-20 15:03:47 +0000227 wall_time += timer->fWall;
keyar@chromium.org163b5672012-08-01 17:53:29 +0000228 }
229 }
230
keyar@chromium.orgdb9a5fb2012-08-21 17:57:59 +0000231 SkString result;
232 result.printf("unflatten: msecs = %6.4f\n", wall_time / fRepeats);
233 sk_tools::print_msg(result.c_str());
keyar@chromium.org378c97f2012-08-20 15:04:09 +0000234
235 SkDELETE(timer);
keyar@chromium.org163b5672012-08-01 17:53:29 +0000236}
237
238}