blob: 29152f8d69a4e19389d69028c183af5c757bbfb4 [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;
keyar@chromium.org163b5672012-08-01 17:53:29 +000091
keyar@chromium.org77a55222012-08-20 15:03:47 +000092 timer->start();
rileya@google.comedfbff62012-08-28 19:13:39 +000093 SkCanvas* recorder = replayer.beginRecording(pict->width(), pict->height());
94 pict->draw(recorder);
95 replayer.endRecording();
keyar@chromium.org77a55222012-08-20 15:03:47 +000096 timer->end();
keyar@chromium.org163b5672012-08-01 17:53:29 +000097
98 // We want to ignore first time effects
99 if (i > 0) {
keyar@chromium.org77a55222012-08-20 15:03:47 +0000100 wall_time += timer->fWall;
robertphillips@google.com91ee3a12012-08-28 12:18:40 +0000101 truncated_wall_time += timer->fTruncatedWall;
keyar@chromium.org163b5672012-08-01 17:53:29 +0000102 }
103 }
104
keyar@chromium.orgdb9a5fb2012-08-21 17:57:59 +0000105 SkString result;
106 result.printf("record: msecs = %6.5f\n", wall_time / fRepeats);
107 sk_tools::print_msg(result.c_str());
keyar@chromium.org378c97f2012-08-20 15:04:09 +0000108
109 SkDELETE(timer);
keyar@chromium.org163b5672012-08-01 17:53:29 +0000110}
111
112void SimplePictureBenchmark::run(SkPicture* pict) {
keyar@chromium.org9d696c02012-08-07 17:11:33 +0000113 SkASSERT(pict);
keyar@chromium.org78a35c52012-08-20 15:03:44 +0000114 if (NULL == pict) {
keyar@chromium.org9d696c02012-08-07 17:11:33 +0000115 return;
116 }
keyar@chromium.org163b5672012-08-01 17:53:29 +0000117
keyar@chromium.orgfe6391a2012-08-20 15:03:41 +0000118 fRenderer.init(pict);
keyar@chromium.org163b5672012-08-01 17:53:29 +0000119
120 // We throw this away to remove first time effects (such as paging in this
121 // program)
keyar@chromium.orgfe6391a2012-08-20 15:03:41 +0000122 fRenderer.render();
keyar@chromium.orgf8a513f2012-08-20 15:03:52 +0000123 fRenderer.resetState();
124
keyar@chromium.org163b5672012-08-01 17:53:29 +0000125
keyar@chromium.org77a55222012-08-20 15:03:47 +0000126 BenchTimer* timer = this->setupTimer();
robertphillips@google.com91ee3a12012-08-28 12:18:40 +0000127 double wall_time = 0, truncated_wall_time = 0;
keyar@chromium.orgf8a513f2012-08-20 15:03:52 +0000128#if SK_SUPPORT_GPU
129 double gpu_time = 0;
130#endif
keyar@chromium.org77a55222012-08-20 15:03:47 +0000131
keyar@chromium.org163b5672012-08-01 17:53:29 +0000132 for (int i = 0; i < fRepeats; ++i) {
keyar@chromium.orgf8a513f2012-08-20 15:03:52 +0000133 timer->start();
keyar@chromium.orgfe6391a2012-08-20 15:03:41 +0000134 fRenderer.render();
keyar@chromium.orgf8a513f2012-08-20 15:03:52 +0000135 timer->end();
136 fRenderer.resetState();
137
138 wall_time += timer->fWall;
robertphillips@google.com91ee3a12012-08-28 12:18:40 +0000139 truncated_wall_time += timer->fTruncatedWall;
keyar@chromium.orgf8a513f2012-08-20 15:03:52 +0000140#if SK_SUPPORT_GPU
141 if (fRenderer.isUsingGpuDevice()) {
142 gpu_time += timer->fGpu;
143 }
144#endif
keyar@chromium.org163b5672012-08-01 17:53:29 +0000145 }
keyar@chromium.org163b5672012-08-01 17:53:29 +0000146
keyar@chromium.org9d696c02012-08-07 17:11:33 +0000147
keyar@chromium.orgdb9a5fb2012-08-21 17:57:59 +0000148 SkString result;
149 result.printf("simple: msecs = %6.2f", wall_time / fRepeats);
keyar@chromium.orgf8a513f2012-08-20 15:03:52 +0000150#if SK_SUPPORT_GPU
keyar@chromium.orgfe6391a2012-08-20 15:03:41 +0000151 if (fRenderer.isUsingGpuDevice()) {
keyar@chromium.orgdb9a5fb2012-08-21 17:57:59 +0000152 result.appendf(" gmsecs = %6.2f", gpu_time / fRepeats);
keyar@chromium.orgfe6391a2012-08-20 15:03:41 +0000153 }
keyar@chromium.orgf8a513f2012-08-20 15:03:52 +0000154#endif
keyar@chromium.orgdb9a5fb2012-08-21 17:57:59 +0000155 result.appendf("\n");
156 sk_tools::print_msg(result.c_str());
keyar@chromium.org77a55222012-08-20 15:03:47 +0000157
keyar@chromium.orgdb9a5fb2012-08-21 17:57:59 +0000158 fRenderer.end();
keyar@chromium.org941844b2012-08-20 15:03:54 +0000159 SkDELETE(timer);
keyar@chromium.org163b5672012-08-01 17:53:29 +0000160}
161
162void TiledPictureBenchmark::run(SkPicture* pict) {
keyar@chromium.org9d696c02012-08-07 17:11:33 +0000163 SkASSERT(pict);
keyar@chromium.org78a35c52012-08-20 15:03:44 +0000164 if (NULL == pict) {
keyar@chromium.org9d696c02012-08-07 17:11:33 +0000165 return;
166 }
167
keyar@chromium.orgfe6391a2012-08-20 15:03:41 +0000168 fRenderer.init(pict);
keyar@chromium.org163b5672012-08-01 17:53:29 +0000169
170 // We throw this away to remove first time effects (such as paging in this
171 // program)
keyar@chromium.orgfe6391a2012-08-20 15:03:41 +0000172 fRenderer.drawTiles();
keyar@chromium.orgf8a513f2012-08-20 15:03:52 +0000173 fRenderer.resetState();
keyar@chromium.org163b5672012-08-01 17:53:29 +0000174
keyar@chromium.org77a55222012-08-20 15:03:47 +0000175 BenchTimer* timer = setupTimer();
robertphillips@google.com91ee3a12012-08-28 12:18:40 +0000176 double wall_time = 0, truncated_wall_time = 0;
keyar@chromium.orgf8a513f2012-08-20 15:03:52 +0000177#if SK_SUPPORT_GPU
178 double gpu_time = 0;
179#endif
180
keyar@chromium.org163b5672012-08-01 17:53:29 +0000181 for (int i = 0; i < fRepeats; ++i) {
keyar@chromium.orgf8a513f2012-08-20 15:03:52 +0000182 timer->start();
keyar@chromium.orgfe6391a2012-08-20 15:03:41 +0000183 fRenderer.drawTiles();
keyar@chromium.orgf8a513f2012-08-20 15:03:52 +0000184 timer->end();
185 fRenderer.resetState();
186
187 wall_time += timer->fWall;
robertphillips@google.com91ee3a12012-08-28 12:18:40 +0000188 truncated_wall_time += timer->fTruncatedWall;
keyar@chromium.orgf8a513f2012-08-20 15:03:52 +0000189#if SK_SUPPORT_GPU
190 if (fRenderer.isUsingGpuDevice()) {
191 gpu_time += timer->fGpu;
192 }
193#endif
keyar@chromium.org163b5672012-08-01 17:53:29 +0000194 }
keyar@chromium.org163b5672012-08-01 17:53:29 +0000195
keyar@chromium.orgdb9a5fb2012-08-21 17:57:59 +0000196 SkString result;
scroggo@google.com58b4ead2012-08-31 16:15:22 +0000197 if (fRenderer.isMultiThreaded()) {
198 result.printf("multithreaded using %s ", (fRenderer.isUsePipe() ? "pipe" : "picture"));
199 }
keyar@chromium.orgf4959ab2012-08-23 20:53:25 +0000200 if (fRenderer.getTileMinPowerOf2Width() > 0) {
scroggo@google.com58b4ead2012-08-31 16:15:22 +0000201 result.appendf("%i_pow2tiles_%iminx%i: msecs = %6.2f", fRenderer.numTiles(),
202 fRenderer.getTileMinPowerOf2Width(), fRenderer.getTileHeight(),
203 wall_time / fRepeats);
keyar@chromium.orgf4959ab2012-08-23 20:53:25 +0000204 } else {
scroggo@google.com58b4ead2012-08-31 16:15:22 +0000205 result.appendf("%i_tiles_%ix%i: msecs = %6.2f", fRenderer.numTiles(),
206 fRenderer.getTileWidth(), fRenderer.getTileHeight(), wall_time / fRepeats);
keyar@chromium.orgf4959ab2012-08-23 20:53:25 +0000207 }
keyar@chromium.orgf8a513f2012-08-20 15:03:52 +0000208#if SK_SUPPORT_GPU
keyar@chromium.orgfe6391a2012-08-20 15:03:41 +0000209 if (fRenderer.isUsingGpuDevice()) {
keyar@chromium.orgdb9a5fb2012-08-21 17:57:59 +0000210 result.appendf(" gmsecs = %6.2f", gpu_time / fRepeats);
keyar@chromium.orgfe6391a2012-08-20 15:03:41 +0000211 }
keyar@chromium.orgf8a513f2012-08-20 15:03:52 +0000212#endif
keyar@chromium.orgdb9a5fb2012-08-21 17:57:59 +0000213 result.appendf("\n");
214 sk_tools::print_msg(result.c_str());
keyar@chromium.org941844b2012-08-20 15:03:54 +0000215
keyar@chromium.orgdb9a5fb2012-08-21 17:57:59 +0000216 fRenderer.end();
keyar@chromium.org941844b2012-08-20 15:03:54 +0000217 SkDELETE(timer);
keyar@chromium.org163b5672012-08-01 17:53:29 +0000218}
219
220void UnflattenPictureBenchmark::run(SkPicture* pict) {
keyar@chromium.org9d696c02012-08-07 17:11:33 +0000221 SkASSERT(pict);
keyar@chromium.org78a35c52012-08-20 15:03:44 +0000222 if (NULL == pict) {
keyar@chromium.org9d696c02012-08-07 17:11:33 +0000223 return;
224 }
225
keyar@chromium.org77a55222012-08-20 15:03:47 +0000226 BenchTimer* timer = setupTimer();
robertphillips@google.com91ee3a12012-08-28 12:18:40 +0000227 double wall_time = 0, truncated_wall_time = 0;
keyar@chromium.org163b5672012-08-01 17:53:29 +0000228
229 for (int i = 0; i < fRepeats + 1; ++i) {
230 SkPicture replayer;
231 SkCanvas* recorder = replayer.beginRecording(pict->width(), pict->height());
232
233 recorder->drawPicture(*pict);
234
keyar@chromium.org77a55222012-08-20 15:03:47 +0000235 timer->start();
keyar@chromium.org163b5672012-08-01 17:53:29 +0000236 replayer.endRecording();
keyar@chromium.org77a55222012-08-20 15:03:47 +0000237 timer->end();
keyar@chromium.org163b5672012-08-01 17:53:29 +0000238
239 // We want to ignore first time effects
240 if (i > 0) {
keyar@chromium.org77a55222012-08-20 15:03:47 +0000241 wall_time += timer->fWall;
robertphillips@google.com91ee3a12012-08-28 12:18:40 +0000242 truncated_wall_time += timer->fTruncatedWall;
keyar@chromium.org163b5672012-08-01 17:53:29 +0000243 }
244 }
245
keyar@chromium.orgdb9a5fb2012-08-21 17:57:59 +0000246 SkString result;
247 result.printf("unflatten: msecs = %6.4f\n", wall_time / fRepeats);
248 sk_tools::print_msg(result.c_str());
keyar@chromium.org378c97f2012-08-20 15:04:09 +0000249
250 SkDELETE(timer);
keyar@chromium.org163b5672012-08-01 17:53:29 +0000251}
252
253}