Chromium Code Reviews| Index: cc/layers/picture_layer_impl_unittest.cc |
| diff --git a/cc/layers/picture_layer_impl_unittest.cc b/cc/layers/picture_layer_impl_unittest.cc |
| index c7a5900ca2e7b10a12a82dc43b215a39b08c3e0d..7fd1cc0c94e827cbd29cb4f7be8c77c1c3fa5aa4 100644 |
| --- a/cc/layers/picture_layer_impl_unittest.cc |
| +++ b/cc/layers/picture_layer_impl_unittest.cc |
| @@ -18,7 +18,6 @@ |
| #include "cc/test/fake_picture_layer_impl.h" |
| #include "cc/test/fake_picture_pile_impl.h" |
| #include "cc/test/geometry_test_utils.h" |
| -#include "cc/test/impl_side_painting_settings.h" |
| #include "cc/test/layer_test_common.h" |
| #include "cc/test/mock_quad_culler.h" |
| #include "cc/test/test_shared_bitmap_manager.h" |
| @@ -46,7 +45,7 @@ class PictureLayerImplTest : public testing::Test { |
| public: |
| PictureLayerImplTest() |
| : proxy_(base::MessageLoopProxy::current()), |
| - host_impl_(ImplSidePaintingSettings(), |
| + host_impl_(LayerTreeSettings(true), |
| &proxy_, |
| &shared_bitmap_manager_), |
| id_(7) {} |
| @@ -197,7 +196,7 @@ class PictureLayerImplTest : public testing::Test { |
| protected: |
| void TestTileGridAlignmentCommon() { |
| // Layer to span 4 raster tiles in x and in y |
| - ImplSidePaintingSettings settings; |
| + LayerTreeSettings settings(true); |
| gfx::Size layer_size( |
| settings.default_tile_size.width() * 7 / 2, |
| settings.default_tile_size.height() * 7 / 2); |
| @@ -2279,5 +2278,529 @@ TEST_F(PictureLayerImplTest, Occlusion) { |
| } |
| } |
| +class NoLowResPictureLayerImplTest : public PictureLayerImplTest { |
| + public: |
| + NoLowResPictureLayerImplTest() |
| + : PictureLayerImplTest(LayerTreeSettings(true, false)) |
|
reveman
2014/05/13 15:38:05
You could just add a NoLowResTilingsSettings class
Sergey
2014/05/14 05:53:35
Done.
|
| + {} |
| +}; |
| + |
| +TEST_F(NoLowResPictureLayerImplTest, ManageTilingsCreatesTilings) { |
| + gfx::Size tile_size(400, 400); |
| + gfx::Size layer_bounds(1300, 1900); |
| + |
| + scoped_refptr<FakePicturePileImpl> pending_pile = |
| + FakePicturePileImpl::CreateFilledPile(tile_size, layer_bounds); |
| + scoped_refptr<FakePicturePileImpl> active_pile = |
| + FakePicturePileImpl::CreateFilledPile(tile_size, layer_bounds); |
| + |
| + float result_scale_x, result_scale_y; |
| + gfx::Size result_bounds; |
| + |
| + SetupTrees(pending_pile, active_pile); |
| + EXPECT_EQ(0u, pending_layer_->tilings()->num_tilings()); |
| + |
| + float low_res_factor = host_impl_.settings().low_res_contents_scale_factor; |
| + EXPECT_LT(low_res_factor, 1.f); |
| + |
| + pending_layer_->CalculateContentsScale(1.3f, // ideal contents scale |
| + 1.7f, // device scale |
| + 3.2f, // page scale |
| + 1.f, // maximum animation scale |
| + false, |
| + &result_scale_x, |
| + &result_scale_y, |
| + &result_bounds); |
| + ASSERT_EQ(1u, pending_layer_->tilings()->num_tilings()); |
| + EXPECT_FLOAT_EQ( |
| + 1.3f, |
| + pending_layer_->tilings()->tiling_at(0)->contents_scale()); |
| + |
| + // If we change the layer's CSS scale factor, then we should not get new |
| + // tilings. |
| + pending_layer_->CalculateContentsScale(1.8f, // ideal contents scale |
| + 1.7f, // device scale |
| + 3.2f, // page scale |
| + 1.f, // maximum animation scale |
| + false, |
| + &result_scale_x, |
| + &result_scale_y, |
| + &result_bounds); |
| + ASSERT_EQ(1u, pending_layer_->tilings()->num_tilings()); |
| + EXPECT_FLOAT_EQ( |
| + 1.3f, |
| + pending_layer_->tilings()->tiling_at(0)->contents_scale()); |
| + |
| + // If we change the page scale factor, then we should get new tilings. |
| + pending_layer_->CalculateContentsScale(1.8f, // ideal contents scale |
| + 1.7f, // device scale |
| + 2.2f, // page scale |
| + 1.f, // maximum animation scale |
| + false, |
| + &result_scale_x, |
| + &result_scale_y, |
| + &result_bounds); |
| + ASSERT_EQ(2u, pending_layer_->tilings()->num_tilings()); |
| + EXPECT_FLOAT_EQ( |
| + 1.8f, |
| + pending_layer_->tilings()->tiling_at(0)->contents_scale()); |
| + |
| + // If we change the device scale factor, then we should get new tilings. |
| + pending_layer_->CalculateContentsScale(1.9f, // ideal contents scale |
| + 1.4f, // device scale |
| + 2.2f, // page scale |
| + 1.f, // maximum animation scale |
| + false, |
| + &result_scale_x, |
| + &result_scale_y, |
| + &result_bounds); |
| + ASSERT_EQ(3u, pending_layer_->tilings()->num_tilings()); |
| + EXPECT_FLOAT_EQ( |
| + 1.9f, |
| + pending_layer_->tilings()->tiling_at(0)->contents_scale()); |
| + |
| + // If we change the device scale factor, but end up at the same total scale |
| + // factor somehow, then we don't get new tilings. |
| + pending_layer_->CalculateContentsScale(1.9f, // ideal contents scale |
| + 2.2f, // device scale |
| + 1.4f, // page scale |
| + 1.f, // maximum animation scale |
| + false, |
| + &result_scale_x, |
| + &result_scale_y, |
| + &result_bounds); |
| + ASSERT_EQ(3u, pending_layer_->tilings()->num_tilings()); |
| + EXPECT_FLOAT_EQ( |
| + 1.9f, |
| + pending_layer_->tilings()->tiling_at(0)->contents_scale()); |
| +} |
| + |
| +TEST_F(NoLowResPictureLayerImplTest, MarkRequiredNullTiles) { |
| + gfx::Size tile_size(100, 100); |
| + gfx::Size layer_bounds(1000, 1000); |
| + |
| + scoped_refptr<FakePicturePileImpl> pending_pile = |
| + FakePicturePileImpl::CreateEmptyPile(tile_size, layer_bounds); |
| + // Layers with entirely empty piles can't get tilings. |
| + pending_pile->AddRecordingAt(0, 0); |
| + |
| + SetupPendingTree(pending_pile); |
| + |
| + ASSERT_TRUE(pending_layer_->CanHaveTilings()); |
| + pending_layer_->AddTiling(1.0f); |
| + pending_layer_->AddTiling(2.0f); |
| + |
| + // It should be safe to call this (and MarkVisibleResourcesAsRequired) |
| + // on a layer with no recordings. |
| + host_impl_.pending_tree()->UpdateDrawProperties(); |
| + pending_layer_->MarkVisibleResourcesAsRequired(); |
| +} |
| + |
| +TEST_F(NoLowResPictureLayerImplTest, NothingRequiredIfAllHighResTilesShared) { |
| + gfx::Size layer_bounds(400, 400); |
| + gfx::Size tile_size(100, 100); |
| + SetupDefaultTreesWithFixedTileSize(layer_bounds, tile_size); |
| + |
| + CreateHighLowResAndSetAllTilesVisible(); |
| + |
| + Tile* some_active_tile = |
| + active_layer_->HighResTiling()->AllTilesForTesting()[0]; |
| + EXPECT_FALSE(some_active_tile->IsReadyToDraw()); |
| + |
| + // All tiles shared (no invalidation), so even though the active tree's |
| + // tiles aren't ready, there is nothing required. |
| + pending_layer_->MarkVisibleResourcesAsRequired(); |
| + AssertNoTilesRequired(pending_layer_->HighResTiling()); |
| + if (host_impl_.settings().create_low_res_tiling) { |
| + AssertNoTilesRequired(pending_layer_->LowResTiling()); |
| + } |
| +} |
| + |
| +TEST_F(NoLowResPictureLayerImplTest, NothingRequiredIfActiveMissingTiles) { |
| + gfx::Size layer_bounds(400, 400); |
| + gfx::Size tile_size(100, 100); |
| + scoped_refptr<FakePicturePileImpl> pending_pile = |
| + FakePicturePileImpl::CreateFilledPile(tile_size, layer_bounds); |
| + // This pile will create tilings, but has no recordings so will not create any |
| + // tiles. This is attempting to simulate scrolling past the end of recorded |
| + // content on the active layer, where the recordings are so far away that |
| + // no tiles are created. |
| + scoped_refptr<FakePicturePileImpl> active_pile = |
| + FakePicturePileImpl::CreateEmptyPileThatThinksItHasRecordings( |
| + tile_size, layer_bounds); |
| + SetupTrees(pending_pile, active_pile); |
| + pending_layer_->set_fixed_tile_size(tile_size); |
| + active_layer_->set_fixed_tile_size(tile_size); |
| + |
| + CreateHighLowResAndSetAllTilesVisible(); |
| + |
| + // Active layer has tilings, but no tiles due to missing recordings. |
| + EXPECT_TRUE(active_layer_->CanHaveTilings()); |
| + EXPECT_EQ( |
| + active_layer_->tilings()->num_tilings(), |
| + host_impl_.settings().create_low_res_tiling ? 2u : 1u); |
| + EXPECT_EQ(active_layer_->HighResTiling()->AllTilesForTesting().size(), 0u); |
| + |
| + // Since the active layer has no tiles at all, the pending layer doesn't |
| + // need content in order to activate. |
| + pending_layer_->MarkVisibleResourcesAsRequired(); |
| + AssertNoTilesRequired(pending_layer_->HighResTiling()); |
| + if (host_impl_.settings().create_low_res_tiling) |
| + AssertNoTilesRequired(pending_layer_->LowResTiling()); |
| +} |
| + |
| +TEST_F(NoLowResPictureLayerImplTest, TileManagerRegisterUnregister) { |
| + gfx::Size tile_size(100, 100); |
| + gfx::Size layer_bounds(400, 400); |
| + |
| + scoped_refptr<FakePicturePileImpl> pending_pile = |
| + FakePicturePileImpl::CreateFilledPile(tile_size, layer_bounds); |
| + scoped_refptr<FakePicturePileImpl> active_pile = |
| + FakePicturePileImpl::CreateFilledPile(tile_size, layer_bounds); |
| + |
| + SetupTrees(pending_pile, active_pile); |
| + |
| + std::vector<TileManager::PairedPictureLayer> paired_layers; |
| + host_impl_.tile_manager()->GetPairedPictureLayers(&paired_layers); |
| + EXPECT_EQ(0u, paired_layers.size()); |
| + |
| + // Update tile priorities will force the layer to register itself. |
| + float dummy_contents_scale_x; |
| + float dummy_contents_scale_y; |
| + gfx::Size dummy_content_bounds; |
| + active_layer_->CalculateContentsScale(1.f, |
| + 1.f, |
| + 1.f, |
| + 1.f, |
| + false, |
| + &dummy_contents_scale_x, |
| + &dummy_contents_scale_y, |
| + &dummy_content_bounds); |
| + active_layer_->UpdateTilePriorities(); |
| + host_impl_.pending_tree()->UpdateDrawProperties(); |
| + pending_layer_->CalculateContentsScale(1.f, |
| + 1.f, |
| + 1.f, |
| + 1.f, |
| + false, |
| + &dummy_contents_scale_x, |
| + &dummy_contents_scale_y, |
| + &dummy_content_bounds); |
| + pending_layer_->UpdateTilePriorities(); |
| + |
| + host_impl_.tile_manager()->GetPairedPictureLayers(&paired_layers); |
| + EXPECT_EQ(1u, paired_layers.size()); |
| + EXPECT_EQ(active_layer_, paired_layers[0].active_layer); |
| + EXPECT_EQ(pending_layer_, paired_layers[0].pending_layer); |
| + |
| + // Destroy and recreate tile manager. |
| + host_impl_.DidLoseOutputSurface(); |
| + scoped_ptr<TestWebGraphicsContext3D> context = |
| + TestWebGraphicsContext3D::Create(); |
| + host_impl_.InitializeRenderer( |
| + FakeOutputSurface::Create3d(context.Pass()).PassAs<OutputSurface>()); |
| + |
| + host_impl_.tile_manager()->GetPairedPictureLayers(&paired_layers); |
| + EXPECT_EQ(0u, paired_layers.size()); |
| + |
| + active_layer_->CalculateContentsScale(1.f, |
| + 1.f, |
| + 1.f, |
| + 1.f, |
| + false, |
| + &dummy_contents_scale_x, |
| + &dummy_contents_scale_y, |
| + &dummy_content_bounds); |
| + active_layer_->UpdateTilePriorities(); |
| + host_impl_.pending_tree()->UpdateDrawProperties(); |
| + pending_layer_->CalculateContentsScale(1.f, |
| + 1.f, |
| + 1.f, |
| + 1.f, |
| + false, |
| + &dummy_contents_scale_x, |
| + &dummy_contents_scale_y, |
| + &dummy_content_bounds); |
| + pending_layer_->UpdateTilePriorities(); |
| + |
| + host_impl_.tile_manager()->GetPairedPictureLayers(&paired_layers); |
| + EXPECT_EQ(1u, paired_layers.size()); |
| + EXPECT_EQ(active_layer_, paired_layers[0].active_layer); |
| + EXPECT_EQ(pending_layer_, paired_layers[0].pending_layer); |
| +} |
| + |
| +TEST_F(NoLowResPictureLayerImplTest, InvalidViewportForPrioritizingTiles) { |
| + base::TimeTicks time_ticks; |
| + host_impl_.SetCurrentFrameTimeTicks(time_ticks); |
| + |
| + gfx::Size tile_size(100, 100); |
| + gfx::Size layer_bounds(400, 400); |
| + |
| + scoped_refptr<FakePicturePileImpl> pending_pile = |
| + FakePicturePileImpl::CreateFilledPile(tile_size, layer_bounds); |
| + scoped_refptr<FakePicturePileImpl> active_pile = |
| + FakePicturePileImpl::CreateFilledPile(tile_size, layer_bounds); |
| + |
| + SetupTrees(pending_pile, active_pile); |
| + |
| + Region invalidation; |
| + AddDefaultTilingsWithInvalidation(invalidation); |
| + float dummy_contents_scale_x; |
| + float dummy_contents_scale_y; |
| + gfx::Size dummy_content_bounds; |
| + active_layer_->CalculateContentsScale(1.f, |
| + 1.f, |
| + 1.f, |
| + 1.f, |
| + false, |
| + &dummy_contents_scale_x, |
| + &dummy_contents_scale_y, |
| + &dummy_content_bounds); |
| + |
| + // UpdateTilePriorities with valid viewport. Should update tile viewport. |
| + bool valid_for_tile_management = true; |
| + gfx::Rect viewport = gfx::Rect(layer_bounds); |
| + gfx::Transform transform; |
| + host_impl_.SetExternalDrawConstraints( |
| + transform, viewport, viewport, valid_for_tile_management); |
| + active_layer_->draw_properties().visible_content_rect = viewport; |
| + active_layer_->draw_properties().screen_space_transform = transform; |
| + active_layer_->UpdateTilePriorities(); |
| + |
| + gfx::Rect visible_rect_for_tile_priority = |
| + active_layer_->visible_rect_for_tile_priority(); |
| + EXPECT_FALSE(visible_rect_for_tile_priority.IsEmpty()); |
| + gfx::Size viewport_size_for_tile_priority = |
| + active_layer_->viewport_size_for_tile_priority(); |
| + EXPECT_FALSE(viewport_size_for_tile_priority.IsEmpty()); |
| + gfx::Transform screen_space_transform_for_tile_priority = |
| + active_layer_->screen_space_transform_for_tile_priority(); |
| + |
| + // Expand viewport and set it as invalid for prioritizing tiles. |
| + // Should not update tile viewport. |
| + time_ticks += base::TimeDelta::FromMilliseconds(200); |
| + host_impl_.SetCurrentFrameTimeTicks(time_ticks); |
| + valid_for_tile_management = false; |
| + viewport = gfx::ScaleToEnclosingRect(viewport, 2); |
| + transform.Translate(1.f, 1.f); |
| + active_layer_->draw_properties().visible_content_rect = viewport; |
| + active_layer_->draw_properties().screen_space_transform = transform; |
| + host_impl_.SetExternalDrawConstraints( |
| + transform, viewport, viewport, valid_for_tile_management); |
| + active_layer_->UpdateTilePriorities(); |
| + |
| + EXPECT_RECT_EQ(visible_rect_for_tile_priority, |
| + active_layer_->visible_rect_for_tile_priority()); |
| + EXPECT_SIZE_EQ(viewport_size_for_tile_priority, |
| + active_layer_->viewport_size_for_tile_priority()); |
| + EXPECT_TRANSFORMATION_MATRIX_EQ( |
| + screen_space_transform_for_tile_priority, |
| + active_layer_->screen_space_transform_for_tile_priority()); |
| + |
| + // Keep expanded viewport but mark it valid. Should update tile viewport. |
| + time_ticks += base::TimeDelta::FromMilliseconds(200); |
| + host_impl_.SetCurrentFrameTimeTicks(time_ticks); |
| + valid_for_tile_management = true; |
| + host_impl_.SetExternalDrawConstraints( |
| + transform, viewport, viewport, valid_for_tile_management); |
| + active_layer_->UpdateTilePriorities(); |
| + |
| + EXPECT_FALSE(visible_rect_for_tile_priority == |
| + active_layer_->visible_rect_for_tile_priority()); |
| + EXPECT_FALSE(viewport_size_for_tile_priority == |
| + active_layer_->viewport_size_for_tile_priority()); |
| + EXPECT_FALSE(screen_space_transform_for_tile_priority == |
| + active_layer_->screen_space_transform_for_tile_priority()); |
| +} |
| + |
| +TEST_F(NoLowResPictureLayerImplTest, InvalidViewportAfterReleaseResources) { |
| + base::TimeTicks time_ticks; |
| + host_impl_.SetCurrentFrameTimeTicks(time_ticks); |
| + |
| + gfx::Size tile_size(100, 100); |
| + gfx::Size layer_bounds(400, 400); |
| + |
| + scoped_refptr<FakePicturePileImpl> pending_pile = |
| + FakePicturePileImpl::CreateFilledPile(tile_size, layer_bounds); |
| + scoped_refptr<FakePicturePileImpl> active_pile = |
| + FakePicturePileImpl::CreateFilledPile(tile_size, layer_bounds); |
| + |
| + SetupTrees(pending_pile, active_pile); |
| + |
| + Region invalidation; |
| + AddDefaultTilingsWithInvalidation(invalidation); |
| + |
| + bool valid_for_tile_management = false; |
| + gfx::Rect viewport = gfx::Rect(layer_bounds); |
| + host_impl_.SetExternalDrawConstraints( |
| + gfx::Transform(), viewport, viewport, valid_for_tile_management); |
| + ResetTilingsAndRasterScales(); |
| + host_impl_.pending_tree()->UpdateDrawProperties(); |
| + host_impl_.active_tree()->UpdateDrawProperties(); |
| + EXPECT_TRUE(active_layer_->HighResTiling()); |
| + |
| + size_t num_tilings = active_layer_->num_tilings(); |
| + active_layer_->UpdateTilePriorities(); |
| + pending_layer_->AddTiling(0.5f); |
| + EXPECT_EQ(num_tilings + 1, active_layer_->num_tilings()); |
| +} |
| + |
| +TEST_F(NoLowResPictureLayerImplTest, CleanUpTilings) { |
| + gfx::Size tile_size(400, 400); |
| + gfx::Size layer_bounds(1300, 1900); |
| + |
| + scoped_refptr<FakePicturePileImpl> pending_pile = |
| + FakePicturePileImpl::CreateFilledPile(tile_size, layer_bounds); |
| + scoped_refptr<FakePicturePileImpl> active_pile = |
| + FakePicturePileImpl::CreateFilledPile(tile_size, layer_bounds); |
| + |
| + float result_scale_x, result_scale_y; |
| + gfx::Size result_bounds; |
| + std::vector<PictureLayerTiling*> used_tilings; |
| + |
| + SetupTrees(pending_pile, active_pile); |
| + EXPECT_EQ(0u, pending_layer_->tilings()->num_tilings()); |
| + |
| + float low_res_factor = host_impl_.settings().low_res_contents_scale_factor; |
| + EXPECT_LT(low_res_factor, 1.f); |
| + |
| + float device_scale = 1.7f; |
| + float page_scale = 3.2f; |
| + |
| + SetContentsScaleOnBothLayers(1.f, device_scale, page_scale, 1.f, false); |
| + ASSERT_EQ(1u, active_layer_->tilings()->num_tilings()); |
| + |
| + // We only have ideal tilings, so they aren't removed. |
| + used_tilings.clear(); |
| + active_layer_->CleanUpTilingsOnActiveLayer(used_tilings); |
| + ASSERT_EQ(1u, active_layer_->tilings()->num_tilings()); |
| + |
| + // Changing the ideal but not creating new tilings. |
| + SetContentsScaleOnBothLayers(1.5f, device_scale, page_scale, 1.f, false); |
| + ASSERT_EQ(1u, active_layer_->tilings()->num_tilings()); |
| + |
| + // The tilings are still our target scale, so they aren't removed. |
| + used_tilings.clear(); |
| + active_layer_->CleanUpTilingsOnActiveLayer(used_tilings); |
| + ASSERT_EQ(1u, active_layer_->tilings()->num_tilings()); |
| + |
| + // Create a 1.2 scale tiling. Now we have 1.0 and 1.2 tilings. Ideal = 1.2. |
| + page_scale = 1.2f; |
| + SetContentsScaleOnBothLayers(1.2f, device_scale, page_scale, 1.f, false); |
| + ASSERT_EQ(2u, active_layer_->tilings()->num_tilings()); |
| + EXPECT_FLOAT_EQ( |
| + 1.f, |
| + active_layer_->tilings()->tiling_at(1)->contents_scale()); |
| + |
| + // Mark the non-ideal tilings as used. They won't be removed. |
| + used_tilings.clear(); |
| + used_tilings.push_back(active_layer_->tilings()->tiling_at(1)); |
| + used_tilings.push_back(active_layer_->tilings()->tiling_at(3)); |
| + active_layer_->CleanUpTilingsOnActiveLayer(used_tilings); |
| + ASSERT_EQ(2u, active_layer_->tilings()->num_tilings()); |
| + |
| + // Now move the ideal scale to 0.5. Our target stays 1.2. |
| + SetContentsScaleOnBothLayers(0.5f, device_scale, page_scale, 1.f, false); |
| + |
| + // The high resolution tiling is between target and ideal, so is not |
| + // removed. The low res tiling for the old ideal=1.0 scale is removed. |
| + used_tilings.clear(); |
| + active_layer_->CleanUpTilingsOnActiveLayer(used_tilings); |
| + ASSERT_EQ(2u, active_layer_->tilings()->num_tilings()); |
| + |
| + // Now move the ideal scale to 1.0. Our target stays 1.2. |
| + SetContentsScaleOnBothLayers(1.f, device_scale, page_scale, 1.f, false); |
| + |
| + // All the tilings are between are target and the ideal, so they are not |
| + // removed. |
| + used_tilings.clear(); |
| + active_layer_->CleanUpTilingsOnActiveLayer(used_tilings); |
| + ASSERT_EQ(2u, active_layer_->tilings()->num_tilings()); |
| + |
| + // Now move the ideal scale to 1.1 on the active layer. Our target stays 1.2. |
| + active_layer_->CalculateContentsScale(1.1f, |
| + device_scale, |
| + page_scale, |
| + 1.f, |
| + false, |
| + &result_scale_x, |
| + &result_scale_y, |
| + &result_bounds); |
| + |
| + // Because the pending layer's ideal scale is still 1.0, our tilings fall |
| + // in the range [1.0,1.2] and are kept. |
| + used_tilings.clear(); |
| + active_layer_->CleanUpTilingsOnActiveLayer(used_tilings); |
| + ASSERT_EQ(2u, active_layer_->tilings()->num_tilings()); |
| + |
| + // Move the ideal scale on the pending layer to 1.1 as well. Our target stays |
| + // 1.2 still. |
| + pending_layer_->CalculateContentsScale(1.1f, |
| + device_scale, |
| + page_scale, |
| + 1.f, |
| + false, |
| + &result_scale_x, |
| + &result_scale_y, |
| + &result_bounds); |
| + |
| + // Our 1.0 tiling now falls outside the range between our ideal scale and our |
| + // target raster scale. But it is in our used tilings set, so nothing is |
| + // deleted. |
| + used_tilings.clear(); |
| + used_tilings.push_back(active_layer_->tilings()->tiling_at(1)); |
| + active_layer_->CleanUpTilingsOnActiveLayer(used_tilings); |
| + ASSERT_EQ(2u, active_layer_->tilings()->num_tilings()); |
| + |
| + // If we remove it from our used tilings set, it is outside the range to keep |
| + // so it is deleted. |
| + used_tilings.clear(); |
| + active_layer_->CleanUpTilingsOnActiveLayer(used_tilings); |
| + ASSERT_EQ(1u, active_layer_->tilings()->num_tilings()); |
| +} |
| + |
| +TEST_F(NoLowResPictureLayerImplTest, ReleaseResources) { |
| + gfx::Size tile_size(400, 400); |
| + gfx::Size layer_bounds(1300, 1900); |
| + |
| + scoped_refptr<FakePicturePileImpl> pending_pile = |
| + FakePicturePileImpl::CreateFilledPile(tile_size, layer_bounds); |
| + scoped_refptr<FakePicturePileImpl> active_pile = |
| + FakePicturePileImpl::CreateFilledPile(tile_size, layer_bounds); |
| + |
| + float result_scale_x, result_scale_y; |
| + gfx::Size result_bounds; |
| + |
| + SetupTrees(pending_pile, active_pile); |
| + EXPECT_EQ(0u, pending_layer_->tilings()->num_tilings()); |
| + |
| + pending_layer_->CalculateContentsScale(1.3f, // ideal contents scale |
| + 2.7f, // device scale |
| + 3.2f, // page scale |
| + 1.f, // maximum animation scale |
| + false, |
| + &result_scale_x, |
| + &result_scale_y, |
| + &result_bounds); |
| + EXPECT_EQ(1u, pending_layer_->tilings()->num_tilings()); |
| + |
| + // All tilings should be removed when losing output surface. |
| + active_layer_->ReleaseResources(); |
| + EXPECT_EQ(0u, active_layer_->tilings()->num_tilings()); |
| + pending_layer_->ReleaseResources(); |
| + EXPECT_EQ(0u, pending_layer_->tilings()->num_tilings()); |
| + |
| + // This should create new tilings. |
| + pending_layer_->CalculateContentsScale(1.3f, // ideal contents scale |
| + 2.7f, // device scale |
| + 3.2f, // page scale |
| + 1.f, // maximum animation scale |
| + false, |
| + &result_scale_x, |
| + &result_scale_y, |
| + &result_bounds); |
| + EXPECT_EQ(1u, pending_layer_->tilings()->num_tilings()); |
| +} |
| + |
| } // namespace |
| } // namespace cc |