blob: 371de3aa54b96a0117228ce85b02e3b6fe83232a [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.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
75 delete 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);
102}
103
104void SimplePictureBenchmark::run(SkPicture* pict) {
keyar@chromium.org9d696c02012-08-07 17:11:33 +0000105 SkASSERT(pict);
keyar@chromium.org78a35c52012-08-20 15:03:44 +0000106 if (NULL == pict) {
keyar@chromium.org9d696c02012-08-07 17:11:33 +0000107 return;
108 }
keyar@chromium.org163b5672012-08-01 17:53:29 +0000109
keyar@chromium.orgfe6391a2012-08-20 15:03:41 +0000110 fRenderer.init(pict);
keyar@chromium.org163b5672012-08-01 17:53:29 +0000111
112 // We throw this away to remove first time effects (such as paging in this
113 // program)
keyar@chromium.orgfe6391a2012-08-20 15:03:41 +0000114 fRenderer.render();
keyar@chromium.orgf8a513f2012-08-20 15:03:52 +0000115 fRenderer.resetState();
116
keyar@chromium.org163b5672012-08-01 17:53:29 +0000117
keyar@chromium.org77a55222012-08-20 15:03:47 +0000118 BenchTimer* timer = this->setupTimer();
keyar@chromium.orgf8a513f2012-08-20 15:03:52 +0000119 double wall_time = 0;
120#if SK_SUPPORT_GPU
121 double gpu_time = 0;
122#endif
keyar@chromium.org77a55222012-08-20 15:03:47 +0000123
keyar@chromium.org163b5672012-08-01 17:53:29 +0000124 for (int i = 0; i < fRepeats; ++i) {
keyar@chromium.orgf8a513f2012-08-20 15:03:52 +0000125 timer->start();
keyar@chromium.orgfe6391a2012-08-20 15:03:41 +0000126 fRenderer.render();
keyar@chromium.orgf8a513f2012-08-20 15:03:52 +0000127 timer->end();
128 fRenderer.resetState();
129
130 wall_time += timer->fWall;
131#if SK_SUPPORT_GPU
132 if (fRenderer.isUsingGpuDevice()) {
133 gpu_time += timer->fGpu;
134 }
135#endif
keyar@chromium.org163b5672012-08-01 17:53:29 +0000136 }
keyar@chromium.org163b5672012-08-01 17:53:29 +0000137
keyar@chromium.orgfe6391a2012-08-20 15:03:41 +0000138 fRenderer.end();
keyar@chromium.org9d696c02012-08-07 17:11:33 +0000139
keyar@chromium.orgf8a513f2012-08-20 15:03:52 +0000140 SkDebugf("simple: msecs = %6.2f", wall_time / fRepeats);
141#if SK_SUPPORT_GPU
keyar@chromium.orgfe6391a2012-08-20 15:03:41 +0000142 if (fRenderer.isUsingGpuDevice()) {
keyar@chromium.orgf8a513f2012-08-20 15:03:52 +0000143 SkDebugf(" gmsecs = %6.2f", gpu_time / fRepeats);
keyar@chromium.orgfe6391a2012-08-20 15:03:41 +0000144 }
keyar@chromium.orgf8a513f2012-08-20 15:03:52 +0000145#endif
keyar@chromium.orgfe6391a2012-08-20 15:03:41 +0000146 SkDebugf("\n");
keyar@chromium.org77a55222012-08-20 15:03:47 +0000147
148 delete timer;
keyar@chromium.org163b5672012-08-01 17:53:29 +0000149}
150
151void TiledPictureBenchmark::run(SkPicture* pict) {
keyar@chromium.org9d696c02012-08-07 17:11:33 +0000152 SkASSERT(pict);
keyar@chromium.org78a35c52012-08-20 15:03:44 +0000153 if (NULL == pict) {
keyar@chromium.org9d696c02012-08-07 17:11:33 +0000154 return;
155 }
156
keyar@chromium.orgfe6391a2012-08-20 15:03:41 +0000157 fRenderer.init(pict);
keyar@chromium.org163b5672012-08-01 17:53:29 +0000158
159 // We throw this away to remove first time effects (such as paging in this
160 // program)
keyar@chromium.orgfe6391a2012-08-20 15:03:41 +0000161 fRenderer.drawTiles();
keyar@chromium.orgf8a513f2012-08-20 15:03:52 +0000162 fRenderer.resetState();
keyar@chromium.org163b5672012-08-01 17:53:29 +0000163
keyar@chromium.org77a55222012-08-20 15:03:47 +0000164 BenchTimer* timer = setupTimer();
keyar@chromium.orgf8a513f2012-08-20 15:03:52 +0000165 double wall_time = 0;
166#if SK_SUPPORT_GPU
167 double gpu_time = 0;
168#endif
169
keyar@chromium.org163b5672012-08-01 17:53:29 +0000170 for (int i = 0; i < fRepeats; ++i) {
keyar@chromium.orgf8a513f2012-08-20 15:03:52 +0000171 timer->start();
keyar@chromium.orgfe6391a2012-08-20 15:03:41 +0000172 fRenderer.drawTiles();
keyar@chromium.orgf8a513f2012-08-20 15:03:52 +0000173 timer->end();
174 fRenderer.resetState();
175
176 wall_time += timer->fWall;
177#if SK_SUPPORT_GPU
178 if (fRenderer.isUsingGpuDevice()) {
179 gpu_time += timer->fGpu;
180 }
181#endif
keyar@chromium.org163b5672012-08-01 17:53:29 +0000182 }
keyar@chromium.org163b5672012-08-01 17:53:29 +0000183
keyar@chromium.orgfe6391a2012-08-20 15:03:41 +0000184 fRenderer.end();
keyar@chromium.org9d696c02012-08-07 17:11:33 +0000185
keyar@chromium.orgfe6391a2012-08-20 15:03:41 +0000186 SkDebugf("%i_tiles_%ix%i: msecs = %6.2f", fRenderer.numTiles(), fRenderer.getTileWidth(),
keyar@chromium.orgf8a513f2012-08-20 15:03:52 +0000187 fRenderer.getTileHeight(), wall_time / fRepeats);
188#if SK_SUPPORT_GPU
keyar@chromium.orgfe6391a2012-08-20 15:03:41 +0000189 if (fRenderer.isUsingGpuDevice()) {
keyar@chromium.orgf8a513f2012-08-20 15:03:52 +0000190 SkDebugf(" gmsecs = %6.2f", gpu_time / fRepeats);
keyar@chromium.orgfe6391a2012-08-20 15:03:41 +0000191 }
keyar@chromium.orgf8a513f2012-08-20 15:03:52 +0000192#endif
keyar@chromium.orgfe6391a2012-08-20 15:03:41 +0000193 SkDebugf("\n");
keyar@chromium.org163b5672012-08-01 17:53:29 +0000194}
195
196void UnflattenPictureBenchmark::run(SkPicture* pict) {
keyar@chromium.org9d696c02012-08-07 17:11:33 +0000197 SkASSERT(pict);
keyar@chromium.org78a35c52012-08-20 15:03:44 +0000198 if (NULL == pict) {
keyar@chromium.org9d696c02012-08-07 17:11:33 +0000199 return;
200 }
201
keyar@chromium.org77a55222012-08-20 15:03:47 +0000202 BenchTimer* timer = setupTimer();
keyar@chromium.org163b5672012-08-01 17:53:29 +0000203 double wall_time = 0;
204
205 for (int i = 0; i < fRepeats + 1; ++i) {
206 SkPicture replayer;
207 SkCanvas* recorder = replayer.beginRecording(pict->width(), pict->height());
208
209 recorder->drawPicture(*pict);
210
keyar@chromium.org77a55222012-08-20 15:03:47 +0000211 timer->start();
keyar@chromium.org163b5672012-08-01 17:53:29 +0000212 replayer.endRecording();
keyar@chromium.org77a55222012-08-20 15:03:47 +0000213 timer->end();
keyar@chromium.org163b5672012-08-01 17:53:29 +0000214
215 // We want to ignore first time effects
216 if (i > 0) {
keyar@chromium.org77a55222012-08-20 15:03:47 +0000217 wall_time += timer->fWall;
keyar@chromium.org163b5672012-08-01 17:53:29 +0000218 }
219 }
220
221 SkDebugf("unflatten: msecs = %6.4f\n", wall_time / fRepeats);
222}
223
224}