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

Unified Diff: cc/resources/tile_manager_unittest.cc

Issue 839143002: Roll Chrome into Mojo. (Closed) Base URL: git@github.com:domokit/mojo.git@master
Patch Set: Rebase Created 5 years, 11 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 side-by-side diff with in-line comments
Download patch
« no previous file with comments | « cc/resources/tile_manager_perftest.cc ('k') | cc/resources/tile_task_worker_pool_perftest.cc » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: cc/resources/tile_manager_unittest.cc
diff --git a/cc/resources/tile_manager_unittest.cc b/cc/resources/tile_manager_unittest.cc
index e9562c94f14c564a655cf9036e7ac22759fdac88..113cd7212aa766043cb34fd3fabf459750f6163e 100644
--- a/cc/resources/tile_manager_unittest.cc
+++ b/cc/resources/tile_manager_unittest.cc
@@ -12,6 +12,7 @@
#include "cc/test/fake_output_surface.h"
#include "cc/test/fake_output_surface_client.h"
#include "cc/test/fake_picture_layer_impl.h"
+#include "cc/test/fake_picture_layer_tiling_client.h"
#include "cc/test/fake_picture_pile_impl.h"
#include "cc/test/fake_tile_manager.h"
#include "cc/test/impl_side_painting_settings.h"
@@ -878,5 +879,195 @@ TEST_F(TileManagerTilePriorityQueueTest, EvictionTilePriorityQueueEmptyLayers) {
EXPECT_EQ(16u, tile_count);
}
+TEST_F(TileManagerTilePriorityQueueTest,
+ RasterTilePriorityQueueStaticViewport) {
+ FakePictureLayerTilingClient client;
+
+ gfx::Rect viewport(50, 50, 100, 100);
+ gfx::Size layer_bounds(800, 800);
+
+ gfx::Rect soon_rect = viewport;
+ soon_rect.Inset(-312.f, -312.f, -312.f, -312.f);
+
+ client.SetTileSize(gfx::Size(30, 30));
+ client.set_tree(ACTIVE_TREE);
+ LayerTreeSettings settings;
+ settings.max_tiles_for_interest_area = 10000;
+
+ scoped_ptr<PictureLayerTilingSet> tiling_set = PictureLayerTilingSet::Create(
+ &client, settings.max_tiles_for_interest_area,
+ settings.skewport_target_time_in_seconds,
+ settings.skewport_extrapolation_limit_in_content_pixels);
+
+ scoped_refptr<FakePicturePileImpl> pile =
+ FakePicturePileImpl::CreateFilledPileWithDefaultTileSize(layer_bounds);
+ PictureLayerTiling* tiling = tiling_set->AddTiling(1.0f, pile);
+ tiling->set_resolution(HIGH_RESOLUTION);
+
+ tiling_set->UpdateTilePriorities(viewport, 1.0f, 1.0, Occlusion(), true);
+
+ TilingSetRasterQueue empty_queue;
+ EXPECT_TRUE(empty_queue.IsEmpty());
+
+ std::vector<Tile*> all_tiles = tiling->AllTilesForTesting();
+
+ // Sanity check.
+ EXPECT_EQ(841u, all_tiles.size());
+
+ // The explanation of each iteration is as follows:
+ // 1. First iteration tests that we can get all of the tiles correctly.
+ // 2. Second iteration ensures that we can get all of the tiles again (first
+ // iteration didn't change any tiles), as well set all tiles to be ready to
+ // draw.
+ // 3. Third iteration ensures that no tiles are returned, since they were all
+ // marked as ready to draw.
+ for (int i = 0; i < 3; ++i) {
+ TilingSetRasterQueue queue(tiling_set.get(), false);
+
+ // There are 3 bins in TilePriority.
+ bool have_tiles[3] = {};
+
+ // On the third iteration, we should get no tiles since everything was
+ // marked as ready to draw.
+ if (i == 2) {
+ EXPECT_TRUE(queue.IsEmpty());
+ continue;
+ }
+
+ EXPECT_FALSE(queue.IsEmpty());
+ std::set<Tile*> unique_tiles;
+ unique_tiles.insert(queue.Top());
+ Tile* last_tile = queue.Top();
+ have_tiles[last_tile->priority(ACTIVE_TREE).priority_bin] = true;
+
+ // On the second iteration, mark everything as ready to draw (solid color).
+ if (i == 1) {
+ TileDrawInfo& draw_info = last_tile->draw_info();
+ draw_info.SetSolidColorForTesting(SK_ColorRED);
+ }
+ queue.Pop();
+ int eventually_bin_order_correct_count = 0;
+ int eventually_bin_order_incorrect_count = 0;
+ while (!queue.IsEmpty()) {
+ Tile* new_tile = queue.Top();
+ queue.Pop();
+ unique_tiles.insert(new_tile);
+
+ TilePriority last_priority = last_tile->priority(ACTIVE_TREE);
+ TilePriority new_priority = new_tile->priority(ACTIVE_TREE);
+ EXPECT_LE(last_priority.priority_bin, new_priority.priority_bin);
+ if (last_priority.priority_bin == new_priority.priority_bin) {
+ if (last_priority.priority_bin == TilePriority::EVENTUALLY) {
+ bool order_correct = last_priority.distance_to_visible <=
+ new_priority.distance_to_visible;
+ eventually_bin_order_correct_count += order_correct;
+ eventually_bin_order_incorrect_count += !order_correct;
+ } else if (!soon_rect.Intersects(new_tile->content_rect()) &&
+ !soon_rect.Intersects(last_tile->content_rect())) {
+ EXPECT_LE(last_priority.distance_to_visible,
+ new_priority.distance_to_visible);
+ EXPECT_EQ(TilePriority::NOW, new_priority.priority_bin);
+ } else if (new_priority.distance_to_visible > 0.f) {
+ EXPECT_EQ(TilePriority::SOON, new_priority.priority_bin);
+ }
+ }
+ have_tiles[new_priority.priority_bin] = true;
+
+ last_tile = new_tile;
+
+ // On the second iteration, mark everything as ready to draw (solid
+ // color).
+ if (i == 1) {
+ TileDrawInfo& draw_info = last_tile->draw_info();
+ draw_info.SetSolidColorForTesting(SK_ColorRED);
+ }
+ }
+
+ EXPECT_GT(eventually_bin_order_correct_count,
+ eventually_bin_order_incorrect_count);
+
+ // We should have now and eventually tiles, as well as soon tiles from
+ // the border region.
+ EXPECT_TRUE(have_tiles[TilePriority::NOW]);
+ EXPECT_TRUE(have_tiles[TilePriority::SOON]);
+ EXPECT_TRUE(have_tiles[TilePriority::EVENTUALLY]);
+
+ EXPECT_EQ(unique_tiles.size(), all_tiles.size());
+ }
+}
+
+TEST_F(TileManagerTilePriorityQueueTest,
+ RasterTilePriorityQueueMovingViewport) {
+ FakePictureLayerTilingClient client;
+
+ gfx::Rect viewport(50, 0, 100, 100);
+ gfx::Rect moved_viewport(50, 0, 100, 500);
+ gfx::Size layer_bounds(1000, 1000);
+
+ client.SetTileSize(gfx::Size(30, 30));
+ client.set_tree(ACTIVE_TREE);
+ LayerTreeSettings settings;
+ settings.max_tiles_for_interest_area = 10000;
+
+ scoped_ptr<PictureLayerTilingSet> tiling_set = PictureLayerTilingSet::Create(
+ &client, settings.max_tiles_for_interest_area,
+ settings.skewport_target_time_in_seconds,
+ settings.skewport_extrapolation_limit_in_content_pixels);
+
+ scoped_refptr<FakePicturePileImpl> pile =
+ FakePicturePileImpl::CreateFilledPileWithDefaultTileSize(layer_bounds);
+ PictureLayerTiling* tiling = tiling_set->AddTiling(1.0f, pile);
+ tiling->set_resolution(HIGH_RESOLUTION);
+
+ tiling_set->UpdateTilePriorities(viewport, 1.0f, 1.0, Occlusion(), true);
+ tiling_set->UpdateTilePriorities(moved_viewport, 1.0f, 2.0, Occlusion(),
+ true);
+
+ gfx::Rect soon_rect = moved_viewport;
+ soon_rect.Inset(-312.f, -312.f, -312.f, -312.f);
+
+ // There are 3 bins in TilePriority.
+ bool have_tiles[3] = {};
+ Tile* last_tile = NULL;
+ int eventually_bin_order_correct_count = 0;
+ int eventually_bin_order_incorrect_count = 0;
+ for (TilingSetRasterQueue queue(tiling_set.get(), false); !queue.IsEmpty();
+ queue.Pop()) {
+ if (!last_tile)
+ last_tile = queue.Top();
+
+ Tile* new_tile = queue.Top();
+
+ TilePriority last_priority = last_tile->priority(ACTIVE_TREE);
+ TilePriority new_priority = new_tile->priority(ACTIVE_TREE);
+
+ have_tiles[new_priority.priority_bin] = true;
+
+ EXPECT_LE(last_priority.priority_bin, new_priority.priority_bin);
+ if (last_priority.priority_bin == new_priority.priority_bin) {
+ if (last_priority.priority_bin == TilePriority::EVENTUALLY) {
+ bool order_correct = last_priority.distance_to_visible <=
+ new_priority.distance_to_visible;
+ eventually_bin_order_correct_count += order_correct;
+ eventually_bin_order_incorrect_count += !order_correct;
+ } else if (!soon_rect.Intersects(new_tile->content_rect()) &&
+ !soon_rect.Intersects(last_tile->content_rect())) {
+ EXPECT_LE(last_priority.distance_to_visible,
+ new_priority.distance_to_visible);
+ } else if (new_priority.distance_to_visible > 0.f) {
+ EXPECT_EQ(TilePriority::SOON, new_priority.priority_bin);
+ }
+ }
+ last_tile = new_tile;
+ }
+
+ EXPECT_GT(eventually_bin_order_correct_count,
+ eventually_bin_order_incorrect_count);
+
+ EXPECT_TRUE(have_tiles[TilePriority::NOW]);
+ EXPECT_TRUE(have_tiles[TilePriority::SOON]);
+ EXPECT_TRUE(have_tiles[TilePriority::EVENTUALLY]);
+}
+
} // namespace
} // namespace cc
« no previous file with comments | « cc/resources/tile_manager_perftest.cc ('k') | cc/resources/tile_task_worker_pool_perftest.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698