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

Side by Side Diff: Source/platform/graphics/paint/DisplayItemListTest.cpp

Issue 1313223002: Simplify subtree (now subsequence) caching (Closed) Base URL: svn://svn.chromium.org/blink/trunk
Patch Set: Created 5 years, 3 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 // Copyright 2014 The Chromium Authors. All rights reserved. 1 // Copyright 2014 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 #include "config.h" 5 #include "config.h"
6 #include "platform/graphics/paint/DisplayItemList.h" 6 #include "platform/graphics/paint/DisplayItemList.h"
7 7
8 #include "platform/RuntimeEnabledFeatures.h" 8 #include "platform/RuntimeEnabledFeatures.h"
9 #include "platform/graphics/GraphicsContext.h" 9 #include "platform/graphics/GraphicsContext.h"
10 #include "platform/graphics/paint/CachedDisplayItem.h" 10 #include "platform/graphics/paint/CachedDisplayItem.h"
(...skipping 440 matching lines...) Expand 10 before | Expand all | Expand 10 after
451 TestDisplayItem(container1, foregroundDrawingType)); 451 TestDisplayItem(container1, foregroundDrawingType));
452 } 452 }
453 453
454 TEST_F(DisplayItemListTest, CachedSubtreeSwapOrder) 454 TEST_F(DisplayItemListTest, CachedSubtreeSwapOrder)
455 { 455 {
456 TestDisplayItemClient container1("container1"); 456 TestDisplayItemClient container1("container1");
457 TestDisplayItemClient content1("content1"); 457 TestDisplayItemClient content1("content1");
458 TestDisplayItemClient container2("container2"); 458 TestDisplayItemClient container2("container2");
459 TestDisplayItemClient content2("content2"); 459 TestDisplayItemClient content2("content2");
460 GraphicsContext context(&displayItemList()); 460 GraphicsContext context(&displayItemList());
461 const int backgroundPaintPhase = backgroundDrawingType - DisplayItem::Drawin gPaintPhaseFirst;
462 const int foregroundPaintPhase = foregroundDrawingType - DisplayItem::Drawin gPaintPhaseFirst;
463 461
464 { 462 {
465 SubtreeRecorder r(context, container1, backgroundPaintPhase); 463 SubtreeRecorder r(context, container1);
466 EXPECT_FALSE(r.canUseCache());
467 drawRect(context, container1, backgroundDrawingType, FloatRect(100, 100, 100, 100)); 464 drawRect(context, container1, backgroundDrawingType, FloatRect(100, 100, 100, 100));
468 drawRect(context, content1, backgroundDrawingType, FloatRect(100, 100, 5 0, 200)); 465 drawRect(context, content1, backgroundDrawingType, FloatRect(100, 100, 5 0, 200));
469 }
470 {
471 SubtreeRecorder r(context, container1, foregroundPaintPhase);
472 EXPECT_FALSE(r.canUseCache());
473 drawRect(context, content1, foregroundDrawingType, FloatRect(100, 100, 5 0, 200)); 466 drawRect(context, content1, foregroundDrawingType, FloatRect(100, 100, 5 0, 200));
474 drawRect(context, container1, foregroundDrawingType, FloatRect(100, 100, 100, 100)); 467 drawRect(context, container1, foregroundDrawingType, FloatRect(100, 100, 100, 100));
475 } 468 }
476 { 469 {
477 SubtreeRecorder r(context, container2, backgroundPaintPhase); 470 SubtreeRecorder r(context, container2);
478 EXPECT_FALSE(r.canUseCache());
479 drawRect(context, container2, backgroundDrawingType, FloatRect(100, 200, 100, 100)); 471 drawRect(context, container2, backgroundDrawingType, FloatRect(100, 200, 100, 100));
480 drawRect(context, content2, backgroundDrawingType, FloatRect(100, 200, 5 0, 200)); 472 drawRect(context, content2, backgroundDrawingType, FloatRect(100, 200, 5 0, 200));
481 }
482 {
483 SubtreeRecorder r(context, container2, foregroundPaintPhase);
484 EXPECT_FALSE(r.canUseCache());
485 drawRect(context, content2, foregroundDrawingType, FloatRect(100, 200, 5 0, 200)); 473 drawRect(context, content2, foregroundDrawingType, FloatRect(100, 200, 5 0, 200));
486 drawRect(context, container2, foregroundDrawingType, FloatRect(100, 200, 100, 100)); 474 drawRect(context, container2, foregroundDrawingType, FloatRect(100, 200, 100, 100));
487 } 475 }
488 displayItemList().commitNewDisplayItems(); 476 displayItemList().commitNewDisplayItems();
489 477
490 EXPECT_DISPLAY_LIST(displayItemList().displayItems(), 16, 478 EXPECT_DISPLAY_LIST(displayItemList().displayItems(), 12,
491 TestDisplayItem(container1, DisplayItem::paintPhaseToBeginSubtreeType(ba ckgroundPaintPhase)), 479 TestDisplayItem(container1, DisplayItem::BeginSubtree),
492 TestDisplayItem(container1, backgroundDrawingType), 480 TestDisplayItem(container1, backgroundDrawingType),
493 TestDisplayItem(content1, backgroundDrawingType), 481 TestDisplayItem(content1, backgroundDrawingType),
494 TestDisplayItem(container1, DisplayItem::paintPhaseToEndSubtreeType(back groundPaintPhase)),
495
496 TestDisplayItem(container1, DisplayItem::paintPhaseToBeginSubtreeType(fo regroundPaintPhase)),
497 TestDisplayItem(content1, foregroundDrawingType), 482 TestDisplayItem(content1, foregroundDrawingType),
498 TestDisplayItem(container1, foregroundDrawingType), 483 TestDisplayItem(container1, foregroundDrawingType),
499 TestDisplayItem(container1, DisplayItem::paintPhaseToEndSubtreeType(fore groundPaintPhase)), 484 TestDisplayItem(container1, DisplayItem::EndSubtree),
500 485
501 TestDisplayItem(container2, DisplayItem::paintPhaseToBeginSubtreeType(ba ckgroundPaintPhase)), 486 TestDisplayItem(container2, DisplayItem::BeginSubtree),
502 TestDisplayItem(container2, backgroundDrawingType), 487 TestDisplayItem(container2, backgroundDrawingType),
503 TestDisplayItem(content2, backgroundDrawingType), 488 TestDisplayItem(content2, backgroundDrawingType),
504 TestDisplayItem(container2, DisplayItem::paintPhaseToEndSubtreeType(back groundPaintPhase)),
505
506 TestDisplayItem(container2, DisplayItem::paintPhaseToBeginSubtreeType(fo regroundPaintPhase)),
507 TestDisplayItem(content2, foregroundDrawingType), 489 TestDisplayItem(content2, foregroundDrawingType),
508 TestDisplayItem(container2, foregroundDrawingType), 490 TestDisplayItem(container2, foregroundDrawingType),
509 TestDisplayItem(container2, DisplayItem::paintPhaseToEndSubtreeType(fore groundPaintPhase))); 491 TestDisplayItem(container2, DisplayItem::EndSubtree));
510 492
511 // Simulate the situation when container1 e.g. gets a z-index that is now gr eater than container2. 493 // Simulate the situation when container1 e.g. gets a z-index that is now gr eater than container2.
512 displayItemList().createAndAppend<CachedDisplayItem>(container2, DisplayItem ::paintPhaseToCachedSubtreeType(backgroundPaintPhase)); 494 EXPECT_TRUE(SubtreeRecorder::useCachedSubtreeIfPossible(context, container2) );
513 EXPECT_EQ((size_t)1, newPaintListBeforeUpdate().size()); 495 EXPECT_EQ((size_t)1, newPaintListBeforeUpdate().size());
514 EXPECT_TRUE(newPaintListBeforeUpdate().last().isCachedSubtree()); 496 EXPECT_TRUE(newPaintListBeforeUpdate().last().type() == DisplayItem::CachedS ubtree);
515 displayItemList().createAndAppend<CachedDisplayItem>(container2, DisplayItem ::paintPhaseToCachedSubtreeType(foregroundPaintPhase)); 497
498 EXPECT_TRUE(SubtreeRecorder::useCachedSubtreeIfPossible(context, container1) );
516 EXPECT_EQ((size_t)2, newPaintListBeforeUpdate().size()); 499 EXPECT_EQ((size_t)2, newPaintListBeforeUpdate().size());
517 EXPECT_TRUE(newPaintListBeforeUpdate().last().isCachedSubtree()); 500 EXPECT_TRUE(newPaintListBeforeUpdate().last().type() == DisplayItem::CachedS ubtree);
518
519 displayItemList().createAndAppend<CachedDisplayItem>(container1, DisplayItem ::paintPhaseToCachedSubtreeType(backgroundPaintPhase));
520 EXPECT_EQ((size_t)3, newPaintListBeforeUpdate().size());
521 EXPECT_TRUE(newPaintListBeforeUpdate().last().isCachedSubtree());
522 displayItemList().createAndAppend<CachedDisplayItem>(container1, DisplayItem ::paintPhaseToCachedSubtreeType(foregroundPaintPhase));
523 EXPECT_EQ((size_t)4, newPaintListBeforeUpdate().size());
524 EXPECT_TRUE(newPaintListBeforeUpdate().last().isCachedSubtree());
525 displayItemList().commitNewDisplayItems(); 501 displayItemList().commitNewDisplayItems();
526 502
527 EXPECT_DISPLAY_LIST(displayItemList().displayItems(), 16, 503 EXPECT_DISPLAY_LIST(displayItemList().displayItems(), 12,
528 TestDisplayItem(container2, DisplayItem::paintPhaseToBeginSubtreeType(ba ckgroundDrawingType)), 504 TestDisplayItem(container2, DisplayItem::BeginSubtree),
529 TestDisplayItem(container2, backgroundDrawingType), 505 TestDisplayItem(container2, backgroundDrawingType),
530 TestDisplayItem(content2, backgroundDrawingType), 506 TestDisplayItem(content2, backgroundDrawingType),
531 TestDisplayItem(container2, DisplayItem::paintPhaseToEndSubtreeType(back groundDrawingType)),
532
533 TestDisplayItem(container2, DisplayItem::paintPhaseToBeginSubtreeType(fo regroundDrawingType)),
534 TestDisplayItem(content2, foregroundDrawingType), 507 TestDisplayItem(content2, foregroundDrawingType),
535 TestDisplayItem(container2, foregroundDrawingType), 508 TestDisplayItem(container2, foregroundDrawingType),
536 TestDisplayItem(container2, DisplayItem::paintPhaseToEndSubtreeType(fore groundDrawingType)), 509 TestDisplayItem(container2, DisplayItem::EndSubtree),
537 510
538 TestDisplayItem(container1, DisplayItem::paintPhaseToBeginSubtreeType(ba ckgroundDrawingType)), 511 TestDisplayItem(container1, DisplayItem::BeginSubtree),
539 TestDisplayItem(container1, backgroundDrawingType), 512 TestDisplayItem(container1, backgroundDrawingType),
540 TestDisplayItem(content1, backgroundDrawingType), 513 TestDisplayItem(content1, backgroundDrawingType),
541 TestDisplayItem(container1, DisplayItem::paintPhaseToEndSubtreeType(back groundDrawingType)),
542
543 TestDisplayItem(container1, DisplayItem::paintPhaseToBeginSubtreeType(fo regroundDrawingType)),
544 TestDisplayItem(content1, foregroundDrawingType), 514 TestDisplayItem(content1, foregroundDrawingType),
545 TestDisplayItem(container1, foregroundDrawingType), 515 TestDisplayItem(container1, foregroundDrawingType),
546 TestDisplayItem(container1, DisplayItem::paintPhaseToEndSubtreeType(fore groundDrawingType))); 516 TestDisplayItem(container1, DisplayItem::EndSubtree));
517 }
518
519 TEST_F(DisplayItemListTest, CachedNestedSubtreeUpdate)
520 {
521 TestDisplayItemClient container1("container1");
522 TestDisplayItemClient content1("content1");
523 TestDisplayItemClient container2("container2");
524 TestDisplayItemClient content2("content2");
525 GraphicsContext context(&displayItemList());
526
527 {
528 SubtreeRecorder r(context, container1);
529 drawRect(context, container1, backgroundDrawingType, FloatRect(100, 100, 100, 100));
530 {
531 SubtreeRecorder r(context, content1);
532 drawRect(context, content1, backgroundDrawingType, FloatRect(100, 10 0, 50, 200));
533 drawRect(context, content1, foregroundDrawingType, FloatRect(100, 10 0, 50, 200));
534 }
535 drawRect(context, container1, foregroundDrawingType, FloatRect(100, 100, 100, 100));
536 }
537 {
538 SubtreeRecorder r(context, container2);
539 drawRect(context, container2, backgroundDrawingType, FloatRect(100, 200, 100, 100));
540 {
541 SubtreeRecorder r(context, content2);
542 drawRect(context, content2, backgroundDrawingType, FloatRect(100, 20 0, 50, 200));
543 }
544 }
545 displayItemList().commitNewDisplayItems();
546
547 EXPECT_DISPLAY_LIST(displayItemList().displayItems(), 14,
548 TestDisplayItem(container1, DisplayItem::BeginSubtree),
549 TestDisplayItem(container1, backgroundDrawingType),
550 TestDisplayItem(content1, DisplayItem::BeginSubtree),
551 TestDisplayItem(content1, backgroundDrawingType),
552 TestDisplayItem(content1, foregroundDrawingType),
553 TestDisplayItem(content1, DisplayItem::EndSubtree),
554 TestDisplayItem(container1, foregroundDrawingType),
555 TestDisplayItem(container1, DisplayItem::EndSubtree),
556
557 TestDisplayItem(container2, DisplayItem::BeginSubtree),
558 TestDisplayItem(container2, backgroundDrawingType),
559 TestDisplayItem(content2, DisplayItem::BeginSubtree),
560 TestDisplayItem(content2, backgroundDrawingType),
561 TestDisplayItem(content2, DisplayItem::EndSubtree),
562 TestDisplayItem(container2, DisplayItem::EndSubtree));
563
564 // Invalidate container1 but not content1.
565 displayItemList().invalidate(container1.displayItemClient());
566
567 // Container2 itself now becomes empty (but still has the 'content2' child), and chooses not to output subtree info.
568 displayItemList().invalidate(container2.displayItemClient());
569 displayItemList().invalidate(content2.displayItemClient());
570 EXPECT_FALSE(SubtreeRecorder::useCachedSubtreeIfPossible(context, container2 ));
571 EXPECT_FALSE(SubtreeRecorder::useCachedSubtreeIfPossible(context, content2)) ;
572 // Content2 now outputs foreground only.
573 {
574 SubtreeRecorder r(context, content2);
575 drawRect(context, content2, foregroundDrawingType, FloatRect(100, 200, 5 0, 200));
576 }
577 EXPECT_EQ((size_t)3, newPaintListBeforeUpdate().size());
578
579 // Repaint container1 with foreground only.
580 {
581 EXPECT_FALSE(SubtreeRecorder::useCachedSubtreeIfPossible(context, contai ner1));
582 SubtreeRecorder r(context, container1);
583
584 // Use cached subtree of content1.
585 EXPECT_TRUE(SubtreeRecorder::useCachedSubtreeIfPossible(context, content 1));
586 EXPECT_EQ((size_t)5, newPaintListBeforeUpdate().size());
587 EXPECT_TRUE(newPaintListBeforeUpdate().last().type() == DisplayItem::Cac hedSubtree);
588
589 drawRect(context, container1, foregroundDrawingType, FloatRect(100, 100, 100, 100));
590 }
591 EXPECT_EQ((size_t)7, newPaintListBeforeUpdate().size());
chrishtr 2015/08/25 23:48:19 Check that newPaintListBeforeUpdate() has cached s
Xianzhu 2015/08/26 23:21:06 Done.
592
593 displayItemList().commitNewDisplayItems();
594
595 EXPECT_DISPLAY_LIST(displayItemList().displayItems(), 10,
596 TestDisplayItem(content2, DisplayItem::BeginSubtree),
597 TestDisplayItem(content2, foregroundDrawingType),
598 TestDisplayItem(content2, DisplayItem::EndSubtree),
599
600 TestDisplayItem(container1, DisplayItem::BeginSubtree),
601 TestDisplayItem(content1, DisplayItem::BeginSubtree),
602 TestDisplayItem(content1, backgroundDrawingType),
603 TestDisplayItem(content1, foregroundDrawingType),
604 TestDisplayItem(content1, DisplayItem::EndSubtree),
605 TestDisplayItem(container1, foregroundDrawingType),
606 TestDisplayItem(container1, DisplayItem::EndSubtree));
547 } 607 }
548 608
549 TEST_F(DisplayItemListTest, Scope) 609 TEST_F(DisplayItemListTest, Scope)
550 { 610 {
551 TestDisplayItemClient multicol("multicol"); 611 TestDisplayItemClient multicol("multicol");
552 TestDisplayItemClient content("content"); 612 TestDisplayItemClient content("content");
553 GraphicsContext context(&displayItemList()); 613 GraphicsContext context(&displayItemList());
554 614
555 FloatRect rect1(100, 100, 50, 50); 615 FloatRect rect1(100, 100, 50, 50);
556 FloatRect rect2(150, 100, 50, 50); 616 FloatRect rect2(150, 100, 50, 50);
(...skipping 121 matching lines...) Expand 10 before | Expand all | Expand 10 after
678 drawRect(context, third, backgroundDrawingType, FloatRect(0, 0, 100, 100)); 738 drawRect(context, third, backgroundDrawingType, FloatRect(0, 0, 100, 100));
679 displayItemList().commitNewDisplayItems(); 739 displayItemList().commitNewDisplayItems();
680 740
681 // Empty clips should have been optimized out. 741 // Empty clips should have been optimized out.
682 EXPECT_DISPLAY_LIST(displayItemList().displayItems(), 2, 742 EXPECT_DISPLAY_LIST(displayItemList().displayItems(), 2,
683 TestDisplayItem(first, backgroundDrawingType), 743 TestDisplayItem(first, backgroundDrawingType),
684 TestDisplayItem(third, backgroundDrawingType)); 744 TestDisplayItem(third, backgroundDrawingType));
685 } 745 }
686 746
687 } // namespace blink 747 } // namespace blink
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698