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 "SkDebuggerGUI.h" | 8 #include "SkDebuggerGUI.h" |
9 #include "SkForceLinking.h" | 9 #include "SkForceLinking.h" |
10 #include "SkGraphics.h" | 10 #include "SkGraphics.h" |
11 #include "SkImageDecoder.h" | 11 #include "SkImageDecoder.h" |
12 #include <QListWidgetItem> | 12 #include <QListWidgetItem> |
13 #include "PictureRenderer.h" | 13 #include "PictureRenderer.h" |
| 14 #include "SkPicturePlayback.h" |
14 #include "SkPictureRecord.h" | 15 #include "SkPictureRecord.h" |
15 #include "SkPictureData.h" | 16 #include "SkPictureData.h" |
16 | 17 |
17 __SK_FORCE_IMAGE_DECODER_LINKING; | 18 __SK_FORCE_IMAGE_DECODER_LINKING; |
18 | 19 |
19 #if defined(SK_BUILD_FOR_WIN32) | 20 #if defined(SK_BUILD_FOR_WIN32) |
20 #include "SysTimer_windows.h" | 21 #include "SysTimer_windows.h" |
21 #elif defined(SK_BUILD_FOR_MAC) | 22 #elif defined(SK_BUILD_FOR_MAC) |
22 #include "SysTimer_mach.h" | 23 #include "SysTimer_mach.h" |
23 #elif defined(SK_BUILD_FOR_UNIX) || defined(SK_BUILD_FOR_ANDROID) | 24 #elif defined(SK_BUILD_FOR_UNIX) || defined(SK_BUILD_FOR_ANDROID) |
(...skipping 127 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
151 fDeletesActivated = !fDeletesActivated; | 152 fDeletesActivated = !fDeletesActivated; |
152 for (int row = 0; row < fListWidget.count(); row++) { | 153 for (int row = 0; row < fListWidget.count(); row++) { |
153 QListWidgetItem *item = fListWidget.item(row); | 154 QListWidgetItem *item = fListWidget.item(row); |
154 item->setHidden(fDebugger.isCommandVisible(row) && fDeletesActivated); | 155 item->setHidden(fDebugger.isCommandVisible(row) && fDeletesActivated); |
155 } | 156 } |
156 } | 157 } |
157 | 158 |
158 // The timed picture playback uses the SkPictureData's profiling stubs | 159 // The timed picture playback uses the SkPictureData's profiling stubs |
159 // to time individual commands. The offsets are needed to map SkPicture | 160 // to time individual commands. The offsets are needed to map SkPicture |
160 // offsets to individual commands. | 161 // offsets to individual commands. |
161 class SkTimedPicturePlayback : public SkPictureData { | 162 class SkTimedPicturePlayback : public SkPicturePlayback { |
162 public: | 163 public: |
163 static SkTimedPicturePlayback* CreateFromStream(SkStream* stream, const SkPi
ctInfo& info, | |
164 SkPicture::InstallPixelRefPr
oc proc, | |
165 const SkTDArray<bool>& delet
edCommands) { | |
166 // Mimics SkPictureData::CreateFromStream | |
167 SkAutoTDelete<SkTimedPicturePlayback> playback(SkNEW_ARGS(SkTimedPicture
Playback, | |
168 (deletedCommands,
info))); | |
169 if (!playback->parseStream(stream, proc)) { | |
170 return NULL; // we're invalid | |
171 } | |
172 return playback.detach(); | |
173 } | |
174 | 164 |
175 SkTimedPicturePlayback(const SkTDArray<bool>& deletedCommands, | 165 SkTimedPicturePlayback(const SkPicture* picture, const SkTDArray<bool>& dele
tedCommands) |
176 const SkPictInfo& info) | 166 : INHERITED(picture) |
177 : INHERITED(info) | |
178 , fSkipCommands(deletedCommands) | 167 , fSkipCommands(deletedCommands) |
179 , fTot(0.0) | 168 , fTot(0.0) |
180 , fCurCommand(0) { | 169 , fCurCommand(0) { |
181 fTimes.setCount(deletedCommands.count()); | 170 fTimes.setCount(deletedCommands.count()); |
182 fTypeTimes.setCount(LAST_DRAWTYPE_ENUM+1); | 171 fTypeTimes.setCount(LAST_DRAWTYPE_ENUM+1); |
183 this->resetTimes(); | 172 this->resetTimes(); |
184 } | 173 } |
185 | 174 |
186 void resetTimes() { | 175 void resetTimes() { |
187 for (int i = 0; i < fTimes.count(); ++i) { | 176 for (int i = 0; i < fTimes.count(); ++i) { |
(...skipping 61 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
249 SkASSERT(opIndex == fCurCommand); | 238 SkASSERT(opIndex == fCurCommand); |
250 SkASSERT(fCurType <= LAST_DRAWTYPE_ENUM); | 239 SkASSERT(fCurType <= LAST_DRAWTYPE_ENUM); |
251 | 240 |
252 fTimes[fCurCommand] += time; | 241 fTimes[fCurCommand] += time; |
253 fTypeTimes[fCurType] += time; | 242 fTypeTimes[fCurType] += time; |
254 fTot += time; | 243 fTot += time; |
255 } | 244 } |
256 #endif | 245 #endif |
257 | 246 |
258 private: | 247 private: |
259 typedef SkPictureData INHERITED; | 248 typedef SkPicturePlayback INHERITED; |
260 }; | 249 }; |
261 | 250 |
| 251 #if 0 |
262 // Wrap SkPicture to allow installation of an SkTimedPicturePlayback object | 252 // Wrap SkPicture to allow installation of an SkTimedPicturePlayback object |
263 class SkTimedPicture : public SkPicture { | 253 class SkTimedPicture : public SkPicture { |
264 public: | 254 public: |
265 static SkTimedPicture* CreateTimedPicture(SkStream* stream, | 255 static SkTimedPicture* CreateTimedPicture(SkStream* stream, |
266 SkPicture::InstallPixelRefProc pro
c, | 256 SkPicture::InstallPixelRefProc pro
c, |
267 const SkTDArray<bool>& deletedComm
ands) { | 257 const SkTDArray<bool>& deletedComm
ands) { |
268 SkPictInfo info; | 258 SkPictInfo info; |
269 if (!InternalOnly_StreamIsSKP(stream, &info)) { | 259 if (!InternalOnly_StreamIsSKP(stream, &info)) { |
270 return NULL; | 260 return NULL; |
271 } | 261 } |
(...skipping 29 matching lines...) Expand all Loading... |
301 // disallow default ctor b.c. we don't have a good way to setup the fData pt
r | 291 // disallow default ctor b.c. we don't have a good way to setup the fData pt
r |
302 SkTimedPicture(); | 292 SkTimedPicture(); |
303 // Private ctor only used by CreateTimedPicture, which has created the playb
ack. | 293 // Private ctor only used by CreateTimedPicture, which has created the playb
ack. |
304 SkTimedPicture(SkTimedPicturePlayback* playback, int width, int height) | 294 SkTimedPicture(SkTimedPicturePlayback* playback, int width, int height) |
305 : INHERITED(playback, width, height) {} | 295 : INHERITED(playback, width, height) {} |
306 // disallow the copy ctor - enabling would require copying code from SkPictu
re | 296 // disallow the copy ctor - enabling would require copying code from SkPictu
re |
307 SkTimedPicture(const SkTimedPicture& src); | 297 SkTimedPicture(const SkTimedPicture& src); |
308 | 298 |
309 typedef SkPicture INHERITED; | 299 typedef SkPicture INHERITED; |
310 }; | 300 }; |
| 301 #endif |
311 | 302 |
312 // This is a simplification of PictureBenchmark's run with the addition of | 303 // This is a simplification of PictureBenchmark's run with the addition of |
313 // clearing of the times after the first pass (in resetTimes) | 304 // clearing of the times after the first pass (in resetTimes) |
314 void SkDebuggerGUI::run(SkTimedPicture* pict, | 305 void SkDebuggerGUI::run(const SkPicture* pict, |
315 sk_tools::PictureRenderer* renderer, | 306 sk_tools::PictureRenderer* renderer, |
316 int repeats) { | 307 int repeats) { |
317 SkASSERT(pict); | 308 SkASSERT(pict); |
318 if (NULL == pict) { | 309 if (NULL == pict) { |
319 return; | 310 return; |
320 } | 311 } |
321 | 312 |
322 SkASSERT(renderer != NULL); | 313 SkASSERT(renderer != NULL); |
323 if (NULL == renderer) { | 314 if (NULL == renderer) { |
324 return; | 315 return; |
325 } | 316 } |
326 | 317 |
327 renderer->init(pict, NULL, NULL, NULL, false); | 318 renderer->init(pict, NULL, NULL, NULL, false); |
328 | 319 |
329 renderer->setup(); | 320 renderer->setup(); |
330 renderer->render(); | 321 renderer->render(); |
331 renderer->resetState(true); // flush, swapBuffers and Finish | 322 renderer->resetState(true); // flush, swapBuffers and Finish |
332 | 323 |
| 324 #if 0 |
333 // We throw this away the first batch of times to remove first time effects
(such as paging in this program) | 325 // We throw this away the first batch of times to remove first time effects
(such as paging in this program) |
334 pict->resetTimes(); | 326 pict->resetTimes(); |
| 327 #endif |
335 | 328 |
336 for (int i = 0; i < repeats; ++i) { | 329 for (int i = 0; i < repeats; ++i) { |
337 renderer->setup(); | 330 renderer->setup(); |
338 renderer->render(); | 331 renderer->render(); |
339 renderer->resetState(false); // flush & swapBuffers, but don't Finish | 332 renderer->resetState(false); // flush & swapBuffers, but don't Finish |
340 } | 333 } |
341 renderer->resetState(true); // flush, swapBuffers and Finish | 334 renderer->resetState(true); // flush, swapBuffers and Finish |
342 | 335 |
343 renderer->end(); | 336 renderer->end(); |
344 } | 337 } |
345 | 338 |
346 void SkDebuggerGUI::actionProfile() { | 339 void SkDebuggerGUI::actionProfile() { |
347 // In order to profile we pass the command offsets (that were read-in | 340 // In order to profile we pass the command offsets (that were read-in |
348 // in loadPicture by the SkOffsetPicture) to an SkTimedPlaybackPicture. | 341 // in loadPicture by the SkOffsetPicture) to an SkTimedPlaybackPicture. |
349 // The SkTimedPlaybackPicture in turn passes the offsets to an | 342 // The SkTimedPlaybackPicture in turn passes the offsets to an |
350 // SkTimedPicturePlayback object which uses them to track the performance | 343 // SkTimedPicturePlayback object which uses them to track the performance |
351 // of individual commands. | 344 // of individual commands. |
352 if (fFileName.isEmpty()) { | 345 if (fFileName.isEmpty()) { |
353 return; | 346 return; |
354 } | 347 } |
355 | 348 |
356 SkFILEStream inputStream; | 349 SkFILEStream inputStream; |
357 | 350 |
358 inputStream.setPath(fFileName.c_str()); | 351 inputStream.setPath(fFileName.c_str()); |
359 if (!inputStream.isValid()) { | 352 if (!inputStream.isValid()) { |
360 return; | 353 return; |
361 } | 354 } |
362 | 355 |
363 SkAutoTUnref<SkTimedPicture> picture(SkTimedPicture::CreateTimedPicture(&inp
utStream, | 356 SkAutoTUnref<SkPicture> picture(SkPicture::CreateFromStream(&inputStream, |
364 &SkImageDecoder::DecodeMemory, fSkipCom
mands)); | 357 &SkImageDecoder::DecodeMemory)); // , fS
kipCommands)); |
365 if (NULL == picture.get()) { | 358 if (NULL == picture.get()) { |
366 return; | 359 return; |
367 } | 360 } |
368 | 361 |
| 362 |
| 363 #if 0 |
| 364 |
369 // For now this #if allows switching between tiled and simple rendering | 365 // For now this #if allows switching between tiled and simple rendering |
370 // modes. Eventually this will be accomplished via the GUI | 366 // modes. Eventually this will be accomplished via the GUI |
371 #if 0 | 367 #if 0 |
372 // With the current batch of SysTimers, profiling in tiled mode | 368 // With the current batch of SysTimers, profiling in tiled mode |
373 // gets swamped by the timing overhead: | 369 // gets swamped by the timing overhead: |
374 // | 370 // |
375 // tile mode simple mode | 371 // tile mode simple mode |
376 // debugger 64.2ms 12.8ms | 372 // debugger 64.2ms 12.8ms |
377 // bench_pictures 16.9ms 12.4ms | 373 // bench_pictures 16.9ms 12.4ms |
378 // | 374 // |
(...skipping 28 matching lines...) Expand all Loading... |
407 for (int i = 0; i < picture->count(); ++i) { | 403 for (int i = 0; i < picture->count(); ++i) { |
408 double temp = picture->time(i); | 404 double temp = picture->time(i); |
409 | 405 |
410 QListWidgetItem* item = fListWidget.item(i); | 406 QListWidgetItem* item = fListWidget.item(i); |
411 | 407 |
412 item->setData(Qt::UserRole + 4, 100.0*temp); | 408 item->setData(Qt::UserRole + 4, 100.0*temp); |
413 } | 409 } |
414 | 410 |
415 setupOverviewText(picture->typeTimes(), picture->totTime(), kNumRepeats); | 411 setupOverviewText(picture->typeTimes(), picture->totTime(), kNumRepeats); |
416 setupClipStackText(); | 412 setupClipStackText(); |
| 413 |
| 414 #endif |
417 } | 415 } |
418 | 416 |
419 void SkDebuggerGUI::actionCancel() { | 417 void SkDebuggerGUI::actionCancel() { |
420 for (int row = 0; row < fListWidget.count(); row++) { | 418 for (int row = 0; row < fListWidget.count(); row++) { |
421 fListWidget.item(row)->setHidden(false); | 419 fListWidget.item(row)->setHidden(false); |
422 } | 420 } |
423 } | 421 } |
424 | 422 |
425 void SkDebuggerGUI::actionClearBreakpoints() { | 423 void SkDebuggerGUI::actionClearBreakpoints() { |
426 for (int row = 0; row < fListWidget.count(); row++) { | 424 for (int row = 0; row < fListWidget.count(); row++) { |
(...skipping 642 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1069 } | 1067 } |
1070 | 1068 |
1071 // NOTE(chudy): Makes first item unselectable. | 1069 // NOTE(chudy): Makes first item unselectable. |
1072 QStandardItemModel* model = qobject_cast<QStandardItemModel*>( | 1070 QStandardItemModel* model = qobject_cast<QStandardItemModel*>( |
1073 fFilter.model()); | 1071 fFilter.model()); |
1074 QModelIndex firstIndex = model->index(0, fFilter.modelColumn(), | 1072 QModelIndex firstIndex = model->index(0, fFilter.modelColumn(), |
1075 fFilter.rootModelIndex()); | 1073 fFilter.rootModelIndex()); |
1076 QStandardItem* firstItem = model->itemFromIndex(firstIndex); | 1074 QStandardItem* firstItem = model->itemFromIndex(firstIndex); |
1077 firstItem->setSelectable(false); | 1075 firstItem->setSelectable(false); |
1078 } | 1076 } |
OLD | NEW |