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

Unified Diff: cc/resources/picture_layer_tiling_unittest.cc

Issue 183663003: cc: Add tiling raster tile iterators. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Created 6 years, 10 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
Index: cc/resources/picture_layer_tiling_unittest.cc
diff --git a/cc/resources/picture_layer_tiling_unittest.cc b/cc/resources/picture_layer_tiling_unittest.cc
index 5fe1acd1031210a53e1fd61c1f14708e1b35ace2..6f6f1d98fcd3eb91e8d8656f66518391dd4c9c62 100644
--- a/cc/resources/picture_layer_tiling_unittest.cc
+++ b/cc/resources/picture_layer_tiling_unittest.cc
@@ -5,10 +5,14 @@
#include "cc/resources/picture_layer_tiling.h"
#include <limits>
+#include <set>
#include "cc/base/math_util.h"
#include "cc/resources/picture_layer_tiling_set.h"
+#include "cc/test/fake_output_surface.h"
+#include "cc/test/fake_output_surface_client.h"
#include "cc/test/fake_picture_layer_tiling_client.h"
+#include "cc/test/test_context_provider.h"
#include "testing/gtest/include/gtest/gtest.h"
#include "ui/gfx/rect_conversions.h"
#include "ui/gfx/size_conversions.h"
@@ -751,6 +755,201 @@ TEST(PictureLayerTilingTest, EmptyStartingRect) {
EXPECT_TRUE(out.IsEmpty());
}
+TEST(PictureLayerTilingTest, TilingRasterTileIteratorStaticViewport) {
+ FakePictureLayerTilingClient client;
+ scoped_ptr<TestablePictureLayerTiling> tiling;
+
+ gfx::Rect viewport(50, 50, 100, 100);
+ gfx::Size layer_bounds(200, 200);
+
+ client.SetTileSize(gfx::Size(10, 10));
+
+ tiling = TestablePictureLayerTiling::Create(0.25f, layer_bounds, &client);
+ tiling->UpdateTilePriorities(ACTIVE_TREE, viewport, 1.f, 1.0);
+
+ PictureLayerTiling::TilingRasterTileIterator empty_iterator;
+ EXPECT_FALSE(empty_iterator);
+
+ std::vector<Tile*> all_tiles = tiling->AllTilesForTesting();
+
+ // Sanity check.
+ EXPECT_EQ(36u, all_tiles.size());
+
+ for (int i = 0; i < 3; ++i) {
+ PictureLayerTiling::TilingRasterTileIterator it(tiling.get());
+
+ // On the third iteration, everything is marked as ready to draw so we
+ // should get a NULL immediately.
+ if (i == 2) {
+ EXPECT_FALSE(it);
+ break;
+ }
+
+ // There are 3 bins in TilePriority.
+ bool have_tiles[3] = {};
+
+ EXPECT_TRUE(it);
+ std::set<Tile*> unique_tiles;
+ unique_tiles.insert(*it);
+ Tile* last_tile = *it;
+ 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) {
+ ManagedTileState::TileVersion& tile_version =
+ last_tile->GetTileVersionForTesting(
+ last_tile->DetermineRasterModeForTree(ACTIVE_TREE));
+ tile_version.SetSolidColorForTesting(SK_ColorRED);
+ }
+ ++it;
+ while (it) {
+ Tile* new_tile = *it;
+ ++it;
+ 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) {
+ EXPECT_LE(last_priority.distance_to_visible,
+ new_priority.distance_to_visible);
+ }
+ 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) {
+ ManagedTileState::TileVersion& tile_version =
+ last_tile->GetTileVersionForTesting(
+ last_tile->DetermineRasterModeForTree(ACTIVE_TREE));
+ tile_version.SetSolidColorForTesting(SK_ColorRED);
+ }
+ }
+
+ // We should have now and eventually tiles, but not soon tiles because the
+ // viewport is static.
+ EXPECT_TRUE(have_tiles[TilePriority::NOW]);
+ EXPECT_FALSE(have_tiles[TilePriority::SOON]);
+ EXPECT_TRUE(have_tiles[TilePriority::EVENTUALLY]);
+
+ EXPECT_EQ(unique_tiles.size(), all_tiles.size());
+ tiling->UpdateTilePriorities(ACTIVE_TREE, viewport, 1.f, i + 2);
+ }
+}
+
+TEST(PictureLayerTilingTest, TilingRasterTileIteratorMovingViewport) {
+ FakePictureLayerTilingClient client;
+ scoped_ptr<TestablePictureLayerTiling> tiling;
+
+ gfx::Rect viewport(50, 0, 100, 100);
+ gfx::Size layer_bounds(500, 500);
+
+ client.SetTileSize(gfx::Size(30, 30));
+
+ tiling = TestablePictureLayerTiling::Create(1.f, layer_bounds, &client);
+ tiling->UpdateTilePriorities(ACTIVE_TREE, viewport, 1.f, 1.0);
+
+ viewport = gfx::Rect(50, 50, 100, 100);
+ tiling->UpdateTilePriorities(ACTIVE_TREE, viewport, 1.f, 1.1);
+
+ // There are 3 bins in TilePriority.
+ bool have_tiles[3] = {};
+ Tile* last_tile = NULL;
+ for (PictureLayerTiling::TilingRasterTileIterator it(tiling.get()); it;
+ ++it) {
+ if (!last_tile)
+ last_tile = *it;
+
+ Tile* new_tile = *it;
+
+ 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) {
+ EXPECT_LE(last_priority.distance_to_visible,
+ new_priority.distance_to_visible);
+ }
+ last_tile = new_tile;
+ }
+
+ EXPECT_TRUE(have_tiles[TilePriority::NOW]);
+ EXPECT_TRUE(have_tiles[TilePriority::SOON]);
+ EXPECT_TRUE(have_tiles[TilePriority::EVENTUALLY]);
+}
+
+TEST(PictureLayerTilingTest, TilingEvictionTileIteratorNoResources) {
+ FakePictureLayerTilingClient client;
+ scoped_ptr<TestablePictureLayerTiling> tiling;
+
+ gfx::Rect viewport(50, 0, 100, 100);
+ gfx::Size layer_bounds(500, 500);
+
+ client.SetTileSize(gfx::Size(30, 30));
+
+ tiling = TestablePictureLayerTiling::Create(1.f, layer_bounds, &client);
+ tiling->UpdateTilePriorities(ACTIVE_TREE, viewport, 1.f, 1.0);
+
+ viewport = gfx::Rect(50, 50, 100, 100);
+ tiling->UpdateTilePriorities(ACTIVE_TREE, viewport, 1.f, 1.1);
+
+ PictureLayerTiling::TilingEvictionTileIterator it(tiling.get());
+ EXPECT_FALSE(it);
+}
+
+TEST(PictureLayerTilingTest, TilingEvictionTileIteratorSomeResources) {
+ scoped_refptr<TestContextProvider> context_provider =
+ TestContextProvider::Create();
+ scoped_ptr<FakeOutputSurface> output_surface =
+ FakeOutputSurface::Create3d(context_provider).Pass();
+ FakeOutputSurfaceClient output_surface_client;
+ CHECK(output_surface->BindToClient(&output_surface_client));
+ scoped_ptr<ResourceProvider> resource_provider =
+ ResourceProvider::Create(output_surface.get(), NULL, 0, false, 1).Pass();
+
+ FakePictureLayerTilingClient client(resource_provider.get());
+ scoped_ptr<TestablePictureLayerTiling> tiling;
+
+ gfx::Rect viewport(50, 0, 100, 100);
+ gfx::Size layer_bounds(500, 500);
+
+ client.SetTileSize(gfx::Size(30, 30));
+
+ tiling = TestablePictureLayerTiling::Create(1.f, layer_bounds, &client);
+ tiling->UpdateTilePriorities(ACTIVE_TREE, viewport, 1.f, 1.0);
+
+ std::vector<Tile*> all_tiles = tiling->AllTilesForTesting();
+
+ std::vector<Tile*> resource_tiles;
+ for (size_t i = 0; i < all_tiles.size(); ++i) {
+ if (i % 2)
+ continue;
+ resource_tiles.push_back(all_tiles[i]);
+ }
+
+ client.tile_manager()->InitializeTilesWithResourcesForTesting(
+ resource_tiles, resource_provider.get());
+
+ viewport = gfx::Rect(50, 50, 100, 100);
+ tiling->UpdateTilePriorities(ACTIVE_TREE, viewport, 1.f, 1.1);
+
+ size_t count = 0;
+ std::set<Tile*> unique_tiles;
+ for (PictureLayerTiling::TilingEvictionTileIterator it(tiling.get()); it;
+ ++it) {
+ ++count;
+ EXPECT_TRUE(it);
+ unique_tiles.insert(*it);
+ }
+
+ EXPECT_EQ(resource_tiles.size(), count);
+ EXPECT_EQ(count, unique_tiles.size());
+}
+
static void TileExists(bool exists, Tile* tile,
const gfx::Rect& geometry_rect) {
EXPECT_EQ(exists, tile != NULL) << geometry_rect.ToString();

Powered by Google App Engine
This is Rietveld 408576698