| OLD | NEW |
| 1 /* | 1 /* |
| 2 * Copyright 2012 Google Inc. | 2 * Copyright 2012 Google Inc. |
| 3 * | 3 * |
| 4 * Use of this source code is governed by a BSD-style license that can be | 4 * Use of this source code is governed by a BSD-style license that can be |
| 5 * found in the LICENSE file. | 5 * found in the LICENSE file. |
| 6 */ | 6 */ |
| 7 | 7 |
| 8 #include "SkBenchLogger.h" | 8 #include "SkBenchLogger.h" |
| 9 #include "BenchTimer.h" | 9 #include "BenchTimer.h" |
| 10 #include "PictureBenchmark.h" | 10 #include "PictureBenchmark.h" |
| 11 #include "SkCanvas.h" | 11 #include "SkCanvas.h" |
| 12 #include "SkPicture.h" | 12 #include "SkPicture.h" |
| 13 #include "SkString.h" | 13 #include "SkString.h" |
| 14 #include "picture_utils.h" | 14 #include "picture_utils.h" |
| 15 | 15 |
| 16 namespace sk_tools { | 16 namespace sk_tools { |
| 17 | 17 |
| 18 PictureBenchmark::PictureBenchmark() | 18 PictureBenchmark::PictureBenchmark() |
| 19 : fRepeats(1) | 19 : fRepeats(1) |
| 20 , fLogger(NULL) | 20 , fLogger(NULL) |
| 21 , fRenderer(NULL) | 21 , fRenderer(NULL) |
| 22 , fTimerResult(TimerData::kAvg_Result) | 22 , fTimerResult(TimerData::kAvg_Result) |
| 23 , fTimerTypes(0) | 23 , fTimerTypes(0) |
| 24 , fTimeIndividualTiles(false) | 24 , fTimeIndividualTiles(false) |
| 25 , fPurgeDecodedTex(false) | 25 , fPurgeDecodedTex1(false) |
| 26 , fPreprocess(false) |
| 26 {} | 27 {} |
| 27 | 28 |
| 28 PictureBenchmark::~PictureBenchmark() { | 29 PictureBenchmark::~PictureBenchmark() { |
| 29 SkSafeUnref(fRenderer); | 30 SkSafeUnref(fRenderer); |
| 30 } | 31 } |
| 31 | 32 |
| 32 void PictureBenchmark::setTimersToShow(bool wall, | 33 void PictureBenchmark::setTimersToShow(bool wall, |
| 33 bool truncatedWall, | 34 bool truncatedWall, |
| 34 bool cpu, | 35 bool cpu, |
| 35 bool truncatedCpu, | 36 bool truncatedCpu, |
| (...skipping 33 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 69 } | 70 } |
| 70 | 71 |
| 71 SkASSERT(fRenderer != NULL); | 72 SkASSERT(fRenderer != NULL); |
| 72 if (NULL == fRenderer) { | 73 if (NULL == fRenderer) { |
| 73 return; | 74 return; |
| 74 } | 75 } |
| 75 | 76 |
| 76 fRenderer->init(pict, NULL, NULL, false); | 77 fRenderer->init(pict, NULL, NULL, false); |
| 77 | 78 |
| 78 // We throw this away to remove first time effects (such as paging in this p
rogram) | 79 // We throw this away to remove first time effects (such as paging in this p
rogram) |
| 79 fRenderer->setup(); | 80 fRenderer->setup1(); |
| 81 |
| 82 if (fPreprocess) { |
| 83 if (NULL != fRenderer->getCanvas()) { |
| 84 fRenderer->getCanvas()->EXPERIMENTAL_optimize(pict); |
| 85 } |
| 86 } |
| 87 |
| 80 fRenderer->render(NULL); | 88 fRenderer->render(NULL); |
| 81 fRenderer->resetState(true); // flush, swapBuffers and Finish | 89 fRenderer->resetState(true); // flush, swapBuffers and Finish |
| 82 | 90 |
| 83 if (fPurgeDecodedTex) { | 91 if (fPreprocess) { |
| 92 // pict->needsNewGenID(); |
| 93 if (NULL != fRenderer->getCanvas()) { |
| 94 fRenderer->getCanvas()->EXPERIMENTAL_purge(); |
| 95 } |
| 96 } |
| 97 |
| 98 if (fPurgeDecodedTex1) { |
| 84 fRenderer->purgeTextures(); | 99 fRenderer->purgeTextures(); |
| 85 } | 100 } |
| 86 | 101 |
| 87 bool usingGpu = false; | 102 bool usingGpu = false; |
| 88 #if SK_SUPPORT_GPU | 103 #if SK_SUPPORT_GPU |
| 89 usingGpu = fRenderer->isUsingGpuDevice(); | 104 usingGpu = fRenderer->isUsingGpuDevice(); |
| 90 #endif | 105 #endif |
| 91 | 106 |
| 92 uint32_t timerTypes = fTimerTypes; | 107 uint32_t timerTypes = fTimerTypes; |
| 93 if (!usingGpu) { | 108 if (!usingGpu) { |
| (...skipping 59 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 153 | 168 |
| 154 longRunningTimer->start(); | 169 longRunningTimer->start(); |
| 155 for (int inner = 0; inner < numInnerLoops; ++inner) { | 170 for (int inner = 0; inner < numInnerLoops; ++inner) { |
| 156 perTileTimer->start(); | 171 perTileTimer->start(); |
| 157 tiledRenderer->drawCurrentTile(); | 172 tiledRenderer->drawCurrentTile(); |
| 158 perTileTimer->truncatedEnd(); | 173 perTileTimer->truncatedEnd(); |
| 159 tiledRenderer->resetState(false); // flush & swapBuffers, b
ut don't Finish | 174 tiledRenderer->resetState(false); // flush & swapBuffers, b
ut don't Finish |
| 160 perTileTimer->end(); | 175 perTileTimer->end(); |
| 161 SkAssertResult(perTileTimerData.appendTimes(perTileTimer.get
())); | 176 SkAssertResult(perTileTimerData.appendTimes(perTileTimer.get
())); |
| 162 | 177 |
| 163 if (fPurgeDecodedTex) { | 178 if (fPurgeDecodedTex1) { |
| 164 fRenderer->purgeTextures(); | 179 fRenderer->purgeTextures(); |
| 165 } | 180 } |
| 166 } | 181 } |
| 167 longRunningTimer->truncatedEnd(); | 182 longRunningTimer->truncatedEnd(); |
| 168 tiledRenderer->resetState(true); // flush, swapBuffers and
Finish | 183 tiledRenderer->resetState(true); // flush, swapBuffers and
Finish |
| 169 longRunningTimer->end(); | 184 longRunningTimer->end(); |
| 170 SkAssertResult(longRunningTimerData.appendTimes(longRunningTimer
.get())); | 185 SkAssertResult(longRunningTimerData.appendTimes(longRunningTimer
.get())); |
| 171 } | 186 } |
| 172 | 187 |
| 173 SkString configName = tiledRenderer->getConfigName(); | 188 SkString configName = tiledRenderer->getConfigName(); |
| 174 configName.appendf(": tile [%i,%i] out of [%i,%i]", x, y, xTiles, yT
iles); | 189 configName.appendf(": tile [%i,%i] out of [%i,%i]", x, y, xTiles, yT
iles); |
| 175 | 190 |
| 176 // TODO(borenet): Turn off per-iteration tile time reporting for now
. | 191 // TODO(borenet): Turn off per-iteration tile time reporting for now
. |
| 177 // Avoiding logging the time for every iteration for each tile cuts | 192 // Avoiding logging the time for every iteration for each tile cuts |
| 178 // down on data file size by a significant amount. Re-enable this on
ce | 193 // down on data file size by a significant amount. Re-enable this on
ce |
| 179 // we're loading the bench data directly into a data store and are n
o | 194 // we're loading the bench data directly into a data store and are n
o |
| 180 // longer generating SVG graphs. | 195 // longer generating SVG graphs. |
| 181 #if 0 | 196 #if 0 |
| 182 SkString result = perTileTimerData.getResult(timeFormat.c_str(), fTi
merResult, | 197 SkString result = perTileTimerData.getResult(timeFormat.c_str(), fTi
merResult, |
| 183 configName.c_str(), tim
erTypes); | 198 configName.c_str(), tim
erTypes); |
| 184 result.append("\n"); | 199 result.append("\n"); |
| 185 this->logProgress(result.c_str()); | 200 this->logProgress(result.c_str()); |
| 186 #endif | 201 #endif |
| 187 | 202 |
| 188 if (fPurgeDecodedTex) { | 203 if (fPurgeDecodedTex1) { |
| 189 configName.append(" <withPurging>"); | 204 configName.append(" <withPurging>"); |
| 190 } | 205 } |
| 191 configName.append(" <averaged>"); | 206 configName.append(" <averaged>"); |
| 192 SkString longRunningResult = longRunningTimerData.getResult( | 207 SkString longRunningResult = longRunningTimerData.getResult( |
| 193 tiledRenderer->getNormalTimeFormat().c_str(), | 208 tiledRenderer->getNormalTimeFormat().c_str(), |
| 194 TimerData::kAvg_Result, | 209 TimerData::kAvg_Result, |
| 195 configName.c_str(), timerTypes, numInnerLoops); | 210 configName.c_str(), timerTypes, numInnerLoops); |
| 196 longRunningResult.append("\n"); | 211 longRunningResult.append("\n"); |
| 197 this->logProgress(longRunningResult.c_str()); | 212 this->logProgress(longRunningResult.c_str()); |
| 198 } | 213 } |
| 199 } else { | 214 } else { |
| 200 SkAutoTDelete<BenchTimer> longRunningTimer(this->setupTimer()); | 215 SkAutoTDelete<BenchTimer> longRunningTimer(this->setupTimer()); |
| 201 TimerData longRunningTimerData(numOuterLoops); | 216 TimerData longRunningTimerData(numOuterLoops); |
| 202 | 217 |
| 203 for (int outer = 0; outer < numOuterLoops; ++outer) { | 218 for (int outer = 0; outer < numOuterLoops; ++outer) { |
| 204 SkAutoTDelete<BenchTimer> perRunTimer(this->setupTimer(false)); | 219 SkAutoTDelete<BenchTimer> perRunTimer(this->setupTimer(false)); |
| 205 TimerData perRunTimerData(numInnerLoops); | 220 TimerData perRunTimerData(numInnerLoops); |
| 206 | 221 |
| 207 longRunningTimer->start(); | 222 longRunningTimer->start(); |
| 208 for (int inner = 0; inner < numInnerLoops; ++inner) { | 223 for (int inner = 0; inner < numInnerLoops; ++inner) { |
| 209 fRenderer->setup(); | 224 fRenderer->setup1(); |
| 210 | 225 |
| 211 perRunTimer->start(); | 226 perRunTimer->start(); |
| 212 fRenderer->render(NULL); | 227 fRenderer->render(NULL); |
| 213 perRunTimer->truncatedEnd(); | 228 perRunTimer->truncatedEnd(); |
| 214 fRenderer->resetState(false); // flush & swapBuffers, but don'
t Finish | 229 fRenderer->resetState(false); // flush & swapBuffers, but don'
t Finish |
| 215 perRunTimer->end(); | 230 perRunTimer->end(); |
| 216 | 231 |
| 217 SkAssertResult(perRunTimerData.appendTimes(perRunTimer.get())); | 232 SkAssertResult(perRunTimerData.appendTimes(perRunTimer.get())); |
| 218 | 233 |
| 219 if (fPurgeDecodedTex) { | 234 if (fPreprocess) { |
| 235 // pict->needsNewGenID(); |
| 236 if (NULL != fRenderer->getCanvas()) { |
| 237 fRenderer->getCanvas()->EXPERIMENTAL_purge(); |
| 238 } |
| 239 } |
| 240 |
| 241 if (fPurgeDecodedTex1) { |
| 220 fRenderer->purgeTextures(); | 242 fRenderer->purgeTextures(); |
| 221 } | 243 } |
| 244 |
| 222 } | 245 } |
| 223 longRunningTimer->truncatedEnd(); | 246 longRunningTimer->truncatedEnd(); |
| 224 fRenderer->resetState(true); // flush, swapBuffers and Finish | 247 fRenderer->resetState(true); // flush, swapBuffers and Finish |
| 225 longRunningTimer->end(); | 248 longRunningTimer->end(); |
| 226 SkAssertResult(longRunningTimerData.appendTimes(longRunningTimer.get
())); | 249 SkAssertResult(longRunningTimerData.appendTimes(longRunningTimer.get
())); |
| 227 } | 250 } |
| 228 | 251 |
| 229 SkString configName = fRenderer->getConfigName(); | 252 SkString configName = fRenderer->getConfigName(); |
| 230 if (fPurgeDecodedTex) { | 253 if (fPurgeDecodedTex1) { |
| 231 configName.append(" <withPurging>"); | 254 configName.append(" <withPurging>"); |
| 232 } | 255 } |
| 233 | 256 |
| 234 // Beware - since the per-run-timer doesn't ever include a glFinish it c
an | 257 // Beware - since the per-run-timer doesn't ever include a glFinish it c
an |
| 235 // report a lower time then the long-running-timer | 258 // report a lower time then the long-running-timer |
| 236 #if 0 | 259 #if 0 |
| 237 SkString result = perRunTimerData.getResult(timeFormat.c_str(), | 260 SkString result = perRunTimerData.getResult(timeFormat.c_str(), |
| 238 fTimerResult, | 261 fTimerResult, |
| 239 configName.c_str(), | 262 configName.c_str(), |
| 240 timerTypes); | 263 timerTypes); |
| 241 result.append("\n"); | 264 result.append("\n"); |
| 242 | 265 |
| 243 this->logProgress(result.c_str()); | 266 this->logProgress(result.c_str()); |
| 244 #else | 267 #else |
| 245 SkString result = longRunningTimerData.getResult(timeFormat.c_str(), | 268 SkString result = longRunningTimerData.getResult(timeFormat.c_str(), |
| 246 fTimerResult, | 269 fTimerResult, |
| 247 configName.c_str(), | 270 configName.c_str(), |
| 248 timerTypes, | 271 timerTypes, |
| 249 numInnerLoops); | 272 numInnerLoops); |
| 250 result.append("\n"); | 273 result.append("\n"); |
| 251 this->logProgress(result.c_str()); | 274 this->logProgress(result.c_str()); |
| 252 #endif | 275 #endif |
| 253 } | 276 } |
| 254 | 277 |
| 255 fRenderer->end(); | 278 fRenderer->end(); |
| 256 } | 279 } |
| 257 | 280 |
| 258 } | 281 } |
| OLD | NEW |