Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(188)

Side by Side Diff: src/core/SkPictureRecord.cpp

Issue 12817011: Fixing SkPicture command pattern optimizations to make them work correctly with bounding box hierar… (Closed) Base URL: http://skia.googlecode.com/svn/trunk/
Patch Set: Created 7 years, 9 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
OLDNEW
1 1
2 /* 2 /*
3 * Copyright 2011 Google Inc. 3 * Copyright 2011 Google Inc.
4 * 4 *
5 * Use of this source code is governed by a BSD-style license that can be 5 * Use of this source code is governed by a BSD-style license that can be
6 * found in the LICENSE file. 6 * found in the LICENSE file.
7 */ 7 */
8 #include "SkPictureRecord.h" 8 #include "SkPictureRecord.h"
9 #include "SkTSearch.h" 9 #include "SkTSearch.h"
10 #include "SkPixelRef.h" 10 #include "SkPixelRef.h"
(...skipping 484 matching lines...) Expand 10 before | Expand all | Expand 10 after
495 SkDebugf("Collapse [%d out of %d] %g%spn", gCollapseCount, gCollapseCalls, 495 SkDebugf("Collapse [%d out of %d] %g%spn", gCollapseCount, gCollapseCalls,
496 (double)gCollapseCount / gCollapseCalls, "%"); 496 (double)gCollapseCount / gCollapseCalls, "%");
497 #endif 497 #endif
498 498
499 writer->rewindToOffset(saveOffset); 499 writer->rewindToOffset(saveOffset);
500 return true; 500 return true;
501 } 501 }
502 502
503 typedef bool (*PictureRecordOptProc)(SkWriter32* writer, int32_t offset, 503 typedef bool (*PictureRecordOptProc)(SkWriter32* writer, int32_t offset,
504 SkPaintDictionary* paintDict); 504 SkPaintDictionary* paintDict);
505 enum PictureRecordOptType {
506 kRewind_OptType, // Optimization rewinds the command stream
507 kCollapseSaveLayer_OptType, // Optimization eliminates a save/restore pair
508 };
505 509
510 struct PictureRecordOpt {
511 PictureRecordOptProc fProc;
512 PictureRecordOptType fType;
513 };
506 /* 514 /*
507 * A list of the optimizations that are tried upon seeing a restore 515 * A list of the optimizations that are tried upon seeing a restore
508 * TODO: add a real API for such optimizations 516 * TODO: add a real API for such optimizations
509 * Add the ability to fire optimizations on any op (not just RESTORE) 517 * Add the ability to fire optimizations on any op (not just RESTORE)
510 */ 518 */
511 static const PictureRecordOptProc gPictureRecordOpts[] = { 519 static const PictureRecordOpt gPictureRecordOpts[] = {
512 collapse_save_clip_restore, 520 { collapse_save_clip_restore, kRewind_OptType },
513 #ifndef SK_IGNORE_PICTURE_RECORD_SAVE_LAYER_OPT 521 { remove_save_layer1, kCollapseSaveLayer_OptType },
514 remove_save_layer1, 522 { remove_save_layer2, kCollapseSaveLayer_OptType }
515 remove_save_layer2,
516 #endif
517 }; 523 };
518 524
robertphillips 2013/03/14 18:55:44 comment? // This method is called after the passed
525 void SkPictureRecord::handleOptimization(int opt) {
526 switch (gPictureRecordOpts[opt].fType) {
527 case kCollapseSaveLayer_OptType:
528 if (NULL != fStateTree) {
529 fStateTree->saveCollapsed();
530 }
531 break;
532 case kRewind_OptType:
robertphillips 2013/03/14 18:55:44 This is a rather ominous comment.
Justin Novosad 2013/03/14 20:04:14 Done.
533 // No need do any rewinding on the state tree, we can just leave the
534 // unreferenced branches dangling.
535 if (NULL != fBoundingHierarchy) {
536 fBoundingHierarchy->rewindInserts();
537 }
538 break;
539 default:
540 SkASSERT(0);
541 }
542 }
543
519 void SkPictureRecord::restore() { 544 void SkPictureRecord::restore() {
520 // FIXME: SkDeferredCanvas needs to be refactored to respect 545 // FIXME: SkDeferredCanvas needs to be refactored to respect
521 // save/restore balancing so that the following test can be 546 // save/restore balancing so that the following test can be
522 // turned on permanently. 547 // turned on permanently.
523 #if 0 548 #if 0
524 SkASSERT(fRestoreOffsetStack.count() > 1); 549 SkASSERT(fRestoreOffsetStack.count() > 1);
525 #endif 550 #endif
526 551
527 // check for underflow 552 // check for underflow
528 if (fRestoreOffsetStack.count() == 0) { 553 if (fRestoreOffsetStack.count() == 0) {
529 return; 554 return;
530 } 555 }
531 556
532 if (fRestoreOffsetStack.count() == fFirstSavedLayerIndex) { 557 if (fRestoreOffsetStack.count() == fFirstSavedLayerIndex) {
533 fFirstSavedLayerIndex = kNoSavedLayerIndex; 558 fFirstSavedLayerIndex = kNoSavedLayerIndex;
534 } 559 }
535 560
536 uint32_t initialOffset, size; 561 uint32_t initialOffset, size;
537 size_t opt; 562 size_t opt;
538 for (opt = 0; opt < SK_ARRAY_COUNT(gPictureRecordOpts); ++opt) { 563 for (opt = 0; opt < SK_ARRAY_COUNT(gPictureRecordOpts); ++opt) {
539 if ((*gPictureRecordOpts[opt])(&fWriter, fRestoreOffsetStack.top(), &fPa ints)) { 564 if ((*gPictureRecordOpts[opt].fProc)(&fWriter, fRestoreOffsetStack.top() , &fPaints)) {
540 // Some optimization fired so don't add the RESTORE 565 // Some optimization fired so don't add the RESTORE
541 size = 0; 566 size = 0;
542 initialOffset = fWriter.size(); 567 initialOffset = fWriter.size();
robertphillips 2013/03/14 18:55:44 this->
Justin Novosad 2013/03/14 20:04:14 Done.
568 handleOptimization(opt);
543 break; 569 break;
544 } 570 }
545 } 571 }
546 572
547 if (SK_ARRAY_COUNT(gPictureRecordOpts) == opt) { 573 if (SK_ARRAY_COUNT(gPictureRecordOpts) == opt) {
548 // No optimization fired so add the RESTORE 574 // No optimization fired so add the RESTORE
549 fillRestoreOffsetPlaceholdersForCurrentStackLevel((uint32_t)fWriter.size ()); 575 fillRestoreOffsetPlaceholdersForCurrentStackLevel((uint32_t)fWriter.size ());
550 size = 1 * kUInt32Size; // RESTORE consists solely of 1 op code 576 size = 1 * kUInt32Size; // RESTORE consists solely of 1 op code
551 initialOffset = this->addDraw(RESTORE, &size); 577 initialOffset = this->addDraw(RESTORE, &size);
552 } 578 }
(...skipping 862 matching lines...) Expand 10 before | Expand all | Expand 10 after
1415 void SkPictureRecord::validateRegions() const { 1441 void SkPictureRecord::validateRegions() const {
1416 int count = fRegions.count(); 1442 int count = fRegions.count();
1417 SkASSERT((unsigned) count < 0x1000); 1443 SkASSERT((unsigned) count < 0x1000);
1418 for (int index = 0; index < count; index++) { 1444 for (int index = 0; index < count; index++) {
1419 const SkFlatData* region = fRegions[index]; 1445 const SkFlatData* region = fRegions[index];
1420 SkASSERT(region); 1446 SkASSERT(region);
1421 // region->validate(); 1447 // region->validate();
1422 } 1448 }
1423 } 1449 }
1424 #endif 1450 #endif
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698