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

Side by Side Diff: cc/tiles/picture_layer_tiling_unittest.cc

Issue 1939963002: cc: Move prepaint region calculations to the tiling set. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Created 4 years, 7 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
« no previous file with comments | « cc/tiles/picture_layer_tiling_set_unittest.cc ('k') | cc/tiles/tile_manager_unittest.cc » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 // Copyright 2012 The Chromium Authors. All rights reserved. 1 // Copyright 2012 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 "cc/tiles/picture_layer_tiling.h" 5 #include "cc/tiles/picture_layer_tiling.h"
6 6
7 #include <stddef.h> 7 #include <stddef.h>
8 8
9 #include <limits> 9 #include <limits>
10 #include <set> 10 #include <set>
(...skipping 37 matching lines...) Expand 10 before | Expand all | Expand 10 after
48 static std::unique_ptr<TestablePictureLayerTiling> Create( 48 static std::unique_ptr<TestablePictureLayerTiling> Create(
49 WhichTree tree, 49 WhichTree tree,
50 float contents_scale, 50 float contents_scale,
51 scoped_refptr<RasterSource> raster_source, 51 scoped_refptr<RasterSource> raster_source,
52 PictureLayerTilingClient* client, 52 PictureLayerTilingClient* client,
53 const LayerTreeSettings& settings) { 53 const LayerTreeSettings& settings) {
54 return base::WrapUnique(new TestablePictureLayerTiling( 54 return base::WrapUnique(new TestablePictureLayerTiling(
55 tree, contents_scale, raster_source, client, 55 tree, contents_scale, raster_source, client,
56 settings.tiling_interest_area_padding, 56 settings.tiling_interest_area_padding,
57 settings.skewport_target_time_in_seconds, 57 settings.skewport_target_time_in_seconds,
58 settings.skewport_extrapolation_limit_in_content_pixels)); 58 settings.skewport_extrapolation_limit_in_screen_pixels));
59 } 59 }
60 60
61 gfx::Rect live_tiles_rect() const { return live_tiles_rect_; } 61 gfx::Rect live_tiles_rect() const { return live_tiles_rect_; }
62 62
63 using PictureLayerTiling::ComputeSkewport;
64 using PictureLayerTiling::RemoveTileAt; 63 using PictureLayerTiling::RemoveTileAt;
65 using PictureLayerTiling::RemoveTilesInRegion; 64 using PictureLayerTiling::RemoveTilesInRegion;
66 65
67 protected: 66 protected:
68 TestablePictureLayerTiling(WhichTree tree, 67 TestablePictureLayerTiling(WhichTree tree,
69 float contents_scale, 68 float contents_scale,
70 scoped_refptr<RasterSource> raster_source, 69 scoped_refptr<RasterSource> raster_source,
71 PictureLayerTilingClient* client, 70 PictureLayerTilingClient* client,
72 size_t tiling_interest_area_padding, 71 size_t tiling_interest_area_padding,
73 float skewport_target_time, 72 float skewport_target_time,
74 int skewport_extrapolation_limit) 73 int skewport_extrapolation_limit)
75 : PictureLayerTiling(tree, 74 : PictureLayerTiling(tree, contents_scale, raster_source, client) {}
76 contents_scale,
77 raster_source,
78 client,
79 tiling_interest_area_padding,
80 skewport_target_time,
81 skewport_extrapolation_limit) {}
82 }; 75 };
83 76
84 class PictureLayerTilingIteratorTest : public testing::Test { 77 class PictureLayerTilingIteratorTest : public testing::Test {
85 public: 78 public:
86 PictureLayerTilingIteratorTest() {} 79 PictureLayerTilingIteratorTest() {}
87 ~PictureLayerTilingIteratorTest() override {} 80 ~PictureLayerTilingIteratorTest() override {}
88 81
89 void Initialize(const gfx::Size& tile_size, 82 void Initialize(const gfx::Size& tile_size,
90 float contents_scale, 83 float contents_scale,
91 const gfx::Size& layer_bounds) { 84 const gfx::Size& layer_bounds) {
(...skipping 514 matching lines...) Expand 10 before | Expand all | Expand 10 after
606 VerifyTilesCoverNonContainedRect(1.0f, gfx::Rect(-1000, -1000, 2000, 2000)); 599 VerifyTilesCoverNonContainedRect(1.0f, gfx::Rect(-1000, -1000, 2000, 2000));
607 VerifyTilesCoverNonContainedRect(1.5f, gfx::Rect(-1000, -1000, 2000, 2000)); 600 VerifyTilesCoverNonContainedRect(1.5f, gfx::Rect(-1000, -1000, 2000, 2000));
608 VerifyTilesCoverNonContainedRect(0.5f, gfx::Rect(-1000, -1000, 2000, 2000)); 601 VerifyTilesCoverNonContainedRect(0.5f, gfx::Rect(-1000, -1000, 2000, 2000));
609 602
610 // Partially covering content, but too large 603 // Partially covering content, but too large
611 VerifyTilesCoverNonContainedRect(1.0f, gfx::Rect(-1000, 100, 2000, 100)); 604 VerifyTilesCoverNonContainedRect(1.0f, gfx::Rect(-1000, 100, 2000, 100));
612 VerifyTilesCoverNonContainedRect(1.5f, gfx::Rect(-1000, 100, 2000, 100)); 605 VerifyTilesCoverNonContainedRect(1.5f, gfx::Rect(-1000, 100, 2000, 100));
613 VerifyTilesCoverNonContainedRect(0.5f, gfx::Rect(-1000, 100, 2000, 100)); 606 VerifyTilesCoverNonContainedRect(0.5f, gfx::Rect(-1000, 100, 2000, 100));
614 } 607 }
615 608
616 TEST(PictureLayerTilingTest, SkewportLimits) {
617 FakePictureLayerTilingClient client;
618
619 gfx::Rect viewport(0, 0, 100, 100);
620 gfx::Size layer_bounds(200, 200);
621
622 client.SetTileSize(gfx::Size(100, 100));
623 LayerTreeSettings settings;
624 settings.skewport_extrapolation_limit_in_content_pixels = 75;
625
626 scoped_refptr<FakeRasterSource> raster_source =
627 FakeRasterSource::CreateFilled(layer_bounds);
628 std::unique_ptr<TestablePictureLayerTiling> tiling =
629 TestablePictureLayerTiling::Create(ACTIVE_TREE, 1.0f, raster_source,
630 &client, settings);
631
632 tiling->ComputeTilePriorityRects(viewport, 1.f, 1.0, Occlusion());
633
634 // Move viewport down 50 pixels in 0.5 seconds.
635 gfx::Rect down_skewport =
636 tiling->ComputeSkewport(1.5, gfx::Rect(0, 50, 100, 100));
637
638 EXPECT_EQ(0, down_skewport.x());
639 EXPECT_EQ(50, down_skewport.y());
640 EXPECT_EQ(100, down_skewport.width());
641 EXPECT_EQ(175, down_skewport.height());
642 EXPECT_TRUE(down_skewport.Contains(gfx::Rect(0, 50, 100, 100)));
643
644 // Move viewport down 50 and right 10 pixels.
645 gfx::Rect down_right_skewport =
646 tiling->ComputeSkewport(1.5, gfx::Rect(10, 50, 100, 100));
647
648 EXPECT_EQ(10, down_right_skewport.x());
649 EXPECT_EQ(50, down_right_skewport.y());
650 EXPECT_EQ(120, down_right_skewport.width());
651 EXPECT_EQ(175, down_right_skewport.height());
652 EXPECT_TRUE(down_right_skewport.Contains(gfx::Rect(10, 50, 100, 100)));
653
654 // Move viewport left.
655 gfx::Rect left_skewport =
656 tiling->ComputeSkewport(1.5, gfx::Rect(-50, 0, 100, 100));
657
658 EXPECT_EQ(-125, left_skewport.x());
659 EXPECT_EQ(0, left_skewport.y());
660 EXPECT_EQ(175, left_skewport.width());
661 EXPECT_EQ(100, left_skewport.height());
662 EXPECT_TRUE(left_skewport.Contains(gfx::Rect(-50, 0, 100, 100)));
663
664 // Expand viewport.
665 gfx::Rect expand_skewport =
666 tiling->ComputeSkewport(1.5, gfx::Rect(-50, -50, 200, 200));
667
668 // x and y moved by -75 (-50 - 75 = -125).
669 // right side and bottom side moved by 75 [(350 - 125) - (200 - 50) = 75].
670 EXPECT_EQ(-125, expand_skewport.x());
671 EXPECT_EQ(-125, expand_skewport.y());
672 EXPECT_EQ(350, expand_skewport.width());
673 EXPECT_EQ(350, expand_skewport.height());
674 EXPECT_TRUE(expand_skewport.Contains(gfx::Rect(-50, -50, 200, 200)));
675
676 // Expand the viewport past the limit in all directions.
677 gfx::Rect big_expand_skewport =
678 tiling->ComputeSkewport(1.5, gfx::Rect(-500, -500, 1500, 1500));
679
680 EXPECT_EQ(-575, big_expand_skewport.x());
681 EXPECT_EQ(-575, big_expand_skewport.y());
682 EXPECT_EQ(1650, big_expand_skewport.width());
683 EXPECT_EQ(1650, big_expand_skewport.height());
684 EXPECT_TRUE(big_expand_skewport.Contains(gfx::Rect(-500, -500, 1500, 1500)));
685
686 // Shrink the skewport in all directions.
687 gfx::Rect shrink_viewport =
688 tiling->ComputeSkewport(1.5, gfx::Rect(0, 0, 100, 100));
689 EXPECT_EQ(0, shrink_viewport.x());
690 EXPECT_EQ(0, shrink_viewport.y());
691 EXPECT_EQ(100, shrink_viewport.width());
692 EXPECT_EQ(100, shrink_viewport.height());
693
694 // Move the skewport really far in one direction.
695 gfx::Rect move_skewport_far =
696 tiling->ComputeSkewport(1.5, gfx::Rect(0, 5000, 100, 100));
697 EXPECT_EQ(0, move_skewport_far.x());
698 EXPECT_EQ(5000, move_skewport_far.y());
699 EXPECT_EQ(100, move_skewport_far.width());
700 EXPECT_EQ(175, move_skewport_far.height());
701 EXPECT_TRUE(move_skewport_far.Contains(gfx::Rect(0, 5000, 100, 100)));
702 }
703
704 TEST(PictureLayerTilingTest, ComputeSkewportExtremeCases) {
705 FakePictureLayerTilingClient client;
706
707 gfx::Size layer_bounds(200, 200);
708 client.SetTileSize(gfx::Size(100, 100));
709 LayerTreeSettings settings;
710 scoped_refptr<FakeRasterSource> raster_source =
711 FakeRasterSource::CreateFilled(layer_bounds);
712 std::unique_ptr<TestablePictureLayerTiling> tiling =
713 TestablePictureLayerTiling::Create(ACTIVE_TREE, 1.0f, raster_source,
714 &client, settings);
715
716 gfx::Rect viewport1(-1918, 255860, 4010, 2356);
717 gfx::Rect viewport2(-7088, -91738, 14212, 8350);
718 gfx::Rect viewport3(-12730024, -158883296, 24607540, 14454512);
719 double time = 1.0;
720 tiling->ComputeTilePriorityRects(viewport1, 1.f, time, Occlusion());
721 time += 0.016;
722 EXPECT_TRUE(tiling->ComputeSkewport(time, viewport2).Contains(viewport2));
723 tiling->ComputeTilePriorityRects(viewport2, 1.f, time, Occlusion());
724 time += 0.016;
725 EXPECT_TRUE(tiling->ComputeSkewport(time, viewport3).Contains(viewport3));
726
727 // Use a tiling with a large scale, so the viewport times the scale no longer
728 // fits into integers, and the viewport is not anywhere close to the tiling.
729 tiling = TestablePictureLayerTiling::Create(ACTIVE_TREE, 1000.0f,
730 raster_source, &client, settings);
731 tiling->ComputeTilePriorityRects(viewport3, 1.f, time, Occlusion());
732 EXPECT_EQ(gfx::Rect(), tiling->GetCurrentVisibleRectForTesting());
733 }
734
735 TEST(PictureLayerTilingTest, ComputeSkewport) {
736 FakePictureLayerTilingClient client;
737
738 gfx::Rect viewport(0, 0, 100, 100);
739 gfx::Size layer_bounds(200, 200);
740
741 client.SetTileSize(gfx::Size(100, 100));
742
743 scoped_refptr<FakeRasterSource> raster_source =
744 FakeRasterSource::CreateFilled(layer_bounds);
745 std::unique_ptr<TestablePictureLayerTiling> tiling =
746 TestablePictureLayerTiling::Create(ACTIVE_TREE, 1.0f, raster_source,
747 &client, LayerTreeSettings());
748
749 tiling->ComputeTilePriorityRects(viewport, 1.f, 1.0, Occlusion());
750
751 // Move viewport down 50 pixels in 0.5 seconds.
752 gfx::Rect down_skewport =
753 tiling->ComputeSkewport(1.5, gfx::Rect(0, 50, 100, 100));
754
755 EXPECT_EQ(0, down_skewport.x());
756 EXPECT_EQ(50, down_skewport.y());
757 EXPECT_EQ(100, down_skewport.width());
758 EXPECT_EQ(200, down_skewport.height());
759
760 // Shrink viewport.
761 gfx::Rect shrink_skewport =
762 tiling->ComputeSkewport(1.5, gfx::Rect(25, 25, 50, 50));
763
764 EXPECT_EQ(25, shrink_skewport.x());
765 EXPECT_EQ(25, shrink_skewport.y());
766 EXPECT_EQ(50, shrink_skewport.width());
767 EXPECT_EQ(50, shrink_skewport.height());
768
769 // Move viewport down 50 and right 10 pixels.
770 gfx::Rect down_right_skewport =
771 tiling->ComputeSkewport(1.5, gfx::Rect(10, 50, 100, 100));
772
773 EXPECT_EQ(10, down_right_skewport.x());
774 EXPECT_EQ(50, down_right_skewport.y());
775 EXPECT_EQ(120, down_right_skewport.width());
776 EXPECT_EQ(200, down_right_skewport.height());
777
778 // Move viewport left.
779 gfx::Rect left_skewport =
780 tiling->ComputeSkewport(1.5, gfx::Rect(-20, 0, 100, 100));
781
782 EXPECT_EQ(-60, left_skewport.x());
783 EXPECT_EQ(0, left_skewport.y());
784 EXPECT_EQ(140, left_skewport.width());
785 EXPECT_EQ(100, left_skewport.height());
786
787 // Expand viewport in 0.2 seconds.
788 gfx::Rect expanded_skewport =
789 tiling->ComputeSkewport(1.2, gfx::Rect(-5, -5, 110, 110));
790
791 EXPECT_EQ(-30, expanded_skewport.x());
792 EXPECT_EQ(-30, expanded_skewport.y());
793 EXPECT_EQ(160, expanded_skewport.width());
794 EXPECT_EQ(160, expanded_skewport.height());
795 }
796
797 TEST(PictureLayerTilingTest, SkewportThroughUpdateTilePriorities) {
798 FakePictureLayerTilingClient client;
799
800 gfx::Rect viewport(0, 0, 100, 100);
801 gfx::Size layer_bounds(200, 200);
802
803 client.SetTileSize(gfx::Size(100, 100));
804
805 scoped_refptr<FakeRasterSource> raster_source =
806 FakeRasterSource::CreateFilled(layer_bounds);
807 std::unique_ptr<TestablePictureLayerTiling> tiling =
808 TestablePictureLayerTiling::Create(ACTIVE_TREE, 1.0f, raster_source,
809 &client, LayerTreeSettings());
810
811 tiling->ComputeTilePriorityRects(viewport, 1.f, 1.0, Occlusion());
812
813 // Move viewport down 50 pixels in 0.5 seconds.
814 gfx::Rect viewport_50 = gfx::Rect(0, 50, 100, 100);
815 gfx::Rect skewport_50 = tiling->ComputeSkewport(1.5, viewport_50);
816
817 EXPECT_EQ(gfx::Rect(0, 50, 100, 200), skewport_50);
818 tiling->ComputeTilePriorityRects(viewport_50, 1.f, 1.5, Occlusion());
819
820 gfx::Rect viewport_100 = gfx::Rect(0, 100, 100, 100);
821 gfx::Rect skewport_100 = tiling->ComputeSkewport(2.0, viewport_100);
822
823 EXPECT_EQ(gfx::Rect(0, 100, 100, 200), skewport_100);
824 tiling->ComputeTilePriorityRects(viewport_100, 1.f, 2.0, Occlusion());
825
826 // Advance time, but not the viewport.
827 gfx::Rect result = tiling->ComputeSkewport(2.5, viewport_100);
828 // Since the history did advance, we should still get a skewport but a smaller
829 // one.
830 EXPECT_EQ(gfx::Rect(0, 100, 100, 150), result);
831 tiling->ComputeTilePriorityRects(viewport_100, 1.f, 2.5, Occlusion());
832
833 // Advance time again.
834 result = tiling->ComputeSkewport(3.0, viewport_100);
835 EXPECT_EQ(viewport_100, result);
836 tiling->ComputeTilePriorityRects(viewport_100, 1.f, 3.0, Occlusion());
837
838 // Ensure we have a skewport.
839 gfx::Rect viewport_150 = gfx::Rect(0, 150, 100, 100);
840 gfx::Rect skewport_150 = tiling->ComputeSkewport(3.5, viewport_150);
841 EXPECT_EQ(gfx::Rect(0, 150, 100, 150), skewport_150);
842 tiling->ComputeTilePriorityRects(viewport_150, 1.f, 3.5, Occlusion());
843
844 // Advance the viewport, but not the time.
845 gfx::Rect viewport_200 = gfx::Rect(0, 200, 100, 100);
846 gfx::Rect skewport_200 = tiling->ComputeSkewport(3.5, viewport_200);
847 EXPECT_EQ(gfx::Rect(0, 200, 100, 300), skewport_200);
848
849 // Ensure that continued calls with the same value, produce the same skewport.
850 tiling->ComputeTilePriorityRects(viewport_150, 1.f, 3.5, Occlusion());
851 EXPECT_EQ(gfx::Rect(0, 200, 100, 300), skewport_200);
852 tiling->ComputeTilePriorityRects(viewport_150, 1.f, 3.5, Occlusion());
853 EXPECT_EQ(gfx::Rect(0, 200, 100, 300), skewport_200);
854
855 tiling->ComputeTilePriorityRects(viewport_200, 1.f, 3.5, Occlusion());
856
857 // This should never happen, but advance the viewport yet again keeping the
858 // time the same.
859 gfx::Rect viewport_250 = gfx::Rect(0, 250, 100, 100);
860 gfx::Rect skewport_250 = tiling->ComputeSkewport(3.5, viewport_250);
861 EXPECT_EQ(viewport_250, skewport_250);
862 tiling->ComputeTilePriorityRects(viewport_250, 1.f, 3.5, Occlusion());
863 }
864
865 TEST(PictureLayerTilingTest, ViewportDistanceWithScale) {
866 FakePictureLayerTilingClient client;
867
868 gfx::Rect viewport(0, 0, 100, 100);
869 gfx::Size layer_bounds(1500, 1500);
870
871 client.SetTileSize(gfx::Size(10, 10));
872 LayerTreeSettings settings;
873
874 // Tiling at 0.25 scale: this should create 47x47 tiles of size 10x10.
875 // The reason is that each tile has a one pixel border, so tile at (1, 2)
876 // for instance begins at (8, 16) pixels. So tile at (46, 46) will begin at
877 // (368, 368) and extend to the end of 1500 * 0.25 = 375 edge of the
878 // tiling.
879 scoped_refptr<FakeRasterSource> raster_source =
880 FakeRasterSource::CreateFilled(layer_bounds);
881 std::unique_ptr<TestablePictureLayerTiling> tiling =
882 TestablePictureLayerTiling::Create(ACTIVE_TREE, 0.25f, raster_source,
883 &client, settings);
884 tiling->set_resolution(HIGH_RESOLUTION);
885 gfx::Rect viewport_in_content_space =
886 gfx::ScaleToEnclosedRect(viewport, 0.25f);
887
888 tiling->ComputeTilePriorityRects(viewport, 1.f, 1.0, Occlusion());
889 auto prioritized_tiles = tiling->UpdateAndGetAllPrioritizedTilesForTesting();
890
891 // Compute the soon border.
892 float inset = PictureLayerTiling::CalculateSoonBorderDistance(
893 viewport_in_content_space, 1.0f / 0.25f);
894 gfx::Rect soon_rect_in_content_space = viewport_in_content_space;
895 soon_rect_in_content_space.Inset(-inset, -inset);
896
897 // Sanity checks.
898 for (int i = 0; i < 47; ++i) {
899 for (int j = 0; j < 47; ++j) {
900 EXPECT_TRUE(tiling->TileAt(i, j)) << "i: " << i << " j: " << j;
901 }
902 }
903 for (int i = 0; i < 47; ++i) {
904 EXPECT_FALSE(tiling->TileAt(i, 47)) << "i: " << i;
905 EXPECT_FALSE(tiling->TileAt(47, i)) << "i: " << i;
906 }
907
908 // No movement in the viewport implies that tiles will either be NOW
909 // or EVENTUALLY, with the exception of tiles that are between 0 and 312
910 // pixels away from the viewport, which will be in the SOON bin.
911 bool have_now = false;
912 bool have_eventually = false;
913 bool have_soon = false;
914 for (int i = 0; i < 47; ++i) {
915 for (int j = 0; j < 47; ++j) {
916 Tile* tile = tiling->TileAt(i, j);
917 PrioritizedTile prioritized_tile = prioritized_tiles[tile];
918 TilePriority priority = prioritized_tile.priority();
919
920 gfx::Rect tile_rect = tiling->TilingDataForTesting().TileBounds(i, j);
921 if (viewport_in_content_space.Intersects(tile_rect)) {
922 EXPECT_EQ(TilePriority::NOW, priority.priority_bin);
923 EXPECT_FLOAT_EQ(0.f, priority.distance_to_visible);
924 have_now = true;
925 } else if (soon_rect_in_content_space.Intersects(tile_rect)) {
926 EXPECT_EQ(TilePriority::SOON, priority.priority_bin);
927 have_soon = true;
928 } else {
929 EXPECT_EQ(TilePriority::EVENTUALLY, priority.priority_bin);
930 EXPECT_GT(priority.distance_to_visible, 0.f);
931 have_eventually = true;
932 }
933 }
934 }
935
936 EXPECT_TRUE(have_now);
937 EXPECT_TRUE(have_soon);
938 EXPECT_TRUE(have_eventually);
939
940 // Spot check some distances.
941 // Tile at 5, 1 should begin at 41x9 in content space (without borders),
942 // so the distance to a viewport that ends at 25x25 in content space
943 // should be 17 (41 - 25 + 1). In layer space, then that should be
944 // 17 / 0.25 = 68 pixels.
945
946 // We can verify that the content rect (with borders) is one pixel off
947 // 41,9 8x8 on all sides.
948 EXPECT_EQ(tiling->TileAt(5, 1)->content_rect().ToString(), "40,8 10x10");
949
950 TilePriority priority = prioritized_tiles[tiling->TileAt(5, 1)].priority();
951 EXPECT_FLOAT_EQ(68.f, priority.distance_to_visible);
952
953 priority = prioritized_tiles[tiling->TileAt(2, 5)].priority();
954 EXPECT_FLOAT_EQ(68.f, priority.distance_to_visible);
955
956 priority = prioritized_tiles[tiling->TileAt(3, 4)].priority();
957 EXPECT_FLOAT_EQ(40.f, priority.distance_to_visible);
958
959 // Move the viewport down 40 pixels.
960 viewport = gfx::Rect(0, 40, 100, 100);
961 viewport_in_content_space = gfx::ScaleToEnclosedRect(viewport, 0.25f);
962 gfx::Rect skewport = tiling->ComputeSkewport(2.0, viewport_in_content_space);
963
964 // Compute the soon border.
965 inset = PictureLayerTiling::CalculateSoonBorderDistance(
966 viewport_in_content_space, 1.0f / 0.25f);
967 soon_rect_in_content_space = viewport_in_content_space;
968 soon_rect_in_content_space.Inset(-inset, -inset);
969
970 EXPECT_EQ(0, skewport.x());
971 EXPECT_EQ(10, skewport.y());
972 EXPECT_EQ(25, skewport.width());
973 EXPECT_EQ(35, skewport.height());
974
975 tiling->ComputeTilePriorityRects(viewport, 1.f, 2.0, Occlusion());
976 prioritized_tiles = tiling->UpdateAndGetAllPrioritizedTilesForTesting();
977
978 have_now = false;
979 have_eventually = false;
980 have_soon = false;
981
982 // Viewport moved, so we expect to find some NOW tiles, some SOON tiles and
983 // some EVENTUALLY tiles.
984 for (int i = 0; i < 47; ++i) {
985 for (int j = 0; j < 47; ++j) {
986 Tile* tile = tiling->TileAt(i, j);
987 TilePriority priority = prioritized_tiles[tile].priority();
988
989 gfx::Rect tile_rect = tiling->TilingDataForTesting().TileBounds(i, j);
990 if (viewport_in_content_space.Intersects(tile_rect)) {
991 EXPECT_EQ(TilePriority::NOW, priority.priority_bin) << "i: " << i
992 << " j: " << j;
993 EXPECT_FLOAT_EQ(0.f, priority.distance_to_visible) << "i: " << i
994 << " j: " << j;
995 have_now = true;
996 } else if (skewport.Intersects(tile_rect) ||
997 soon_rect_in_content_space.Intersects(tile_rect)) {
998 EXPECT_EQ(TilePriority::SOON, priority.priority_bin) << "i: " << i
999 << " j: " << j;
1000 EXPECT_GT(priority.distance_to_visible, 0.f) << "i: " << i
1001 << " j: " << j;
1002 have_soon = true;
1003 } else {
1004 EXPECT_EQ(TilePriority::EVENTUALLY, priority.priority_bin)
1005 << "i: " << i << " j: " << j;
1006 EXPECT_GT(priority.distance_to_visible, 0.f) << "i: " << i
1007 << " j: " << j;
1008 have_eventually = true;
1009 }
1010 }
1011 }
1012
1013 EXPECT_TRUE(have_now);
1014 EXPECT_TRUE(have_soon);
1015 EXPECT_TRUE(have_eventually);
1016
1017 priority = prioritized_tiles[tiling->TileAt(5, 1)].priority();
1018 EXPECT_FLOAT_EQ(68.f, priority.distance_to_visible);
1019
1020 priority = prioritized_tiles[tiling->TileAt(2, 5)].priority();
1021 EXPECT_FLOAT_EQ(28.f, priority.distance_to_visible);
1022
1023 priority = prioritized_tiles[tiling->TileAt(3, 4)].priority();
1024 EXPECT_FLOAT_EQ(4.f, priority.distance_to_visible);
1025
1026 // Change the underlying layer scale.
1027 tiling->ComputeTilePriorityRects(viewport, 2.0f, 3.0, Occlusion());
1028 prioritized_tiles = tiling->UpdateAndGetAllPrioritizedTilesForTesting();
1029
1030 priority = prioritized_tiles[tiling->TileAt(5, 1)].priority();
1031 EXPECT_FLOAT_EQ(136.f, priority.distance_to_visible);
1032
1033 priority = prioritized_tiles[tiling->TileAt(2, 5)].priority();
1034 EXPECT_FLOAT_EQ(56.f, priority.distance_to_visible);
1035
1036 priority = prioritized_tiles[tiling->TileAt(3, 4)].priority();
1037 EXPECT_FLOAT_EQ(8.f, priority.distance_to_visible);
1038
1039 // Test additional scales.
1040 tiling = TestablePictureLayerTiling::Create(ACTIVE_TREE, 0.2f, raster_source,
1041 &client, LayerTreeSettings());
1042 tiling->set_resolution(HIGH_RESOLUTION);
1043 tiling->ComputeTilePriorityRects(viewport, 1.0f, 4.0, Occlusion());
1044 prioritized_tiles = tiling->UpdateAndGetAllPrioritizedTilesForTesting();
1045
1046 priority = prioritized_tiles[tiling->TileAt(5, 1)].priority();
1047 EXPECT_FLOAT_EQ(110.f, priority.distance_to_visible);
1048
1049 priority = prioritized_tiles[tiling->TileAt(2, 5)].priority();
1050 EXPECT_FLOAT_EQ(70.f, priority.distance_to_visible);
1051
1052 priority = prioritized_tiles[tiling->TileAt(3, 4)].priority();
1053 EXPECT_FLOAT_EQ(60.f, priority.distance_to_visible);
1054
1055 tiling->ComputeTilePriorityRects(viewport, 0.5f, 5.0, Occlusion());
1056 prioritized_tiles = tiling->UpdateAndGetAllPrioritizedTilesForTesting();
1057
1058 priority = prioritized_tiles[tiling->TileAt(5, 1)].priority();
1059 EXPECT_FLOAT_EQ(55.f, priority.distance_to_visible);
1060
1061 priority = prioritized_tiles[tiling->TileAt(2, 5)].priority();
1062 EXPECT_FLOAT_EQ(35.f, priority.distance_to_visible);
1063
1064 priority = prioritized_tiles[tiling->TileAt(3, 4)].priority();
1065 EXPECT_FLOAT_EQ(30.f, priority.distance_to_visible);
1066 }
1067
1068 static void TileExists(bool exists, Tile* tile, 609 static void TileExists(bool exists, Tile* tile,
1069 const gfx::Rect& geometry_rect) { 610 const gfx::Rect& geometry_rect) {
1070 EXPECT_EQ(exists, tile != NULL) << geometry_rect.ToString(); 611 EXPECT_EQ(exists, tile != NULL) << geometry_rect.ToString();
1071 } 612 }
1072 613
1073 TEST_F(PictureLayerTilingIteratorTest, TilesExist) { 614 TEST_F(PictureLayerTilingIteratorTest, TilesExist) {
1074 gfx::Size layer_bounds(1099, 801); 615 gfx::Size layer_bounds(1099, 801);
1075 Initialize(gfx::Size(100, 100), 1.f, layer_bounds); 616 Initialize(gfx::Size(100, 100), 1.f, layer_bounds);
1076 VerifyTilesExactlyCoverRect(1.f, gfx::Rect(layer_bounds)); 617 VerifyTilesExactlyCoverRect(1.f, gfx::Rect(layer_bounds));
1077 VerifyTiles(1.f, gfx::Rect(layer_bounds), base::Bind(&TileExists, false)); 618 VerifyTiles(1.f, gfx::Rect(layer_bounds), base::Bind(&TileExists, false));
1078 619
1079 tiling_->ComputeTilePriorityRects( 620 tiling_->ComputeTilePriorityRects(
1080 gfx::Rect(layer_bounds), // visible content rect 621 gfx::Rect(layer_bounds), // visible rect
622 gfx::Rect(layer_bounds), // skewport
623 gfx::Rect(layer_bounds), // soon border rect
624 gfx::Rect(layer_bounds), // eventually rect
1081 1.f, // current contents scale 625 1.f, // current contents scale
1082 1.0, // current frame time
1083 Occlusion()); 626 Occlusion());
1084 VerifyTiles(1.f, gfx::Rect(layer_bounds), base::Bind(&TileExists, true)); 627 VerifyTiles(1.f, gfx::Rect(layer_bounds), base::Bind(&TileExists, true));
1085 628
1086 // Make the viewport rect empty. All tiles are killed and become zombies. 629 // Make the viewport rect empty. All tiles are killed and become zombies.
1087 tiling_->ComputeTilePriorityRects(gfx::Rect(), // visible content rect 630 tiling_->ComputeTilePriorityRects(gfx::Rect(), gfx::Rect(), gfx::Rect(),
1088 1.f, // current contents scale 631 gfx::Rect(), 1.f, Occlusion());
1089 2.0, // current frame time
1090 Occlusion());
1091 VerifyTiles(1.f, gfx::Rect(layer_bounds), base::Bind(&TileExists, false)); 632 VerifyTiles(1.f, gfx::Rect(layer_bounds), base::Bind(&TileExists, false));
1092 } 633 }
1093 634
1094 TEST_F(PictureLayerTilingIteratorTest, TilesExistGiantViewport) { 635 TEST_F(PictureLayerTilingIteratorTest, TilesExistGiantViewport) {
1095 gfx::Size layer_bounds(1099, 801); 636 gfx::Size layer_bounds(1099, 801);
1096 Initialize(gfx::Size(100, 100), 1.f, layer_bounds); 637 Initialize(gfx::Size(100, 100), 1.f, layer_bounds);
1097 VerifyTilesExactlyCoverRect(1.f, gfx::Rect(layer_bounds)); 638 VerifyTilesExactlyCoverRect(1.f, gfx::Rect(layer_bounds));
1098 VerifyTiles(1.f, gfx::Rect(layer_bounds), base::Bind(&TileExists, false)); 639 VerifyTiles(1.f, gfx::Rect(layer_bounds), base::Bind(&TileExists, false));
1099 640
1100 gfx::Rect giant_rect(-10000000, -10000000, 1000000000, 1000000000); 641 gfx::Rect giant_rect(-10000000, -10000000, 1000000000, 1000000000);
1101 642
1102 tiling_->ComputeTilePriorityRects( 643 tiling_->ComputeTilePriorityRects(
1103 gfx::Rect(layer_bounds), // visible content rect 644 gfx::Rect(layer_bounds), // visible rect
645 gfx::Rect(layer_bounds), // skewport
646 gfx::Rect(layer_bounds), // soon border rect
647 gfx::Rect(layer_bounds), // eventually rect
1104 1.f, // current contents scale 648 1.f, // current contents scale
1105 1.0, // current frame time
1106 Occlusion()); 649 Occlusion());
1107 VerifyTiles(1.f, gfx::Rect(layer_bounds), base::Bind(&TileExists, true)); 650 VerifyTiles(1.f, gfx::Rect(layer_bounds), base::Bind(&TileExists, true));
1108 651
1109 // If the visible content rect is empty, it should still have live tiles. 652 // If the visible content rect is huge, we should still have live tiles.
1110 tiling_->ComputeTilePriorityRects(giant_rect, // visible content rect 653 tiling_->ComputeTilePriorityRects(giant_rect, giant_rect, giant_rect,
1111 1.f, // current contents scale 654 giant_rect, 1.f, Occlusion());
1112 2.0, // current frame time
1113 Occlusion());
1114 VerifyTiles(1.f, gfx::Rect(layer_bounds), base::Bind(&TileExists, true)); 655 VerifyTiles(1.f, gfx::Rect(layer_bounds), base::Bind(&TileExists, true));
1115 } 656 }
1116 657
1117 TEST_F(PictureLayerTilingIteratorTest, TilesExistOutsideViewport) { 658 TEST_F(PictureLayerTilingIteratorTest, TilesExistOutsideViewport) {
1118 gfx::Size layer_bounds(1099, 801); 659 gfx::Size layer_bounds(1099, 801);
1119 Initialize(gfx::Size(100, 100), 1.f, layer_bounds); 660 Initialize(gfx::Size(100, 100), 1.f, layer_bounds);
1120 VerifyTilesExactlyCoverRect(1.f, gfx::Rect(layer_bounds)); 661 VerifyTilesExactlyCoverRect(1.f, gfx::Rect(layer_bounds));
1121 VerifyTiles(1.f, gfx::Rect(layer_bounds), base::Bind(&TileExists, false)); 662 VerifyTiles(1.f, gfx::Rect(layer_bounds), base::Bind(&TileExists, false));
1122 663
1123 // This rect does not intersect with the layer, as the layer is outside the 664 // This rect does not intersect with the layer, as the layer is outside the
1124 // viewport. 665 // viewport.
1125 gfx::Rect viewport_rect(1100, 0, 1000, 1000); 666 gfx::Rect viewport_rect(1100, 0, 1000, 1000);
1126 EXPECT_FALSE(viewport_rect.Intersects(gfx::Rect(layer_bounds))); 667 EXPECT_FALSE(viewport_rect.Intersects(gfx::Rect(layer_bounds)));
1127 668
1128 tiling_->ComputeTilePriorityRects(viewport_rect, // visible content rect 669 LayerTreeSettings settings;
1129 1.f, // current contents scale 670 gfx::Rect eventually_rect = viewport_rect;
1130 1.0, // current frame time 671 eventually_rect.Inset(-settings.tiling_interest_area_padding,
1131 Occlusion()); 672 -settings.tiling_interest_area_padding);
673 tiling_->ComputeTilePriorityRects(viewport_rect, viewport_rect, viewport_rect,
674 eventually_rect, 1.f, Occlusion());
1132 VerifyTiles(1.f, gfx::Rect(layer_bounds), base::Bind(&TileExists, true)); 675 VerifyTiles(1.f, gfx::Rect(layer_bounds), base::Bind(&TileExists, true));
1133 } 676 }
1134 677
1135 static void TilesIntersectingRectExist(const gfx::Rect& rect, 678 static void TilesIntersectingRectExist(const gfx::Rect& rect,
1136 bool intersect_exists, 679 bool intersect_exists,
1137 Tile* tile, 680 Tile* tile,
1138 const gfx::Rect& geometry_rect) { 681 const gfx::Rect& geometry_rect) {
1139 bool intersects = rect.Intersects(geometry_rect); 682 bool intersects = rect.Intersects(geometry_rect);
1140 bool expected_exists = intersect_exists ? intersects : !intersects; 683 bool expected_exists = intersect_exists ? intersects : !intersects;
1141 EXPECT_EQ(expected_exists, tile != NULL) 684 EXPECT_EQ(expected_exists, tile != NULL)
(...skipping 11 matching lines...) Expand all
1153 scoped_refptr<FakeRasterSource> raster_source = 696 scoped_refptr<FakeRasterSource> raster_source =
1154 FakeRasterSource::CreateFilled(layer_bounds); 697 FakeRasterSource::CreateFilled(layer_bounds);
1155 tiling_ = TestablePictureLayerTiling::Create(PENDING_TREE, 1.f, raster_source, 698 tiling_ = TestablePictureLayerTiling::Create(PENDING_TREE, 1.f, raster_source,
1156 &client_, settings); 699 &client_, settings);
1157 tiling_->set_resolution(HIGH_RESOLUTION); 700 tiling_->set_resolution(HIGH_RESOLUTION);
1158 VerifyTilesExactlyCoverRect(1.f, gfx::Rect(layer_bounds)); 701 VerifyTilesExactlyCoverRect(1.f, gfx::Rect(layer_bounds));
1159 VerifyTiles(1.f, gfx::Rect(layer_bounds), base::Bind(&TileExists, false)); 702 VerifyTiles(1.f, gfx::Rect(layer_bounds), base::Bind(&TileExists, false));
1160 703
1161 gfx::Rect visible_rect(8000, 8000, 50, 50); 704 gfx::Rect visible_rect(8000, 8000, 50, 50);
1162 705
1163 tiling_->ComputeTilePriorityRects(visible_rect, // visible content rect 706 tiling_->ComputeTilePriorityRects(visible_rect, // visible rect
707 visible_rect, // skewport
708 visible_rect, // soon border rect
709 visible_rect, // eventually rect
1164 1.f, // current contents scale 710 1.f, // current contents scale
1165 1.0, // current frame time
1166 Occlusion()); 711 Occlusion());
1167 VerifyTiles(1.f, 712 VerifyTiles(1.f,
1168 gfx::Rect(layer_bounds), 713 gfx::Rect(layer_bounds),
1169 base::Bind(&TilesIntersectingRectExist, visible_rect, true)); 714 base::Bind(&TilesIntersectingRectExist, visible_rect, true));
1170 } 715 }
1171 716
1172 TEST(ComputeTilePriorityRectsTest, VisibleTiles) { 717 TEST(ComputeTilePriorityRectsTest, VisibleTiles) {
1173 // The TilePriority of visible tiles should have zero distance_to_visible 718 // The TilePriority of visible tiles should have zero distance_to_visible
1174 // and time_to_visible. 719 // and time_to_visible.
1175 FakePictureLayerTilingClient client; 720 FakePictureLayerTilingClient client;
1176 721
1177 gfx::Size device_viewport(800, 600); 722 gfx::Size device_viewport(800, 600);
1178 gfx::Size last_layer_bounds(200, 200); 723 gfx::Size last_layer_bounds(200, 200);
1179 gfx::Size current_layer_bounds(200, 200); 724 gfx::Size current_layer_bounds(200, 200);
1180 float current_layer_contents_scale = 1.f; 725 float current_layer_contents_scale = 1.f;
1181 gfx::Transform current_screen_transform; 726 gfx::Transform current_screen_transform;
1182 double current_frame_time_in_seconds = 1.0;
1183 727
1184 gfx::Rect viewport_in_layer_space = ViewportInLayerSpace( 728 gfx::Rect viewport_in_layer_space = ViewportInLayerSpace(
1185 current_screen_transform, device_viewport); 729 current_screen_transform, device_viewport);
1186 730
1187 client.SetTileSize(gfx::Size(100, 100)); 731 client.SetTileSize(gfx::Size(100, 100));
1188 732
1189 scoped_refptr<FakeRasterSource> raster_source = 733 scoped_refptr<FakeRasterSource> raster_source =
1190 FakeRasterSource::CreateFilled(current_layer_bounds); 734 FakeRasterSource::CreateFilled(current_layer_bounds);
1191 std::unique_ptr<TestablePictureLayerTiling> tiling = 735 std::unique_ptr<TestablePictureLayerTiling> tiling =
1192 TestablePictureLayerTiling::Create(ACTIVE_TREE, 1.0f, raster_source, 736 TestablePictureLayerTiling::Create(ACTIVE_TREE, 1.0f, raster_source,
1193 &client, LayerTreeSettings()); 737 &client, LayerTreeSettings());
1194 tiling->set_resolution(HIGH_RESOLUTION); 738 tiling->set_resolution(HIGH_RESOLUTION);
1195 739
1196 tiling->ComputeTilePriorityRects(viewport_in_layer_space, 740 LayerTreeSettings settings;
1197 current_layer_contents_scale, 741 gfx::Rect eventually_rect = viewport_in_layer_space;
1198 current_frame_time_in_seconds, Occlusion()); 742 eventually_rect.Inset(-settings.tiling_interest_area_padding,
743 -settings.tiling_interest_area_padding);
744 tiling->ComputeTilePriorityRects(
745 viewport_in_layer_space, viewport_in_layer_space, viewport_in_layer_space,
746 eventually_rect, current_layer_contents_scale, Occlusion());
1199 auto prioritized_tiles = tiling->UpdateAndGetAllPrioritizedTilesForTesting(); 747 auto prioritized_tiles = tiling->UpdateAndGetAllPrioritizedTilesForTesting();
1200 748
1201 ASSERT_TRUE(tiling->TileAt(0, 0)); 749 ASSERT_TRUE(tiling->TileAt(0, 0));
1202 ASSERT_TRUE(tiling->TileAt(0, 1)); 750 ASSERT_TRUE(tiling->TileAt(0, 1));
1203 ASSERT_TRUE(tiling->TileAt(1, 0)); 751 ASSERT_TRUE(tiling->TileAt(1, 0));
1204 ASSERT_TRUE(tiling->TileAt(1, 1)); 752 ASSERT_TRUE(tiling->TileAt(1, 1));
1205 753
1206 TilePriority priority = prioritized_tiles[tiling->TileAt(0, 0)].priority(); 754 TilePriority priority = prioritized_tiles[tiling->TileAt(0, 0)].priority();
1207 EXPECT_FLOAT_EQ(0.f, priority.distance_to_visible); 755 EXPECT_FLOAT_EQ(0.f, priority.distance_to_visible);
1208 EXPECT_FLOAT_EQ(TilePriority::NOW, priority.priority_bin); 756 EXPECT_FLOAT_EQ(TilePriority::NOW, priority.priority_bin);
(...skipping 15 matching lines...) Expand all
1224 // The TilePriority of offscreen tiles (without movement) should have nonzero 772 // The TilePriority of offscreen tiles (without movement) should have nonzero
1225 // distance_to_visible and infinite time_to_visible. 773 // distance_to_visible and infinite time_to_visible.
1226 FakePictureLayerTilingClient client; 774 FakePictureLayerTilingClient client;
1227 775
1228 gfx::Size device_viewport(800, 600); 776 gfx::Size device_viewport(800, 600);
1229 gfx::Size last_layer_bounds(200, 200); 777 gfx::Size last_layer_bounds(200, 200);
1230 gfx::Size current_layer_bounds(200, 200); 778 gfx::Size current_layer_bounds(200, 200);
1231 float current_layer_contents_scale = 1.f; 779 float current_layer_contents_scale = 1.f;
1232 gfx::Transform last_screen_transform; 780 gfx::Transform last_screen_transform;
1233 gfx::Transform current_screen_transform; 781 gfx::Transform current_screen_transform;
1234 double current_frame_time_in_seconds = 1.0;
1235 782
1236 current_screen_transform.Translate(850, 0); 783 current_screen_transform.Translate(850, 0);
1237 last_screen_transform = current_screen_transform; 784 last_screen_transform = current_screen_transform;
1238 785
1239 gfx::Rect viewport_in_layer_space = ViewportInLayerSpace( 786 gfx::Rect viewport_in_layer_space = ViewportInLayerSpace(
1240 current_screen_transform, device_viewport); 787 current_screen_transform, device_viewport);
1241 788
1242 client.SetTileSize(gfx::Size(100, 100)); 789 client.SetTileSize(gfx::Size(100, 100));
1243 790
1244 scoped_refptr<FakeRasterSource> raster_source = 791 scoped_refptr<FakeRasterSource> raster_source =
1245 FakeRasterSource::CreateFilled(current_layer_bounds); 792 FakeRasterSource::CreateFilled(current_layer_bounds);
1246 std::unique_ptr<TestablePictureLayerTiling> tiling = 793 std::unique_ptr<TestablePictureLayerTiling> tiling =
1247 TestablePictureLayerTiling::Create(ACTIVE_TREE, 1.0f, raster_source, 794 TestablePictureLayerTiling::Create(ACTIVE_TREE, 1.0f, raster_source,
1248 &client, LayerTreeSettings()); 795 &client, LayerTreeSettings());
1249 tiling->set_resolution(HIGH_RESOLUTION); 796 tiling->set_resolution(HIGH_RESOLUTION);
1250 797
1251 tiling->ComputeTilePriorityRects(viewport_in_layer_space, 798 LayerTreeSettings settings;
1252 current_layer_contents_scale, 799 gfx::Rect eventually_rect = viewport_in_layer_space;
1253 current_frame_time_in_seconds, Occlusion()); 800 eventually_rect.Inset(-settings.tiling_interest_area_padding,
801 -settings.tiling_interest_area_padding);
802 tiling->ComputeTilePriorityRects(
803 viewport_in_layer_space, viewport_in_layer_space, viewport_in_layer_space,
804 eventually_rect, current_layer_contents_scale, Occlusion());
1254 auto prioritized_tiles = tiling->UpdateAndGetAllPrioritizedTilesForTesting(); 805 auto prioritized_tiles = tiling->UpdateAndGetAllPrioritizedTilesForTesting();
1255 806
1256 ASSERT_TRUE(tiling->TileAt(0, 0)); 807 ASSERT_TRUE(tiling->TileAt(0, 0));
1257 ASSERT_TRUE(tiling->TileAt(0, 1)); 808 ASSERT_TRUE(tiling->TileAt(0, 1));
1258 ASSERT_TRUE(tiling->TileAt(1, 0)); 809 ASSERT_TRUE(tiling->TileAt(1, 0));
1259 ASSERT_TRUE(tiling->TileAt(1, 1)); 810 ASSERT_TRUE(tiling->TileAt(1, 1));
1260 811
1261 TilePriority priority = prioritized_tiles[tiling->TileAt(0, 0)].priority(); 812 TilePriority priority = prioritized_tiles[tiling->TileAt(0, 0)].priority();
1262 EXPECT_GT(priority.distance_to_visible, 0.f); 813 EXPECT_GT(priority.distance_to_visible, 0.f);
1263 EXPECT_NE(TilePriority::NOW, priority.priority_bin); 814 EXPECT_NE(TilePriority::NOW, priority.priority_bin);
(...skipping 25 matching lines...) Expand all
1289 // Sanity check that a layer with some tiles visible and others offscreen has 840 // Sanity check that a layer with some tiles visible and others offscreen has
1290 // correct TilePriorities for each tile. 841 // correct TilePriorities for each tile.
1291 FakePictureLayerTilingClient client; 842 FakePictureLayerTilingClient client;
1292 843
1293 gfx::Size device_viewport(800, 600); 844 gfx::Size device_viewport(800, 600);
1294 gfx::Size last_layer_bounds(200, 200); 845 gfx::Size last_layer_bounds(200, 200);
1295 gfx::Size current_layer_bounds(200, 200); 846 gfx::Size current_layer_bounds(200, 200);
1296 float current_layer_contents_scale = 1.f; 847 float current_layer_contents_scale = 1.f;
1297 gfx::Transform last_screen_transform; 848 gfx::Transform last_screen_transform;
1298 gfx::Transform current_screen_transform; 849 gfx::Transform current_screen_transform;
1299 double current_frame_time_in_seconds = 1.0;
1300 850
1301 current_screen_transform.Translate(705, 505); 851 current_screen_transform.Translate(705, 505);
1302 last_screen_transform = current_screen_transform; 852 last_screen_transform = current_screen_transform;
1303 853
1304 gfx::Rect viewport_in_layer_space = ViewportInLayerSpace( 854 gfx::Rect viewport_in_layer_space = ViewportInLayerSpace(
1305 current_screen_transform, device_viewport); 855 current_screen_transform, device_viewport);
1306 856
1307 client.SetTileSize(gfx::Size(100, 100)); 857 client.SetTileSize(gfx::Size(100, 100));
1308 858
1309 scoped_refptr<FakeRasterSource> raster_source = 859 scoped_refptr<FakeRasterSource> raster_source =
1310 FakeRasterSource::CreateFilled(current_layer_bounds); 860 FakeRasterSource::CreateFilled(current_layer_bounds);
1311 std::unique_ptr<TestablePictureLayerTiling> tiling = 861 std::unique_ptr<TestablePictureLayerTiling> tiling =
1312 TestablePictureLayerTiling::Create(ACTIVE_TREE, 1.0f, raster_source, 862 TestablePictureLayerTiling::Create(ACTIVE_TREE, 1.0f, raster_source,
1313 &client, LayerTreeSettings()); 863 &client, LayerTreeSettings());
1314 tiling->set_resolution(HIGH_RESOLUTION); 864 tiling->set_resolution(HIGH_RESOLUTION);
1315 865
1316 tiling->ComputeTilePriorityRects(viewport_in_layer_space, 866 LayerTreeSettings settings;
1317 current_layer_contents_scale, 867 gfx::Rect eventually_rect = viewport_in_layer_space;
1318 current_frame_time_in_seconds, Occlusion()); 868 eventually_rect.Inset(-settings.tiling_interest_area_padding,
869 -settings.tiling_interest_area_padding);
870 tiling->ComputeTilePriorityRects(
871 viewport_in_layer_space, viewport_in_layer_space, viewport_in_layer_space,
872 eventually_rect, current_layer_contents_scale, Occlusion());
1319 auto prioritized_tiles = tiling->UpdateAndGetAllPrioritizedTilesForTesting(); 873 auto prioritized_tiles = tiling->UpdateAndGetAllPrioritizedTilesForTesting();
1320 874
1321 ASSERT_TRUE(tiling->TileAt(0, 0)); 875 ASSERT_TRUE(tiling->TileAt(0, 0));
1322 ASSERT_TRUE(tiling->TileAt(0, 1));
1323 ASSERT_TRUE(tiling->TileAt(1, 0));
1324 ASSERT_TRUE(tiling->TileAt(1, 1));
1325
1326 TilePriority priority = prioritized_tiles[tiling->TileAt(0, 0)].priority();
1327 EXPECT_FLOAT_EQ(0.f, priority.distance_to_visible);
1328 EXPECT_FLOAT_EQ(TilePriority::NOW, priority.priority_bin);
1329
1330 priority = prioritized_tiles[tiling->TileAt(0, 1)].priority();
1331 EXPECT_GT(priority.distance_to_visible, 0.f);
1332 EXPECT_NE(TilePriority::NOW, priority.priority_bin);
1333
1334 priority = prioritized_tiles[tiling->TileAt(1, 0)].priority();
1335 EXPECT_GT(priority.distance_to_visible, 0.f);
1336 EXPECT_NE(TilePriority::NOW, priority.priority_bin);
1337
1338 priority = prioritized_tiles[tiling->TileAt(1, 1)].priority();
1339 EXPECT_GT(priority.distance_to_visible, 0.f);
1340 EXPECT_NE(TilePriority::NOW, priority.priority_bin);
1341 }
1342
1343 TEST(ComputeTilePriorityRectsTest, PartiallyOffscreenRotatedLayer) {
1344 // Each tile of a layer may be affected differently by a transform; Check
1345 // that ComputeTilePriorityRects correctly accounts for the transform between
1346 // layer space and screen space.
1347 FakePictureLayerTilingClient client;
1348
1349 gfx::Size device_viewport(800, 600);
1350 gfx::Size last_layer_bounds(200, 200);
1351 gfx::Size current_layer_bounds(200, 200);
1352 float current_layer_contents_scale = 1.f;
1353 gfx::Transform last_screen_transform;
1354 gfx::Transform current_screen_transform;
1355 double current_frame_time_in_seconds = 1.0;
1356
1357 // A diagonally rotated layer that is partially off the bottom of the screen.
1358 // In this configuration, only the top-left tile would be visible.
1359 current_screen_transform.Translate(600, 750);
1360 current_screen_transform.RotateAboutZAxis(45);
1361 last_screen_transform = current_screen_transform;
1362
1363 gfx::Rect viewport_in_layer_space = ViewportInLayerSpace(
1364 current_screen_transform, device_viewport);
1365
1366 client.SetTileSize(gfx::Size(100, 100));
1367
1368 scoped_refptr<FakeRasterSource> raster_source =
1369 FakeRasterSource::CreateFilled(current_layer_bounds);
1370 std::unique_ptr<TestablePictureLayerTiling> tiling =
1371 TestablePictureLayerTiling::Create(ACTIVE_TREE, 1.0f, raster_source,
1372 &client, LayerTreeSettings());
1373 tiling->set_resolution(HIGH_RESOLUTION);
1374
1375 tiling->ComputeTilePriorityRects(viewport_in_layer_space,
1376 current_layer_contents_scale,
1377 current_frame_time_in_seconds, Occlusion());
1378 auto prioritized_tiles = tiling->UpdateAndGetAllPrioritizedTilesForTesting();
1379
1380 ASSERT_TRUE(tiling->TileAt(0, 0));
1381 ASSERT_TRUE(tiling->TileAt(0, 1));
1382 ASSERT_TRUE(tiling->TileAt(1, 0));
1383 ASSERT_TRUE(tiling->TileAt(1, 1));
1384
1385 TilePriority priority = prioritized_tiles[tiling->TileAt(0, 0)].priority();
1386 EXPECT_FLOAT_EQ(0.f, priority.distance_to_visible);
1387 EXPECT_EQ(TilePriority::NOW, priority.priority_bin);
1388
1389 priority = prioritized_tiles[tiling->TileAt(0, 1)].priority();
1390 EXPECT_FLOAT_EQ(0.f, priority.distance_to_visible);
1391 EXPECT_EQ(TilePriority::NOW, priority.priority_bin);
1392
1393 priority = prioritized_tiles[tiling->TileAt(1, 0)].priority();
1394 EXPECT_GT(priority.distance_to_visible, 0.f);
1395 EXPECT_NE(TilePriority::NOW, priority.priority_bin);
1396
1397 priority = prioritized_tiles[tiling->TileAt(1, 1)].priority();
1398 EXPECT_GT(priority.distance_to_visible, 0.f);
1399 EXPECT_NE(TilePriority::NOW, priority.priority_bin);
1400
1401 // Furthermore, in this scenario the bottom-right tile should have the larger
1402 // distance to visible.
1403 TilePriority top_left = prioritized_tiles[tiling->TileAt(0, 0)].priority();
1404 TilePriority top_right = prioritized_tiles[tiling->TileAt(1, 0)].priority();
1405 TilePriority bottom_right =
1406 prioritized_tiles[tiling->TileAt(1, 1)].priority();
1407 EXPECT_GT(top_right.distance_to_visible, top_left.distance_to_visible);
1408
1409 EXPECT_EQ(bottom_right.distance_to_visible, top_right.distance_to_visible);
1410 }
1411
1412 TEST(ComputeTilePriorityRectsTest, PerspectiveLayer) {
1413 // Perspective transforms need to take a different code path.
1414 // This test checks tile priorities of a perspective layer.
1415 FakePictureLayerTilingClient client;
1416
1417 gfx::Size device_viewport(800, 600);
1418 gfx::Rect visible_layer_rect(0, 0, 0, 0); // offscreen.
1419 gfx::Size last_layer_bounds(200, 200);
1420 gfx::Size current_layer_bounds(200, 200);
1421 float current_layer_contents_scale = 1.f;
1422 gfx::Transform last_screen_transform;
1423 gfx::Transform current_screen_transform;
1424 double current_frame_time_in_seconds = 1.0;
1425
1426 // A 3d perspective layer rotated about its Y axis, translated to almost
1427 // fully offscreen. The left side will appear closer (i.e. larger in 2d) than
1428 // the right side, so the top-left tile will technically be closer than the
1429 // top-right.
1430
1431 // Translate layer to offscreen
1432 current_screen_transform.Translate(400.0, 630.0);
1433 // Apply perspective about the center of the layer
1434 current_screen_transform.Translate(100.0, 100.0);
1435 current_screen_transform.ApplyPerspectiveDepth(100.0);
1436 current_screen_transform.RotateAboutYAxis(10.0);
1437 current_screen_transform.Translate(-100.0, -100.0);
1438 last_screen_transform = current_screen_transform;
1439
1440 // Sanity check that this transform wouldn't cause w<0 clipping.
1441 bool clipped;
1442 MathUtil::MapQuad(current_screen_transform,
1443 gfx::QuadF(gfx::RectF(0, 0, 200, 200)),
1444 &clipped);
1445 ASSERT_FALSE(clipped);
1446
1447 gfx::Rect viewport_in_layer_space = ViewportInLayerSpace(
1448 current_screen_transform, device_viewport);
1449
1450 client.SetTileSize(gfx::Size(100, 100));
1451
1452 scoped_refptr<FakeRasterSource> raster_source =
1453 FakeRasterSource::CreateFilled(current_layer_bounds);
1454 std::unique_ptr<TestablePictureLayerTiling> tiling =
1455 TestablePictureLayerTiling::Create(ACTIVE_TREE, 1.0f, raster_source,
1456 &client, LayerTreeSettings());
1457 tiling->set_resolution(HIGH_RESOLUTION);
1458
1459 tiling->ComputeTilePriorityRects(viewport_in_layer_space,
1460 current_layer_contents_scale,
1461 current_frame_time_in_seconds, Occlusion());
1462 auto prioritized_tiles = tiling->UpdateAndGetAllPrioritizedTilesForTesting();
1463
1464 ASSERT_TRUE(tiling->TileAt(0, 0));
1465 ASSERT_TRUE(tiling->TileAt(0, 1));
1466 ASSERT_TRUE(tiling->TileAt(1, 0));
1467 ASSERT_TRUE(tiling->TileAt(1, 1));
1468
1469 // All tiles will have a positive distance_to_visible
1470 // and an infinite time_to_visible.
1471 TilePriority priority = prioritized_tiles[tiling->TileAt(0, 0)].priority();
1472 EXPECT_FLOAT_EQ(priority.distance_to_visible, 0.f);
1473 EXPECT_EQ(TilePriority::NOW, priority.priority_bin);
1474
1475 priority = prioritized_tiles[tiling->TileAt(0, 1)].priority();
1476 EXPECT_GT(priority.distance_to_visible, 0.f);
1477 EXPECT_NE(TilePriority::NOW, priority.priority_bin);
1478
1479 priority = prioritized_tiles[tiling->TileAt(1, 0)].priority();
1480 EXPECT_FLOAT_EQ(priority.distance_to_visible, 0.f);
1481 EXPECT_EQ(TilePriority::NOW, priority.priority_bin);
1482
1483 priority = prioritized_tiles[tiling->TileAt(1, 1)].priority();
1484 EXPECT_GT(priority.distance_to_visible, 0.f);
1485 EXPECT_NE(TilePriority::NOW, priority.priority_bin);
1486
1487 // Furthermore, in this scenario the top-left distance_to_visible
1488 // will be smallest, followed by top-right. The bottom layers
1489 // will of course be further than the top layers.
1490 TilePriority top_left = prioritized_tiles[tiling->TileAt(0, 0)].priority();
1491 TilePriority top_right = prioritized_tiles[tiling->TileAt(1, 0)].priority();
1492 TilePriority bottom_left = prioritized_tiles[tiling->TileAt(0, 1)].priority();
1493 TilePriority bottom_right =
1494 prioritized_tiles[tiling->TileAt(1, 1)].priority();
1495
1496 EXPECT_GT(bottom_right.distance_to_visible, top_right.distance_to_visible);
1497
1498 EXPECT_GT(bottom_left.distance_to_visible, top_left.distance_to_visible);
1499 }
1500
1501 TEST(ComputeTilePriorityRectsTest, PerspectiveLayerClippedByW) {
1502 // Perspective transforms need to take a different code path.
1503 // This test checks tile priorities of a perspective layer.
1504 FakePictureLayerTilingClient client;
1505
1506 gfx::Size device_viewport(800, 600);
1507 gfx::Size last_layer_bounds(200, 200);
1508 gfx::Size current_layer_bounds(200, 200);
1509 float current_layer_contents_scale = 1.f;
1510 gfx::Transform last_screen_transform;
1511 gfx::Transform current_screen_transform;
1512 double current_frame_time_in_seconds = 1.0;
1513
1514 // A 3d perspective layer rotated about its Y axis, translated to almost
1515 // fully offscreen. The left side will appear closer (i.e. larger in 2d) than
1516 // the right side, so the top-left tile will technically be closer than the
1517 // top-right.
1518
1519 // Translate layer to offscreen
1520 current_screen_transform.Translate(400.0, 970.0);
1521 // Apply perspective and rotation about the center of the layer
1522 current_screen_transform.Translate(100.0, 100.0);
1523 current_screen_transform.ApplyPerspectiveDepth(10.0);
1524 current_screen_transform.RotateAboutYAxis(10.0);
1525 current_screen_transform.Translate(-100.0, -100.0);
1526 last_screen_transform = current_screen_transform;
1527
1528 // Sanity check that this transform does cause w<0 clipping for the left side
1529 // of the layer, but not the right side.
1530 bool clipped;
1531 MathUtil::MapQuad(current_screen_transform,
1532 gfx::QuadF(gfx::RectF(0, 0, 100, 200)),
1533 &clipped);
1534 ASSERT_TRUE(clipped);
1535
1536 MathUtil::MapQuad(current_screen_transform,
1537 gfx::QuadF(gfx::RectF(100, 0, 100, 200)),
1538 &clipped);
1539 ASSERT_FALSE(clipped);
1540
1541 gfx::Rect viewport_in_layer_space = ViewportInLayerSpace(
1542 current_screen_transform, device_viewport);
1543
1544 client.SetTileSize(gfx::Size(100, 100));
1545
1546 scoped_refptr<FakeRasterSource> raster_source =
1547 FakeRasterSource::CreateFilled(current_layer_bounds);
1548 std::unique_ptr<TestablePictureLayerTiling> tiling =
1549 TestablePictureLayerTiling::Create(ACTIVE_TREE, 1.0f, raster_source,
1550 &client, LayerTreeSettings());
1551 tiling->set_resolution(HIGH_RESOLUTION);
1552
1553 tiling->ComputeTilePriorityRects(viewport_in_layer_space,
1554 current_layer_contents_scale,
1555 current_frame_time_in_seconds, Occlusion());
1556 auto prioritized_tiles = tiling->UpdateAndGetAllPrioritizedTilesForTesting();
1557
1558 ASSERT_TRUE(tiling->TileAt(0, 0));
1559 ASSERT_TRUE(tiling->TileAt(0, 1)); 876 ASSERT_TRUE(tiling->TileAt(0, 1));
1560 ASSERT_TRUE(tiling->TileAt(1, 0)); 877 ASSERT_TRUE(tiling->TileAt(1, 0));
1561 ASSERT_TRUE(tiling->TileAt(1, 1)); 878 ASSERT_TRUE(tiling->TileAt(1, 1));
1562 879
1563 // Left-side tiles will be clipped by the transform, so we have to assume
1564 // they are visible just in case.
1565 TilePriority priority = prioritized_tiles[tiling->TileAt(0, 0)].priority(); 880 TilePriority priority = prioritized_tiles[tiling->TileAt(0, 0)].priority();
1566 EXPECT_FLOAT_EQ(0.f, priority.distance_to_visible); 881 EXPECT_FLOAT_EQ(0.f, priority.distance_to_visible);
1567 EXPECT_FLOAT_EQ(TilePriority::NOW, priority.priority_bin); 882 EXPECT_FLOAT_EQ(TilePriority::NOW, priority.priority_bin);
1568 883
1569 priority = prioritized_tiles[tiling->TileAt(0, 1)].priority(); 884 priority = prioritized_tiles[tiling->TileAt(0, 1)].priority();
1570 EXPECT_GT(priority.distance_to_visible, 0.f); 885 EXPECT_GT(priority.distance_to_visible, 0.f);
1571 EXPECT_NE(TilePriority::NOW, priority.priority_bin); 886 EXPECT_NE(TilePriority::NOW, priority.priority_bin);
1572 887
1573 // Right-side tiles will have a positive distance_to_visible
1574 // and an infinite time_to_visible.
1575 priority = prioritized_tiles[tiling->TileAt(1, 0)].priority();
1576 EXPECT_FLOAT_EQ(priority.distance_to_visible, 0.f);
1577 EXPECT_EQ(TilePriority::NOW, priority.priority_bin);
1578
1579 priority = prioritized_tiles[tiling->TileAt(1, 1)].priority();
1580 EXPECT_GT(priority.distance_to_visible, 0.f);
1581 EXPECT_NE(TilePriority::NOW, priority.priority_bin);
1582 }
1583
1584 TEST(ComputeTilePriorityRectsTest, BasicMotion) {
1585 // Test that time_to_visible is computed correctly when
1586 // there is some motion.
1587 FakePictureLayerTilingClient client;
1588
1589 gfx::Size device_viewport(800, 600);
1590 gfx::Rect visible_layer_rect(0, 0, 0, 0);
1591 gfx::Size last_layer_bounds(200, 200);
1592 gfx::Size current_layer_bounds(200, 200);
1593 float last_layer_contents_scale = 1.f;
1594 float current_layer_contents_scale = 1.f;
1595 gfx::Transform last_screen_transform;
1596 gfx::Transform current_screen_transform;
1597 double last_frame_time_in_seconds = 1.0;
1598 double current_frame_time_in_seconds = 2.0;
1599
1600 // Offscreen layer is coming closer to viewport at 1000 pixels per second.
1601 current_screen_transform.Translate(1800, 0);
1602 last_screen_transform.Translate(2800, 0);
1603
1604 gfx::Rect viewport_in_layer_space = ViewportInLayerSpace(
1605 current_screen_transform, device_viewport);
1606
1607 client.SetTileSize(gfx::Size(100, 100));
1608 LayerTreeSettings settings;
1609
1610 scoped_refptr<FakeRasterSource> raster_source =
1611 FakeRasterSource::CreateFilled(current_layer_bounds);
1612 std::unique_ptr<TestablePictureLayerTiling> tiling =
1613 TestablePictureLayerTiling::Create(ACTIVE_TREE, 1.0f, raster_source,
1614 &client, settings);
1615 tiling->set_resolution(HIGH_RESOLUTION);
1616
1617 // previous ("last") frame
1618 tiling->ComputeTilePriorityRects(viewport_in_layer_space,
1619 last_layer_contents_scale,
1620 last_frame_time_in_seconds, Occlusion());
1621
1622 // current frame
1623 tiling->ComputeTilePriorityRects(viewport_in_layer_space,
1624 current_layer_contents_scale,
1625 current_frame_time_in_seconds, Occlusion());
1626 auto prioritized_tiles = tiling->UpdateAndGetAllPrioritizedTilesForTesting();
1627
1628 ASSERT_TRUE(tiling->TileAt(0, 0));
1629 ASSERT_TRUE(tiling->TileAt(0, 1));
1630 ASSERT_TRUE(tiling->TileAt(1, 0));
1631 ASSERT_TRUE(tiling->TileAt(1, 1));
1632
1633 TilePriority priority = prioritized_tiles[tiling->TileAt(0, 0)].priority();
1634 EXPECT_GT(priority.distance_to_visible, 0.f);
1635 EXPECT_NE(TilePriority::NOW, priority.priority_bin);
1636
1637 priority = prioritized_tiles[tiling->TileAt(0, 1)].priority();
1638 EXPECT_GT(priority.distance_to_visible, 0.f);
1639 EXPECT_NE(TilePriority::NOW, priority.priority_bin);
1640
1641 // time_to_visible for the right hand side layers needs an extra 0.099
1642 // seconds because this tile is 99 pixels further away.
1643 priority = prioritized_tiles[tiling->TileAt(1, 0)].priority(); 888 priority = prioritized_tiles[tiling->TileAt(1, 0)].priority();
1644 EXPECT_GT(priority.distance_to_visible, 0.f); 889 EXPECT_GT(priority.distance_to_visible, 0.f);
1645 EXPECT_NE(TilePriority::NOW, priority.priority_bin); 890 EXPECT_NE(TilePriority::NOW, priority.priority_bin);
1646 891
1647 priority = prioritized_tiles[tiling->TileAt(1, 1)].priority(); 892 priority = prioritized_tiles[tiling->TileAt(1, 1)].priority();
1648 EXPECT_GT(priority.distance_to_visible, 0.f); 893 EXPECT_GT(priority.distance_to_visible, 0.f);
1649 EXPECT_NE(TilePriority::NOW, priority.priority_bin); 894 EXPECT_NE(TilePriority::NOW, priority.priority_bin);
1650 } 895 }
1651 896
1652 TEST(ComputeTilePriorityRectsTest, RotationMotion) {
1653 // Each tile of a layer may be affected differently by a transform; Check
1654 // that ComputeTilePriorityRects correctly accounts for the transform between
1655 // layer space and screen space.
1656
1657 FakePictureLayerTilingClient client;
1658 std::unique_ptr<TestablePictureLayerTiling> tiling;
1659
1660 gfx::Size device_viewport(800, 600);
1661 gfx::Rect visible_layer_rect(0, 0, 0, 0); // offscren.
1662 gfx::Size last_layer_bounds(200, 200);
1663 gfx::Size current_layer_bounds(200, 200);
1664 float last_layer_contents_scale = 1.f;
1665 float current_layer_contents_scale = 1.f;
1666 gfx::Transform last_screen_transform;
1667 gfx::Transform current_screen_transform;
1668 double last_frame_time_in_seconds = 1.0;
1669 double current_frame_time_in_seconds = 2.0;
1670
1671 // Rotation motion is set up specifically so that:
1672 // - rotation occurs about the center of the layer
1673 // - the top-left tile becomes visible on rotation
1674 // - the top-right tile will have an infinite time_to_visible
1675 // because it is rotating away from viewport.
1676 // - bottom-left layer will have a positive non-zero time_to_visible
1677 // because it is rotating toward the viewport.
1678 current_screen_transform.Translate(400, 550);
1679 current_screen_transform.RotateAboutZAxis(45);
1680
1681 last_screen_transform.Translate(400, 550);
1682
1683 gfx::Rect viewport_in_layer_space = ViewportInLayerSpace(
1684 current_screen_transform, device_viewport);
1685
1686 client.SetTileSize(gfx::Size(100, 100));
1687
1688 scoped_refptr<FakeRasterSource> raster_source =
1689 FakeRasterSource::CreateFilled(current_layer_bounds);
1690 tiling = TestablePictureLayerTiling::Create(ACTIVE_TREE, 1.0f, raster_source,
1691 &client, LayerTreeSettings());
1692 tiling->set_resolution(HIGH_RESOLUTION);
1693
1694 // previous ("last") frame
1695 tiling->ComputeTilePriorityRects(viewport_in_layer_space,
1696 last_layer_contents_scale,
1697 last_frame_time_in_seconds, Occlusion());
1698
1699 // current frame
1700 tiling->ComputeTilePriorityRects(viewport_in_layer_space,
1701 current_layer_contents_scale,
1702 current_frame_time_in_seconds, Occlusion());
1703 auto prioritized_tiles = tiling->UpdateAndGetAllPrioritizedTilesForTesting();
1704
1705 ASSERT_TRUE(tiling->TileAt(0, 0));
1706 ASSERT_TRUE(tiling->TileAt(0, 1));
1707 ASSERT_TRUE(tiling->TileAt(1, 0));
1708 ASSERT_TRUE(tiling->TileAt(1, 1));
1709
1710 TilePriority priority = prioritized_tiles[tiling->TileAt(0, 0)].priority();
1711 EXPECT_FLOAT_EQ(0.f, priority.distance_to_visible);
1712 EXPECT_EQ(TilePriority::NOW, priority.priority_bin);
1713
1714 priority = prioritized_tiles[tiling->TileAt(0, 1)].priority();
1715 EXPECT_FLOAT_EQ(0.f, priority.distance_to_visible);
1716 EXPECT_EQ(TilePriority::NOW, priority.priority_bin);
1717
1718 priority = prioritized_tiles[tiling->TileAt(1, 0)].priority();
1719 EXPECT_FLOAT_EQ(0.f, priority.distance_to_visible);
1720 EXPECT_EQ(TilePriority::NOW, priority.priority_bin);
1721 }
1722
1723 TEST(PictureLayerTilingTest, RecycledTilesCleared) {
1724 // This test performs the following:
1725 // Setup:
1726 // - Two tilings, one active one recycled with all tiles shared.
1727 // Procedure:
1728 // - Viewport moves somewhere far away and active tiling clears tiles.
1729 // - Viewport moves back and a new active tiling tile is created.
1730 // Result:
1731 // - Recycle tiling does _not_ have the tile in the same location (thus it
1732 // will be shared next time a pending tiling is created).
1733
1734 FakePictureLayerTilingClient active_client;
1735
1736 active_client.SetTileSize(gfx::Size(100, 100));
1737 LayerTreeSettings settings;
1738
1739 scoped_refptr<FakeRasterSource> raster_source =
1740 FakeRasterSource::CreateFilled(gfx::Size(10000, 10000));
1741 std::unique_ptr<TestablePictureLayerTiling> active_tiling =
1742 TestablePictureLayerTiling::Create(ACTIVE_TREE, 1.0f, raster_source,
1743 &active_client, settings);
1744 active_tiling->set_resolution(HIGH_RESOLUTION);
1745 // Create all tiles on this tiling.
1746 active_tiling->ComputeTilePriorityRects(gfx::Rect(0, 0, 100, 100), 1.0f, 1.0f,
1747 Occlusion());
1748
1749 FakePictureLayerTilingClient recycle_client;
1750 recycle_client.SetTileSize(gfx::Size(100, 100));
1751 recycle_client.set_twin_tiling(active_tiling.get());
1752
1753 raster_source = FakeRasterSource::CreateFilled(gfx::Size(10000, 10000));
1754 std::unique_ptr<TestablePictureLayerTiling> recycle_tiling =
1755 TestablePictureLayerTiling::Create(PENDING_TREE, 1.0f, raster_source,
1756 &recycle_client, settings);
1757 recycle_tiling->set_resolution(HIGH_RESOLUTION);
1758
1759 // Create all tiles on the second tiling. All tiles should be shared.
1760 recycle_tiling->ComputeTilePriorityRects(gfx::Rect(0, 0, 100, 100), 1.0f,
1761 1.0f, Occlusion());
1762
1763 // Set the second tiling as recycled.
1764 active_client.set_twin_tiling(NULL);
1765 recycle_client.set_twin_tiling(NULL);
1766
1767 EXPECT_TRUE(active_tiling->TileAt(0, 0));
1768 EXPECT_FALSE(recycle_tiling->TileAt(0, 0));
1769
1770 // Move the viewport far away from the (0, 0) tile.
1771 active_tiling->ComputeTilePriorityRects(gfx::Rect(9000, 9000, 100, 100), 1.0f,
1772 2.0, Occlusion());
1773 // Ensure the tile was deleted.
1774 EXPECT_FALSE(active_tiling->TileAt(0, 0));
1775 EXPECT_FALSE(recycle_tiling->TileAt(0, 0));
1776
1777 // Move the viewport back to (0, 0) tile.
1778 active_tiling->ComputeTilePriorityRects(gfx::Rect(0, 0, 100, 100), 1.0f, 3.0,
1779 Occlusion());
1780
1781 // Ensure that we now have a tile here on both active.
1782 EXPECT_TRUE(active_tiling->TileAt(0, 0));
1783 EXPECT_FALSE(recycle_tiling->TileAt(0, 0));
1784 }
1785
1786 TEST(PictureLayerTilingTest, RecycledTilesClearedOnReset) { 897 TEST(PictureLayerTilingTest, RecycledTilesClearedOnReset) {
1787 FakePictureLayerTilingClient active_client; 898 FakePictureLayerTilingClient active_client;
1788 active_client.SetTileSize(gfx::Size(100, 100)); 899 active_client.SetTileSize(gfx::Size(100, 100));
1789 900
1790 scoped_refptr<FakeRasterSource> raster_source = 901 scoped_refptr<FakeRasterSource> raster_source =
1791 FakeRasterSource::CreateFilled(gfx::Size(100, 100)); 902 FakeRasterSource::CreateFilled(gfx::Size(100, 100));
1792 std::unique_ptr<TestablePictureLayerTiling> active_tiling = 903 std::unique_ptr<TestablePictureLayerTiling> active_tiling =
1793 TestablePictureLayerTiling::Create(ACTIVE_TREE, 1.0f, raster_source, 904 TestablePictureLayerTiling::Create(ACTIVE_TREE, 1.0f, raster_source,
1794 &active_client, LayerTreeSettings()); 905 &active_client, LayerTreeSettings());
1795 active_tiling->set_resolution(HIGH_RESOLUTION); 906 active_tiling->set_resolution(HIGH_RESOLUTION);
1796 // Create all tiles on this tiling. 907 // Create all tiles on this tiling.
1797 active_tiling->ComputeTilePriorityRects(gfx::Rect(0, 0, 100, 100), 1.0f, 1.0f, 908 gfx::Rect visible_rect = gfx::Rect(0, 0, 100, 100);
1798 Occlusion()); 909 active_tiling->ComputeTilePriorityRects(
910 visible_rect, visible_rect, visible_rect, visible_rect, 1.f, Occlusion());
1799 911
1800 FakePictureLayerTilingClient recycle_client; 912 FakePictureLayerTilingClient recycle_client;
1801 recycle_client.SetTileSize(gfx::Size(100, 100)); 913 recycle_client.SetTileSize(gfx::Size(100, 100));
1802 recycle_client.set_twin_tiling(active_tiling.get()); 914 recycle_client.set_twin_tiling(active_tiling.get());
1803 915
1804 LayerTreeSettings settings; 916 LayerTreeSettings settings;
1805 917
1806 raster_source = FakeRasterSource::CreateFilled(gfx::Size(100, 100)); 918 raster_source = FakeRasterSource::CreateFilled(gfx::Size(100, 100));
1807 std::unique_ptr<TestablePictureLayerTiling> recycle_tiling = 919 std::unique_ptr<TestablePictureLayerTiling> recycle_tiling =
1808 TestablePictureLayerTiling::Create(PENDING_TREE, 1.0f, raster_source, 920 TestablePictureLayerTiling::Create(PENDING_TREE, 1.0f, raster_source,
1809 &recycle_client, settings); 921 &recycle_client, settings);
1810 recycle_tiling->set_resolution(HIGH_RESOLUTION); 922 recycle_tiling->set_resolution(HIGH_RESOLUTION);
1811 923
1812 // Create all tiles on the recycle tiling. All tiles should be shared. 924 // Create all tiles on the recycle tiling.
1813 recycle_tiling->ComputeTilePriorityRects(gfx::Rect(0, 0, 100, 100), 1.0f, 925 recycle_tiling->ComputeTilePriorityRects(visible_rect, visible_rect,
1814 1.0f, Occlusion()); 926 visible_rect, visible_rect, 1.0f,
927 Occlusion());
1815 928
1816 // Set the second tiling as recycled. 929 // Set the second tiling as recycled.
1817 active_client.set_twin_tiling(NULL); 930 active_client.set_twin_tiling(NULL);
1818 recycle_client.set_twin_tiling(NULL); 931 recycle_client.set_twin_tiling(NULL);
1819 932
1820 EXPECT_TRUE(active_tiling->TileAt(0, 0)); 933 EXPECT_TRUE(active_tiling->TileAt(0, 0));
1821 EXPECT_FALSE(recycle_tiling->TileAt(0, 0)); 934 EXPECT_FALSE(recycle_tiling->TileAt(0, 0));
1822 935
1823 // Reset the active tiling. The recycle tiles should be released too. 936 // Reset the active tiling. The recycle tiles should be released too.
1824 active_tiling->Reset(); 937 active_tiling->Reset();
1825 EXPECT_FALSE(active_tiling->TileAt(0, 0)); 938 EXPECT_FALSE(active_tiling->TileAt(0, 0));
1826 EXPECT_FALSE(recycle_tiling->TileAt(0, 0)); 939 EXPECT_FALSE(recycle_tiling->TileAt(0, 0));
1827 } 940 }
1828 941
1829 TEST(PictureLayerTilingTest, InvalidateAfterComputeTilePriorityRects) {
1830 FakePictureLayerTilingClient pending_client;
1831 pending_client.SetTileSize(gfx::Size(100, 100));
1832
1833 scoped_refptr<FakeRasterSource> raster_source =
1834 FakeRasterSource::CreateFilled(gfx::Size(100, 100));
1835 std::unique_ptr<TestablePictureLayerTiling> pending_tiling =
1836 TestablePictureLayerTiling::Create(PENDING_TREE, 1.0f, raster_source,
1837 &pending_client, LayerTreeSettings());
1838 pending_tiling->set_resolution(HIGH_RESOLUTION);
1839
1840 // Ensure that we can compute tile priority rects, invalidate, and compute the
1841 // rects again. It is important that the second compute tile priority rects
1842 // return true, indicating that things have changed (since invalidation has
1843 // changed things). This causes PrepareTiles to be properly scheduled. If the
1844 // second ComputeTilePriorityRects returns false, then we assume that
1845 // PrepareTiles isn't needed and we signal that we're ready to draw
1846 // immediately, which can cause visual glitches.
1847 //
1848 // This can happen we if we process an impl frame deadline before processing a
1849 // commit. That is, when we draw we ComputeTilePriorityRects. If we process
1850 // the commit afterwards, it would use the same timestamp and sometimes would
1851 // use the same viewport to compute tile priority rects again.
1852 double time = 1.;
1853 gfx::Rect viewport(0, 0, 100, 100);
1854 EXPECT_TRUE(pending_tiling->ComputeTilePriorityRects(viewport, 1.0f, time,
1855 Occlusion()));
1856 pending_tiling->Invalidate(viewport);
1857 EXPECT_TRUE(pending_tiling->ComputeTilePriorityRects(viewport, 1.0f, time,
1858 Occlusion()));
1859 }
1860
1861 TEST_F(PictureLayerTilingIteratorTest, ResizeTilesAndUpdateToCurrent) { 942 TEST_F(PictureLayerTilingIteratorTest, ResizeTilesAndUpdateToCurrent) {
1862 // The tiling has four rows and three columns. 943 // The tiling has four rows and three columns.
1863 Initialize(gfx::Size(150, 100), 1.f, gfx::Size(250, 150)); 944 Initialize(gfx::Size(150, 100), 1.f, gfx::Size(250, 150));
1864 tiling_->CreateAllTilesForTesting(); 945 tiling_->CreateAllTilesForTesting();
1865 EXPECT_EQ(150, tiling_->TilingDataForTesting().max_texture_size().width()); 946 EXPECT_EQ(150, tiling_->TilingDataForTesting().max_texture_size().width());
1866 EXPECT_EQ(100, tiling_->TilingDataForTesting().max_texture_size().height()); 947 EXPECT_EQ(100, tiling_->TilingDataForTesting().max_texture_size().height());
1867 EXPECT_EQ(4u, tiling_->AllTilesForTesting().size()); 948 EXPECT_EQ(4u, tiling_->AllTilesForTesting().size());
1868 949
1869 client_.SetTileSize(gfx::Size(250, 200)); 950 client_.SetTileSize(gfx::Size(250, 200));
1870 951
(...skipping 24 matching lines...) Expand all
1895 tiling_ = TestablePictureLayerTiling::Create(PENDING_TREE, contents_scale, 976 tiling_ = TestablePictureLayerTiling::Create(PENDING_TREE, contents_scale,
1896 raster_source, &client_, 977 raster_source, &client_,
1897 LayerTreeSettings()); 978 LayerTreeSettings());
1898 979
1899 gfx::Rect content_rect(25554432, 25554432, 950, 860); 980 gfx::Rect content_rect(25554432, 25554432, 950, 860);
1900 VerifyTilesExactlyCoverRect(contents_scale, content_rect); 981 VerifyTilesExactlyCoverRect(contents_scale, content_rect);
1901 } 982 }
1902 983
1903 } // namespace 984 } // namespace
1904 } // namespace cc 985 } // namespace cc
OLDNEW
« no previous file with comments | « cc/tiles/picture_layer_tiling_set_unittest.cc ('k') | cc/tiles/tile_manager_unittest.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698