blob: 164d3c356c265d1c196f54cce6d8a4f14404c383 [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();
robertphillips@google.com91ee3a12012-08-28 12:18:40 +000046 double wall_time = 0, truncated_wall_time = 0;
keyar@chromium.orgf8a513f2012-08-20 15:03:52 +000047#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;
robertphillips@google.com91ee3a12012-08-28 12:18:40 +000058 truncated_wall_time += timer->fTruncatedWall;
keyar@chromium.orgf8a513f2012-08-20 15:03:52 +000059#if SK_SUPPORT_GPU
60 if (fRenderer.isUsingGpuDevice()) {
61 gpu_time += timer->fGpu;
62 }
63#endif
keyar@chromium.org163b5672012-08-01 17:53:29 +000064 }
keyar@chromium.org163b5672012-08-01 17:53:29 +000065
keyar@chromium.orgdb9a5fb2012-08-21 17:57:59 +000066 SkString result;
67 result.printf("pipe: msecs = %6.2f", wall_time / fRepeats);
keyar@chromium.orgf8a513f2012-08-20 15:03:52 +000068#if SK_SUPPORT_GPU
keyar@chromium.orgfe6391a2012-08-20 15:03:41 +000069 if (fRenderer.isUsingGpuDevice()) {
keyar@chromium.orgdb9a5fb2012-08-21 17:57:59 +000070 result.appendf(" 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.orgdb9a5fb2012-08-21 17:57:59 +000073 result.appendf("\n");
74 sk_tools::print_msg(result.c_str());
keyar@chromium.org77a55222012-08-20 15:03:47 +000075
keyar@chromium.orgdb9a5fb2012-08-21 17:57:59 +000076 fRenderer.end();
keyar@chromium.org941844b2012-08-20 15:03:54 +000077 SkDELETE(timer);
keyar@chromium.org163b5672012-08-01 17:53:29 +000078}
79
80void RecordPictureBenchmark::run(SkPicture* pict) {
keyar@chromium.org9d696c02012-08-07 17:11:33 +000081 SkASSERT(pict);
keyar@chromium.org78a35c52012-08-20 15:03:44 +000082 if (NULL == pict) {
keyar@chromium.org9d696c02012-08-07 17:11:33 +000083 return;
84 }
85
keyar@chromium.org77a55222012-08-20 15:03:47 +000086 BenchTimer* timer = setupTimer();
robertphillips@google.com91ee3a12012-08-28 12:18:40 +000087 double wall_time = 0, truncated_wall_time = 0;
keyar@chromium.org163b5672012-08-01 17:53:29 +000088
89 for (int i = 0; i < fRepeats + 1; ++i) {
90 SkPicture replayer;
91 SkCanvas* recorder = replayer.beginRecording(pict->width(), pict->height());
92
keyar@chromium.org77a55222012-08-20 15:03:47 +000093 timer->start();
keyar@chromium.org163b5672012-08-01 17:53:29 +000094 recorder->drawPicture(*pict);
keyar@chromium.org77a55222012-08-20 15:03:47 +000095 timer->end();
keyar@chromium.org163b5672012-08-01 17:53:29 +000096
97 // We want to ignore first time effects
98 if (i > 0) {
keyar@chromium.org77a55222012-08-20 15:03:47 +000099 wall_time += timer->fWall;
robertphillips@google.com91ee3a12012-08-28 12:18:40 +0000100 truncated_wall_time += timer->fTruncatedWall;
keyar@chromium.org163b5672012-08-01 17:53:29 +0000101 }
102 }
103
keyar@chromium.orgdb9a5fb2012-08-21 17:57:59 +0000104 SkString result;
105 result.printf("record: msecs = %6.5f\n", wall_time / fRepeats);
106 sk_tools::print_msg(result.c_str());
keyar@chromium.org378c97f2012-08-20 15:04:09 +0000107
108 SkDELETE(timer);
keyar@chromium.org163b5672012-08-01 17:53:29 +0000109}
110
111void SimplePictureBenchmark::run(SkPicture* pict) {
keyar@chromium.org9d696c02012-08-07 17:11:33 +0000112 SkASSERT(pict);
keyar@chromium.org78a35c52012-08-20 15:03:44 +0000113 if (NULL == pict) {
keyar@chromium.org9d696c02012-08-07 17:11:33 +0000114 return;
115 }
keyar@chromium.org163b5672012-08-01 17:53:29 +0000116
keyar@chromium.orgfe6391a2012-08-20 15:03:41 +0000117 fRenderer.init(pict);
keyar@chromium.org163b5672012-08-01 17:53:29 +0000118
119 // We throw this away to remove first time effects (such as paging in this
120 // program)
keyar@chromium.orgfe6391a2012-08-20 15:03:41 +0000121 fRenderer.render();
keyar@chromium.orgf8a513f2012-08-20 15:03:52 +0000122 fRenderer.resetState();
123
keyar@chromium.org163b5672012-08-01 17:53:29 +0000124
keyar@chromium.org77a55222012-08-20 15:03:47 +0000125 BenchTimer* timer = this->setupTimer();
robertphillips@google.com91ee3a12012-08-28 12:18:40 +0000126 double wall_time = 0, truncated_wall_time = 0;
keyar@chromium.orgf8a513f2012-08-20 15:03:52 +0000127#if SK_SUPPORT_GPU
128 double gpu_time = 0;
129#endif
keyar@chromium.org77a55222012-08-20 15:03:47 +0000130
keyar@chromium.org163b5672012-08-01 17:53:29 +0000131 for (int i = 0; i < fRepeats; ++i) {
keyar@chromium.orgf8a513f2012-08-20 15:03:52 +0000132 timer->start();
keyar@chromium.orgfe6391a2012-08-20 15:03:41 +0000133 fRenderer.render();
keyar@chromium.orgf8a513f2012-08-20 15:03:52 +0000134 timer->end();
135 fRenderer.resetState();
136
137 wall_time += timer->fWall;
robertphillips@google.com91ee3a12012-08-28 12:18:40 +0000138 truncated_wall_time += timer->fTruncatedWall;
keyar@chromium.orgf8a513f2012-08-20 15:03:52 +0000139#if SK_SUPPORT_GPU
140 if (fRenderer.isUsingGpuDevice()) {
141 gpu_time += timer->fGpu;
142 }
143#endif
keyar@chromium.org163b5672012-08-01 17:53:29 +0000144 }
keyar@chromium.org163b5672012-08-01 17:53:29 +0000145
keyar@chromium.org9d696c02012-08-07 17:11:33 +0000146
keyar@chromium.orgdb9a5fb2012-08-21 17:57:59 +0000147 SkString result;
148 result.printf("simple: msecs = %6.2f", wall_time / fRepeats);
keyar@chromium.orgf8a513f2012-08-20 15:03:52 +0000149#if SK_SUPPORT_GPU
keyar@chromium.orgfe6391a2012-08-20 15:03:41 +0000150 if (fRenderer.isUsingGpuDevice()) {
keyar@chromium.orgdb9a5fb2012-08-21 17:57:59 +0000151 result.appendf(" gmsecs = %6.2f", gpu_time / fRepeats);
keyar@chromium.orgfe6391a2012-08-20 15:03:41 +0000152 }
keyar@chromium.orgf8a513f2012-08-20 15:03:52 +0000153#endif
keyar@chromium.orgdb9a5fb2012-08-21 17:57:59 +0000154 result.appendf("\n");
155 sk_tools::print_msg(result.c_str());
keyar@chromium.org77a55222012-08-20 15:03:47 +0000156
keyar@chromium.orgdb9a5fb2012-08-21 17:57:59 +0000157 fRenderer.end();
keyar@chromium.org941844b2012-08-20 15:03:54 +0000158 SkDELETE(timer);
keyar@chromium.org163b5672012-08-01 17:53:29 +0000159}
160
161void TiledPictureBenchmark::run(SkPicture* pict) {
keyar@chromium.org9d696c02012-08-07 17:11:33 +0000162 SkASSERT(pict);
keyar@chromium.org78a35c52012-08-20 15:03:44 +0000163 if (NULL == pict) {
keyar@chromium.org9d696c02012-08-07 17:11:33 +0000164 return;
165 }
166
keyar@chromium.orgfe6391a2012-08-20 15:03:41 +0000167 fRenderer.init(pict);
keyar@chromium.org163b5672012-08-01 17:53:29 +0000168
169 // We throw this away to remove first time effects (such as paging in this
170 // program)
keyar@chromium.orgfe6391a2012-08-20 15:03:41 +0000171 fRenderer.drawTiles();
keyar@chromium.orgf8a513f2012-08-20 15:03:52 +0000172 fRenderer.resetState();
keyar@chromium.org163b5672012-08-01 17:53:29 +0000173
keyar@chromium.org77a55222012-08-20 15:03:47 +0000174 BenchTimer* timer = setupTimer();
robertphillips@google.com91ee3a12012-08-28 12:18:40 +0000175 double wall_time = 0, truncated_wall_time = 0;
keyar@chromium.orgf8a513f2012-08-20 15:03:52 +0000176#if SK_SUPPORT_GPU
177 double gpu_time = 0;
178#endif
179
keyar@chromium.org163b5672012-08-01 17:53:29 +0000180 for (int i = 0; i < fRepeats; ++i) {
keyar@chromium.orgf8a513f2012-08-20 15:03:52 +0000181 timer->start();
keyar@chromium.orgfe6391a2012-08-20 15:03:41 +0000182 fRenderer.drawTiles();
keyar@chromium.orgf8a513f2012-08-20 15:03:52 +0000183 timer->end();
184 fRenderer.resetState();
185
186 wall_time += timer->fWall;
robertphillips@google.com91ee3a12012-08-28 12:18:40 +0000187 truncated_wall_time += timer->fTruncatedWall;
keyar@chromium.orgf8a513f2012-08-20 15:03:52 +0000188#if SK_SUPPORT_GPU
189 if (fRenderer.isUsingGpuDevice()) {
190 gpu_time += timer->fGpu;
191 }
192#endif
keyar@chromium.org163b5672012-08-01 17:53:29 +0000193 }
keyar@chromium.org163b5672012-08-01 17:53:29 +0000194
keyar@chromium.orgdb9a5fb2012-08-21 17:57:59 +0000195 SkString result;
keyar@chromium.orgf4959ab2012-08-23 20:53:25 +0000196 if (fRenderer.getTileMinPowerOf2Width() > 0) {
197 result.printf("%i_pow2tiles_%iminx%i: msecs = %6.2f", fRenderer.numTiles(),
198 fRenderer.getTileMinPowerOf2Width(), fRenderer.getTileHeight(),
199 wall_time / fRepeats);
200 } else {
201 result.printf("%i_tiles_%ix%i: msecs = %6.2f", fRenderer.numTiles(),
202 fRenderer.getTileWidth(), fRenderer.getTileHeight(), wall_time / fRepeats);
203 }
keyar@chromium.orgf8a513f2012-08-20 15:03:52 +0000204#if SK_SUPPORT_GPU
keyar@chromium.orgfe6391a2012-08-20 15:03:41 +0000205 if (fRenderer.isUsingGpuDevice()) {
keyar@chromium.orgdb9a5fb2012-08-21 17:57:59 +0000206 result.appendf(" gmsecs = %6.2f", gpu_time / fRepeats);
keyar@chromium.orgfe6391a2012-08-20 15:03:41 +0000207 }
keyar@chromium.orgf8a513f2012-08-20 15:03:52 +0000208#endif
keyar@chromium.orgdb9a5fb2012-08-21 17:57:59 +0000209 result.appendf("\n");
210 sk_tools::print_msg(result.c_str());
keyar@chromium.org941844b2012-08-20 15:03:54 +0000211
keyar@chromium.orgdb9a5fb2012-08-21 17:57:59 +0000212 fRenderer.end();
keyar@chromium.org941844b2012-08-20 15:03:54 +0000213 SkDELETE(timer);
keyar@chromium.org163b5672012-08-01 17:53:29 +0000214}
215
216void UnflattenPictureBenchmark::run(SkPicture* pict) {
keyar@chromium.org9d696c02012-08-07 17:11:33 +0000217 SkASSERT(pict);
keyar@chromium.org78a35c52012-08-20 15:03:44 +0000218 if (NULL == pict) {
keyar@chromium.org9d696c02012-08-07 17:11:33 +0000219 return;
220 }
221
keyar@chromium.org77a55222012-08-20 15:03:47 +0000222 BenchTimer* timer = setupTimer();
robertphillips@google.com91ee3a12012-08-28 12:18:40 +0000223 double wall_time = 0, truncated_wall_time = 0;
keyar@chromium.org163b5672012-08-01 17:53:29 +0000224
225 for (int i = 0; i < fRepeats + 1; ++i) {
226 SkPicture replayer;
227 SkCanvas* recorder = replayer.beginRecording(pict->width(), pict->height());
228
229 recorder->drawPicture(*pict);
230
keyar@chromium.org77a55222012-08-20 15:03:47 +0000231 timer->start();
keyar@chromium.org163b5672012-08-01 17:53:29 +0000232 replayer.endRecording();
keyar@chromium.org77a55222012-08-20 15:03:47 +0000233 timer->end();
keyar@chromium.org163b5672012-08-01 17:53:29 +0000234
235 // We want to ignore first time effects
236 if (i > 0) {
keyar@chromium.org77a55222012-08-20 15:03:47 +0000237 wall_time += timer->fWall;
robertphillips@google.com91ee3a12012-08-28 12:18:40 +0000238 truncated_wall_time += timer->fTruncatedWall;
keyar@chromium.org163b5672012-08-01 17:53:29 +0000239 }
240 }
241
keyar@chromium.orgdb9a5fb2012-08-21 17:57:59 +0000242 SkString result;
243 result.printf("unflatten: msecs = %6.4f\n", wall_time / fRepeats);
244 sk_tools::print_msg(result.c_str());
keyar@chromium.org378c97f2012-08-20 15:04:09 +0000245
246 SkDELETE(timer);
keyar@chromium.org163b5672012-08-01 17:53:29 +0000247}
248
249}