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 |
deleted file mode 100644 |
index 1ed32874972cea3acad86707ce7e3ed0b14701e5..0000000000000000000000000000000000000000 |
--- a/cc/layers/picture_layer_impl_unittest.cc |
+++ /dev/null |
@@ -1,4978 +0,0 @@ |
-// Copyright 2013 The Chromium Authors. All rights reserved. |
-// Use of this source code is governed by a BSD-style license that can be |
-// found in the LICENSE file. |
- |
-#include "cc/layers/picture_layer_impl.h" |
- |
-#include <algorithm> |
-#include <limits> |
-#include <set> |
-#include <utility> |
- |
-#include "cc/base/math_util.h" |
-#include "cc/layers/append_quads_data.h" |
-#include "cc/layers/picture_layer.h" |
-#include "cc/quads/draw_quad.h" |
-#include "cc/quads/tile_draw_quad.h" |
-#include "cc/resources/tiling_set_raster_queue_all.h" |
-#include "cc/resources/tiling_set_raster_queue_required.h" |
-#include "cc/test/begin_frame_args_test.h" |
-#include "cc/test/fake_content_layer_client.h" |
-#include "cc/test/fake_impl_proxy.h" |
-#include "cc/test/fake_layer_tree_host_impl.h" |
-#include "cc/test/fake_output_surface.h" |
-#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/test_shared_bitmap_manager.h" |
-#include "cc/test/test_task_graph_runner.h" |
-#include "cc/test/test_web_graphics_context_3d.h" |
-#include "cc/trees/layer_tree_impl.h" |
-#include "testing/gtest/include/gtest/gtest.h" |
-#include "ui/gfx/geometry/rect_conversions.h" |
-#include "ui/gfx/geometry/size_conversions.h" |
- |
-namespace cc { |
-namespace { |
- |
-#define EXPECT_BOTH_EQ(expression, x) \ |
- do { \ |
- EXPECT_EQ(x, pending_layer_->expression); \ |
- EXPECT_EQ(x, active_layer_->expression); \ |
- } while (false) |
- |
-#define EXPECT_BOTH_NE(expression, x) \ |
- do { \ |
- EXPECT_NE(x, pending_layer_->expression); \ |
- EXPECT_NE(x, active_layer_->expression); \ |
- } while (false) |
- |
-class MockCanvas : public SkCanvas { |
- public: |
- explicit MockCanvas(int w, int h) : SkCanvas(w, h) {} |
- |
- void onDrawRect(const SkRect& rect, const SkPaint& paint) override { |
- // Capture calls before SkCanvas quickReject() kicks in. |
- rects_.push_back(rect); |
- } |
- |
- std::vector<SkRect> rects_; |
-}; |
- |
-class NoLowResTilingsSettings : public ImplSidePaintingSettings {}; |
- |
-class LowResTilingsSettings : public ImplSidePaintingSettings { |
- public: |
- LowResTilingsSettings() { create_low_res_tiling = true; } |
-}; |
- |
-class PictureLayerImplTest : public testing::Test { |
- public: |
- PictureLayerImplTest() |
- : proxy_(base::MessageLoopProxy::current()), |
- host_impl_(LowResTilingsSettings(), |
- &proxy_, |
- &shared_bitmap_manager_, |
- &task_graph_runner_), |
- root_id_(6), |
- id_(7), |
- pending_layer_(nullptr), |
- old_pending_layer_(nullptr), |
- active_layer_(nullptr) { |
- host_impl_.SetViewportSize(gfx::Size(10000, 10000)); |
- } |
- |
- explicit PictureLayerImplTest(const LayerTreeSettings& settings) |
- : proxy_(base::MessageLoopProxy::current()), |
- host_impl_(settings, |
- &proxy_, |
- &shared_bitmap_manager_, |
- &task_graph_runner_), |
- root_id_(6), |
- id_(7) { |
- host_impl_.SetViewportSize(gfx::Size(10000, 10000)); |
- } |
- |
- ~PictureLayerImplTest() override {} |
- |
- void SetUp() override { InitializeRenderer(); } |
- |
- virtual void InitializeRenderer() { |
- host_impl_.InitializeRenderer(FakeOutputSurface::Create3d()); |
- } |
- |
- void SetupDefaultTrees(const gfx::Size& layer_bounds) { |
- gfx::Size tile_size(100, 100); |
- |
- 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); |
- } |
- |
- void SetupDefaultTreesWithInvalidation(const gfx::Size& layer_bounds, |
- const Region& invalidation) { |
- gfx::Size tile_size(100, 100); |
- |
- scoped_refptr<FakePicturePileImpl> pending_pile = |
- FakePicturePileImpl::CreateFilledPile(tile_size, layer_bounds); |
- scoped_refptr<FakePicturePileImpl> active_pile = |
- FakePicturePileImpl::CreateFilledPile(tile_size, layer_bounds); |
- |
- SetupTreesWithInvalidation(pending_pile, active_pile, invalidation); |
- } |
- |
- void ActivateTree() { |
- host_impl_.ActivateSyncTree(); |
- CHECK(!host_impl_.pending_tree()); |
- CHECK(host_impl_.recycle_tree()); |
- old_pending_layer_ = pending_layer_; |
- pending_layer_ = nullptr; |
- active_layer_ = static_cast<FakePictureLayerImpl*>( |
- host_impl_.active_tree()->LayerById(id_)); |
- |
- bool update_lcd_text = false; |
- host_impl_.active_tree()->UpdateDrawProperties(update_lcd_text); |
- } |
- |
- void SetupDefaultTreesWithFixedTileSize(const gfx::Size& layer_bounds, |
- const gfx::Size& tile_size, |
- const Region& invalidation) { |
- gfx::Size pile_tile_size(100, 100); |
- |
- scoped_refptr<FakePicturePileImpl> pending_pile = |
- FakePicturePileImpl::CreateFilledPile(pile_tile_size, layer_bounds); |
- scoped_refptr<FakePicturePileImpl> active_pile = |
- FakePicturePileImpl::CreateFilledPile(pile_tile_size, layer_bounds); |
- |
- SetupTreesWithFixedTileSize(pending_pile, active_pile, tile_size, |
- invalidation); |
- } |
- |
- void SetupTrees( |
- scoped_refptr<PicturePileImpl> pending_pile, |
- scoped_refptr<PicturePileImpl> active_pile) { |
- SetupPendingTree(active_pile); |
- ActivateTree(); |
- SetupPendingTreeInternal(pending_pile, gfx::Size(), Region()); |
- } |
- |
- void SetupTreesWithInvalidation(scoped_refptr<PicturePileImpl> pending_pile, |
- scoped_refptr<PicturePileImpl> active_pile, |
- const Region& pending_invalidation) { |
- SetupPendingTreeInternal(active_pile, gfx::Size(), Region()); |
- ActivateTree(); |
- SetupPendingTreeInternal(pending_pile, gfx::Size(), pending_invalidation); |
- } |
- |
- void SetupTreesWithFixedTileSize(scoped_refptr<PicturePileImpl> pending_pile, |
- scoped_refptr<PicturePileImpl> active_pile, |
- const gfx::Size& tile_size, |
- const Region& pending_invalidation) { |
- SetupPendingTreeInternal(active_pile, tile_size, Region()); |
- ActivateTree(); |
- SetupPendingTreeInternal(pending_pile, tile_size, pending_invalidation); |
- } |
- |
- void SetupPendingTree(scoped_refptr<RasterSource> raster_source) { |
- SetupPendingTreeInternal(raster_source, gfx::Size(), Region()); |
- } |
- |
- void SetupPendingTreeWithInvalidation( |
- scoped_refptr<RasterSource> raster_source, |
- const Region& invalidation) { |
- SetupPendingTreeInternal(raster_source, gfx::Size(), invalidation); |
- } |
- |
- void SetupPendingTreeWithFixedTileSize( |
- scoped_refptr<RasterSource> raster_source, |
- const gfx::Size& tile_size, |
- const Region& invalidation) { |
- SetupPendingTreeInternal(raster_source, tile_size, invalidation); |
- } |
- |
- void SetupPendingTreeInternal(scoped_refptr<RasterSource> raster_source, |
- const gfx::Size& tile_size, |
- const Region& invalidation) { |
- host_impl_.CreatePendingTree(); |
- host_impl_.pending_tree()->PushPageScaleFromMainThread(1.f, 0.25f, 100.f); |
- LayerTreeImpl* pending_tree = host_impl_.pending_tree(); |
- |
- // Steal from the recycled tree if possible. |
- scoped_ptr<LayerImpl> pending_root = pending_tree->DetachLayerTree(); |
- scoped_ptr<FakePictureLayerImpl> pending_layer; |
- DCHECK_IMPLIES(pending_root, pending_root->id() == root_id_); |
- if (!pending_root) { |
- pending_root = LayerImpl::Create(pending_tree, root_id_); |
- pending_layer = FakePictureLayerImpl::Create(pending_tree, id_); |
- if (!tile_size.IsEmpty()) |
- pending_layer->set_fixed_tile_size(tile_size); |
- pending_layer->SetDrawsContent(true); |
- } else { |
- pending_layer.reset(static_cast<FakePictureLayerImpl*>( |
- pending_root->RemoveChild(pending_root->children()[0]).release())); |
- if (!tile_size.IsEmpty()) |
- pending_layer->set_fixed_tile_size(tile_size); |
- } |
- pending_root->SetHasRenderSurface(true); |
- // The bounds() just mirror the pile size. |
- pending_layer->SetBounds(raster_source->GetSize()); |
- pending_layer->SetContentBounds(raster_source->GetSize()); |
- pending_layer->SetRasterSourceOnPending(raster_source, invalidation); |
- |
- pending_root->AddChild(pending_layer.Pass()); |
- pending_tree->SetRootLayer(pending_root.Pass()); |
- |
- pending_layer_ = static_cast<FakePictureLayerImpl*>( |
- host_impl_.pending_tree()->LayerById(id_)); |
- |
- // Add tilings/tiles for the layer. |
- bool update_lcd_text = false; |
- host_impl_.pending_tree()->UpdateDrawProperties(update_lcd_text); |
- } |
- |
- void SetupDrawPropertiesAndUpdateTiles(FakePictureLayerImpl* layer, |
- float ideal_contents_scale, |
- float device_scale_factor, |
- float page_scale_factor, |
- float maximum_animation_contents_scale, |
- bool animating_transform_to_screen) { |
- layer->draw_properties().ideal_contents_scale = ideal_contents_scale; |
- layer->draw_properties().device_scale_factor = device_scale_factor; |
- layer->draw_properties().page_scale_factor = page_scale_factor; |
- layer->draw_properties().maximum_animation_contents_scale = |
- maximum_animation_contents_scale; |
- layer->draw_properties().screen_space_transform_is_animating = |
- animating_transform_to_screen; |
- bool resourceless_software_draw = false; |
- layer->UpdateTiles(resourceless_software_draw); |
- } |
- static void VerifyAllTilesExistAndHavePile( |
- const PictureLayerTiling* tiling, |
- PicturePileImpl* pile) { |
- for (PictureLayerTiling::CoverageIterator iter( |
- tiling, |
- tiling->contents_scale(), |
- gfx::Rect(tiling->tiling_size())); |
- iter; |
- ++iter) { |
- EXPECT_TRUE(*iter); |
- EXPECT_EQ(pile, iter->raster_source()); |
- } |
- } |
- |
- void SetContentsScaleOnBothLayers(float contents_scale, |
- float device_scale_factor, |
- float page_scale_factor, |
- float maximum_animation_contents_scale, |
- bool animating_transform) { |
- SetupDrawPropertiesAndUpdateTiles(pending_layer_, |
- contents_scale, |
- device_scale_factor, |
- page_scale_factor, |
- maximum_animation_contents_scale, |
- animating_transform); |
- |
- SetupDrawPropertiesAndUpdateTiles(active_layer_, |
- contents_scale, |
- device_scale_factor, |
- page_scale_factor, |
- maximum_animation_contents_scale, |
- animating_transform); |
- } |
- |
- void ResetTilingsAndRasterScales() { |
- pending_layer_->ReleaseResources(); |
- EXPECT_FALSE(pending_layer_->tilings()); |
- pending_layer_->RecreateResources(); |
- EXPECT_EQ(0u, pending_layer_->tilings()->num_tilings()); |
- |
- active_layer_->ReleaseResources(); |
- EXPECT_FALSE(active_layer_->tilings()); |
- active_layer_->RecreateResources(); |
- EXPECT_EQ(0u, active_layer_->tilings()->num_tilings()); |
- } |
- |
- void AssertAllTilesRequired(PictureLayerTiling* tiling) { |
- std::vector<Tile*> tiles = tiling->AllTilesForTesting(); |
- for (size_t i = 0; i < tiles.size(); ++i) |
- EXPECT_TRUE(tiles[i]->required_for_activation()) << "i: " << i; |
- EXPECT_GT(tiles.size(), 0u); |
- } |
- |
- void AssertNoTilesRequired(PictureLayerTiling* tiling) { |
- std::vector<Tile*> tiles = tiling->AllTilesForTesting(); |
- for (size_t i = 0; i < tiles.size(); ++i) |
- EXPECT_FALSE(tiles[i]->required_for_activation()) << "i: " << i; |
- EXPECT_GT(tiles.size(), 0u); |
- } |
- |
- protected: |
- void TestQuadsForSolidColor(bool test_for_solid); |
- |
- FakeImplProxy proxy_; |
- TestSharedBitmapManager shared_bitmap_manager_; |
- TestTaskGraphRunner task_graph_runner_; |
- FakeLayerTreeHostImpl host_impl_; |
- int root_id_; |
- int id_; |
- FakePictureLayerImpl* pending_layer_; |
- FakePictureLayerImpl* old_pending_layer_; |
- FakePictureLayerImpl* active_layer_; |
- |
- private: |
- DISALLOW_COPY_AND_ASSIGN(PictureLayerImplTest); |
-}; |
- |
-class NoLowResPictureLayerImplTest : public PictureLayerImplTest { |
- public: |
- NoLowResPictureLayerImplTest() |
- : PictureLayerImplTest(NoLowResTilingsSettings()) {} |
-}; |
- |
-TEST_F(PictureLayerImplTest, TileGridAlignment) { |
- // Layer to span 4 raster tiles in x and in y |
- ImplSidePaintingSettings settings; |
- gfx::Size layer_size(settings.default_tile_size.width() * 7 / 2, |
- settings.default_tile_size.height() * 7 / 2); |
- |
- scoped_refptr<FakePicturePileImpl> pending_pile = |
- FakePicturePileImpl::CreateFilledPile(layer_size, layer_size); |
- |
- scoped_ptr<FakePicturePile> active_recording = |
- FakePicturePile::CreateFilledPile(layer_size, layer_size); |
- scoped_refptr<FakePicturePileImpl> active_pile = |
- FakePicturePileImpl::CreateFromPile(active_recording.get(), nullptr); |
- |
- SetupTrees(pending_pile, active_pile); |
- |
- // Add 1x1 rects at the centers of each tile, then re-record pile contents |
- active_layer_->tilings()->tiling_at(0)->CreateAllTilesForTesting(); |
- std::vector<Tile*> tiles = |
- active_layer_->tilings()->tiling_at(0)->AllTilesForTesting(); |
- EXPECT_EQ(16u, tiles.size()); |
- std::vector<SkRect> rects; |
- std::vector<Tile*>::const_iterator tile_iter; |
- for (tile_iter = tiles.begin(); tile_iter < tiles.end(); tile_iter++) { |
- gfx::Point tile_center = (*tile_iter)->content_rect().CenterPoint(); |
- gfx::Rect rect(tile_center.x(), tile_center.y(), 1, 1); |
- active_recording->add_draw_rect(rect); |
- rects.push_back(SkRect::MakeXYWH(rect.x(), rect.y(), 1, 1)); |
- } |
- |
- // Force re-raster with newly injected content |
- active_recording->RemoveRecordingAt(0, 0); |
- active_recording->AddRecordingAt(0, 0); |
- |
- scoped_refptr<FakePicturePileImpl> updated_active_pile = |
- FakePicturePileImpl::CreateFromPile(active_recording.get(), nullptr); |
- |
- std::vector<SkRect>::const_iterator rect_iter = rects.begin(); |
- for (tile_iter = tiles.begin(); tile_iter < tiles.end(); tile_iter++) { |
- MockCanvas mock_canvas(1000, 1000); |
- updated_active_pile->PlaybackToSharedCanvas( |
- &mock_canvas, (*tile_iter)->content_rect(), 1.0f); |
- |
- // This test verifies that when drawing the contents of a specific tile |
- // at content scale 1.0, the playback canvas never receives content from |
- // neighboring tiles which indicates that the tile grid embedded in |
- // SkPicture is perfectly aligned with the compositor's tiles. |
- EXPECT_EQ(1u, mock_canvas.rects_.size()); |
- EXPECT_EQ(*rect_iter, mock_canvas.rects_[0]); |
- rect_iter++; |
- } |
-} |
- |
-TEST_F(PictureLayerImplTest, CloneNoInvalidation) { |
- 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); |
- |
- SetupTreesWithInvalidation(pending_pile, active_pile, Region()); |
- |
- EXPECT_EQ(pending_layer_->tilings()->num_tilings(), |
- active_layer_->tilings()->num_tilings()); |
- |
- const PictureLayerTilingSet* tilings = pending_layer_->tilings(); |
- EXPECT_GT(tilings->num_tilings(), 0u); |
- for (size_t i = 0; i < tilings->num_tilings(); ++i) |
- VerifyAllTilesExistAndHavePile(tilings->tiling_at(i), pending_pile.get()); |
-} |
- |
-TEST_F(PictureLayerImplTest, ExternalViewportRectForPrioritizingTiles) { |
- base::TimeTicks time_ticks; |
- time_ticks += base::TimeDelta::FromMilliseconds(1); |
- host_impl_.SetCurrentBeginFrameArgs( |
- CreateBeginFrameArgsForTesting(BEGINFRAME_FROM_HERE, 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); |
- |
- SetupTreesWithInvalidation(pending_pile, active_pile, Region()); |
- |
- SetupDrawPropertiesAndUpdateTiles(active_layer_, 1.f, 1.f, 1.f, 1.f, false); |
- |
- time_ticks += base::TimeDelta::FromMilliseconds(200); |
- host_impl_.SetCurrentBeginFrameArgs( |
- CreateBeginFrameArgsForTesting(BEGINFRAME_FROM_HERE, time_ticks)); |
- |
- // Update tiles with viewport for tile priority as (0, 0, 100, 100) and the |
- // identify transform for tile priority. |
- bool resourceless_software_draw = false; |
- gfx::Rect viewport = gfx::Rect(layer_bounds), |
- viewport_rect_for_tile_priority = gfx::Rect(0, 0, 100, 100); |
- gfx::Transform transform, transform_for_tile_priority; |
- |
- host_impl_.SetExternalDrawConstraints(transform, |
- viewport, |
- viewport, |
- viewport_rect_for_tile_priority, |
- transform_for_tile_priority, |
- resourceless_software_draw); |
- bool update_lcd_text = false; |
- host_impl_.active_tree()->UpdateDrawProperties(update_lcd_text); |
- |
- gfx::Rect viewport_rect_for_tile_priority_in_view_space = |
- viewport_rect_for_tile_priority; |
- |
- // Verify the viewport rect for tile priority is used in picture layer tiling. |
- EXPECT_EQ(viewport_rect_for_tile_priority_in_view_space, |
- active_layer_->viewport_rect_for_tile_priority_in_content_space()); |
- PictureLayerTilingSet* tilings = active_layer_->tilings(); |
- for (size_t i = 0; i < tilings->num_tilings(); i++) { |
- PictureLayerTiling* tiling = tilings->tiling_at(i); |
- EXPECT_EQ( |
- tiling->GetCurrentVisibleRectForTesting(), |
- gfx::ScaleToEnclosingRect(viewport_rect_for_tile_priority_in_view_space, |
- tiling->contents_scale())); |
- } |
- |
- // Update tiles with viewport for tile priority as (200, 200, 100, 100) in |
- // screen space and the transform for tile priority is translated and |
- // rotated. The actual viewport for tile priority used by PictureLayerImpl |
- // should be (200, 200, 100, 100) applied with the said transform. |
- time_ticks += base::TimeDelta::FromMilliseconds(200); |
- host_impl_.SetCurrentBeginFrameArgs( |
- CreateBeginFrameArgsForTesting(BEGINFRAME_FROM_HERE, time_ticks)); |
- |
- viewport_rect_for_tile_priority = gfx::Rect(200, 200, 100, 100); |
- transform_for_tile_priority.Translate(100, 100); |
- transform_for_tile_priority.Rotate(45); |
- host_impl_.SetExternalDrawConstraints(transform, |
- viewport, |
- viewport, |
- viewport_rect_for_tile_priority, |
- transform_for_tile_priority, |
- resourceless_software_draw); |
- host_impl_.active_tree()->UpdateDrawProperties(update_lcd_text); |
- |
- gfx::Transform screen_to_view(gfx::Transform::kSkipInitialization); |
- bool success = transform_for_tile_priority.GetInverse(&screen_to_view); |
- EXPECT_TRUE(success); |
- |
- // Note that we don't clip this to the layer bounds, since it is expected that |
- // the rect will sometimes be outside of the layer bounds. If we clip to |
- // bounds, then tile priorities will end up being incorrect in cases of fully |
- // offscreen layer. |
- viewport_rect_for_tile_priority_in_view_space = |
- gfx::ToEnclosingRect(MathUtil::ProjectClippedRect( |
- screen_to_view, viewport_rect_for_tile_priority)); |
- |
- EXPECT_EQ(viewport_rect_for_tile_priority_in_view_space, |
- active_layer_->viewport_rect_for_tile_priority_in_content_space()); |
- tilings = active_layer_->tilings(); |
- for (size_t i = 0; i < tilings->num_tilings(); i++) { |
- PictureLayerTiling* tiling = tilings->tiling_at(i); |
- EXPECT_EQ( |
- tiling->GetCurrentVisibleRectForTesting(), |
- gfx::ScaleToEnclosingRect(viewport_rect_for_tile_priority_in_view_space, |
- tiling->contents_scale())); |
- } |
-} |
- |
-TEST_F(PictureLayerImplTest, InvalidViewportForPrioritizingTiles) { |
- base::TimeTicks time_ticks; |
- time_ticks += base::TimeDelta::FromMilliseconds(1); |
- host_impl_.SetCurrentBeginFrameArgs( |
- CreateBeginFrameArgsForTesting(BEGINFRAME_FROM_HERE, 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); |
- |
- SetupTreesWithInvalidation(pending_pile, active_pile, Region()); |
- |
- SetupDrawPropertiesAndUpdateTiles(active_layer_, 1.f, 1.f, 1.f, 1.f, false); |
- |
- // UpdateTiles with valid viewport. Should update tile viewport. |
- // Note viewport is considered invalid if and only if in resourceless |
- // software draw. |
- bool resourceless_software_draw = false; |
- gfx::Rect viewport = gfx::Rect(layer_bounds); |
- gfx::Transform transform; |
- host_impl_.SetExternalDrawConstraints(transform, |
- viewport, |
- viewport, |
- viewport, |
- transform, |
- resourceless_software_draw); |
- active_layer_->draw_properties().visible_content_rect = viewport; |
- active_layer_->draw_properties().screen_space_transform = transform; |
- active_layer_->UpdateTiles(resourceless_software_draw); |
- |
- gfx::Rect visible_rect_for_tile_priority = |
- active_layer_->visible_rect_for_tile_priority(); |
- EXPECT_FALSE(visible_rect_for_tile_priority.IsEmpty()); |
- gfx::Transform screen_space_transform_for_tile_priority = |
- active_layer_->screen_space_transform(); |
- |
- // Expand viewport and set it as invalid for prioritizing tiles. |
- // Should update viewport and transform, but not update visible rect. |
- time_ticks += base::TimeDelta::FromMilliseconds(200); |
- host_impl_.SetCurrentBeginFrameArgs( |
- CreateBeginFrameArgsForTesting(BEGINFRAME_FROM_HERE, time_ticks)); |
- resourceless_software_draw = true; |
- 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, |
- viewport, |
- transform, |
- resourceless_software_draw); |
- active_layer_->UpdateTiles(resourceless_software_draw); |
- |
- // Transform for tile priority is updated. |
- EXPECT_TRANSFORMATION_MATRIX_EQ(transform, |
- active_layer_->screen_space_transform()); |
- // Visible rect for tile priority retains old value. |
- EXPECT_EQ(visible_rect_for_tile_priority, |
- active_layer_->visible_rect_for_tile_priority()); |
- |
- // Keep expanded viewport but mark it valid. Should update tile viewport. |
- time_ticks += base::TimeDelta::FromMilliseconds(200); |
- host_impl_.SetCurrentBeginFrameArgs( |
- CreateBeginFrameArgsForTesting(BEGINFRAME_FROM_HERE, time_ticks)); |
- resourceless_software_draw = false; |
- host_impl_.SetExternalDrawConstraints(transform, |
- viewport, |
- viewport, |
- viewport, |
- transform, |
- resourceless_software_draw); |
- active_layer_->UpdateTiles(resourceless_software_draw); |
- |
- EXPECT_TRANSFORMATION_MATRIX_EQ(transform, |
- active_layer_->screen_space_transform()); |
- EXPECT_EQ(viewport, active_layer_->visible_rect_for_tile_priority()); |
-} |
- |
-TEST_F(PictureLayerImplTest, ViewportRectForTilePriorityIsCached) { |
- base::TimeTicks time_ticks; |
- time_ticks += base::TimeDelta::FromMilliseconds(1); |
- host_impl_.SetCurrentBeginFrameArgs( |
- CreateBeginFrameArgsForTesting(BEGINFRAME_FROM_HERE, 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); |
- |
- SetupTreesWithInvalidation(pending_pile, active_pile, Region()); |
- |
- SetupDrawPropertiesAndUpdateTiles(active_layer_, 1.f, 1.f, 1.f, 1.f, false); |
- |
- time_ticks += base::TimeDelta::FromMilliseconds(200); |
- host_impl_.SetCurrentBeginFrameArgs( |
- CreateBeginFrameArgsForTesting(BEGINFRAME_FROM_HERE, time_ticks)); |
- |
- bool resourceless_software_draw = false; |
- gfx::Rect viewport = gfx::Rect(layer_bounds); |
- gfx::Rect viewport_rect_for_tile_priority(0, 0, 100, 100); |
- gfx::Transform transform, transform_for_tile_priority; |
- |
- host_impl_.SetExternalDrawConstraints( |
- transform, viewport, viewport, viewport_rect_for_tile_priority, |
- transform_for_tile_priority, resourceless_software_draw); |
- bool update_lcd_text = false; |
- host_impl_.active_tree()->UpdateDrawProperties(update_lcd_text); |
- |
- EXPECT_EQ(viewport_rect_for_tile_priority, |
- active_layer_->viewport_rect_for_tile_priority_in_content_space()); |
- |
- time_ticks += base::TimeDelta::FromMilliseconds(200); |
- host_impl_.SetCurrentBeginFrameArgs( |
- CreateBeginFrameArgsForTesting(BEGINFRAME_FROM_HERE, time_ticks)); |
- |
- gfx::Rect another_viewport_rect_for_tile_priority(11, 11, 50, 50); |
- host_impl_.SetExternalDrawConstraints( |
- transform, viewport, viewport, another_viewport_rect_for_tile_priority, |
- transform_for_tile_priority, resourceless_software_draw); |
- |
- // Didn't call UpdateDrawProperties yet. The viewport rect for tile priority |
- // should remain to be the previously cached value. |
- EXPECT_EQ(viewport_rect_for_tile_priority, |
- active_layer_->viewport_rect_for_tile_priority_in_content_space()); |
- host_impl_.active_tree()->UpdateDrawProperties(update_lcd_text); |
- |
- // Now the UpdateDrawProperties is called. The viewport rect for tile |
- // priority should be the latest value. |
- EXPECT_EQ(another_viewport_rect_for_tile_priority, |
- active_layer_->viewport_rect_for_tile_priority_in_content_space()); |
-} |
- |
-TEST_F(PictureLayerImplTest, ClonePartialInvalidation) { |
- gfx::Size tile_size(100, 100); |
- gfx::Size layer_bounds(400, 400); |
- gfx::Rect layer_invalidation(150, 200, 30, 180); |
- |
- scoped_refptr<FakePicturePileImpl> pending_pile = |
- FakePicturePileImpl::CreateFilledPile(tile_size, layer_bounds); |
- scoped_refptr<FakePicturePileImpl> active_pile = |
- FakePicturePileImpl::CreateFilledPile(tile_size, layer_bounds); |
- scoped_refptr<FakePicturePileImpl> lost_pile = |
- FakePicturePileImpl::CreateFilledPile(tile_size, layer_bounds); |
- |
- SetupPendingTreeWithFixedTileSize(lost_pile, gfx::Size(50, 50), Region()); |
- ActivateTree(); |
- // Add a non-shared tiling on the active tree. |
- PictureLayerTiling* tiling = active_layer_->AddTiling(3.f); |
- tiling->CreateAllTilesForTesting(); |
- |
- // Ensure UpdateTiles won't remove any tilings. |
- active_layer_->MarkAllTilingsUsed(); |
- |
- // Then setup a new pending tree and activate it. |
- SetupTreesWithFixedTileSize(pending_pile, active_pile, gfx::Size(50, 50), |
- layer_invalidation); |
- |
- EXPECT_EQ(2u, pending_layer_->num_tilings()); |
- EXPECT_EQ(3u, active_layer_->num_tilings()); |
- |
- const PictureLayerTilingSet* tilings = pending_layer_->tilings(); |
- EXPECT_GT(tilings->num_tilings(), 0u); |
- for (size_t i = 0; i < tilings->num_tilings(); ++i) { |
- const PictureLayerTiling* tiling = tilings->tiling_at(i); |
- gfx::Rect content_invalidation = gfx::ScaleToEnclosingRect( |
- layer_invalidation, |
- tiling->contents_scale()); |
- for (PictureLayerTiling::CoverageIterator iter( |
- tiling, |
- tiling->contents_scale(), |
- gfx::Rect(tiling->tiling_size())); |
- iter; |
- ++iter) { |
- EXPECT_TRUE(*iter); |
- EXPECT_FALSE(iter.geometry_rect().IsEmpty()); |
- EXPECT_EQ(pending_pile.get(), iter->raster_source()); |
- } |
- } |
- |
- tilings = active_layer_->tilings(); |
- EXPECT_GT(tilings->num_tilings(), 0u); |
- for (size_t i = 0; i < tilings->num_tilings(); ++i) { |
- const PictureLayerTiling* tiling = tilings->tiling_at(i); |
- gfx::Rect content_invalidation = |
- gfx::ScaleToEnclosingRect(layer_invalidation, tiling->contents_scale()); |
- for (PictureLayerTiling::CoverageIterator iter( |
- tiling, |
- tiling->contents_scale(), |
- gfx::Rect(tiling->tiling_size())); |
- iter; |
- ++iter) { |
- EXPECT_TRUE(*iter); |
- EXPECT_FALSE(iter.geometry_rect().IsEmpty()); |
- if (iter.geometry_rect().Intersects(content_invalidation)) |
- EXPECT_EQ(active_pile.get(), iter->raster_source()); |
- else if (!active_layer_->GetPendingOrActiveTwinTiling(tiling)) |
- EXPECT_EQ(active_pile.get(), iter->raster_source()); |
- else |
- EXPECT_EQ(pending_pile.get(), iter->raster_source()); |
- } |
- } |
-} |
- |
-TEST_F(PictureLayerImplTest, CloneFullInvalidation) { |
- gfx::Size tile_size(90, 80); |
- gfx::Size layer_bounds(300, 500); |
- |
- scoped_refptr<FakePicturePileImpl> pending_pile = |
- FakePicturePileImpl::CreateFilledPile(tile_size, layer_bounds); |
- scoped_refptr<FakePicturePileImpl> active_pile = |
- FakePicturePileImpl::CreateFilledPile(tile_size, layer_bounds); |
- |
- SetupTreesWithInvalidation(pending_pile, active_pile, |
- gfx::Rect(layer_bounds)); |
- |
- EXPECT_EQ(pending_layer_->tilings()->num_tilings(), |
- active_layer_->tilings()->num_tilings()); |
- |
- const PictureLayerTilingSet* tilings = pending_layer_->tilings(); |
- EXPECT_GT(tilings->num_tilings(), 0u); |
- for (size_t i = 0; i < tilings->num_tilings(); ++i) |
- VerifyAllTilesExistAndHavePile(tilings->tiling_at(i), pending_pile.get()); |
-} |
- |
-TEST_F(PictureLayerImplTest, UpdateTilesCreatesTilings) { |
- 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); |
- |
- SetupTrees(pending_pile, active_pile); |
- |
- float low_res_factor = host_impl_.settings().low_res_contents_scale_factor; |
- EXPECT_LT(low_res_factor, 1.f); |
- |
- active_layer_->ReleaseResources(); |
- EXPECT_FALSE(active_layer_->tilings()); |
- active_layer_->RecreateResources(); |
- EXPECT_EQ(0u, active_layer_->tilings()->num_tilings()); |
- |
- SetupDrawPropertiesAndUpdateTiles(active_layer_, |
- 6.f, // ideal contents scale |
- 3.f, // device scale |
- 2.f, // page scale |
- 1.f, // maximum animation scale |
- false); |
- ASSERT_EQ(2u, active_layer_->tilings()->num_tilings()); |
- EXPECT_FLOAT_EQ(6.f, |
- active_layer_->tilings()->tiling_at(0)->contents_scale()); |
- EXPECT_FLOAT_EQ(6.f * low_res_factor, |
- active_layer_->tilings()->tiling_at(1)->contents_scale()); |
- |
- // If we change the page scale factor, then we should get new tilings. |
- SetupDrawPropertiesAndUpdateTiles(active_layer_, |
- 6.6f, // ideal contents scale |
- 3.f, // device scale |
- 2.2f, // page scale |
- 1.f, // maximum animation scale |
- false); |
- ASSERT_EQ(4u, active_layer_->tilings()->num_tilings()); |
- EXPECT_FLOAT_EQ(6.6f, |
- active_layer_->tilings()->tiling_at(0)->contents_scale()); |
- EXPECT_FLOAT_EQ(6.6f * low_res_factor, |
- active_layer_->tilings()->tiling_at(2)->contents_scale()); |
- |
- // If we change the device scale factor, then we should get new tilings. |
- SetupDrawPropertiesAndUpdateTiles(active_layer_, |
- 7.26f, // ideal contents scale |
- 3.3f, // device scale |
- 2.2f, // page scale |
- 1.f, // maximum animation scale |
- false); |
- ASSERT_EQ(6u, active_layer_->tilings()->num_tilings()); |
- EXPECT_FLOAT_EQ(7.26f, |
- active_layer_->tilings()->tiling_at(0)->contents_scale()); |
- EXPECT_FLOAT_EQ(7.26f * low_res_factor, |
- active_layer_->tilings()->tiling_at(3)->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. |
- SetupDrawPropertiesAndUpdateTiles(active_layer_, |
- 7.26f, // ideal contents scale |
- 2.2f, // device scale |
- 3.3f, // page scale |
- 1.f, // maximum animation scale |
- false); |
- ASSERT_EQ(6u, active_layer_->tilings()->num_tilings()); |
- EXPECT_FLOAT_EQ(7.26f, |
- active_layer_->tilings()->tiling_at(0)->contents_scale()); |
- EXPECT_FLOAT_EQ(7.26f * low_res_factor, |
- active_layer_->tilings()->tiling_at(3)->contents_scale()); |
-} |
- |
-TEST_F(PictureLayerImplTest, PendingLayerOnlyHasHighAndLowResTiling) { |
- 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); |
- |
- SetupTrees(pending_pile, active_pile); |
- |
- float low_res_factor = host_impl_.settings().low_res_contents_scale_factor; |
- EXPECT_LT(low_res_factor, 1.f); |
- |
- pending_layer_->ReleaseResources(); |
- EXPECT_FALSE(pending_layer_->tilings()); |
- pending_layer_->RecreateResources(); |
- EXPECT_EQ(0u, pending_layer_->tilings()->num_tilings()); |
- |
- SetupDrawPropertiesAndUpdateTiles(pending_layer_, |
- 6.f, // ideal contents scale |
- 3.f, // device scale |
- 2.f, // page scale |
- 1.f, // maximum animation scale |
- false); |
- ASSERT_EQ(2u, pending_layer_->tilings()->num_tilings()); |
- EXPECT_FLOAT_EQ(6.f, |
- pending_layer_->tilings()->tiling_at(0)->contents_scale()); |
- EXPECT_FLOAT_EQ(6.f * low_res_factor, |
- pending_layer_->tilings()->tiling_at(1)->contents_scale()); |
- |
- // If we change the page scale factor, then we should get new tilings. |
- SetupDrawPropertiesAndUpdateTiles(pending_layer_, |
- 6.6f, // ideal contents scale |
- 3.f, // device scale |
- 2.2f, // page scale |
- 1.f, // maximum animation scale |
- false); |
- ASSERT_EQ(2u, pending_layer_->tilings()->num_tilings()); |
- EXPECT_FLOAT_EQ(6.6f, |
- pending_layer_->tilings()->tiling_at(0)->contents_scale()); |
- EXPECT_FLOAT_EQ(6.6f * low_res_factor, |
- pending_layer_->tilings()->tiling_at(1)->contents_scale()); |
- |
- // If we change the device scale factor, then we should get new tilings. |
- SetupDrawPropertiesAndUpdateTiles(pending_layer_, |
- 7.26f, // ideal contents scale |
- 3.3f, // device scale |
- 2.2f, // page scale |
- 1.f, // maximum animation scale |
- false); |
- ASSERT_EQ(2u, pending_layer_->tilings()->num_tilings()); |
- EXPECT_FLOAT_EQ(7.26f, |
- pending_layer_->tilings()->tiling_at(0)->contents_scale()); |
- EXPECT_FLOAT_EQ(7.26f * low_res_factor, |
- pending_layer_->tilings()->tiling_at(1)->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. |
- SetupDrawPropertiesAndUpdateTiles(pending_layer_, |
- 7.26f, // ideal contents scale |
- 2.2f, // device scale |
- 3.3f, // page scale |
- 1.f, // maximum animation scale |
- false); |
- ASSERT_EQ(2u, pending_layer_->tilings()->num_tilings()); |
- EXPECT_FLOAT_EQ(7.26f, |
- pending_layer_->tilings()->tiling_at(0)->contents_scale()); |
- EXPECT_FLOAT_EQ(7.26f * low_res_factor, |
- pending_layer_->tilings()->tiling_at(1)->contents_scale()); |
-} |
- |
-TEST_F(PictureLayerImplTest, CreateTilingsEvenIfTwinHasNone) { |
- // This test makes sure that if a layer can have tilings, then a commit makes |
- // it not able to have tilings (empty size), and then a future commit that |
- // makes it valid again should be able to create tilings. |
- gfx::Size tile_size(400, 400); |
- gfx::Size layer_bounds(1300, 1900); |
- |
- scoped_refptr<FakePicturePileImpl> empty_pile = |
- FakePicturePileImpl::CreateEmptyPile(tile_size, layer_bounds); |
- scoped_refptr<FakePicturePileImpl> valid_pile = |
- FakePicturePileImpl::CreateFilledPile(tile_size, layer_bounds); |
- |
- SetupPendingTree(valid_pile); |
- ASSERT_EQ(2u, pending_layer_->tilings()->num_tilings()); |
- |
- ActivateTree(); |
- SetupPendingTree(empty_pile); |
- EXPECT_FALSE(pending_layer_->CanHaveTilings()); |
- ASSERT_EQ(2u, active_layer_->tilings()->num_tilings()); |
- ASSERT_EQ(0u, pending_layer_->tilings()->num_tilings()); |
- |
- ActivateTree(); |
- EXPECT_FALSE(active_layer_->CanHaveTilings()); |
- ASSERT_EQ(0u, active_layer_->tilings()->num_tilings()); |
- |
- SetupPendingTree(valid_pile); |
- ASSERT_EQ(2u, pending_layer_->tilings()->num_tilings()); |
- ASSERT_EQ(0u, active_layer_->tilings()->num_tilings()); |
-} |
- |
-TEST_F(PictureLayerImplTest, ZoomOutCrash) { |
- gfx::Size tile_size(400, 400); |
- gfx::Size layer_bounds(1300, 1900); |
- |
- // Set up the high and low res tilings before pinch zoom. |
- 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); |
- ResetTilingsAndRasterScales(); |
- EXPECT_EQ(0u, active_layer_->tilings()->num_tilings()); |
- SetContentsScaleOnBothLayers(32.0f, 1.0f, 32.0f, 1.0f, false); |
- EXPECT_EQ(32.f, active_layer_->HighResTiling()->contents_scale()); |
- host_impl_.PinchGestureBegin(); |
- SetContentsScaleOnBothLayers(1.0f, 1.0f, 1.0f, 1.0f, false); |
- SetContentsScaleOnBothLayers(1.0f, 1.0f, 1.0f, 1.0f, false); |
- EXPECT_EQ(active_layer_->tilings()->NumHighResTilings(), 1); |
-} |
- |
-TEST_F(PictureLayerImplTest, PinchGestureTilings) { |
- gfx::Size tile_size(400, 400); |
- gfx::Size layer_bounds(1300, 1900); |
- |
- float low_res_factor = host_impl_.settings().low_res_contents_scale_factor; |
- |
- scoped_refptr<FakePicturePileImpl> pending_pile = |
- FakePicturePileImpl::CreateFilledPile(tile_size, layer_bounds); |
- scoped_refptr<FakePicturePileImpl> active_pile = |
- FakePicturePileImpl::CreateFilledPile(tile_size, layer_bounds); |
- |
- // Set up the high and low res tilings before pinch zoom. |
- SetupTrees(pending_pile, active_pile); |
- ResetTilingsAndRasterScales(); |
- |
- SetContentsScaleOnBothLayers(2.f, 1.0f, 2.f, 1.0f, false); |
- EXPECT_BOTH_EQ(num_tilings(), 2u); |
- EXPECT_BOTH_EQ(tilings()->tiling_at(0)->contents_scale(), 2.f); |
- EXPECT_BOTH_EQ(tilings()->tiling_at(1)->contents_scale(), |
- 2.f * low_res_factor); |
- |
- // Ensure UpdateTiles won't remove any tilings. |
- active_layer_->MarkAllTilingsUsed(); |
- |
- // Start a pinch gesture. |
- host_impl_.PinchGestureBegin(); |
- |
- // Zoom out by a small amount. We should create a tiling at half |
- // the scale (2/kMaxScaleRatioDuringPinch). |
- SetContentsScaleOnBothLayers(1.8f, 1.0f, 1.8f, 1.0f, false); |
- EXPECT_EQ(3u, active_layer_->tilings()->num_tilings()); |
- EXPECT_FLOAT_EQ(2.0f, |
- active_layer_->tilings()->tiling_at(0)->contents_scale()); |
- EXPECT_FLOAT_EQ(1.0f, |
- active_layer_->tilings()->tiling_at(1)->contents_scale()); |
- EXPECT_FLOAT_EQ(2.0f * low_res_factor, |
- active_layer_->tilings()->tiling_at(2)->contents_scale()); |
- |
- // Ensure UpdateTiles won't remove any tilings. |
- active_layer_->MarkAllTilingsUsed(); |
- |
- // Zoom out further, close to our low-res scale factor. We should |
- // use that tiling as high-res, and not create a new tiling. |
- SetContentsScaleOnBothLayers(low_res_factor * 2.1f, 1.0f, |
- low_res_factor * 2.1f, 1.0f, false); |
- EXPECT_EQ(3u, active_layer_->tilings()->num_tilings()); |
- |
- // Zoom in a lot now. Since we increase by increments of |
- // kMaxScaleRatioDuringPinch, this will create a new tiling at 4.0. |
- SetContentsScaleOnBothLayers(3.8f, 1.0f, 3.8f, 1.f, false); |
- EXPECT_EQ(4u, active_layer_->tilings()->num_tilings()); |
- EXPECT_FLOAT_EQ(4.0f, |
- active_layer_->tilings()->tiling_at(0)->contents_scale()); |
-} |
- |
-TEST_F(PictureLayerImplTest, SnappedTilingDuringZoom) { |
- gfx::Size tile_size(300, 300); |
- gfx::Size layer_bounds(2600, 3800); |
- |
- 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); |
- |
- ResetTilingsAndRasterScales(); |
- EXPECT_EQ(0u, active_layer_->tilings()->num_tilings()); |
- |
- // Set up the high and low res tilings before pinch zoom. |
- SetContentsScaleOnBothLayers(0.24f, 1.0f, 0.24f, 1.0f, false); |
- EXPECT_EQ(2u, active_layer_->tilings()->num_tilings()); |
- EXPECT_FLOAT_EQ(0.24f, |
- active_layer_->tilings()->tiling_at(0)->contents_scale()); |
- EXPECT_FLOAT_EQ(0.0625f, |
- active_layer_->tilings()->tiling_at(1)->contents_scale()); |
- |
- // Ensure UpdateTiles won't remove any tilings. |
- active_layer_->MarkAllTilingsUsed(); |
- |
- // Start a pinch gesture. |
- host_impl_.PinchGestureBegin(); |
- |
- // Zoom out by a small amount. We should create a tiling at half |
- // the scale (1/kMaxScaleRatioDuringPinch). |
- SetContentsScaleOnBothLayers(0.2f, 1.0f, 0.2f, 1.0f, false); |
- EXPECT_EQ(3u, active_layer_->tilings()->num_tilings()); |
- EXPECT_FLOAT_EQ(0.24f, |
- active_layer_->tilings()->tiling_at(0)->contents_scale()); |
- EXPECT_FLOAT_EQ(0.12f, |
- active_layer_->tilings()->tiling_at(1)->contents_scale()); |
- EXPECT_FLOAT_EQ(0.0625, |
- active_layer_->tilings()->tiling_at(2)->contents_scale()); |
- |
- // Ensure UpdateTiles won't remove any tilings. |
- active_layer_->MarkAllTilingsUsed(); |
- |
- // Zoom out further, close to our low-res scale factor. We should |
- // use that tiling as high-res, and not create a new tiling. |
- SetContentsScaleOnBothLayers(0.1f, 1.0f, 0.1f, 1.0f, false); |
- EXPECT_EQ(3u, active_layer_->tilings()->num_tilings()); |
- |
- // Zoom in. 0.25(desired_scale) should be snapped to 0.24 during zoom-in |
- // because 0.25(desired_scale) is within the ratio(1.2). |
- SetContentsScaleOnBothLayers(0.25f, 1.0f, 0.25f, 1.0f, false); |
- EXPECT_EQ(3u, active_layer_->tilings()->num_tilings()); |
- |
- // Zoom in a lot. Since we move in factors of two, we should get a scale that |
- // is a power of 2 times 0.24. |
- SetContentsScaleOnBothLayers(1.f, 1.0f, 1.f, 1.0f, false); |
- EXPECT_EQ(4u, active_layer_->tilings()->num_tilings()); |
- EXPECT_FLOAT_EQ(1.92f, |
- active_layer_->tilings()->tiling_at(0)->contents_scale()); |
-} |
- |
-TEST_F(PictureLayerImplTest, 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); |
- |
- std::vector<PictureLayerTiling*> used_tilings; |
- |
- float low_res_factor = host_impl_.settings().low_res_contents_scale_factor; |
- EXPECT_LT(low_res_factor, 1.f); |
- |
- float scale = 1.f; |
- float page_scale = 1.f; |
- |
- SetupTrees(pending_pile, active_pile); |
- EXPECT_EQ(2u, active_layer_->tilings()->num_tilings()); |
- EXPECT_EQ(1.f, active_layer_->HighResTiling()->contents_scale()); |
- |
- // Ensure UpdateTiles won't remove any tilings. Note this is unrelated to |
- // |used_tilings| variable, and it's here only to ensure that active_layer_ |
- // won't remove tilings before the test has a chance to verify behavior. |
- active_layer_->MarkAllTilingsUsed(); |
- |
- // We only have ideal tilings, so they aren't removed. |
- used_tilings.clear(); |
- active_layer_->CleanUpTilingsOnActiveLayer(used_tilings); |
- EXPECT_EQ(2u, active_layer_->tilings()->num_tilings()); |
- |
- host_impl_.PinchGestureBegin(); |
- |
- // Changing the ideal but not creating new tilings. |
- scale = 1.5f; |
- page_scale = 1.5f; |
- SetContentsScaleOnBothLayers(scale, 1.f, page_scale, 1.f, false); |
- EXPECT_EQ(2u, 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(2u, active_layer_->tilings()->num_tilings()); |
- |
- host_impl_.PinchGestureEnd(); |
- |
- // Create a 1.2 scale tiling. Now we have 1.0 and 1.2 tilings. Ideal = 1.2. |
- scale = 1.2f; |
- page_scale = 1.2f; |
- SetContentsScaleOnBothLayers(1.2f, 1.f, page_scale, 1.f, false); |
- ASSERT_EQ(4u, active_layer_->tilings()->num_tilings()); |
- EXPECT_FLOAT_EQ( |
- 1.f, |
- active_layer_->tilings()->tiling_at(1)->contents_scale()); |
- EXPECT_FLOAT_EQ( |
- 1.f * low_res_factor, |
- active_layer_->tilings()->tiling_at(3)->contents_scale()); |
- |
- // Ensure UpdateTiles won't remove any tilings. |
- active_layer_->MarkAllTilingsUsed(); |
- |
- // 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(4u, active_layer_->tilings()->num_tilings()); |
- |
- // Now move the ideal scale to 0.5. Our target stays 1.2. |
- SetContentsScaleOnBothLayers(0.5f, 1.f, 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(3u, active_layer_->tilings()->num_tilings()); |
- |
- // Now move the ideal scale to 1.0. Our target stays 1.2. |
- SetContentsScaleOnBothLayers(1.f, 1.f, 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(3u, active_layer_->tilings()->num_tilings()); |
- |
- // Now move the ideal scale to 1.1 on the active layer. Our target stays 1.2. |
- SetupDrawPropertiesAndUpdateTiles(active_layer_, 1.1f, 1.f, page_scale, 1.f, |
- false); |
- |
- // 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(3u, active_layer_->tilings()->num_tilings()); |
- |
- // Move the ideal scale on the pending layer to 1.1 as well. Our target stays |
- // 1.2 still. |
- SetupDrawPropertiesAndUpdateTiles(pending_layer_, 1.1f, 1.f, page_scale, 1.f, |
- false); |
- |
- // 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(3u, 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(2u, active_layer_->tilings()->num_tilings()); |
-} |
- |
-TEST_F(PictureLayerImplTest, DontAddLowResDuringAnimation) { |
- // Make sure this layer covers multiple tiles, since otherwise low |
- // res won't get created because it is too small. |
- gfx::Size tile_size(host_impl_.settings().default_tile_size); |
- // Avoid max untiled layer size heuristics via fixed tile size. |
- gfx::Size layer_bounds(tile_size.width() + 1, tile_size.height() + 1); |
- SetupDefaultTreesWithFixedTileSize(layer_bounds, tile_size, Region()); |
- |
- float low_res_factor = host_impl_.settings().low_res_contents_scale_factor; |
- float contents_scale = 1.f; |
- float device_scale = 1.f; |
- float page_scale = 1.f; |
- float maximum_animation_scale = 1.f; |
- bool animating_transform = true; |
- |
- ResetTilingsAndRasterScales(); |
- |
- // Animating, so don't create low res even if there isn't one already. |
- SetContentsScaleOnBothLayers(contents_scale, |
- device_scale, |
- page_scale, |
- maximum_animation_scale, |
- animating_transform); |
- EXPECT_BOTH_EQ(HighResTiling()->contents_scale(), 1.f); |
- EXPECT_BOTH_EQ(num_tilings(), 1u); |
- |
- // Stop animating, low res gets created. |
- animating_transform = false; |
- SetContentsScaleOnBothLayers(contents_scale, |
- device_scale, |
- page_scale, |
- maximum_animation_scale, |
- animating_transform); |
- EXPECT_BOTH_EQ(HighResTiling()->contents_scale(), 1.f); |
- EXPECT_BOTH_EQ(LowResTiling()->contents_scale(), low_res_factor); |
- EXPECT_BOTH_EQ(num_tilings(), 2u); |
- |
- // Ensure UpdateTiles won't remove any tilings. |
- active_layer_->MarkAllTilingsUsed(); |
- |
- // Page scale animation, new high res, but no low res. We still have |
- // a tiling at the previous scale, it's just not marked as low res on the |
- // active layer. The pending layer drops non-ideal tilings. |
- contents_scale = 2.f; |
- page_scale = 2.f; |
- maximum_animation_scale = 2.f; |
- animating_transform = true; |
- SetContentsScaleOnBothLayers(contents_scale, |
- device_scale, |
- page_scale, |
- maximum_animation_scale, |
- animating_transform); |
- EXPECT_BOTH_EQ(HighResTiling()->contents_scale(), 2.f); |
- EXPECT_FALSE(active_layer_->LowResTiling()); |
- EXPECT_FALSE(pending_layer_->LowResTiling()); |
- EXPECT_EQ(3u, active_layer_->num_tilings()); |
- EXPECT_EQ(1u, pending_layer_->num_tilings()); |
- |
- // Stop animating, new low res gets created for final page scale. |
- animating_transform = false; |
- SetContentsScaleOnBothLayers(contents_scale, |
- device_scale, |
- page_scale, |
- maximum_animation_scale, |
- animating_transform); |
- EXPECT_BOTH_EQ(HighResTiling()->contents_scale(), 2.f); |
- EXPECT_BOTH_EQ(LowResTiling()->contents_scale(), 2.f * low_res_factor); |
- EXPECT_EQ(4u, active_layer_->num_tilings()); |
- EXPECT_EQ(2u, pending_layer_->num_tilings()); |
-} |
- |
-TEST_F(PictureLayerImplTest, DontAddLowResForSmallLayers) { |
- gfx::Size layer_bounds(host_impl_.settings().default_tile_size); |
- gfx::Size tile_size(100, 100); |
- |
- 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); |
- |
- float low_res_factor = host_impl_.settings().low_res_contents_scale_factor; |
- float device_scale = 1.f; |
- float page_scale = 1.f; |
- float maximum_animation_scale = 1.f; |
- bool animating_transform = false; |
- |
- // Contents exactly fit on one tile at scale 1, no low res. |
- float contents_scale = 1.f; |
- SetContentsScaleOnBothLayers(contents_scale, |
- device_scale, |
- page_scale, |
- maximum_animation_scale, |
- animating_transform); |
- EXPECT_BOTH_EQ(HighResTiling()->contents_scale(), contents_scale); |
- EXPECT_BOTH_EQ(num_tilings(), 1u); |
- |
- ResetTilingsAndRasterScales(); |
- |
- // Contents that are smaller than one tile, no low res. |
- contents_scale = 0.123f; |
- SetContentsScaleOnBothLayers(contents_scale, |
- device_scale, |
- page_scale, |
- maximum_animation_scale, |
- animating_transform); |
- EXPECT_BOTH_EQ(HighResTiling()->contents_scale(), contents_scale); |
- EXPECT_BOTH_EQ(num_tilings(), 1u); |
- |
- ResetTilingsAndRasterScales(); |
- |
- // Any content bounds that would create more than one tile will |
- // generate a low res tiling. |
- contents_scale = 2.5f; |
- SetContentsScaleOnBothLayers(contents_scale, |
- device_scale, |
- page_scale, |
- maximum_animation_scale, |
- animating_transform); |
- EXPECT_BOTH_EQ(HighResTiling()->contents_scale(), contents_scale); |
- EXPECT_BOTH_EQ(LowResTiling()->contents_scale(), |
- contents_scale * low_res_factor); |
- EXPECT_BOTH_EQ(num_tilings(), 2u); |
- |
- // Mask layers dont create low res since they always fit on one tile. |
- scoped_ptr<FakePictureLayerImpl> mask = |
- FakePictureLayerImpl::CreateMaskWithRasterSource( |
- host_impl_.pending_tree(), 3, pending_pile); |
- mask->SetBounds(layer_bounds); |
- mask->SetContentBounds(layer_bounds); |
- mask->SetDrawsContent(true); |
- |
- SetupDrawPropertiesAndUpdateTiles(mask.get(), contents_scale, device_scale, |
- page_scale, maximum_animation_scale, |
- animating_transform); |
- EXPECT_EQ(mask->HighResTiling()->contents_scale(), contents_scale); |
- EXPECT_EQ(mask->num_tilings(), 1u); |
-} |
- |
-TEST_F(PictureLayerImplTest, HugeMasksGetScaledDown) { |
- base::TimeTicks time_ticks; |
- time_ticks += base::TimeDelta::FromMilliseconds(1); |
- host_impl_.SetCurrentBeginFrameArgs( |
- CreateBeginFrameArgsForTesting(BEGINFRAME_FROM_HERE, time_ticks)); |
- |
- gfx::Size tile_size(100, 100); |
- gfx::Size layer_bounds(1000, 1000); |
- |
- scoped_refptr<FakePicturePileImpl> valid_pile = |
- FakePicturePileImpl::CreateFilledPile(tile_size, layer_bounds); |
- SetupPendingTree(valid_pile); |
- |
- scoped_ptr<FakePictureLayerImpl> mask_ptr = |
- FakePictureLayerImpl::CreateMaskWithRasterSource( |
- host_impl_.pending_tree(), 3, valid_pile); |
- mask_ptr->SetBounds(layer_bounds); |
- mask_ptr->SetContentBounds(layer_bounds); |
- mask_ptr->SetDrawsContent(true); |
- pending_layer_->SetMaskLayer(mask_ptr.Pass()); |
- pending_layer_->SetHasRenderSurface(true); |
- |
- time_ticks += base::TimeDelta::FromMilliseconds(1); |
- host_impl_.SetCurrentBeginFrameArgs( |
- CreateBeginFrameArgsForTesting(BEGINFRAME_FROM_HERE, time_ticks)); |
- bool update_lcd_text = false; |
- host_impl_.pending_tree()->UpdateDrawProperties(update_lcd_text); |
- |
- FakePictureLayerImpl* pending_mask = |
- static_cast<FakePictureLayerImpl*>(pending_layer_->mask_layer()); |
- |
- EXPECT_EQ(1.f, pending_mask->HighResTiling()->contents_scale()); |
- EXPECT_EQ(1u, pending_mask->num_tilings()); |
- |
- host_impl_.tile_manager()->InitializeTilesWithResourcesForTesting( |
- pending_mask->HighResTiling()->AllTilesForTesting()); |
- |
- ActivateTree(); |
- |
- FakePictureLayerImpl* active_mask = |
- static_cast<FakePictureLayerImpl*>(active_layer_->mask_layer()); |
- |
- // Mask layers have a tiling with a single tile in it. |
- EXPECT_EQ(1u, active_mask->HighResTiling()->AllTilesForTesting().size()); |
- // The mask resource exists. |
- ResourceProvider::ResourceId mask_resource_id; |
- gfx::Size mask_texture_size; |
- active_mask->GetContentsResourceId(&mask_resource_id, &mask_texture_size); |
- EXPECT_NE(0u, mask_resource_id); |
- EXPECT_EQ(active_mask->bounds(), mask_texture_size); |
- |
- // Drop resources and recreate them, still the same. |
- pending_mask->ReleaseResources(); |
- active_mask->ReleaseResources(); |
- pending_mask->RecreateResources(); |
- active_mask->RecreateResources(); |
- SetupDrawPropertiesAndUpdateTiles(active_mask, 1.f, 1.f, 1.f, 1.f, false); |
- active_mask->HighResTiling()->CreateAllTilesForTesting(); |
- EXPECT_EQ(1u, active_mask->HighResTiling()->AllTilesForTesting().size()); |
- EXPECT_NE(0u, mask_resource_id); |
- EXPECT_EQ(active_mask->bounds(), mask_texture_size); |
- |
- // Resize larger than the max texture size. |
- int max_texture_size = host_impl_.GetRendererCapabilities().max_texture_size; |
- gfx::Size huge_bounds(max_texture_size + 1, 10); |
- scoped_refptr<FakePicturePileImpl> huge_pile = |
- FakePicturePileImpl::CreateFilledPile(tile_size, huge_bounds); |
- |
- SetupPendingTree(huge_pile); |
- pending_mask->SetBounds(huge_bounds); |
- pending_mask->SetContentBounds(huge_bounds); |
- pending_mask->SetRasterSourceOnPending(huge_pile, Region()); |
- |
- time_ticks += base::TimeDelta::FromMilliseconds(1); |
- host_impl_.SetCurrentBeginFrameArgs( |
- CreateBeginFrameArgsForTesting(BEGINFRAME_FROM_HERE, time_ticks)); |
- host_impl_.pending_tree()->UpdateDrawProperties(update_lcd_text); |
- |
- // The mask tiling gets scaled down. |
- EXPECT_LT(pending_mask->HighResTiling()->contents_scale(), 1.f); |
- EXPECT_EQ(1u, pending_mask->num_tilings()); |
- |
- host_impl_.tile_manager()->InitializeTilesWithResourcesForTesting( |
- pending_mask->HighResTiling()->AllTilesForTesting()); |
- |
- ActivateTree(); |
- |
- // Mask layers have a tiling with a single tile in it. |
- EXPECT_EQ(1u, active_mask->HighResTiling()->AllTilesForTesting().size()); |
- // The mask resource exists. |
- active_mask->GetContentsResourceId(&mask_resource_id, &mask_texture_size); |
- EXPECT_NE(0u, mask_resource_id); |
- gfx::Size expected_size = active_mask->bounds(); |
- expected_size.SetToMin(gfx::Size(max_texture_size, max_texture_size)); |
- EXPECT_EQ(expected_size, mask_texture_size); |
- |
- // Drop resources and recreate them, still the same. |
- pending_mask->ReleaseResources(); |
- active_mask->ReleaseResources(); |
- pending_mask->RecreateResources(); |
- active_mask->RecreateResources(); |
- SetupDrawPropertiesAndUpdateTiles(active_mask, 1.f, 1.f, 1.f, 1.f, false); |
- active_mask->HighResTiling()->CreateAllTilesForTesting(); |
- EXPECT_EQ(1u, active_mask->HighResTiling()->AllTilesForTesting().size()); |
- EXPECT_NE(0u, mask_resource_id); |
- EXPECT_EQ(expected_size, mask_texture_size); |
- |
- // Do another activate, the same holds. |
- SetupPendingTree(huge_pile); |
- ActivateTree(); |
- EXPECT_EQ(1u, active_mask->HighResTiling()->AllTilesForTesting().size()); |
- active_layer_->GetContentsResourceId(&mask_resource_id, &mask_texture_size); |
- EXPECT_EQ(expected_size, mask_texture_size); |
- EXPECT_EQ(0u, mask_resource_id); |
- |
- // Resize even larger, so that the scale would be smaller than the minimum |
- // contents scale. Then the layer should no longer have any tiling. |
- float min_contents_scale = host_impl_.settings().minimum_contents_scale; |
- gfx::Size extra_huge_bounds(max_texture_size / min_contents_scale + 1, 10); |
- scoped_refptr<FakePicturePileImpl> extra_huge_pile = |
- FakePicturePileImpl::CreateFilledPile(tile_size, extra_huge_bounds); |
- |
- SetupPendingTree(extra_huge_pile); |
- pending_mask->SetBounds(extra_huge_bounds); |
- pending_mask->SetContentBounds(extra_huge_bounds); |
- pending_mask->SetRasterSourceOnPending(extra_huge_pile, Region()); |
- |
- EXPECT_FALSE(pending_mask->CanHaveTilings()); |
- |
- time_ticks += base::TimeDelta::FromMilliseconds(1); |
- host_impl_.SetCurrentBeginFrameArgs( |
- CreateBeginFrameArgsForTesting(BEGINFRAME_FROM_HERE, time_ticks)); |
- host_impl_.pending_tree()->UpdateDrawProperties(update_lcd_text); |
- |
- EXPECT_EQ(0u, pending_mask->num_tilings()); |
-} |
- |
-TEST_F(PictureLayerImplTest, ScaledMaskLayer) { |
- base::TimeTicks time_ticks; |
- time_ticks += base::TimeDelta::FromMilliseconds(1); |
- host_impl_.SetCurrentBeginFrameArgs( |
- CreateBeginFrameArgsForTesting(BEGINFRAME_FROM_HERE, time_ticks)); |
- |
- gfx::Size tile_size(100, 100); |
- gfx::Size layer_bounds(1000, 1000); |
- |
- host_impl_.SetDeviceScaleFactor(1.3f); |
- |
- scoped_refptr<FakePicturePileImpl> valid_pile = |
- FakePicturePileImpl::CreateFilledPile(tile_size, layer_bounds); |
- SetupPendingTree(valid_pile); |
- |
- scoped_ptr<FakePictureLayerImpl> mask_ptr = |
- FakePictureLayerImpl::CreateMaskWithRasterSource( |
- host_impl_.pending_tree(), 3, valid_pile); |
- mask_ptr->SetBounds(layer_bounds); |
- mask_ptr->SetContentBounds(layer_bounds); |
- mask_ptr->SetDrawsContent(true); |
- pending_layer_->SetMaskLayer(mask_ptr.Pass()); |
- pending_layer_->SetHasRenderSurface(true); |
- |
- time_ticks += base::TimeDelta::FromMilliseconds(1); |
- host_impl_.SetCurrentBeginFrameArgs( |
- CreateBeginFrameArgsForTesting(BEGINFRAME_FROM_HERE, time_ticks)); |
- bool update_lcd_text = false; |
- host_impl_.pending_tree()->UpdateDrawProperties(update_lcd_text); |
- |
- FakePictureLayerImpl* pending_mask = |
- static_cast<FakePictureLayerImpl*>(pending_layer_->mask_layer()); |
- |
- // Masks are scaled, and do not have a low res tiling. |
- EXPECT_EQ(1.3f, pending_mask->HighResTiling()->contents_scale()); |
- EXPECT_EQ(1u, pending_mask->num_tilings()); |
- |
- host_impl_.tile_manager()->InitializeTilesWithResourcesForTesting( |
- pending_mask->HighResTiling()->AllTilesForTesting()); |
- |
- ActivateTree(); |
- |
- FakePictureLayerImpl* active_mask = |
- static_cast<FakePictureLayerImpl*>(active_layer_->mask_layer()); |
- |
- // Mask layers have a tiling with a single tile in it. |
- EXPECT_EQ(1u, active_mask->HighResTiling()->AllTilesForTesting().size()); |
- // The mask resource exists. |
- ResourceProvider::ResourceId mask_resource_id; |
- gfx::Size mask_texture_size; |
- active_mask->GetContentsResourceId(&mask_resource_id, &mask_texture_size); |
- EXPECT_NE(0u, mask_resource_id); |
- gfx::Size expected_mask_texture_size = |
- gfx::ToCeiledSize(gfx::ScaleSize(active_mask->bounds(), 1.3f)); |
- EXPECT_EQ(mask_texture_size, expected_mask_texture_size); |
-} |
- |
-TEST_F(PictureLayerImplTest, 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); |
- |
- SetupTrees(pending_pile, active_pile); |
- EXPECT_EQ(2u, pending_layer_->tilings()->num_tilings()); |
- |
- // All tilings should be removed when losing output surface. |
- active_layer_->ReleaseResources(); |
- EXPECT_FALSE(active_layer_->tilings()); |
- active_layer_->RecreateResources(); |
- EXPECT_EQ(0u, active_layer_->tilings()->num_tilings()); |
- pending_layer_->ReleaseResources(); |
- EXPECT_FALSE(pending_layer_->tilings()); |
- pending_layer_->RecreateResources(); |
- EXPECT_EQ(0u, pending_layer_->tilings()->num_tilings()); |
- |
- // This should create new tilings. |
- SetupDrawPropertiesAndUpdateTiles(pending_layer_, |
- 1.f, // ideal contents scale |
- 1.f, // device scale |
- 1.f, // page scale |
- 1.f, // maximum animation scale |
- false); |
- EXPECT_EQ(2u, pending_layer_->tilings()->num_tilings()); |
-} |
- |
-TEST_F(PictureLayerImplTest, ClampTilesToToMaxTileSize) { |
- // The default max tile size is larger than 400x400. |
- gfx::Size tile_size(400, 400); |
- gfx::Size layer_bounds(5000, 5000); |
- |
- 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); |
- EXPECT_GE(pending_layer_->tilings()->num_tilings(), 1u); |
- |
- pending_layer_->tilings()->tiling_at(0)->CreateAllTilesForTesting(); |
- |
- // The default value. |
- EXPECT_EQ(gfx::Size(256, 256).ToString(), |
- host_impl_.settings().default_tile_size.ToString()); |
- |
- Tile* tile = pending_layer_->tilings()->tiling_at(0)->AllTilesForTesting()[0]; |
- EXPECT_EQ(gfx::Size(256, 256).ToString(), |
- tile->content_rect().size().ToString()); |
- |
- ResetTilingsAndRasterScales(); |
- |
- // Change the max texture size on the output surface context. |
- scoped_ptr<TestWebGraphicsContext3D> context = |
- TestWebGraphicsContext3D::Create(); |
- context->set_max_texture_size(140); |
- host_impl_.DidLoseOutputSurface(); |
- host_impl_.InitializeRenderer( |
- FakeOutputSurface::Create3d(context.Pass()).Pass()); |
- |
- SetupDrawPropertiesAndUpdateTiles(pending_layer_, 1.f, 1.f, 1.f, 1.f, false); |
- ASSERT_EQ(2u, pending_layer_->tilings()->num_tilings()); |
- |
- pending_layer_->tilings()->tiling_at(0)->CreateAllTilesForTesting(); |
- |
- // Verify the tiles are not larger than the context's max texture size. |
- tile = pending_layer_->tilings()->tiling_at(0)->AllTilesForTesting()[0]; |
- EXPECT_GE(140, tile->content_rect().width()); |
- EXPECT_GE(140, tile->content_rect().height()); |
-} |
- |
-TEST_F(PictureLayerImplTest, ClampSingleTileToToMaxTileSize) { |
- // The default max tile size is larger than 400x400. |
- gfx::Size tile_size(400, 400); |
- gfx::Size layer_bounds(500, 500); |
- |
- 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); |
- EXPECT_GE(pending_layer_->tilings()->num_tilings(), 1u); |
- |
- pending_layer_->tilings()->tiling_at(0)->CreateAllTilesForTesting(); |
- |
- // The default value. The layer is smaller than this. |
- EXPECT_EQ(gfx::Size(512, 512).ToString(), |
- host_impl_.settings().max_untiled_layer_size.ToString()); |
- |
- // There should be a single tile since the layer is small. |
- PictureLayerTiling* high_res_tiling = pending_layer_->tilings()->tiling_at(0); |
- EXPECT_EQ(1u, high_res_tiling->AllTilesForTesting().size()); |
- |
- ResetTilingsAndRasterScales(); |
- |
- // Change the max texture size on the output surface context. |
- scoped_ptr<TestWebGraphicsContext3D> context = |
- TestWebGraphicsContext3D::Create(); |
- context->set_max_texture_size(140); |
- host_impl_.DidLoseOutputSurface(); |
- host_impl_.InitializeRenderer( |
- FakeOutputSurface::Create3d(context.Pass()).Pass()); |
- |
- SetupDrawPropertiesAndUpdateTiles(pending_layer_, 1.f, 1.f, 1.f, 1.f, false); |
- ASSERT_LE(1u, pending_layer_->tilings()->num_tilings()); |
- |
- pending_layer_->tilings()->tiling_at(0)->CreateAllTilesForTesting(); |
- |
- // There should be more than one tile since the max texture size won't cover |
- // the layer. |
- high_res_tiling = pending_layer_->tilings()->tiling_at(0); |
- EXPECT_LT(1u, high_res_tiling->AllTilesForTesting().size()); |
- |
- // Verify the tiles are not larger than the context's max texture size. |
- Tile* tile = pending_layer_->tilings()->tiling_at(0)->AllTilesForTesting()[0]; |
- EXPECT_GE(140, tile->content_rect().width()); |
- EXPECT_GE(140, tile->content_rect().height()); |
-} |
- |
-TEST_F(PictureLayerImplTest, DisallowTileDrawQuads) { |
- scoped_ptr<RenderPass> render_pass = RenderPass::Create(); |
- |
- 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); |
- |
- gfx::Rect layer_invalidation(150, 200, 30, 180); |
- SetupTreesWithInvalidation(pending_pile, active_pile, layer_invalidation); |
- |
- active_layer_->draw_properties().visible_content_rect = |
- gfx::Rect(layer_bounds); |
- |
- AppendQuadsData data; |
- active_layer_->WillDraw(DRAW_MODE_RESOURCELESS_SOFTWARE, nullptr); |
- active_layer_->AppendQuads(render_pass.get(), &data); |
- active_layer_->DidDraw(nullptr); |
- |
- ASSERT_EQ(1U, render_pass->quad_list.size()); |
- EXPECT_EQ(DrawQuad::PICTURE_CONTENT, |
- render_pass->quad_list.front()->material); |
-} |
- |
-TEST_F(PictureLayerImplTest, SolidColorLayerHasVisibleFullCoverage) { |
- scoped_ptr<RenderPass> render_pass = RenderPass::Create(); |
- |
- gfx::Size tile_size(1000, 1000); |
- gfx::Size layer_bounds(1500, 1500); |
- gfx::Rect visible_rect(250, 250, 1000, 1000); |
- |
- scoped_ptr<FakePicturePile> empty_recording = |
- FakePicturePile::CreateEmptyPile(tile_size, layer_bounds); |
- empty_recording->SetIsSolidColor(true); |
- |
- scoped_refptr<FakePicturePileImpl> pending_pile = |
- FakePicturePileImpl::CreateFromPile(empty_recording.get(), nullptr); |
- scoped_refptr<FakePicturePileImpl> active_pile = |
- FakePicturePileImpl::CreateFromPile(empty_recording.get(), nullptr); |
- |
- SetupTrees(pending_pile, active_pile); |
- |
- active_layer_->draw_properties().visible_content_rect = visible_rect; |
- |
- AppendQuadsData data; |
- active_layer_->WillDraw(DRAW_MODE_SOFTWARE, nullptr); |
- active_layer_->AppendQuads(render_pass.get(), &data); |
- active_layer_->DidDraw(nullptr); |
- |
- Region remaining = visible_rect; |
- for (const auto& quad : render_pass->quad_list) { |
- EXPECT_TRUE(visible_rect.Contains(quad->rect)); |
- EXPECT_TRUE(remaining.Contains(quad->rect)); |
- remaining.Subtract(quad->rect); |
- } |
- |
- EXPECT_TRUE(remaining.IsEmpty()); |
-} |
- |
-TEST_F(PictureLayerImplTest, TileScalesWithSolidColorPile) { |
- gfx::Size layer_bounds(200, 200); |
- gfx::Size tile_size(host_impl_.settings().default_tile_size); |
- scoped_refptr<FakePicturePileImpl> pending_pile = |
- FakePicturePileImpl::CreateEmptyPileThatThinksItHasRecordings( |
- tile_size, layer_bounds, false); |
- scoped_refptr<FakePicturePileImpl> active_pile = |
- FakePicturePileImpl::CreateEmptyPileThatThinksItHasRecordings( |
- tile_size, layer_bounds, true); |
- |
- SetupTrees(pending_pile, active_pile); |
- // Solid color pile should not allow tilings at any scale. |
- EXPECT_FALSE(active_layer_->CanHaveTilings()); |
- EXPECT_EQ(0.f, active_layer_->ideal_contents_scale()); |
- |
- // Activate non-solid-color pending pile makes active layer can have tilings. |
- ActivateTree(); |
- EXPECT_TRUE(active_layer_->CanHaveTilings()); |
- EXPECT_GT(active_layer_->ideal_contents_scale(), 0.f); |
-} |
- |
-TEST_F(NoLowResPictureLayerImplTest, MarkRequiredOffscreenTiles) { |
- gfx::Size tile_size(100, 100); |
- gfx::Size layer_bounds(200, 200); |
- |
- gfx::Transform transform; |
- gfx::Transform transform_for_tile_priority; |
- bool resourceless_software_draw = false; |
- gfx::Rect viewport(0, 0, 100, 200); |
- host_impl_.SetExternalDrawConstraints(transform, |
- viewport, |
- viewport, |
- viewport, |
- transform, |
- resourceless_software_draw); |
- |
- scoped_refptr<FakePicturePileImpl> pending_pile = |
- FakePicturePileImpl::CreateFilledPile(tile_size, layer_bounds); |
- SetupPendingTreeWithFixedTileSize(pending_pile, tile_size, Region()); |
- |
- EXPECT_EQ(1u, pending_layer_->num_tilings()); |
- EXPECT_EQ(viewport, pending_layer_->visible_rect_for_tile_priority()); |
- |
- base::TimeTicks time_ticks; |
- time_ticks += base::TimeDelta::FromMilliseconds(1); |
- host_impl_.SetCurrentBeginFrameArgs( |
- CreateBeginFrameArgsForTesting(BEGINFRAME_FROM_HERE, time_ticks)); |
- pending_layer_->UpdateTiles(resourceless_software_draw); |
- |
- int num_visible = 0; |
- int num_offscreen = 0; |
- |
- scoped_ptr<TilingSetRasterQueueAll> queue(new TilingSetRasterQueueAll( |
- pending_layer_->picture_layer_tiling_set(), false)); |
- for (; !queue->IsEmpty(); queue->Pop()) { |
- const Tile* tile = queue->Top(); |
- DCHECK(tile); |
- if (tile->priority(PENDING_TREE).distance_to_visible == 0.f) { |
- EXPECT_TRUE(tile->required_for_activation()); |
- num_visible++; |
- } else { |
- EXPECT_FALSE(tile->required_for_activation()); |
- num_offscreen++; |
- } |
- } |
- |
- EXPECT_GT(num_visible, 0); |
- EXPECT_GT(num_offscreen, 0); |
-} |
- |
-TEST_F(NoLowResPictureLayerImplTest, |
- TileOutsideOfViewportForTilePriorityNotRequired) { |
- base::TimeTicks time_ticks; |
- time_ticks += base::TimeDelta::FromMilliseconds(1); |
- host_impl_.SetCurrentBeginFrameArgs( |
- CreateBeginFrameArgsForTesting(BEGINFRAME_FROM_HERE, time_ticks)); |
- |
- gfx::Size tile_size(100, 100); |
- gfx::Size layer_bounds(400, 400); |
- gfx::Rect external_viewport_for_tile_priority(400, 200); |
- gfx::Rect visible_content_rect(200, 400); |
- |
- scoped_refptr<FakePicturePileImpl> active_pile = |
- FakePicturePileImpl::CreateFilledPile(tile_size, layer_bounds); |
- scoped_refptr<FakePicturePileImpl> pending_pile = |
- FakePicturePileImpl::CreateFilledPile(tile_size, layer_bounds); |
- SetupTreesWithFixedTileSize(pending_pile, active_pile, tile_size, Region()); |
- |
- ASSERT_EQ(1u, pending_layer_->num_tilings()); |
- ASSERT_EQ(1.f, pending_layer_->HighResTiling()->contents_scale()); |
- |
- // Set external viewport for tile priority. |
- gfx::Rect viewport = gfx::Rect(layer_bounds); |
- gfx::Transform transform; |
- gfx::Transform transform_for_tile_priority; |
- bool resourceless_software_draw = false; |
- host_impl_.SetExternalDrawConstraints(transform, |
- viewport, |
- viewport, |
- external_viewport_for_tile_priority, |
- transform_for_tile_priority, |
- resourceless_software_draw); |
- time_ticks += base::TimeDelta::FromMilliseconds(1); |
- host_impl_.SetCurrentBeginFrameArgs( |
- CreateBeginFrameArgsForTesting(BEGINFRAME_FROM_HERE, time_ticks)); |
- bool update_lcd_text = false; |
- host_impl_.pending_tree()->UpdateDrawProperties(update_lcd_text); |
- |
- // Set visible content rect that is different from |
- // external_viewport_for_tile_priority. |
- pending_layer_->draw_properties().visible_content_rect = visible_content_rect; |
- time_ticks += base::TimeDelta::FromMilliseconds(200); |
- host_impl_.SetCurrentBeginFrameArgs( |
- CreateBeginFrameArgsForTesting(BEGINFRAME_FROM_HERE, time_ticks)); |
- pending_layer_->UpdateTiles(resourceless_software_draw); |
- |
- // Intersect the two rects. Any tile outside should not be required for |
- // activation. |
- gfx::Rect viewport_for_tile_priority = |
- pending_layer_->viewport_rect_for_tile_priority_in_content_space(); |
- viewport_for_tile_priority.Intersect(pending_layer_->visible_content_rect()); |
- |
- int num_inside = 0; |
- int num_outside = 0; |
- for (PictureLayerTiling::CoverageIterator iter( |
- pending_layer_->HighResTiling(), 1.f, gfx::Rect(layer_bounds)); |
- iter; ++iter) { |
- if (!*iter) |
- continue; |
- Tile* tile = *iter; |
- if (viewport_for_tile_priority.Intersects(iter.geometry_rect())) { |
- num_inside++; |
- // Mark everything in viewport for tile priority as ready to draw. |
- TileDrawInfo& draw_info = tile->draw_info(); |
- draw_info.SetSolidColorForTesting(SK_ColorRED); |
- } else { |
- num_outside++; |
- EXPECT_FALSE(tile->required_for_activation()); |
- } |
- } |
- |
- EXPECT_GT(num_inside, 0); |
- EXPECT_GT(num_outside, 0); |
- |
- // Activate and draw active layer. |
- host_impl_.ActivateSyncTree(); |
- host_impl_.active_tree()->UpdateDrawProperties(update_lcd_text); |
- active_layer_->draw_properties().visible_content_rect = visible_content_rect; |
- |
- scoped_ptr<RenderPass> render_pass = RenderPass::Create(); |
- AppendQuadsData data; |
- active_layer_->WillDraw(DRAW_MODE_SOFTWARE, nullptr); |
- active_layer_->AppendQuads(render_pass.get(), &data); |
- active_layer_->DidDraw(nullptr); |
- |
- // All tiles in activation rect is ready to draw. |
- EXPECT_EQ(0u, data.num_missing_tiles); |
- EXPECT_EQ(0u, data.num_incomplete_tiles); |
- EXPECT_FALSE(active_layer_->only_used_low_res_last_append_quads()); |
-} |
- |
-TEST_F(PictureLayerImplTest, HighResTileIsComplete) { |
- base::TimeTicks time_ticks; |
- time_ticks += base::TimeDelta::FromMilliseconds(1); |
- host_impl_.SetCurrentBeginFrameArgs( |
- CreateBeginFrameArgsForTesting(BEGINFRAME_FROM_HERE, time_ticks)); |
- |
- gfx::Size tile_size(100, 100); |
- gfx::Size layer_bounds(200, 200); |
- |
- scoped_refptr<FakePicturePileImpl> pending_pile = |
- FakePicturePileImpl::CreateFilledPile(tile_size, layer_bounds); |
- |
- SetupPendingTreeWithFixedTileSize(pending_pile, tile_size, Region()); |
- ActivateTree(); |
- |
- // All high res tiles have resources. |
- std::vector<Tile*> tiles = |
- active_layer_->tilings()->tiling_at(0)->AllTilesForTesting(); |
- host_impl_.tile_manager()->InitializeTilesWithResourcesForTesting(tiles); |
- |
- scoped_ptr<RenderPass> render_pass = RenderPass::Create(); |
- AppendQuadsData data; |
- active_layer_->WillDraw(DRAW_MODE_SOFTWARE, nullptr); |
- active_layer_->AppendQuads(render_pass.get(), &data); |
- active_layer_->DidDraw(nullptr); |
- |
- // All high res tiles drew, nothing was incomplete. |
- EXPECT_EQ(9u, render_pass->quad_list.size()); |
- EXPECT_EQ(0u, data.num_missing_tiles); |
- EXPECT_EQ(0u, data.num_incomplete_tiles); |
- EXPECT_FALSE(active_layer_->only_used_low_res_last_append_quads()); |
-} |
- |
-TEST_F(PictureLayerImplTest, HighResTileIsIncomplete) { |
- base::TimeTicks time_ticks; |
- time_ticks += base::TimeDelta::FromMilliseconds(1); |
- host_impl_.SetCurrentBeginFrameArgs( |
- CreateBeginFrameArgsForTesting(BEGINFRAME_FROM_HERE, time_ticks)); |
- |
- gfx::Size tile_size(100, 100); |
- gfx::Size layer_bounds(200, 200); |
- |
- scoped_refptr<FakePicturePileImpl> pending_pile = |
- FakePicturePileImpl::CreateFilledPile(tile_size, layer_bounds); |
- SetupPendingTreeWithFixedTileSize(pending_pile, tile_size, Region()); |
- ActivateTree(); |
- |
- scoped_ptr<RenderPass> render_pass = RenderPass::Create(); |
- AppendQuadsData data; |
- active_layer_->WillDraw(DRAW_MODE_SOFTWARE, nullptr); |
- active_layer_->AppendQuads(render_pass.get(), &data); |
- active_layer_->DidDraw(nullptr); |
- |
- EXPECT_EQ(1u, render_pass->quad_list.size()); |
- EXPECT_EQ(1u, data.num_missing_tiles); |
- EXPECT_EQ(0u, data.num_incomplete_tiles); |
- EXPECT_TRUE(active_layer_->only_used_low_res_last_append_quads()); |
-} |
- |
-TEST_F(PictureLayerImplTest, HighResTileIsIncompleteLowResComplete) { |
- base::TimeTicks time_ticks; |
- time_ticks += base::TimeDelta::FromMilliseconds(1); |
- host_impl_.SetCurrentBeginFrameArgs( |
- CreateBeginFrameArgsForTesting(BEGINFRAME_FROM_HERE, time_ticks)); |
- |
- gfx::Size tile_size(100, 100); |
- gfx::Size layer_bounds(200, 200); |
- |
- scoped_refptr<FakePicturePileImpl> pending_pile = |
- FakePicturePileImpl::CreateFilledPile(tile_size, layer_bounds); |
- SetupPendingTreeWithFixedTileSize(pending_pile, tile_size, Region()); |
- ActivateTree(); |
- |
- std::vector<Tile*> low_tiles = |
- active_layer_->tilings()->tiling_at(1)->AllTilesForTesting(); |
- host_impl_.tile_manager()->InitializeTilesWithResourcesForTesting(low_tiles); |
- |
- scoped_ptr<RenderPass> render_pass = RenderPass::Create(); |
- AppendQuadsData data; |
- active_layer_->WillDraw(DRAW_MODE_SOFTWARE, nullptr); |
- active_layer_->AppendQuads(render_pass.get(), &data); |
- active_layer_->DidDraw(nullptr); |
- |
- EXPECT_EQ(1u, render_pass->quad_list.size()); |
- EXPECT_EQ(0u, data.num_missing_tiles); |
- EXPECT_EQ(1u, data.num_incomplete_tiles); |
- EXPECT_TRUE(active_layer_->only_used_low_res_last_append_quads()); |
-} |
- |
-TEST_F(PictureLayerImplTest, LowResTileIsIncomplete) { |
- base::TimeTicks time_ticks; |
- time_ticks += base::TimeDelta::FromMilliseconds(1); |
- host_impl_.SetCurrentBeginFrameArgs( |
- CreateBeginFrameArgsForTesting(BEGINFRAME_FROM_HERE, time_ticks)); |
- |
- gfx::Size tile_size(100, 100); |
- gfx::Size layer_bounds(200, 200); |
- |
- scoped_refptr<FakePicturePileImpl> pending_pile = |
- FakePicturePileImpl::CreateFilledPile(tile_size, layer_bounds); |
- SetupPendingTreeWithFixedTileSize(pending_pile, tile_size, Region()); |
- ActivateTree(); |
- |
- // All high res tiles have resources except one. |
- std::vector<Tile*> high_tiles = |
- active_layer_->tilings()->tiling_at(0)->AllTilesForTesting(); |
- high_tiles.erase(high_tiles.begin()); |
- host_impl_.tile_manager()->InitializeTilesWithResourcesForTesting(high_tiles); |
- |
- // All low res tiles have resources. |
- std::vector<Tile*> low_tiles = |
- active_layer_->tilings()->tiling_at(1)->AllTilesForTesting(); |
- host_impl_.tile_manager()->InitializeTilesWithResourcesForTesting(low_tiles); |
- |
- scoped_ptr<RenderPass> render_pass = RenderPass::Create(); |
- AppendQuadsData data; |
- active_layer_->WillDraw(DRAW_MODE_SOFTWARE, nullptr); |
- active_layer_->AppendQuads(render_pass.get(), &data); |
- active_layer_->DidDraw(nullptr); |
- |
- // The missing high res tile was replaced by a low res tile. |
- EXPECT_EQ(9u, render_pass->quad_list.size()); |
- EXPECT_EQ(0u, data.num_missing_tiles); |
- EXPECT_EQ(1u, data.num_incomplete_tiles); |
- EXPECT_FALSE(active_layer_->only_used_low_res_last_append_quads()); |
-} |
- |
-TEST_F(PictureLayerImplTest, |
- HighResAndIdealResTileIsCompleteWhenRasterScaleIsNotIdeal) { |
- base::TimeTicks time_ticks; |
- time_ticks += base::TimeDelta::FromMilliseconds(1); |
- host_impl_.SetCurrentBeginFrameArgs( |
- CreateBeginFrameArgsForTesting(BEGINFRAME_FROM_HERE, time_ticks)); |
- |
- gfx::Size tile_size(100, 100); |
- gfx::Size layer_bounds(200, 200); |
- gfx::Size viewport_size(400, 400); |
- |
- host_impl_.SetViewportSize(viewport_size); |
- host_impl_.SetDeviceScaleFactor(2.f); |
- |
- scoped_refptr<FakePicturePileImpl> pending_pile = |
- FakePicturePileImpl::CreateFilledPile(tile_size, layer_bounds); |
- scoped_refptr<FakePicturePileImpl> active_pile = |
- FakePicturePileImpl::CreateFilledPile(tile_size, layer_bounds); |
- SetupTreesWithFixedTileSize(pending_pile, active_pile, tile_size, Region()); |
- |
- // One ideal tile exists, this will get used when drawing. |
- std::vector<Tile*> ideal_tiles; |
- EXPECT_EQ(2.f, active_layer_->HighResTiling()->contents_scale()); |
- ideal_tiles.push_back(active_layer_->HighResTiling()->TileAt(0, 0)); |
- host_impl_.tile_manager()->InitializeTilesWithResourcesForTesting( |
- ideal_tiles); |
- |
- // Due to layer scale throttling, the raster contents scale is changed to 1, |
- // while the ideal is still 2. |
- SetupDrawPropertiesAndUpdateTiles(active_layer_, 1.f, 1.f, 1.f, 1.f, false); |
- SetupDrawPropertiesAndUpdateTiles(active_layer_, 2.f, 1.f, 1.f, 1.f, false); |
- |
- EXPECT_EQ(1.f, active_layer_->HighResTiling()->contents_scale()); |
- EXPECT_EQ(1.f, active_layer_->raster_contents_scale()); |
- EXPECT_EQ(2.f, active_layer_->ideal_contents_scale()); |
- |
- // Both tilings still exist. |
- EXPECT_EQ(2.f, active_layer_->tilings()->tiling_at(0)->contents_scale()); |
- EXPECT_EQ(1.f, active_layer_->tilings()->tiling_at(1)->contents_scale()); |
- |
- // All high res tiles have resources. |
- std::vector<Tile*> high_tiles = |
- active_layer_->HighResTiling()->AllTilesForTesting(); |
- host_impl_.tile_manager()->InitializeTilesWithResourcesForTesting(high_tiles); |
- |
- scoped_ptr<RenderPass> render_pass = RenderPass::Create(); |
- AppendQuadsData data; |
- active_layer_->WillDraw(DRAW_MODE_SOFTWARE, nullptr); |
- active_layer_->AppendQuads(render_pass.get(), &data); |
- active_layer_->DidDraw(nullptr); |
- |
- // All high res tiles drew, and the one ideal res tile drew. |
- ASSERT_GT(render_pass->quad_list.size(), 9u); |
- EXPECT_EQ(gfx::SizeF(99.f, 99.f), |
- TileDrawQuad::MaterialCast(render_pass->quad_list.front()) |
- ->tex_coord_rect.size()); |
- EXPECT_EQ(gfx::SizeF(49.5f, 49.5f), |
- TileDrawQuad::MaterialCast(render_pass->quad_list.ElementAt(1)) |
- ->tex_coord_rect.size()); |
- |
- // Neither the high res nor the ideal tiles were considered as incomplete. |
- EXPECT_EQ(0u, data.num_missing_tiles); |
- EXPECT_EQ(0u, data.num_incomplete_tiles); |
- EXPECT_FALSE(active_layer_->only_used_low_res_last_append_quads()); |
-} |
- |
-TEST_F(PictureLayerImplTest, HighResRequiredWhenUnsharedActiveAllReady) { |
- gfx::Size layer_bounds(400, 400); |
- gfx::Size tile_size(100, 100); |
- |
- // No tiles shared. |
- SetupDefaultTreesWithFixedTileSize(layer_bounds, tile_size, |
- gfx::Rect(layer_bounds)); |
- |
- active_layer_->SetAllTilesReady(); |
- |
- // No shared tiles and all active tiles ready, so pending can only |
- // activate with all high res tiles. |
- pending_layer_->HighResTiling()->UpdateAllTilePrioritiesForTesting(); |
- pending_layer_->LowResTiling()->UpdateAllTilePrioritiesForTesting(); |
- |
- AssertAllTilesRequired(pending_layer_->HighResTiling()); |
- AssertNoTilesRequired(pending_layer_->LowResTiling()); |
-} |
- |
-TEST_F(PictureLayerImplTest, HighResRequiredWhenMissingHighResFlagOn) { |
- gfx::Size layer_bounds(400, 400); |
- gfx::Size tile_size(100, 100); |
- |
- // All tiles shared (no invalidation). |
- SetupDefaultTreesWithFixedTileSize(layer_bounds, tile_size, Region()); |
- |
- // Verify active tree not ready. |
- Tile* some_active_tile = |
- active_layer_->HighResTiling()->AllTilesForTesting()[0]; |
- EXPECT_FALSE(some_active_tile->IsReadyToDraw()); |
- |
- // When high res are required, even if the active tree is not ready, |
- // the high res tiles must be ready. |
- host_impl_.SetRequiresHighResToDraw(); |
- |
- pending_layer_->HighResTiling()->UpdateAllTilePrioritiesForTesting(); |
- pending_layer_->LowResTiling()->UpdateAllTilePrioritiesForTesting(); |
- |
- AssertAllTilesRequired(pending_layer_->HighResTiling()); |
- AssertNoTilesRequired(pending_layer_->LowResTiling()); |
-} |
- |
-TEST_F(PictureLayerImplTest, AllHighResRequiredEvenIfShared) { |
- gfx::Size layer_bounds(400, 400); |
- gfx::Size tile_size(100, 100); |
- |
- SetupDefaultTreesWithFixedTileSize(layer_bounds, tile_size, Region()); |
- |
- 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, the high res tiles are required for activation. |
- pending_layer_->HighResTiling()->UpdateAllTilePrioritiesForTesting(); |
- pending_layer_->LowResTiling()->UpdateAllTilePrioritiesForTesting(); |
- |
- AssertAllTilesRequired(pending_layer_->HighResTiling()); |
- AssertNoTilesRequired(pending_layer_->LowResTiling()); |
-} |
- |
-TEST_F(PictureLayerImplTest, DisallowRequiredForActivation) { |
- gfx::Size layer_bounds(400, 400); |
- gfx::Size tile_size(100, 100); |
- |
- SetupDefaultTreesWithFixedTileSize(layer_bounds, tile_size, Region()); |
- |
- Tile* some_active_tile = |
- active_layer_->HighResTiling()->AllTilesForTesting()[0]; |
- EXPECT_FALSE(some_active_tile->IsReadyToDraw()); |
- |
- pending_layer_->HighResTiling()->set_can_require_tiles_for_activation(false); |
- pending_layer_->LowResTiling()->set_can_require_tiles_for_activation(false); |
- |
- // If we disallow required for activation, no tiles can be required. |
- pending_layer_->HighResTiling()->UpdateAllTilePrioritiesForTesting(); |
- pending_layer_->LowResTiling()->UpdateAllTilePrioritiesForTesting(); |
- |
- AssertNoTilesRequired(pending_layer_->HighResTiling()); |
- AssertNoTilesRequired(pending_layer_->LowResTiling()); |
-} |
- |
-TEST_F(PictureLayerImplTest, 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. |
- bool is_solid_color = false; |
- scoped_refptr<FakePicturePileImpl> active_pile = |
- FakePicturePileImpl::CreateEmptyPileThatThinksItHasRecordings( |
- tile_size, layer_bounds, is_solid_color); |
- |
- SetupTreesWithFixedTileSize(pending_pile, active_pile, tile_size, Region()); |
- |
- // Active layer has tilings, but no tiles due to missing recordings. |
- EXPECT_TRUE(active_layer_->CanHaveTilings()); |
- EXPECT_EQ(active_layer_->tilings()->num_tilings(), 2u); |
- 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_->HighResTiling()->UpdateAllTilePrioritiesForTesting(); |
- pending_layer_->LowResTiling()->UpdateAllTilePrioritiesForTesting(); |
- |
- AssertNoTilesRequired(pending_layer_->HighResTiling()); |
- AssertNoTilesRequired(pending_layer_->LowResTiling()); |
-} |
- |
-TEST_F(PictureLayerImplTest, HighResRequiredIfActiveCantHaveTiles) { |
- gfx::Size layer_bounds(400, 400); |
- gfx::Size tile_size(100, 100); |
- |
- scoped_refptr<FakePicturePileImpl> pending_pile = |
- FakePicturePileImpl::CreateFilledPile(tile_size, layer_bounds); |
- scoped_refptr<FakePicturePileImpl> active_pile = |
- FakePicturePileImpl::CreateEmptyPile(tile_size, layer_bounds); |
- SetupTreesWithFixedTileSize(pending_pile, active_pile, tile_size, Region()); |
- |
- // Active layer can't have tiles. |
- EXPECT_FALSE(active_layer_->CanHaveTilings()); |
- |
- // All high res tiles required. This should be considered identical |
- // to the case where there is no active layer, to avoid flashing content. |
- // This can happen if a layer exists for a while and switches from |
- // not being able to have content to having content. |
- pending_layer_->HighResTiling()->UpdateAllTilePrioritiesForTesting(); |
- pending_layer_->LowResTiling()->UpdateAllTilePrioritiesForTesting(); |
- |
- AssertAllTilesRequired(pending_layer_->HighResTiling()); |
- AssertNoTilesRequired(pending_layer_->LowResTiling()); |
-} |
- |
-TEST_F(PictureLayerImplTest, HighResRequiredWhenActiveHasDifferentBounds) { |
- gfx::Size pending_layer_bounds(400, 400); |
- gfx::Size active_layer_bounds(200, 200); |
- gfx::Size tile_size(100, 100); |
- |
- scoped_refptr<FakePicturePileImpl> pending_pile = |
- FakePicturePileImpl::CreateFilledPile(tile_size, pending_layer_bounds); |
- scoped_refptr<FakePicturePileImpl> active_pile = |
- FakePicturePileImpl::CreateFilledPile(tile_size, active_layer_bounds); |
- |
- SetupTreesWithFixedTileSize(pending_pile, active_pile, tile_size, Region()); |
- |
- // Since the active layer has different bounds, the pending layer needs all |
- // high res tiles in order to activate. |
- pending_layer_->HighResTiling()->UpdateAllTilePrioritiesForTesting(); |
- pending_layer_->LowResTiling()->UpdateAllTilePrioritiesForTesting(); |
- |
- AssertAllTilesRequired(pending_layer_->HighResTiling()); |
- AssertNoTilesRequired(pending_layer_->LowResTiling()); |
-} |
- |
-TEST_F(PictureLayerImplTest, ActivateUninitializedLayer) { |
- gfx::Size tile_size(100, 100); |
- gfx::Size layer_bounds(400, 400); |
- scoped_refptr<FakePicturePileImpl> pending_pile = |
- FakePicturePileImpl::CreateFilledPile(tile_size, layer_bounds); |
- |
- host_impl_.CreatePendingTree(); |
- LayerTreeImpl* pending_tree = host_impl_.pending_tree(); |
- |
- scoped_ptr<FakePictureLayerImpl> pending_layer = |
- FakePictureLayerImpl::CreateWithRasterSource(pending_tree, id_, |
- pending_pile); |
- pending_layer->SetDrawsContent(true); |
- pending_tree->SetRootLayer(pending_layer.Pass()); |
- |
- pending_layer_ = static_cast<FakePictureLayerImpl*>( |
- host_impl_.pending_tree()->LayerById(id_)); |
- |
- // Set some state on the pending layer, make sure it is not clobbered |
- // by a sync from the active layer. This could happen because if the |
- // pending layer has not been post-commit initialized it will attempt |
- // to sync from the active layer. |
- float raster_page_scale = 10.f * pending_layer_->raster_page_scale(); |
- pending_layer_->set_raster_page_scale(raster_page_scale); |
- |
- host_impl_.ActivateSyncTree(); |
- |
- active_layer_ = static_cast<FakePictureLayerImpl*>( |
- host_impl_.active_tree()->LayerById(id_)); |
- |
- EXPECT_EQ(0u, active_layer_->num_tilings()); |
- EXPECT_EQ(raster_page_scale, active_layer_->raster_page_scale()); |
-} |
- |
-TEST_F(PictureLayerImplTest, ShareTilesOnNextFrame) { |
- gfx::Size layer_bounds(1500, 1500); |
- gfx::Size tile_size(100, 100); |
- |
- scoped_refptr<FakePicturePileImpl> pending_pile = |
- FakePicturePileImpl::CreateFilledPile(tile_size, layer_bounds); |
- |
- SetupPendingTree(pending_pile); |
- |
- PictureLayerTiling* tiling = pending_layer_->HighResTiling(); |
- gfx::Rect first_invalidate = tiling->TilingDataForTesting().TileBounds(0, 0); |
- first_invalidate.Inset(tiling->TilingDataForTesting().border_texels(), |
- tiling->TilingDataForTesting().border_texels()); |
- gfx::Rect second_invalidate = tiling->TilingDataForTesting().TileBounds(1, 1); |
- second_invalidate.Inset(tiling->TilingDataForTesting().border_texels(), |
- tiling->TilingDataForTesting().border_texels()); |
- |
- ActivateTree(); |
- |
- // Make a pending tree with an invalidated raster tile 0,0. |
- SetupPendingTreeWithInvalidation(pending_pile, first_invalidate); |
- |
- // Activate and make a pending tree with an invalidated raster tile 1,1. |
- ActivateTree(); |
- |
- SetupPendingTreeWithInvalidation(pending_pile, second_invalidate); |
- |
- PictureLayerTiling* pending_tiling = pending_layer_->tilings()->tiling_at(0); |
- PictureLayerTiling* active_tiling = active_layer_->tilings()->tiling_at(0); |
- |
- // pending_tiling->CreateAllTilesForTesting(); |
- |
- // Tile 0,0 should be shared, but tile 1,1 should not be. |
- EXPECT_EQ(active_tiling->TileAt(0, 0), pending_tiling->TileAt(0, 0)); |
- EXPECT_EQ(active_tiling->TileAt(1, 0), pending_tiling->TileAt(1, 0)); |
- EXPECT_EQ(active_tiling->TileAt(0, 1), pending_tiling->TileAt(0, 1)); |
- EXPECT_NE(active_tiling->TileAt(1, 1), pending_tiling->TileAt(1, 1)); |
- EXPECT_TRUE(pending_tiling->TileAt(0, 0)->is_shared()); |
- EXPECT_TRUE(pending_tiling->TileAt(1, 0)->is_shared()); |
- EXPECT_TRUE(pending_tiling->TileAt(0, 1)->is_shared()); |
- EXPECT_FALSE(pending_tiling->TileAt(1, 1)->is_shared()); |
- |
- // Drop the tiles on the active tree and recreate them. The same tiles |
- // should be shared or not. |
- active_tiling->ComputeTilePriorityRects(gfx::Rect(), 1.f, 1.0, Occlusion()); |
- EXPECT_TRUE(active_tiling->AllTilesForTesting().empty()); |
- active_tiling->CreateAllTilesForTesting(); |
- |
- // Tile 0,0 should be shared, but tile 1,1 should not be. |
- EXPECT_EQ(active_tiling->TileAt(0, 0), pending_tiling->TileAt(0, 0)); |
- EXPECT_EQ(active_tiling->TileAt(1, 0), pending_tiling->TileAt(1, 0)); |
- EXPECT_EQ(active_tiling->TileAt(0, 1), pending_tiling->TileAt(0, 1)); |
- EXPECT_NE(active_tiling->TileAt(1, 1), pending_tiling->TileAt(1, 1)); |
- EXPECT_TRUE(pending_tiling->TileAt(0, 0)->is_shared()); |
- EXPECT_TRUE(pending_tiling->TileAt(1, 0)->is_shared()); |
- EXPECT_TRUE(pending_tiling->TileAt(0, 1)->is_shared()); |
- EXPECT_FALSE(pending_tiling->TileAt(1, 1)->is_shared()); |
-} |
- |
-TEST_F(PictureLayerImplTest, ShareTilesWithNoInvalidation) { |
- SetupDefaultTrees(gfx::Size(1500, 1500)); |
- |
- EXPECT_GE(active_layer_->num_tilings(), 1u); |
- EXPECT_GE(pending_layer_->num_tilings(), 1u); |
- |
- // No invalidation, so all tiles are shared. |
- PictureLayerTiling* active_tiling = active_layer_->tilings()->tiling_at(0); |
- PictureLayerTiling* pending_tiling = pending_layer_->tilings()->tiling_at(0); |
- ASSERT_TRUE(active_tiling); |
- ASSERT_TRUE(pending_tiling); |
- |
- EXPECT_TRUE(active_tiling->TileAt(0, 0)); |
- EXPECT_TRUE(active_tiling->TileAt(1, 0)); |
- EXPECT_TRUE(active_tiling->TileAt(0, 1)); |
- EXPECT_TRUE(active_tiling->TileAt(1, 1)); |
- |
- EXPECT_TRUE(pending_tiling->TileAt(0, 0)); |
- EXPECT_TRUE(pending_tiling->TileAt(1, 0)); |
- EXPECT_TRUE(pending_tiling->TileAt(0, 1)); |
- EXPECT_TRUE(pending_tiling->TileAt(1, 1)); |
- |
- EXPECT_EQ(active_tiling->TileAt(0, 0), pending_tiling->TileAt(0, 0)); |
- EXPECT_TRUE(active_tiling->TileAt(0, 0)->is_shared()); |
- EXPECT_EQ(active_tiling->TileAt(1, 0), pending_tiling->TileAt(1, 0)); |
- EXPECT_TRUE(active_tiling->TileAt(1, 0)->is_shared()); |
- EXPECT_EQ(active_tiling->TileAt(0, 1), pending_tiling->TileAt(0, 1)); |
- EXPECT_TRUE(active_tiling->TileAt(0, 1)->is_shared()); |
- EXPECT_EQ(active_tiling->TileAt(1, 1), pending_tiling->TileAt(1, 1)); |
- EXPECT_TRUE(active_tiling->TileAt(1, 1)->is_shared()); |
-} |
- |
-TEST_F(PictureLayerImplTest, ShareInvalidActiveTreeTiles) { |
- gfx::Size tile_size(100, 100); |
- gfx::Size layer_bounds(1500, 1500); |
- |
- scoped_refptr<FakePicturePileImpl> pending_pile = |
- FakePicturePileImpl::CreateFilledPile(tile_size, layer_bounds); |
- scoped_refptr<FakePicturePileImpl> active_pile = |
- FakePicturePileImpl::CreateFilledPile(tile_size, layer_bounds); |
- SetupTreesWithInvalidation(pending_pile, active_pile, gfx::Rect(1, 1)); |
- // Activate the invalidation. |
- ActivateTree(); |
- // Make another pending tree without any invalidation in it. |
- scoped_refptr<FakePicturePileImpl> pending_pile2 = |
- FakePicturePileImpl::CreateFilledPile(tile_size, layer_bounds); |
- SetupPendingTree(pending_pile2); |
- |
- EXPECT_GE(active_layer_->num_tilings(), 1u); |
- EXPECT_GE(pending_layer_->num_tilings(), 1u); |
- |
- // The active tree invalidation was handled by the active tiles, so they |
- // can be shared with the pending tree. |
- PictureLayerTiling* active_tiling = active_layer_->tilings()->tiling_at(0); |
- PictureLayerTiling* pending_tiling = pending_layer_->tilings()->tiling_at(0); |
- ASSERT_TRUE(active_tiling); |
- ASSERT_TRUE(pending_tiling); |
- |
- EXPECT_TRUE(active_tiling->TileAt(0, 0)); |
- EXPECT_TRUE(active_tiling->TileAt(1, 0)); |
- EXPECT_TRUE(active_tiling->TileAt(0, 1)); |
- EXPECT_TRUE(active_tiling->TileAt(1, 1)); |
- |
- EXPECT_TRUE(pending_tiling->TileAt(0, 0)); |
- EXPECT_TRUE(pending_tiling->TileAt(1, 0)); |
- EXPECT_TRUE(pending_tiling->TileAt(0, 1)); |
- EXPECT_TRUE(pending_tiling->TileAt(1, 1)); |
- |
- EXPECT_EQ(active_tiling->TileAt(0, 0), pending_tiling->TileAt(0, 0)); |
- EXPECT_TRUE(active_tiling->TileAt(0, 0)->is_shared()); |
- EXPECT_EQ(active_tiling->TileAt(1, 0), pending_tiling->TileAt(1, 0)); |
- EXPECT_TRUE(active_tiling->TileAt(1, 0)->is_shared()); |
- EXPECT_EQ(active_tiling->TileAt(0, 1), pending_tiling->TileAt(0, 1)); |
- EXPECT_TRUE(active_tiling->TileAt(0, 1)->is_shared()); |
- EXPECT_EQ(active_tiling->TileAt(1, 1), pending_tiling->TileAt(1, 1)); |
- EXPECT_TRUE(active_tiling->TileAt(1, 1)->is_shared()); |
-} |
- |
-TEST_F(PictureLayerImplTest, RecreateInvalidPendingTreeTiles) { |
- // Set some invalidation on the pending tree. We should replace raster tiles |
- // that touch this. |
- SetupDefaultTreesWithInvalidation(gfx::Size(1500, 1500), gfx::Rect(1, 1)); |
- |
- EXPECT_GE(active_layer_->num_tilings(), 1u); |
- EXPECT_GE(pending_layer_->num_tilings(), 1u); |
- |
- // The pending tree invalidation means tiles can not be shared with the |
- // active tree. |
- PictureLayerTiling* active_tiling = active_layer_->tilings()->tiling_at(0); |
- PictureLayerTiling* pending_tiling = pending_layer_->tilings()->tiling_at(0); |
- ASSERT_TRUE(active_tiling); |
- ASSERT_TRUE(pending_tiling); |
- |
- EXPECT_TRUE(active_tiling->TileAt(0, 0)); |
- EXPECT_TRUE(active_tiling->TileAt(1, 0)); |
- EXPECT_TRUE(active_tiling->TileAt(0, 1)); |
- EXPECT_TRUE(active_tiling->TileAt(1, 1)); |
- |
- EXPECT_TRUE(pending_tiling->TileAt(0, 0)); |
- EXPECT_TRUE(pending_tiling->TileAt(1, 0)); |
- EXPECT_TRUE(pending_tiling->TileAt(0, 1)); |
- EXPECT_TRUE(pending_tiling->TileAt(1, 1)); |
- |
- EXPECT_NE(active_tiling->TileAt(0, 0), pending_tiling->TileAt(0, 0)); |
- EXPECT_FALSE(active_tiling->TileAt(0, 0)->is_shared()); |
- EXPECT_FALSE(pending_tiling->TileAt(0, 0)->is_shared()); |
- EXPECT_EQ(active_tiling->TileAt(1, 0), pending_tiling->TileAt(1, 0)); |
- EXPECT_TRUE(active_tiling->TileAt(1, 0)->is_shared()); |
- EXPECT_EQ(active_tiling->TileAt(0, 1), pending_tiling->TileAt(0, 1)); |
- EXPECT_TRUE(active_tiling->TileAt(1, 1)->is_shared()); |
- EXPECT_EQ(active_tiling->TileAt(1, 1), pending_tiling->TileAt(1, 1)); |
- EXPECT_TRUE(active_tiling->TileAt(1, 1)->is_shared()); |
-} |
- |
-TEST_F(PictureLayerImplTest, SyncTilingAfterGpuRasterizationToggles) { |
- base::TimeTicks time_ticks; |
- time_ticks += base::TimeDelta::FromMilliseconds(1); |
- host_impl_.SetCurrentBeginFrameArgs( |
- CreateBeginFrameArgsForTesting(BEGINFRAME_FROM_HERE, time_ticks)); |
- |
- gfx::Size tile_size(100, 100); |
- gfx::Size layer_bounds(10, 10); |
- |
- 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); |
- |
- EXPECT_TRUE(pending_layer_->tilings()->FindTilingWithScale(1.f)); |
- EXPECT_TRUE(active_layer_->tilings()->FindTilingWithScale(1.f)); |
- |
- // Gpu rasterization is disabled by default. |
- EXPECT_FALSE(host_impl_.use_gpu_rasterization()); |
- // Toggling the gpu rasterization clears all tilings on both trees. |
- host_impl_.SetUseGpuRasterization(true); |
- EXPECT_EQ(0u, pending_layer_->tilings()->num_tilings()); |
- EXPECT_EQ(0u, active_layer_->tilings()->num_tilings()); |
- |
- // Make sure that we can still add tiling to the pending layer, |
- // that gets synced to the active layer. |
- time_ticks += base::TimeDelta::FromMilliseconds(1); |
- host_impl_.SetCurrentBeginFrameArgs( |
- CreateBeginFrameArgsForTesting(BEGINFRAME_FROM_HERE, time_ticks)); |
- bool update_lcd_text = false; |
- host_impl_.pending_tree()->UpdateDrawProperties(update_lcd_text); |
- EXPECT_TRUE(pending_layer_->tilings()->FindTilingWithScale(1.f)); |
- |
- ActivateTree(); |
- EXPECT_TRUE(active_layer_->tilings()->FindTilingWithScale(1.f)); |
- |
- SetupPendingTree(pending_pile); |
- EXPECT_TRUE(pending_layer_->tilings()->FindTilingWithScale(1.f)); |
- |
- // Toggling the gpu rasterization clears all tilings on both trees. |
- EXPECT_TRUE(host_impl_.use_gpu_rasterization()); |
- host_impl_.SetUseGpuRasterization(false); |
- EXPECT_EQ(0u, pending_layer_->tilings()->num_tilings()); |
- EXPECT_EQ(0u, active_layer_->tilings()->num_tilings()); |
-} |
- |
-TEST_F(PictureLayerImplTest, HighResCreatedWhenBoundsShrink) { |
- gfx::Size tile_size(100, 100); |
- |
- // Put 0.5 as high res. |
- host_impl_.SetDeviceScaleFactor(0.5f); |
- |
- scoped_refptr<FakePicturePileImpl> pending_pile = |
- FakePicturePileImpl::CreateFilledPile(tile_size, gfx::Size(10, 10)); |
- SetupPendingTree(pending_pile); |
- |
- // Sanity checks. |
- EXPECT_EQ(1u, pending_layer_->tilings()->num_tilings()); |
- EXPECT_TRUE(pending_layer_->tilings()->FindTilingWithScale(0.5f)); |
- |
- ActivateTree(); |
- |
- // Now, set the bounds to be 1x1, so that minimum contents scale becomes 1. |
- pending_pile = |
- FakePicturePileImpl::CreateFilledPile(tile_size, gfx::Size(1, 1)); |
- SetupPendingTree(pending_pile); |
- |
- // Another sanity check. |
- EXPECT_EQ(1.f, pending_layer_->MinimumContentsScale()); |
- |
- // Since the MinContentsScale is 1, the 0.5 tiling should be replaced by a 1.0 |
- // tiling. |
- SetupDrawPropertiesAndUpdateTiles(pending_layer_, 0.5f, 1.f, 1.f, 1.f, false); |
- |
- EXPECT_EQ(1u, pending_layer_->tilings()->num_tilings()); |
- PictureLayerTiling* tiling = |
- pending_layer_->tilings()->FindTilingWithScale(1.0f); |
- ASSERT_TRUE(tiling); |
- EXPECT_EQ(HIGH_RESOLUTION, tiling->resolution()); |
-} |
- |
-TEST_F(PictureLayerImplTest, LowResTilingWithoutGpuRasterization) { |
- gfx::Size default_tile_size(host_impl_.settings().default_tile_size); |
- gfx::Size layer_bounds(default_tile_size.width() * 4, |
- default_tile_size.height() * 4); |
- |
- host_impl_.SetUseGpuRasterization(false); |
- |
- SetupDefaultTrees(layer_bounds); |
- EXPECT_FALSE(host_impl_.use_gpu_rasterization()); |
- // Should have a low-res and a high-res tiling. |
- EXPECT_EQ(2u, pending_layer_->tilings()->num_tilings()); |
-} |
- |
-TEST_F(PictureLayerImplTest, NoLowResTilingWithGpuRasterization) { |
- gfx::Size default_tile_size(host_impl_.settings().default_tile_size); |
- gfx::Size layer_bounds(default_tile_size.width() * 4, |
- default_tile_size.height() * 4); |
- |
- host_impl_.SetUseGpuRasterization(true); |
- |
- SetupDefaultTrees(layer_bounds); |
- EXPECT_TRUE(host_impl_.use_gpu_rasterization()); |
- // Should only have the high-res tiling. |
- EXPECT_EQ(1u, pending_layer_->tilings()->num_tilings()); |
-} |
- |
-TEST_F(PictureLayerImplTest, NoTilingIfDoesNotDrawContent) { |
- // Set up layers with tilings. |
- SetupDefaultTrees(gfx::Size(10, 10)); |
- SetContentsScaleOnBothLayers(1.f, 1.f, 1.f, 1.f, false); |
- pending_layer_->PushPropertiesTo(active_layer_); |
- EXPECT_TRUE(pending_layer_->DrawsContent()); |
- EXPECT_TRUE(pending_layer_->CanHaveTilings()); |
- EXPECT_GE(pending_layer_->num_tilings(), 0u); |
- EXPECT_GE(active_layer_->num_tilings(), 0u); |
- |
- // Set content to false, which should make CanHaveTilings return false. |
- pending_layer_->SetDrawsContent(false); |
- EXPECT_FALSE(pending_layer_->DrawsContent()); |
- EXPECT_FALSE(pending_layer_->CanHaveTilings()); |
- |
- // No tilings should be pushed to active layer. |
- pending_layer_->PushPropertiesTo(active_layer_); |
- EXPECT_EQ(0u, active_layer_->num_tilings()); |
-} |
- |
-TEST_F(PictureLayerImplTest, FirstTilingDuringPinch) { |
- SetupDefaultTrees(gfx::Size(10, 10)); |
- |
- // We start with a tiling at scale 1. |
- EXPECT_EQ(1.f, pending_layer_->HighResTiling()->contents_scale()); |
- |
- // When we scale up by 2.3, we get a new tiling that is a power of 2, in this |
- // case 4. |
- host_impl_.PinchGestureBegin(); |
- float high_res_scale = 2.3f; |
- SetContentsScaleOnBothLayers(high_res_scale, 1.f, 1.f, 1.f, false); |
- EXPECT_EQ(4.f, pending_layer_->HighResTiling()->contents_scale()); |
-} |
- |
-TEST_F(PictureLayerImplTest, PinchingTooSmall) { |
- SetupDefaultTrees(gfx::Size(10, 10)); |
- |
- // We start with a tiling at scale 1. |
- EXPECT_EQ(1.f, pending_layer_->HighResTiling()->contents_scale()); |
- |
- host_impl_.PinchGestureBegin(); |
- float high_res_scale = 0.0001f; |
- EXPECT_LT(high_res_scale, pending_layer_->MinimumContentsScale()); |
- |
- SetContentsScaleOnBothLayers(high_res_scale, 1.f, high_res_scale, 1.f, false); |
- EXPECT_FLOAT_EQ(pending_layer_->MinimumContentsScale(), |
- pending_layer_->HighResTiling()->contents_scale()); |
-} |
- |
-TEST_F(PictureLayerImplTest, PinchingTooSmallWithContentsScale) { |
- SetupDefaultTrees(gfx::Size(10, 10)); |
- |
- ResetTilingsAndRasterScales(); |
- |
- float contents_scale = 0.15f; |
- SetContentsScaleOnBothLayers(contents_scale, 1.f, 1.f, 1.f, false); |
- |
- ASSERT_GE(pending_layer_->num_tilings(), 0u); |
- EXPECT_FLOAT_EQ(contents_scale, |
- pending_layer_->HighResTiling()->contents_scale()); |
- |
- host_impl_.PinchGestureBegin(); |
- |
- float page_scale = 0.0001f; |
- EXPECT_LT(page_scale * contents_scale, |
- pending_layer_->MinimumContentsScale()); |
- |
- SetContentsScaleOnBothLayers(contents_scale * page_scale, 1.f, page_scale, |
- 1.f, false); |
- ASSERT_GE(pending_layer_->num_tilings(), 0u); |
- EXPECT_FLOAT_EQ(pending_layer_->MinimumContentsScale(), |
- pending_layer_->HighResTiling()->contents_scale()); |
-} |
- |
-class DeferredInitPictureLayerImplTest : public PictureLayerImplTest { |
- public: |
- void InitializeRenderer() override { |
- bool delegated_rendering = false; |
- host_impl_.InitializeRenderer(FakeOutputSurface::CreateDeferredGL( |
- scoped_ptr<SoftwareOutputDevice>(new SoftwareOutputDevice), |
- delegated_rendering)); |
- } |
- |
- void SetUp() override { |
- PictureLayerImplTest::SetUp(); |
- |
- // Create some default active and pending trees. |
- 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); |
- } |
-}; |
- |
-// This test is really a LayerTreeHostImpl test, in that it makes sure |
-// that trees need update draw properties after deferred initialization. |
-// However, this is also a regression test for PictureLayerImpl in that |
-// not having this update will cause a crash. |
-TEST_F(DeferredInitPictureLayerImplTest, PreventUpdateTilesDuringLostContext) { |
- host_impl_.pending_tree()->UpdateDrawProperties(true); |
- host_impl_.active_tree()->UpdateDrawProperties(false); |
- EXPECT_FALSE(host_impl_.pending_tree()->needs_update_draw_properties()); |
- EXPECT_FALSE(host_impl_.active_tree()->needs_update_draw_properties()); |
- |
- FakeOutputSurface* fake_output_surface = |
- static_cast<FakeOutputSurface*>(host_impl_.output_surface()); |
- ASSERT_TRUE(fake_output_surface->InitializeAndSetContext3d( |
- TestContextProvider::Create(), TestContextProvider::Create())); |
- |
- // These will crash PictureLayerImpl if this is not true. |
- ASSERT_TRUE(host_impl_.pending_tree()->needs_update_draw_properties()); |
- ASSERT_TRUE(host_impl_.active_tree()->needs_update_draw_properties()); |
- host_impl_.active_tree()->UpdateDrawProperties(false); |
-} |
- |
-TEST_F(PictureLayerImplTest, HighResTilingDuringAnimationForCpuRasterization) { |
- gfx::Size viewport_size(1000, 1000); |
- host_impl_.SetViewportSize(viewport_size); |
- |
- gfx::Size layer_bounds(100, 100); |
- SetupDefaultTrees(layer_bounds); |
- |
- float contents_scale = 1.f; |
- float device_scale = 1.f; |
- float page_scale = 1.f; |
- float maximum_animation_scale = 1.f; |
- bool animating_transform = false; |
- |
- EXPECT_BOTH_EQ(HighResTiling()->contents_scale(), 1.f); |
- |
- // Since we're CPU-rasterizing, starting an animation should cause tiling |
- // resolution to get set to the maximum animation scale factor. |
- animating_transform = true; |
- maximum_animation_scale = 3.f; |
- contents_scale = 2.f; |
- |
- SetContentsScaleOnBothLayers(contents_scale, |
- device_scale, |
- page_scale, |
- maximum_animation_scale, |
- animating_transform); |
- EXPECT_BOTH_EQ(HighResTiling()->contents_scale(), 3.f); |
- |
- // Further changes to scale during the animation should not cause a new |
- // high-res tiling to get created. |
- contents_scale = 4.f; |
- maximum_animation_scale = 5.f; |
- |
- SetContentsScaleOnBothLayers(contents_scale, |
- device_scale, |
- page_scale, |
- maximum_animation_scale, |
- animating_transform); |
- EXPECT_BOTH_EQ(HighResTiling()->contents_scale(), 3.f); |
- |
- // Once we stop animating, a new high-res tiling should be created. |
- animating_transform = false; |
- |
- SetContentsScaleOnBothLayers(contents_scale, |
- device_scale, |
- page_scale, |
- maximum_animation_scale, |
- animating_transform); |
- EXPECT_BOTH_EQ(HighResTiling()->contents_scale(), 4.f); |
- |
- // When animating with an unknown maximum animation scale factor, a new |
- // high-res tiling should be created at a source scale of 1. |
- animating_transform = true; |
- contents_scale = 2.f; |
- maximum_animation_scale = 0.f; |
- |
- SetContentsScaleOnBothLayers(contents_scale, |
- device_scale, |
- page_scale, |
- maximum_animation_scale, |
- animating_transform); |
- EXPECT_BOTH_EQ(HighResTiling()->contents_scale(), page_scale * device_scale); |
- |
- // Further changes to scale during the animation should not cause a new |
- // high-res tiling to get created. |
- contents_scale = 3.f; |
- |
- SetContentsScaleOnBothLayers(contents_scale, |
- device_scale, |
- page_scale, |
- maximum_animation_scale, |
- animating_transform); |
- EXPECT_BOTH_EQ(HighResTiling()->contents_scale(), page_scale * device_scale); |
- |
- // Once we stop animating, a new high-res tiling should be created. |
- animating_transform = false; |
- contents_scale = 4.f; |
- |
- SetContentsScaleOnBothLayers(contents_scale, |
- device_scale, |
- page_scale, |
- maximum_animation_scale, |
- animating_transform); |
- EXPECT_BOTH_EQ(HighResTiling()->contents_scale(), 4.f); |
- |
- // When animating with a maxmium animation scale factor that is so large |
- // that the layer grows larger than the viewport at this scale, a new |
- // high-res tiling should get created at a source scale of 1, not at its |
- // maximum scale. |
- animating_transform = true; |
- contents_scale = 2.f; |
- maximum_animation_scale = 11.f; |
- |
- SetContentsScaleOnBothLayers(contents_scale, |
- device_scale, |
- page_scale, |
- maximum_animation_scale, |
- animating_transform); |
- EXPECT_BOTH_EQ(HighResTiling()->contents_scale(), page_scale * device_scale); |
- |
- // Once we stop animating, a new high-res tiling should be created. |
- animating_transform = false; |
- contents_scale = 11.f; |
- |
- SetContentsScaleOnBothLayers(contents_scale, |
- device_scale, |
- page_scale, |
- maximum_animation_scale, |
- animating_transform); |
- EXPECT_BOTH_EQ(HighResTiling()->contents_scale(), 11.f); |
- |
- // When animating with a maxmium animation scale factor that is so large |
- // that the layer grows larger than the viewport at this scale, and where |
- // the intial source scale is < 1, a new high-res tiling should get created |
- // at source scale 1. |
- animating_transform = true; |
- contents_scale = 0.1f; |
- maximum_animation_scale = 11.f; |
- |
- SetContentsScaleOnBothLayers(contents_scale, |
- device_scale, |
- page_scale, |
- maximum_animation_scale, |
- animating_transform); |
- EXPECT_BOTH_EQ(HighResTiling()->contents_scale(), device_scale * page_scale); |
- |
- // Once we stop animating, a new high-res tiling should be created. |
- animating_transform = false; |
- contents_scale = 12.f; |
- |
- SetContentsScaleOnBothLayers(contents_scale, |
- device_scale, |
- page_scale, |
- maximum_animation_scale, |
- animating_transform); |
- EXPECT_BOTH_EQ(HighResTiling()->contents_scale(), 12.f); |
- |
- // When animating toward a smaller scale, but that is still so large that the |
- // layer grows larger than the viewport at this scale, a new high-res tiling |
- // should get created at source scale 1. |
- animating_transform = true; |
- contents_scale = 11.f; |
- maximum_animation_scale = 11.f; |
- |
- SetContentsScaleOnBothLayers(contents_scale, |
- device_scale, |
- page_scale, |
- maximum_animation_scale, |
- animating_transform); |
- EXPECT_BOTH_EQ(HighResTiling()->contents_scale(), device_scale * page_scale); |
- |
- // Once we stop animating, a new high-res tiling should be created. |
- animating_transform = false; |
- contents_scale = 11.f; |
- |
- SetContentsScaleOnBothLayers(contents_scale, |
- device_scale, |
- page_scale, |
- maximum_animation_scale, |
- animating_transform); |
- EXPECT_BOTH_EQ(HighResTiling()->contents_scale(), 11.f); |
-} |
- |
-TEST_F(PictureLayerImplTest, HighResTilingDuringAnimationForGpuRasterization) { |
- gfx::Size layer_bounds(100, 100); |
- gfx::Size viewport_size(1000, 1000); |
- SetupDefaultTrees(layer_bounds); |
- host_impl_.SetViewportSize(viewport_size); |
- host_impl_.SetUseGpuRasterization(true); |
- |
- float contents_scale = 1.f; |
- float device_scale = 1.3f; |
- float page_scale = 1.4f; |
- float maximum_animation_scale = 1.f; |
- bool animating_transform = false; |
- |
- SetContentsScaleOnBothLayers(contents_scale, |
- device_scale, |
- page_scale, |
- maximum_animation_scale, |
- animating_transform); |
- EXPECT_BOTH_EQ(HighResTiling()->contents_scale(), 1.f); |
- |
- // Since we're GPU-rasterizing, starting an animation should cause tiling |
- // resolution to get set to the current contents scale. |
- animating_transform = true; |
- contents_scale = 2.f; |
- maximum_animation_scale = 4.f; |
- |
- SetContentsScaleOnBothLayers(contents_scale, |
- device_scale, |
- page_scale, |
- maximum_animation_scale, |
- animating_transform); |
- EXPECT_BOTH_EQ(HighResTiling()->contents_scale(), 2.f); |
- |
- // Further changes to scale during the animation should cause a new high-res |
- // tiling to get created. |
- contents_scale = 3.f; |
- |
- SetContentsScaleOnBothLayers(contents_scale, |
- device_scale, |
- page_scale, |
- maximum_animation_scale, |
- animating_transform); |
- EXPECT_BOTH_EQ(HighResTiling()->contents_scale(), 3.f); |
- |
- // Since we're re-rasterizing during the animation, scales smaller than 1 |
- // should be respected. |
- contents_scale = 0.25f; |
- |
- SetContentsScaleOnBothLayers(contents_scale, |
- device_scale, |
- page_scale, |
- maximum_animation_scale, |
- animating_transform); |
- EXPECT_BOTH_EQ(HighResTiling()->contents_scale(), 0.25f); |
- |
- // Once we stop animating, a new high-res tiling should be created. |
- contents_scale = 4.f; |
- animating_transform = false; |
- |
- SetContentsScaleOnBothLayers(contents_scale, |
- device_scale, |
- page_scale, |
- maximum_animation_scale, |
- animating_transform); |
- EXPECT_BOTH_EQ(HighResTiling()->contents_scale(), 4.f); |
-} |
- |
-TEST_F(PictureLayerImplTest, TilingSetRasterQueue) { |
- base::TimeTicks time_ticks; |
- time_ticks += base::TimeDelta::FromMilliseconds(1); |
- host_impl_.SetCurrentBeginFrameArgs( |
- CreateBeginFrameArgsForTesting(BEGINFRAME_FROM_HERE, time_ticks)); |
- |
- host_impl_.SetViewportSize(gfx::Size(500, 500)); |
- |
- gfx::Size recording_tile_size(100, 100); |
- gfx::Size layer_bounds(1000, 1000); |
- |
- scoped_refptr<FakePicturePileImpl> pending_pile = |
- FakePicturePileImpl::CreateFilledPile(recording_tile_size, layer_bounds); |
- |
- SetupPendingTree(pending_pile); |
- EXPECT_EQ(2u, pending_layer_->num_tilings()); |
- |
- std::set<Tile*> unique_tiles; |
- bool reached_prepaint = false; |
- int non_ideal_tile_count = 0u; |
- int low_res_tile_count = 0u; |
- int high_res_tile_count = 0u; |
- int high_res_now_tiles = 0u; |
- scoped_ptr<TilingSetRasterQueueAll> queue(new TilingSetRasterQueueAll( |
- pending_layer_->picture_layer_tiling_set(), false)); |
- while (!queue->IsEmpty()) { |
- Tile* tile = queue->Top(); |
- TilePriority priority = tile->priority(PENDING_TREE); |
- |
- EXPECT_TRUE(tile); |
- |
- // Non-high res tiles only get visible tiles. Also, prepaint should only |
- // come at the end of the iteration. |
- if (priority.resolution != HIGH_RESOLUTION) { |
- EXPECT_EQ(TilePriority::NOW, priority.priority_bin); |
- } else if (reached_prepaint) { |
- EXPECT_NE(TilePriority::NOW, priority.priority_bin); |
- } else { |
- reached_prepaint = priority.priority_bin != TilePriority::NOW; |
- if (!reached_prepaint) |
- ++high_res_now_tiles; |
- } |
- |
- non_ideal_tile_count += priority.resolution == NON_IDEAL_RESOLUTION; |
- low_res_tile_count += priority.resolution == LOW_RESOLUTION; |
- high_res_tile_count += priority.resolution == HIGH_RESOLUTION; |
- |
- unique_tiles.insert(tile); |
- queue->Pop(); |
- } |
- |
- EXPECT_TRUE(reached_prepaint); |
- EXPECT_EQ(0, non_ideal_tile_count); |
- EXPECT_EQ(0, low_res_tile_count); |
- |
- // With layer size being 1000x1000 and default tile size 256x256, we expect to |
- // see 4 now tiles out of 16 total high res tiles. |
- EXPECT_EQ(16, high_res_tile_count); |
- EXPECT_EQ(4, high_res_now_tiles); |
- EXPECT_EQ(low_res_tile_count + high_res_tile_count + non_ideal_tile_count, |
- static_cast<int>(unique_tiles.size())); |
- |
- scoped_ptr<TilingSetRasterQueueRequired> required_queue( |
- new TilingSetRasterQueueRequired( |
- pending_layer_->picture_layer_tiling_set(), |
- RasterTilePriorityQueue::Type::REQUIRED_FOR_DRAW)); |
- EXPECT_TRUE(required_queue->IsEmpty()); |
- |
- required_queue.reset(new TilingSetRasterQueueRequired( |
- pending_layer_->picture_layer_tiling_set(), |
- RasterTilePriorityQueue::Type::REQUIRED_FOR_ACTIVATION)); |
- EXPECT_FALSE(required_queue->IsEmpty()); |
- int required_for_activation_count = 0; |
- while (!required_queue->IsEmpty()) { |
- Tile* tile = required_queue->Top(); |
- EXPECT_TRUE(tile->required_for_activation()); |
- EXPECT_FALSE(tile->IsReadyToDraw()); |
- ++required_for_activation_count; |
- required_queue->Pop(); |
- } |
- |
- // All of the high res tiles should be required for activation, since there is |
- // no active twin. |
- EXPECT_EQ(high_res_now_tiles, required_for_activation_count); |
- |
- // No NOW tiles. |
- time_ticks += base::TimeDelta::FromMilliseconds(200); |
- host_impl_.SetCurrentBeginFrameArgs( |
- CreateBeginFrameArgsForTesting(BEGINFRAME_FROM_HERE, time_ticks)); |
- |
- pending_layer_->draw_properties().visible_content_rect = |
- gfx::Rect(1100, 1100, 500, 500); |
- bool resourceless_software_draw = false; |
- pending_layer_->UpdateTiles(resourceless_software_draw); |
- |
- unique_tiles.clear(); |
- high_res_tile_count = 0u; |
- queue.reset(new TilingSetRasterQueueAll( |
- pending_layer_->picture_layer_tiling_set(), false)); |
- while (!queue->IsEmpty()) { |
- Tile* tile = queue->Top(); |
- TilePriority priority = tile->priority(PENDING_TREE); |
- |
- EXPECT_TRUE(tile); |
- |
- // Non-high res tiles only get visible tiles. |
- EXPECT_EQ(HIGH_RESOLUTION, priority.resolution); |
- EXPECT_NE(TilePriority::NOW, priority.priority_bin); |
- |
- high_res_tile_count += priority.resolution == HIGH_RESOLUTION; |
- |
- unique_tiles.insert(tile); |
- queue->Pop(); |
- } |
- |
- EXPECT_EQ(16, high_res_tile_count); |
- EXPECT_EQ(high_res_tile_count, static_cast<int>(unique_tiles.size())); |
- |
- time_ticks += base::TimeDelta::FromMilliseconds(200); |
- host_impl_.SetCurrentBeginFrameArgs( |
- CreateBeginFrameArgsForTesting(BEGINFRAME_FROM_HERE, time_ticks)); |
- |
- pending_layer_->draw_properties().visible_content_rect = |
- gfx::Rect(0, 0, 500, 500); |
- pending_layer_->UpdateTiles(resourceless_software_draw); |
- |
- std::vector<Tile*> high_res_tiles = |
- pending_layer_->HighResTiling()->AllTilesForTesting(); |
- for (std::vector<Tile*>::iterator tile_it = high_res_tiles.begin(); |
- tile_it != high_res_tiles.end(); |
- ++tile_it) { |
- Tile* tile = *tile_it; |
- TileDrawInfo& draw_info = tile->draw_info(); |
- draw_info.SetSolidColorForTesting(SK_ColorRED); |
- } |
- |
- non_ideal_tile_count = 0; |
- low_res_tile_count = 0; |
- high_res_tile_count = 0; |
- queue.reset(new TilingSetRasterQueueAll( |
- pending_layer_->picture_layer_tiling_set(), true)); |
- while (!queue->IsEmpty()) { |
- Tile* tile = queue->Top(); |
- TilePriority priority = tile->priority(PENDING_TREE); |
- |
- EXPECT_TRUE(tile); |
- |
- non_ideal_tile_count += priority.resolution == NON_IDEAL_RESOLUTION; |
- low_res_tile_count += priority.resolution == LOW_RESOLUTION; |
- high_res_tile_count += priority.resolution == HIGH_RESOLUTION; |
- queue->Pop(); |
- } |
- |
- EXPECT_EQ(0, non_ideal_tile_count); |
- EXPECT_EQ(1, low_res_tile_count); |
- EXPECT_EQ(0, high_res_tile_count); |
-} |
- |
-TEST_F(PictureLayerImplTest, TilingSetRasterQueueActiveTree) { |
- base::TimeTicks time_ticks; |
- time_ticks += base::TimeDelta::FromMilliseconds(1); |
- host_impl_.SetCurrentBeginFrameArgs( |
- CreateBeginFrameArgsForTesting(BEGINFRAME_FROM_HERE, time_ticks)); |
- |
- host_impl_.SetViewportSize(gfx::Size(500, 500)); |
- |
- gfx::Size tile_size(100, 100); |
- gfx::Size layer_bounds(1000, 1000); |
- |
- scoped_refptr<FakePicturePileImpl> pending_pile = |
- FakePicturePileImpl::CreateFilledPile(tile_size, layer_bounds); |
- |
- SetupPendingTree(pending_pile); |
- ActivateTree(); |
- EXPECT_EQ(2u, active_layer_->num_tilings()); |
- |
- scoped_ptr<TilingSetRasterQueueRequired> queue( |
- new TilingSetRasterQueueRequired( |
- active_layer_->picture_layer_tiling_set(), |
- RasterTilePriorityQueue::Type::REQUIRED_FOR_DRAW)); |
- EXPECT_FALSE(queue->IsEmpty()); |
- while (!queue->IsEmpty()) { |
- Tile* tile = queue->Top(); |
- EXPECT_TRUE(tile->required_for_draw()); |
- EXPECT_FALSE(tile->IsReadyToDraw()); |
- queue->Pop(); |
- } |
- |
- queue.reset(new TilingSetRasterQueueRequired( |
- active_layer_->picture_layer_tiling_set(), |
- RasterTilePriorityQueue::Type::REQUIRED_FOR_ACTIVATION)); |
- EXPECT_TRUE(queue->IsEmpty()); |
-} |
- |
-TEST_F(PictureLayerImplTest, TilingSetRasterQueueRequiredNoHighRes) { |
- scoped_ptr<FakePicturePile> empty_recording = |
- FakePicturePile::CreateEmptyPile(gfx::Size(256, 256), |
- gfx::Size(1024, 1024)); |
- empty_recording->SetIsSolidColor(true); |
- |
- scoped_refptr<FakePicturePileImpl> pending_pile = |
- FakePicturePileImpl::CreateFromPile(empty_recording.get(), nullptr); |
- |
- SetupPendingTree(pending_pile); |
- EXPECT_FALSE( |
- pending_layer_->picture_layer_tiling_set()->FindTilingWithResolution( |
- HIGH_RESOLUTION)); |
- |
- scoped_ptr<TilingSetRasterQueueRequired> queue( |
- new TilingSetRasterQueueRequired( |
- pending_layer_->picture_layer_tiling_set(), |
- RasterTilePriorityQueue::Type::REQUIRED_FOR_ACTIVATION)); |
- EXPECT_TRUE(queue->IsEmpty()); |
-} |
- |
-TEST_F(PictureLayerImplTest, TilingSetEvictionQueue) { |
- gfx::Size tile_size(100, 100); |
- gfx::Size layer_bounds(1000, 1000); |
- float low_res_factor = host_impl_.settings().low_res_contents_scale_factor; |
- |
- host_impl_.SetViewportSize(gfx::Size(500, 500)); |
- |
- scoped_refptr<FakePicturePileImpl> pending_pile = |
- FakePicturePileImpl::CreateFilledPile(tile_size, layer_bounds); |
- |
- // TODO(vmpstr): Add a test with tilings other than high/low res on the active |
- // tree. |
- SetupPendingTree(pending_pile); |
- EXPECT_EQ(2u, pending_layer_->num_tilings()); |
- |
- std::vector<Tile*> all_tiles; |
- for (size_t i = 0; i < pending_layer_->num_tilings(); ++i) { |
- PictureLayerTiling* tiling = pending_layer_->tilings()->tiling_at(i); |
- std::vector<Tile*> tiles = tiling->AllTilesForTesting(); |
- all_tiles.insert(all_tiles.end(), tiles.begin(), tiles.end()); |
- } |
- |
- std::set<Tile*> all_tiles_set(all_tiles.begin(), all_tiles.end()); |
- |
- bool mark_required = false; |
- size_t number_of_marked_tiles = 0u; |
- size_t number_of_unmarked_tiles = 0u; |
- for (size_t i = 0; i < pending_layer_->num_tilings(); ++i) { |
- PictureLayerTiling* tiling = pending_layer_->tilings()->tiling_at(i); |
- for (PictureLayerTiling::CoverageIterator iter( |
- tiling, |
- pending_layer_->contents_scale_x(), |
- pending_layer_->visible_content_rect()); |
- iter; |
- ++iter) { |
- if (mark_required) { |
- number_of_marked_tiles++; |
- iter->set_required_for_activation(true); |
- } else { |
- number_of_unmarked_tiles++; |
- } |
- mark_required = !mark_required; |
- } |
- } |
- |
- // Sanity checks. |
- EXPECT_EQ(17u, all_tiles.size()); |
- EXPECT_EQ(17u, all_tiles_set.size()); |
- EXPECT_GT(number_of_marked_tiles, 1u); |
- EXPECT_GT(number_of_unmarked_tiles, 1u); |
- |
- // Tiles don't have resources yet. |
- scoped_ptr<TilingSetEvictionQueue> queue( |
- new TilingSetEvictionQueue(pending_layer_->picture_layer_tiling_set(), |
- SAME_PRIORITY_FOR_BOTH_TREES, false)); |
- EXPECT_TRUE(queue->IsEmpty()); |
- |
- host_impl_.tile_manager()->InitializeTilesWithResourcesForTesting(all_tiles); |
- |
- std::set<Tile*> unique_tiles; |
- float expected_scales[] = {low_res_factor, 1.f}; |
- size_t scale_index = 0; |
- bool reached_visible = false; |
- Tile* last_tile = nullptr; |
- size_t distance_decreasing = 0; |
- size_t distance_increasing = 0; |
- queue.reset( |
- new TilingSetEvictionQueue(pending_layer_->picture_layer_tiling_set(), |
- SAME_PRIORITY_FOR_BOTH_TREES, false)); |
- while (!queue->IsEmpty()) { |
- Tile* tile = queue->Top(); |
- if (!last_tile) |
- last_tile = tile; |
- |
- EXPECT_TRUE(tile); |
- |
- TilePriority priority = tile->priority(PENDING_TREE); |
- |
- if (priority.priority_bin == TilePriority::NOW) { |
- reached_visible = true; |
- last_tile = tile; |
- break; |
- } |
- |
- EXPECT_FALSE(tile->required_for_activation()); |
- |
- while (std::abs(tile->contents_scale() - expected_scales[scale_index]) > |
- std::numeric_limits<float>::epsilon()) { |
- ++scale_index; |
- ASSERT_LT(scale_index, arraysize(expected_scales)); |
- } |
- |
- EXPECT_FLOAT_EQ(tile->contents_scale(), expected_scales[scale_index]); |
- unique_tiles.insert(tile); |
- |
- if (tile->required_for_activation() == |
- last_tile->required_for_activation() && |
- std::abs(tile->contents_scale() - last_tile->contents_scale()) < |
- std::numeric_limits<float>::epsilon()) { |
- if (priority.distance_to_visible <= |
- last_tile->priority(PENDING_TREE).distance_to_visible) |
- ++distance_decreasing; |
- else |
- ++distance_increasing; |
- } |
- |
- last_tile = tile; |
- queue->Pop(); |
- } |
- |
- // 4 high res tiles are inside the viewport, the rest are evicted. |
- EXPECT_TRUE(reached_visible); |
- EXPECT_EQ(12u, unique_tiles.size()); |
- EXPECT_EQ(1u, distance_increasing); |
- EXPECT_EQ(11u, distance_decreasing); |
- |
- scale_index = 0; |
- bool reached_required = false; |
- while (!queue->IsEmpty()) { |
- Tile* tile = queue->Top(); |
- EXPECT_TRUE(tile); |
- |
- TilePriority priority = tile->priority(PENDING_TREE); |
- EXPECT_EQ(TilePriority::NOW, priority.priority_bin); |
- |
- if (reached_required) { |
- EXPECT_TRUE(tile->required_for_activation()); |
- } else if (tile->required_for_activation()) { |
- reached_required = true; |
- scale_index = 0; |
- } |
- |
- while (std::abs(tile->contents_scale() - expected_scales[scale_index]) > |
- std::numeric_limits<float>::epsilon()) { |
- ++scale_index; |
- ASSERT_LT(scale_index, arraysize(expected_scales)); |
- } |
- |
- EXPECT_FLOAT_EQ(tile->contents_scale(), expected_scales[scale_index]); |
- unique_tiles.insert(tile); |
- queue->Pop(); |
- } |
- |
- EXPECT_TRUE(reached_required); |
- EXPECT_EQ(all_tiles_set.size(), unique_tiles.size()); |
-} |
- |
-TEST_F(PictureLayerImplTest, Occlusion) { |
- gfx::Size tile_size(102, 102); |
- gfx::Size layer_bounds(1000, 1000); |
- gfx::Size viewport_size(1000, 1000); |
- |
- LayerTestCommon::LayerImplTest impl; |
- host_impl_.SetViewportSize(viewport_size); |
- |
- scoped_refptr<FakePicturePileImpl> pending_pile = |
- FakePicturePileImpl::CreateFilledPile(layer_bounds, layer_bounds); |
- SetupPendingTreeWithFixedTileSize(pending_pile, tile_size, Region()); |
- ActivateTree(); |
- |
- std::vector<Tile*> tiles = |
- active_layer_->HighResTiling()->AllTilesForTesting(); |
- host_impl_.tile_manager()->InitializeTilesWithResourcesForTesting(tiles); |
- |
- { |
- SCOPED_TRACE("No occlusion"); |
- gfx::Rect occluded; |
- impl.AppendQuadsWithOcclusion(active_layer_, occluded); |
- |
- LayerTestCommon::VerifyQuadsExactlyCoverRect(impl.quad_list(), |
- gfx::Rect(layer_bounds)); |
- EXPECT_EQ(100u, impl.quad_list().size()); |
- } |
- |
- { |
- SCOPED_TRACE("Full occlusion"); |
- gfx::Rect occluded(active_layer_->visible_content_rect()); |
- impl.AppendQuadsWithOcclusion(active_layer_, occluded); |
- |
- LayerTestCommon::VerifyQuadsExactlyCoverRect(impl.quad_list(), gfx::Rect()); |
- EXPECT_EQ(impl.quad_list().size(), 0u); |
- } |
- |
- { |
- SCOPED_TRACE("Partial occlusion"); |
- gfx::Rect occluded(150, 0, 200, 1000); |
- impl.AppendQuadsWithOcclusion(active_layer_, occluded); |
- |
- size_t partially_occluded_count = 0; |
- LayerTestCommon::VerifyQuadsAreOccluded( |
- impl.quad_list(), occluded, &partially_occluded_count); |
- // The layer outputs one quad, which is partially occluded. |
- EXPECT_EQ(100u - 10u, impl.quad_list().size()); |
- EXPECT_EQ(10u + 10u, partially_occluded_count); |
- } |
-} |
- |
-TEST_F(PictureLayerImplTest, RasterScaleChangeWithoutAnimation) { |
- gfx::Size tile_size(host_impl_.settings().default_tile_size); |
- SetupDefaultTrees(tile_size); |
- |
- ResetTilingsAndRasterScales(); |
- |
- float contents_scale = 2.f; |
- float device_scale = 1.f; |
- float page_scale = 1.f; |
- float maximum_animation_scale = 1.f; |
- bool animating_transform = false; |
- |
- SetContentsScaleOnBothLayers(contents_scale, |
- device_scale, |
- page_scale, |
- maximum_animation_scale, |
- animating_transform); |
- EXPECT_BOTH_EQ(HighResTiling()->contents_scale(), 2.f); |
- |
- // Changing the source scale without being in an animation will cause |
- // the layer to reset its source scale to 1.f. |
- contents_scale = 3.f; |
- |
- SetContentsScaleOnBothLayers(contents_scale, |
- device_scale, |
- page_scale, |
- maximum_animation_scale, |
- animating_transform); |
- EXPECT_BOTH_EQ(HighResTiling()->contents_scale(), 1.f); |
- |
- // Further changes to the source scale will no longer be reflected in the |
- // contents scale. |
- contents_scale = 0.5f; |
- |
- SetContentsScaleOnBothLayers(contents_scale, |
- device_scale, |
- page_scale, |
- maximum_animation_scale, |
- animating_transform); |
- EXPECT_BOTH_EQ(HighResTiling()->contents_scale(), 1.f); |
-} |
- |
-TEST_F(PictureLayerImplTest, LowResReadyToDrawNotEnoughToActivate) { |
- gfx::Size tile_size(100, 100); |
- gfx::Size layer_bounds(1000, 1000); |
- |
- // Make sure some tiles are not shared. |
- gfx::Rect invalidation(gfx::Point(50, 50), tile_size); |
- SetupDefaultTreesWithFixedTileSize(layer_bounds, tile_size, invalidation); |
- |
- // All pending layer tiles required are not ready. |
- EXPECT_FALSE(host_impl_.tile_manager()->IsReadyToActivate()); |
- |
- // Initialize all low-res tiles. |
- pending_layer_->SetAllTilesReadyInTiling(pending_layer_->LowResTiling()); |
- |
- // Low-res tiles should not be enough. |
- EXPECT_FALSE(host_impl_.tile_manager()->IsReadyToActivate()); |
- |
- // Initialize remaining tiles. |
- pending_layer_->SetAllTilesReady(); |
- |
- EXPECT_TRUE(host_impl_.tile_manager()->IsReadyToActivate()); |
-} |
- |
-TEST_F(PictureLayerImplTest, HighResReadyToDrawEnoughToActivate) { |
- gfx::Size tile_size(100, 100); |
- gfx::Size layer_bounds(1000, 1000); |
- |
- // Make sure some tiles are not shared. |
- gfx::Rect invalidation(gfx::Point(50, 50), tile_size); |
- SetupDefaultTreesWithFixedTileSize(layer_bounds, tile_size, invalidation); |
- |
- // All pending layer tiles required are not ready. |
- EXPECT_FALSE(host_impl_.tile_manager()->IsReadyToActivate()); |
- |
- // Initialize all high-res tiles. |
- pending_layer_->SetAllTilesReadyInTiling(pending_layer_->HighResTiling()); |
- |
- // High-res tiles should be enough, since they cover everything visible. |
- EXPECT_TRUE(host_impl_.tile_manager()->IsReadyToActivate()); |
-} |
- |
-TEST_F(PictureLayerImplTest, |
- SharedActiveHighResReadyAndPendingLowResReadyNotEnoughToActivate) { |
- gfx::Size tile_size(100, 100); |
- gfx::Size layer_bounds(1000, 1000); |
- |
- // Make sure some tiles are not shared. |
- gfx::Rect invalidation(gfx::Point(50, 50), tile_size); |
- SetupDefaultTreesWithFixedTileSize(layer_bounds, tile_size, invalidation); |
- |
- // Initialize all high-res tiles in the active layer. |
- active_layer_->SetAllTilesReadyInTiling(active_layer_->HighResTiling()); |
- // And all the low-res tiles in the pending layer. |
- pending_layer_->SetAllTilesReadyInTiling(pending_layer_->LowResTiling()); |
- |
- // The unshared high-res tiles are not ready, so we cannot activate. |
- EXPECT_FALSE(host_impl_.tile_manager()->IsReadyToActivate()); |
- |
- // When the unshared pending high-res tiles are ready, we can activate. |
- pending_layer_->SetAllTilesReadyInTiling(pending_layer_->HighResTiling()); |
- EXPECT_TRUE(host_impl_.tile_manager()->IsReadyToActivate()); |
-} |
- |
-TEST_F(PictureLayerImplTest, SharedActiveHighResReadyNotEnoughToActivate) { |
- gfx::Size tile_size(100, 100); |
- gfx::Size layer_bounds(1000, 1000); |
- |
- // Make sure some tiles are not shared. |
- gfx::Rect invalidation(gfx::Point(50, 50), tile_size); |
- SetupDefaultTreesWithFixedTileSize(layer_bounds, tile_size, invalidation); |
- |
- // Initialize all high-res tiles in the active layer. |
- active_layer_->SetAllTilesReadyInTiling(active_layer_->HighResTiling()); |
- |
- // The unshared high-res tiles are not ready, so we cannot activate. |
- EXPECT_FALSE(host_impl_.tile_manager()->IsReadyToActivate()); |
- |
- // When the unshared pending high-res tiles are ready, we can activate. |
- pending_layer_->SetAllTilesReadyInTiling(pending_layer_->HighResTiling()); |
- EXPECT_TRUE(host_impl_.tile_manager()->IsReadyToActivate()); |
-} |
- |
-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); |
- |
- SetupTrees(pending_pile, active_pile); |
- |
- float low_res_factor = host_impl_.settings().low_res_contents_scale_factor; |
- EXPECT_LT(low_res_factor, 1.f); |
- |
- ResetTilingsAndRasterScales(); |
- |
- SetupDrawPropertiesAndUpdateTiles(active_layer_, |
- 6.f, // ideal contents scale |
- 3.f, // device scale |
- 2.f, // page scale |
- 1.f, // maximum animation scale |
- false); |
- ASSERT_EQ(1u, active_layer_->tilings()->num_tilings()); |
- EXPECT_FLOAT_EQ(6.f, |
- active_layer_->tilings()->tiling_at(0)->contents_scale()); |
- |
- // If we change the page scale factor, then we should get new tilings. |
- SetupDrawPropertiesAndUpdateTiles(active_layer_, |
- 6.6f, // ideal contents scale |
- 3.f, // device scale |
- 2.2f, // page scale |
- 1.f, // maximum animation scale |
- false); |
- ASSERT_EQ(2u, active_layer_->tilings()->num_tilings()); |
- EXPECT_FLOAT_EQ(6.6f, |
- active_layer_->tilings()->tiling_at(0)->contents_scale()); |
- |
- // If we change the device scale factor, then we should get new tilings. |
- SetupDrawPropertiesAndUpdateTiles(active_layer_, |
- 7.26f, // ideal contents scale |
- 3.3f, // device scale |
- 2.2f, // page scale |
- 1.f, // maximum animation scale |
- false); |
- ASSERT_EQ(3u, active_layer_->tilings()->num_tilings()); |
- EXPECT_FLOAT_EQ(7.26f, |
- active_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. |
- SetupDrawPropertiesAndUpdateTiles(active_layer_, |
- 7.26f, // ideal contents scale |
- 2.2f, // device scale |
- 3.3f, // page scale |
- 1.f, // maximum animation scale |
- false); |
- ASSERT_EQ(3u, active_layer_->tilings()->num_tilings()); |
- EXPECT_FLOAT_EQ(7.26f, |
- active_layer_->tilings()->tiling_at(0)->contents_scale()); |
-} |
- |
-TEST_F(NoLowResPictureLayerImplTest, PendingLayerOnlyHasHighResTiling) { |
- 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); |
- |
- SetupTrees(pending_pile, active_pile); |
- |
- float low_res_factor = host_impl_.settings().low_res_contents_scale_factor; |
- EXPECT_LT(low_res_factor, 1.f); |
- |
- ResetTilingsAndRasterScales(); |
- |
- SetupDrawPropertiesAndUpdateTiles(pending_layer_, |
- 6.f, // ideal contents scale |
- 3.f, // device scale |
- 2.f, // page scale |
- 1.f, // maximum animation scale |
- false); |
- ASSERT_EQ(1u, pending_layer_->tilings()->num_tilings()); |
- EXPECT_FLOAT_EQ(6.f, |
- pending_layer_->tilings()->tiling_at(0)->contents_scale()); |
- |
- // If we change the page scale factor, then we should get new tilings. |
- SetupDrawPropertiesAndUpdateTiles(pending_layer_, |
- 6.6f, // ideal contents scale |
- 3.f, // device scale |
- 2.2f, // page scale |
- 1.f, // maximum animation scale |
- false); |
- ASSERT_EQ(1u, pending_layer_->tilings()->num_tilings()); |
- EXPECT_FLOAT_EQ(6.6f, |
- pending_layer_->tilings()->tiling_at(0)->contents_scale()); |
- |
- // If we change the device scale factor, then we should get new tilings. |
- SetupDrawPropertiesAndUpdateTiles(pending_layer_, |
- 7.26f, // ideal contents scale |
- 3.3f, // device scale |
- 2.2f, // page scale |
- 1.f, // maximum animation scale |
- false); |
- ASSERT_EQ(1u, pending_layer_->tilings()->num_tilings()); |
- EXPECT_FLOAT_EQ(7.26f, |
- 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. |
- SetupDrawPropertiesAndUpdateTiles(pending_layer_, |
- 7.26f, // ideal contents scale |
- 2.2f, // device scale |
- 3.3f, // page scale |
- 1.f, // maximum animation scale |
- false); |
- ASSERT_EQ(1u, pending_layer_->tilings()->num_tilings()); |
- EXPECT_FLOAT_EQ(7.26f, |
- pending_layer_->tilings()->tiling_at(0)->contents_scale()); |
-} |
- |
-TEST_F(NoLowResPictureLayerImplTest, AllHighResRequiredEvenIfShared) { |
- gfx::Size layer_bounds(400, 400); |
- gfx::Size tile_size(100, 100); |
- |
- SetupDefaultTreesWithFixedTileSize(layer_bounds, tile_size, Region()); |
- |
- 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_->HighResTiling()->UpdateAllTilePrioritiesForTesting(); |
- if (host_impl_.settings().create_low_res_tiling) |
- pending_layer_->LowResTiling()->UpdateAllTilePrioritiesForTesting(); |
- |
- AssertAllTilesRequired(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. |
- bool is_solid_color = false; |
- scoped_refptr<FakePicturePileImpl> active_pile = |
- FakePicturePileImpl::CreateEmptyPileThatThinksItHasRecordings( |
- tile_size, layer_bounds, is_solid_color); |
- |
- SetupTreesWithFixedTileSize(pending_pile, active_pile, tile_size, Region()); |
- |
- // 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_->HighResTiling()->UpdateAllTilePrioritiesForTesting(); |
- if (host_impl_.settings().create_low_res_tiling) |
- pending_layer_->LowResTiling()->UpdateAllTilePrioritiesForTesting(); |
- |
- AssertNoTilesRequired(pending_layer_->HighResTiling()); |
- if (host_impl_.settings().create_low_res_tiling) |
- AssertNoTilesRequired(pending_layer_->LowResTiling()); |
-} |
- |
-TEST_F(NoLowResPictureLayerImplTest, InvalidViewportForPrioritizingTiles) { |
- base::TimeTicks time_ticks; |
- time_ticks += base::TimeDelta::FromMilliseconds(1); |
- host_impl_.SetCurrentBeginFrameArgs( |
- CreateBeginFrameArgsForTesting(BEGINFRAME_FROM_HERE, 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); |
- |
- SetupTreesWithInvalidation(pending_pile, active_pile, Region()); |
- |
- SetupDrawPropertiesAndUpdateTiles(active_layer_, 1.f, 1.f, 1.f, 1.f, false); |
- |
- // UpdateTiles with valid viewport. Should update tile viewport. |
- // Note viewport is considered invalid if and only if in resourceless |
- // software draw. |
- bool resourceless_software_draw = false; |
- gfx::Rect viewport = gfx::Rect(layer_bounds); |
- gfx::Transform transform; |
- host_impl_.SetExternalDrawConstraints(transform, |
- viewport, |
- viewport, |
- viewport, |
- transform, |
- resourceless_software_draw); |
- active_layer_->draw_properties().visible_content_rect = viewport; |
- active_layer_->draw_properties().screen_space_transform = transform; |
- active_layer_->UpdateTiles(resourceless_software_draw); |
- |
- gfx::Rect visible_rect_for_tile_priority = |
- active_layer_->visible_rect_for_tile_priority(); |
- EXPECT_FALSE(visible_rect_for_tile_priority.IsEmpty()); |
- gfx::Transform screen_space_transform_for_tile_priority = |
- active_layer_->screen_space_transform(); |
- |
- // Expand viewport and set it as invalid for prioritizing tiles. |
- // Should update viewport and transform, but not update visible rect. |
- time_ticks += base::TimeDelta::FromMilliseconds(200); |
- host_impl_.SetCurrentBeginFrameArgs( |
- CreateBeginFrameArgsForTesting(BEGINFRAME_FROM_HERE, time_ticks)); |
- resourceless_software_draw = true; |
- 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, |
- viewport, |
- transform, |
- resourceless_software_draw); |
- active_layer_->UpdateTiles(resourceless_software_draw); |
- |
- // Transform for tile priority is updated. |
- EXPECT_TRANSFORMATION_MATRIX_EQ(transform, |
- active_layer_->screen_space_transform()); |
- // Visible rect for tile priority retains old value. |
- EXPECT_EQ(visible_rect_for_tile_priority, |
- active_layer_->visible_rect_for_tile_priority()); |
- |
- // Keep expanded viewport but mark it valid. Should update tile viewport. |
- time_ticks += base::TimeDelta::FromMilliseconds(200); |
- host_impl_.SetCurrentBeginFrameArgs( |
- CreateBeginFrameArgsForTesting(BEGINFRAME_FROM_HERE, time_ticks)); |
- resourceless_software_draw = false; |
- host_impl_.SetExternalDrawConstraints(transform, |
- viewport, |
- viewport, |
- viewport, |
- transform, |
- resourceless_software_draw); |
- active_layer_->UpdateTiles(resourceless_software_draw); |
- |
- EXPECT_TRANSFORMATION_MATRIX_EQ(transform, |
- active_layer_->screen_space_transform()); |
- EXPECT_EQ(viewport, active_layer_->visible_rect_for_tile_priority()); |
-} |
- |
-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); |
- |
- std::vector<PictureLayerTiling*> used_tilings; |
- |
- SetupTrees(pending_pile, active_pile); |
- |
- 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; |
- float scale = 1.f; |
- |
- ResetTilingsAndRasterScales(); |
- |
- SetContentsScaleOnBothLayers(scale, device_scale, page_scale, 1.f, false); |
- ASSERT_EQ(1u, active_layer_->tilings()->num_tilings()); |
- |
- // Ensure UpdateTiles won't remove any tilings. Note this is unrelated to |
- // |used_tilings| variable, and it's here only to ensure that active_layer_ |
- // won't remove tilings before the test has a chance to verify behavior. |
- active_layer_->MarkAllTilingsUsed(); |
- |
- // 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()); |
- |
- host_impl_.PinchGestureBegin(); |
- |
- // Changing the ideal but not creating new tilings. |
- scale *= 1.5f; |
- page_scale *= 1.5f; |
- SetContentsScaleOnBothLayers(scale, 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()); |
- |
- host_impl_.PinchGestureEnd(); |
- |
- // Create a 1.2 scale tiling. Now we have 1.0 and 1.2 tilings. Ideal = 1.2. |
- scale /= 4.f; |
- page_scale /= 4.f; |
- 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()); |
- |
- // Ensure UpdateTiles won't remove any tilings. |
- active_layer_->MarkAllTilingsUsed(); |
- |
- // 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)); |
- 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. |
- SetupDrawPropertiesAndUpdateTiles( |
- active_layer_, 1.1f, device_scale, page_scale, 1.f, false); |
- |
- // 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. |
- SetupDrawPropertiesAndUpdateTiles( |
- pending_layer_, 1.1f, device_scale, page_scale, 1.f, false); |
- |
- // 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); |
- |
- SetupTrees(pending_pile, active_pile); |
- EXPECT_EQ(1u, pending_layer_->tilings()->num_tilings()); |
- EXPECT_EQ(1u, active_layer_->tilings()->num_tilings()); |
- |
- // All tilings should be removed when losing output surface. |
- active_layer_->ReleaseResources(); |
- EXPECT_FALSE(active_layer_->tilings()); |
- active_layer_->RecreateResources(); |
- EXPECT_EQ(0u, active_layer_->tilings()->num_tilings()); |
- pending_layer_->ReleaseResources(); |
- EXPECT_FALSE(pending_layer_->tilings()); |
- pending_layer_->RecreateResources(); |
- EXPECT_EQ(0u, pending_layer_->tilings()->num_tilings()); |
- |
- // This should create new tilings. |
- SetupDrawPropertiesAndUpdateTiles(pending_layer_, |
- 1.3f, // ideal contents scale |
- 2.7f, // device scale |
- 3.2f, // page scale |
- 1.f, // maximum animation scale |
- false); |
- EXPECT_EQ(1u, pending_layer_->tilings()->num_tilings()); |
-} |
- |
-TEST_F(PictureLayerImplTest, SharedQuadStateContainsMaxTilingScale) { |
- scoped_ptr<RenderPass> render_pass = RenderPass::Create(); |
- |
- gfx::Size tile_size(400, 400); |
- gfx::Size layer_bounds(1000, 2000); |
- |
- host_impl_.SetViewportSize(gfx::Size(10000, 20000)); |
- |
- 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); |
- |
- ResetTilingsAndRasterScales(); |
- SetupDrawPropertiesAndUpdateTiles(active_layer_, 2.5f, 1.f, 1.f, 1.f, false); |
- |
- float max_contents_scale = active_layer_->MaximumTilingContentsScale(); |
- EXPECT_EQ(2.5f, max_contents_scale); |
- |
- gfx::Transform scaled_draw_transform = active_layer_->draw_transform(); |
- scaled_draw_transform.Scale(SK_MScalar1 / max_contents_scale, |
- SK_MScalar1 / max_contents_scale); |
- |
- AppendQuadsData data; |
- active_layer_->AppendQuads(render_pass.get(), &data); |
- |
- // SharedQuadState should have be of size 1, as we are doing AppenQuad once. |
- EXPECT_EQ(1u, render_pass->shared_quad_state_list.size()); |
- // The content_to_target_transform should be scaled by the |
- // MaximumTilingContentsScale on the layer. |
- EXPECT_EQ(scaled_draw_transform.ToString(), |
- render_pass->shared_quad_state_list.front() |
- ->content_to_target_transform.ToString()); |
- // The content_bounds should be scaled by the |
- // MaximumTilingContentsScale on the layer. |
- EXPECT_EQ( |
- gfx::Size(2500u, 5000u).ToString(), |
- render_pass->shared_quad_state_list.front()->content_bounds.ToString()); |
- // The visible_content_rect should be scaled by the |
- // MaximumTilingContentsScale on the layer. |
- EXPECT_EQ(gfx::Rect(0u, 0u, 2500u, 5000u).ToString(), |
- render_pass->shared_quad_state_list.front() |
- ->visible_content_rect.ToString()); |
-} |
- |
-class PictureLayerImplTestWithDelegatingRenderer : public PictureLayerImplTest { |
- public: |
- PictureLayerImplTestWithDelegatingRenderer() : PictureLayerImplTest() {} |
- |
- void InitializeRenderer() override { |
- host_impl_.InitializeRenderer(FakeOutputSurface::CreateDelegating3d()); |
- } |
-}; |
- |
-TEST_F(PictureLayerImplTestWithDelegatingRenderer, |
- DelegatingRendererWithTileOOM) { |
- // This test is added for crbug.com/402321, where quad should be produced when |
- // raster on demand is not allowed and tile is OOM. |
- gfx::Size tile_size = host_impl_.settings().default_tile_size; |
- gfx::Size layer_bounds(1000, 1000); |
- |
- // Create tiles. |
- scoped_refptr<FakePicturePileImpl> pending_pile = |
- FakePicturePileImpl::CreateFilledPile(tile_size, layer_bounds); |
- SetupPendingTree(pending_pile); |
- pending_layer_->SetBounds(layer_bounds); |
- ActivateTree(); |
- bool update_lcd_text = false; |
- host_impl_.active_tree()->UpdateDrawProperties(update_lcd_text); |
- std::vector<Tile*> tiles = |
- active_layer_->HighResTiling()->AllTilesForTesting(); |
- host_impl_.tile_manager()->InitializeTilesWithResourcesForTesting(tiles); |
- |
- // Force tiles after max_tiles to be OOM. TileManager uses |
- // GlobalStateThatImpactsTilesPriority from LayerTreeHostImpl, and we cannot |
- // directly set state to host_impl_, so we set policy that would change the |
- // state. We also need to update tree priority separately. |
- GlobalStateThatImpactsTilePriority state; |
- size_t max_tiles = 1; |
- size_t memory_limit = max_tiles * 4 * tile_size.width() * tile_size.height(); |
- size_t resource_limit = max_tiles; |
- ManagedMemoryPolicy policy(memory_limit, |
- gpu::MemoryAllocation::CUTOFF_ALLOW_EVERYTHING, |
- resource_limit); |
- host_impl_.SetMemoryPolicy(policy); |
- host_impl_.SetTreePriority(SAME_PRIORITY_FOR_BOTH_TREES); |
- host_impl_.PrepareTiles(); |
- |
- scoped_ptr<RenderPass> render_pass = RenderPass::Create(); |
- AppendQuadsData data; |
- active_layer_->WillDraw(DRAW_MODE_HARDWARE, nullptr); |
- active_layer_->AppendQuads(render_pass.get(), &data); |
- active_layer_->DidDraw(nullptr); |
- |
- // Even when OOM, quads should be produced, and should be different material |
- // from quads with resource. |
- EXPECT_LT(max_tiles, render_pass->quad_list.size()); |
- EXPECT_EQ(DrawQuad::Material::TILED_CONTENT, |
- render_pass->quad_list.front()->material); |
- EXPECT_EQ(DrawQuad::Material::SOLID_COLOR, |
- render_pass->quad_list.back()->material); |
-} |
- |
-class OcclusionTrackingSettings : public LowResTilingsSettings { |
- public: |
- OcclusionTrackingSettings() { use_occlusion_for_tile_prioritization = true; } |
-}; |
- |
-class OcclusionTrackingPictureLayerImplTest : public PictureLayerImplTest { |
- public: |
- OcclusionTrackingPictureLayerImplTest() |
- : PictureLayerImplTest(OcclusionTrackingSettings()) {} |
- |
- void VerifyEvictionConsidersOcclusion(FakePictureLayerImpl* layer, |
- FakePictureLayerImpl* twin_layer, |
- WhichTree tree, |
- size_t expected_occluded_tile_count) { |
- WhichTree twin_tree = tree == ACTIVE_TREE ? PENDING_TREE : ACTIVE_TREE; |
- for (int priority_count = 0; priority_count <= LAST_TREE_PRIORITY; |
- ++priority_count) { |
- TreePriority tree_priority = static_cast<TreePriority>(priority_count); |
- size_t occluded_tile_count = 0u; |
- Tile* last_tile = nullptr; |
- std::set<Tile*> shared_tiles; |
- |
- scoped_ptr<TilingSetEvictionQueue> queue( |
- new TilingSetEvictionQueue(layer->picture_layer_tiling_set(), |
- tree_priority, layer && twin_layer)); |
- while (!queue->IsEmpty()) { |
- Tile* tile = queue->Top(); |
- if (!last_tile) |
- last_tile = tile; |
- if (tile->is_shared()) |
- EXPECT_TRUE(shared_tiles.insert(tile).second); |
- |
- // The only way we will encounter an occluded tile after an unoccluded |
- // tile is if the priorty bin decreased, the tile is required for |
- // activation, or the scale changed. |
- bool tile_is_occluded = tile->is_occluded(tree); |
- if (tile_is_occluded) { |
- occluded_tile_count++; |
- |
- bool last_tile_is_occluded = last_tile->is_occluded(tree); |
- if (!last_tile_is_occluded) { |
- TilePriority::PriorityBin tile_priority_bin = |
- tile->priority(tree).priority_bin; |
- TilePriority::PriorityBin last_tile_priority_bin = |
- last_tile->priority(tree).priority_bin; |
- |
- EXPECT_TRUE( |
- (tile_priority_bin < last_tile_priority_bin) || |
- tile->required_for_activation() || |
- (tile->contents_scale() != last_tile->contents_scale())); |
- } |
- } |
- last_tile = tile; |
- queue->Pop(); |
- } |
- // Count also shared tiles which are occluded in the tree but which were |
- // not returned by the tiling set eviction queue. Those shared tiles |
- // shall be returned by the twin tiling set eviction queue. |
- queue.reset( |
- new TilingSetEvictionQueue(twin_layer->picture_layer_tiling_set(), |
- tree_priority, layer && twin_layer)); |
- while (!queue->IsEmpty()) { |
- Tile* tile = queue->Top(); |
- if (tile->is_shared()) { |
- EXPECT_TRUE(shared_tiles.insert(tile).second); |
- if (tile->is_occluded(tree)) |
- ++occluded_tile_count; |
- // Check the reasons why the shared tile was not returned by |
- // the first tiling set eviction queue. |
- switch (tree_priority) { |
- case SAME_PRIORITY_FOR_BOTH_TREES: { |
- const TilePriority& priority = tile->priority(tree); |
- const TilePriority& priority_for_tree_priority = |
- tile->priority_for_tree_priority(tree_priority); |
- const TilePriority& twin_priority = tile->priority(twin_tree); |
- // Check if the shared tile was not returned by the first tiling |
- // set eviction queue because it was out of order for the first |
- // tiling set eviction queue but not for the twin tiling set |
- // eviction queue. |
- if (priority.priority_bin != twin_priority.priority_bin) { |
- EXPECT_LT(priority_for_tree_priority.priority_bin, |
- priority.priority_bin); |
- EXPECT_EQ(priority_for_tree_priority.priority_bin, |
- twin_priority.priority_bin); |
- EXPECT_TRUE(priority_for_tree_priority.priority_bin < |
- priority.priority_bin); |
- } else if (tile->is_occluded(tree) != |
- tile->is_occluded(twin_tree)) { |
- EXPECT_TRUE(tile->is_occluded(tree)); |
- EXPECT_FALSE(tile->is_occluded(twin_tree)); |
- EXPECT_FALSE(tile->is_occluded_combined()); |
- } else if (priority.distance_to_visible != |
- twin_priority.distance_to_visible) { |
- EXPECT_LT(priority_for_tree_priority.distance_to_visible, |
- priority.distance_to_visible); |
- EXPECT_EQ(priority_for_tree_priority.distance_to_visible, |
- twin_priority.distance_to_visible); |
- EXPECT_TRUE(priority_for_tree_priority.distance_to_visible < |
- priority.distance_to_visible); |
- } else { |
- // Shared tiles having the same active and pending priorities |
- // should be returned only by a pending tree eviction queue. |
- EXPECT_EQ(ACTIVE_TREE, tree); |
- } |
- break; |
- } |
- case SMOOTHNESS_TAKES_PRIORITY: |
- // Shared tiles should be returned only by an active tree |
- // eviction queue. |
- EXPECT_EQ(PENDING_TREE, tree); |
- break; |
- case NEW_CONTENT_TAKES_PRIORITY: |
- // Shared tiles should be returned only by a pending tree |
- // eviction queue. |
- EXPECT_EQ(ACTIVE_TREE, tree); |
- break; |
- } |
- } |
- queue->Pop(); |
- } |
- EXPECT_EQ(expected_occluded_tile_count, occluded_tile_count); |
- } |
- } |
-}; |
- |
-TEST_F(OcclusionTrackingPictureLayerImplTest, |
- OccludedTilesSkippedDuringRasterization) { |
- base::TimeTicks time_ticks; |
- time_ticks += base::TimeDelta::FromMilliseconds(1); |
- host_impl_.SetCurrentBeginFrameArgs( |
- CreateBeginFrameArgsForTesting(BEGINFRAME_FROM_HERE, time_ticks)); |
- |
- gfx::Size tile_size(102, 102); |
- gfx::Size layer_bounds(1000, 1000); |
- gfx::Size viewport_size(500, 500); |
- gfx::Point occluding_layer_position(310, 0); |
- |
- host_impl_.SetViewportSize(viewport_size); |
- |
- scoped_refptr<FakePicturePileImpl> pending_pile = |
- FakePicturePileImpl::CreateFilledPile(tile_size, layer_bounds); |
- SetupPendingTreeWithFixedTileSize(pending_pile, tile_size, Region()); |
- |
- // No occlusion. |
- int unoccluded_tile_count = 0; |
- scoped_ptr<TilingSetRasterQueueAll> queue(new TilingSetRasterQueueAll( |
- pending_layer_->picture_layer_tiling_set(), false)); |
- while (!queue->IsEmpty()) { |
- Tile* tile = queue->Top(); |
- |
- // Occluded tiles should not be iterated over. |
- EXPECT_FALSE(tile->is_occluded(PENDING_TREE)); |
- |
- // Some tiles may not be visible (i.e. outside the viewport). The rest are |
- // visible and at least partially unoccluded, verified by the above expect. |
- bool tile_is_visible = |
- tile->content_rect().Intersects(pending_layer_->visible_content_rect()); |
- if (tile_is_visible) |
- unoccluded_tile_count++; |
- queue->Pop(); |
- } |
- EXPECT_EQ(unoccluded_tile_count, 25); |
- |
- // Partial occlusion. |
- pending_layer_->AddChild(LayerImpl::Create(host_impl_.pending_tree(), 1)); |
- LayerImpl* layer1 = pending_layer_->children()[0]; |
- layer1->SetBounds(layer_bounds); |
- layer1->SetContentBounds(layer_bounds); |
- layer1->SetDrawsContent(true); |
- layer1->SetContentsOpaque(true); |
- layer1->SetPosition(occluding_layer_position); |
- |
- time_ticks += base::TimeDelta::FromMilliseconds(200); |
- host_impl_.SetCurrentBeginFrameArgs( |
- CreateBeginFrameArgsForTesting(BEGINFRAME_FROM_HERE, time_ticks)); |
- bool update_lcd_text = false; |
- host_impl_.pending_tree()->UpdateDrawProperties(update_lcd_text); |
- |
- unoccluded_tile_count = 0; |
- queue.reset(new TilingSetRasterQueueAll( |
- pending_layer_->picture_layer_tiling_set(), false)); |
- while (!queue->IsEmpty()) { |
- Tile* tile = queue->Top(); |
- |
- EXPECT_FALSE(tile->is_occluded(PENDING_TREE)); |
- |
- bool tile_is_visible = |
- tile->content_rect().Intersects(pending_layer_->visible_content_rect()); |
- if (tile_is_visible) |
- unoccluded_tile_count++; |
- queue->Pop(); |
- } |
- EXPECT_EQ(20, unoccluded_tile_count); |
- |
- // Full occlusion. |
- layer1->SetPosition(gfx::Point(0, 0)); |
- |
- time_ticks += base::TimeDelta::FromMilliseconds(200); |
- host_impl_.SetCurrentBeginFrameArgs( |
- CreateBeginFrameArgsForTesting(BEGINFRAME_FROM_HERE, time_ticks)); |
- host_impl_.pending_tree()->UpdateDrawProperties(update_lcd_text); |
- |
- unoccluded_tile_count = 0; |
- queue.reset(new TilingSetRasterQueueAll( |
- pending_layer_->picture_layer_tiling_set(), false)); |
- while (!queue->IsEmpty()) { |
- Tile* tile = queue->Top(); |
- |
- EXPECT_FALSE(tile->is_occluded(PENDING_TREE)); |
- |
- bool tile_is_visible = |
- tile->content_rect().Intersects(pending_layer_->visible_content_rect()); |
- if (tile_is_visible) |
- unoccluded_tile_count++; |
- queue->Pop(); |
- } |
- EXPECT_EQ(unoccluded_tile_count, 0); |
-} |
- |
-TEST_F(OcclusionTrackingPictureLayerImplTest, |
- OccludedTilesNotMarkedAsRequired) { |
- base::TimeTicks time_ticks; |
- time_ticks += base::TimeDelta::FromMilliseconds(1); |
- host_impl_.SetCurrentBeginFrameArgs( |
- CreateBeginFrameArgsForTesting(BEGINFRAME_FROM_HERE, time_ticks)); |
- |
- gfx::Size tile_size(102, 102); |
- gfx::Size layer_bounds(1000, 1000); |
- gfx::Size viewport_size(500, 500); |
- gfx::Point occluding_layer_position(310, 0); |
- |
- host_impl_.SetViewportSize(viewport_size); |
- |
- scoped_refptr<FakePicturePileImpl> pending_pile = |
- FakePicturePileImpl::CreateFilledPile(tile_size, layer_bounds); |
- SetupPendingTreeWithFixedTileSize(pending_pile, tile_size, Region()); |
- |
- // No occlusion. |
- int occluded_tile_count = 0; |
- for (size_t i = 0; i < pending_layer_->num_tilings(); ++i) { |
- PictureLayerTiling* tiling = pending_layer_->tilings()->tiling_at(i); |
- |
- occluded_tile_count = 0; |
- for (PictureLayerTiling::CoverageIterator iter( |
- tiling, |
- pending_layer_->contents_scale_x(), |
- gfx::Rect(layer_bounds)); |
- iter; |
- ++iter) { |
- if (!*iter) |
- continue; |
- const Tile* tile = *iter; |
- |
- // Fully occluded tiles are not required for activation. |
- if (tile->is_occluded(PENDING_TREE)) { |
- EXPECT_FALSE(tile->required_for_activation()); |
- occluded_tile_count++; |
- } |
- } |
- EXPECT_EQ(occluded_tile_count, 0); |
- } |
- |
- // Partial occlusion. |
- pending_layer_->AddChild(LayerImpl::Create(host_impl_.pending_tree(), 1)); |
- LayerImpl* layer1 = pending_layer_->children()[0]; |
- layer1->SetBounds(layer_bounds); |
- layer1->SetContentBounds(layer_bounds); |
- layer1->SetDrawsContent(true); |
- layer1->SetContentsOpaque(true); |
- layer1->SetPosition(occluding_layer_position); |
- |
- time_ticks += base::TimeDelta::FromMilliseconds(200); |
- host_impl_.SetCurrentBeginFrameArgs( |
- CreateBeginFrameArgsForTesting(BEGINFRAME_FROM_HERE, time_ticks)); |
- bool update_lcd_text = false; |
- host_impl_.pending_tree()->UpdateDrawProperties(update_lcd_text); |
- |
- for (size_t i = 0; i < pending_layer_->num_tilings(); ++i) { |
- PictureLayerTiling* tiling = pending_layer_->tilings()->tiling_at(i); |
- tiling->UpdateAllTilePrioritiesForTesting(); |
- |
- occluded_tile_count = 0; |
- for (PictureLayerTiling::CoverageIterator iter( |
- tiling, |
- pending_layer_->contents_scale_x(), |
- gfx::Rect(layer_bounds)); |
- iter; |
- ++iter) { |
- if (!*iter) |
- continue; |
- const Tile* tile = *iter; |
- |
- if (tile->is_occluded(PENDING_TREE)) { |
- EXPECT_FALSE(tile->required_for_activation()); |
- occluded_tile_count++; |
- } |
- } |
- switch (i) { |
- case 0: |
- EXPECT_EQ(occluded_tile_count, 5); |
- break; |
- case 1: |
- EXPECT_EQ(occluded_tile_count, 2); |
- break; |
- default: |
- NOTREACHED(); |
- } |
- } |
- |
- // Full occlusion. |
- layer1->SetPosition(gfx::PointF(0, 0)); |
- |
- time_ticks += base::TimeDelta::FromMilliseconds(200); |
- host_impl_.SetCurrentBeginFrameArgs( |
- CreateBeginFrameArgsForTesting(BEGINFRAME_FROM_HERE, time_ticks)); |
- host_impl_.pending_tree()->UpdateDrawProperties(update_lcd_text); |
- |
- for (size_t i = 0; i < pending_layer_->num_tilings(); ++i) { |
- PictureLayerTiling* tiling = pending_layer_->tilings()->tiling_at(i); |
- tiling->UpdateAllTilePrioritiesForTesting(); |
- |
- occluded_tile_count = 0; |
- for (PictureLayerTiling::CoverageIterator iter( |
- tiling, |
- pending_layer_->contents_scale_x(), |
- gfx::Rect(layer_bounds)); |
- iter; |
- ++iter) { |
- if (!*iter) |
- continue; |
- const Tile* tile = *iter; |
- |
- if (tile->is_occluded(PENDING_TREE)) { |
- EXPECT_FALSE(tile->required_for_activation()); |
- occluded_tile_count++; |
- } |
- } |
- switch (i) { |
- case 0: |
- EXPECT_EQ(25, occluded_tile_count); |
- break; |
- case 1: |
- EXPECT_EQ(4, occluded_tile_count); |
- break; |
- default: |
- NOTREACHED(); |
- } |
- } |
-} |
- |
-TEST_F(OcclusionTrackingPictureLayerImplTest, OcclusionForDifferentScales) { |
- base::TimeTicks time_ticks; |
- time_ticks += base::TimeDelta::FromMilliseconds(1); |
- host_impl_.SetCurrentBeginFrameArgs( |
- CreateBeginFrameArgsForTesting(BEGINFRAME_FROM_HERE, time_ticks)); |
- |
- gfx::Size tile_size(102, 102); |
- gfx::Size layer_bounds(1000, 1000); |
- gfx::Size viewport_size(500, 500); |
- gfx::Point occluding_layer_position(310, 0); |
- |
- scoped_refptr<FakePicturePileImpl> pending_pile = |
- FakePicturePileImpl::CreateFilledPile(tile_size, layer_bounds); |
- |
- host_impl_.SetViewportSize(viewport_size); |
- |
- SetupPendingTreeWithFixedTileSize(pending_pile, tile_size, Region()); |
- ASSERT_TRUE(pending_layer_->CanHaveTilings()); |
- |
- pending_layer_->AddChild(LayerImpl::Create(host_impl_.pending_tree(), 1)); |
- LayerImpl* layer1 = pending_layer_->children()[0]; |
- layer1->SetBounds(layer_bounds); |
- layer1->SetContentBounds(layer_bounds); |
- layer1->SetDrawsContent(true); |
- layer1->SetContentsOpaque(true); |
- layer1->SetPosition(occluding_layer_position); |
- |
- pending_layer_->tilings()->RemoveAllTilings(); |
- float low_res_factor = host_impl_.settings().low_res_contents_scale_factor; |
- pending_layer_->AddTiling(low_res_factor); |
- pending_layer_->AddTiling(0.3f); |
- pending_layer_->AddTiling(0.7f); |
- pending_layer_->AddTiling(1.0f); |
- pending_layer_->AddTiling(2.0f); |
- |
- time_ticks += base::TimeDelta::FromMilliseconds(1); |
- host_impl_.SetCurrentBeginFrameArgs( |
- CreateBeginFrameArgsForTesting(BEGINFRAME_FROM_HERE, time_ticks)); |
- // UpdateDrawProperties with the occluding layer. |
- bool update_lcd_text = false; |
- host_impl_.pending_tree()->UpdateDrawProperties(update_lcd_text); |
- |
- EXPECT_EQ(5u, pending_layer_->num_tilings()); |
- |
- int occluded_tile_count = 0; |
- for (size_t i = 0; i < pending_layer_->num_tilings(); ++i) { |
- PictureLayerTiling* tiling = pending_layer_->tilings()->tiling_at(i); |
- tiling->UpdateAllTilePrioritiesForTesting(); |
- std::vector<Tile*> tiles = tiling->AllTilesForTesting(); |
- |
- occluded_tile_count = 0; |
- for (size_t j = 0; j < tiles.size(); ++j) { |
- if (tiles[j]->is_occluded(PENDING_TREE)) { |
- gfx::Rect scaled_content_rect = ScaleToEnclosingRect( |
- tiles[j]->content_rect(), 1.0f / tiles[j]->contents_scale()); |
- EXPECT_GE(scaled_content_rect.x(), occluding_layer_position.x()); |
- occluded_tile_count++; |
- } |
- } |
- |
- switch (i) { |
- case 0: |
- EXPECT_EQ(occluded_tile_count, 30); |
- break; |
- case 1: |
- EXPECT_EQ(occluded_tile_count, 5); |
- break; |
- case 2: |
- EXPECT_EQ(occluded_tile_count, 4); |
- break; |
- case 4: |
- case 3: |
- EXPECT_EQ(occluded_tile_count, 2); |
- break; |
- default: |
- NOTREACHED(); |
- } |
- } |
-} |
- |
-TEST_F(OcclusionTrackingPictureLayerImplTest, DifferentOcclusionOnTrees) { |
- gfx::Size tile_size(102, 102); |
- gfx::Size layer_bounds(1000, 1000); |
- gfx::Size viewport_size(1000, 1000); |
- gfx::Point occluding_layer_position(310, 0); |
- gfx::Rect invalidation_rect(230, 230, 102, 102); |
- |
- scoped_refptr<FakePicturePileImpl> pending_pile = |
- FakePicturePileImpl::CreateFilledPile(tile_size, layer_bounds); |
- scoped_refptr<FakePicturePileImpl> active_pile = |
- FakePicturePileImpl::CreateFilledPile(tile_size, layer_bounds); |
- |
- host_impl_.SetViewportSize(viewport_size); |
- SetupPendingTree(active_pile); |
- |
- // Partially occlude the active layer. |
- pending_layer_->AddChild(LayerImpl::Create(host_impl_.pending_tree(), 2)); |
- LayerImpl* layer1 = pending_layer_->children()[0]; |
- layer1->SetBounds(layer_bounds); |
- layer1->SetContentBounds(layer_bounds); |
- layer1->SetDrawsContent(true); |
- layer1->SetContentsOpaque(true); |
- layer1->SetPosition(occluding_layer_position); |
- |
- ActivateTree(); |
- |
- // Partially invalidate the pending layer. |
- SetupPendingTreeWithInvalidation(pending_pile, invalidation_rect); |
- |
- for (size_t i = 0; i < pending_layer_->num_tilings(); ++i) { |
- PictureLayerTiling* tiling = pending_layer_->tilings()->tiling_at(i); |
- tiling->UpdateAllTilePrioritiesForTesting(); |
- |
- for (PictureLayerTiling::CoverageIterator iter( |
- tiling, |
- pending_layer_->contents_scale_x(), |
- gfx::Rect(layer_bounds)); |
- iter; |
- ++iter) { |
- if (!*iter) |
- continue; |
- const Tile* tile = *iter; |
- |
- // All tiles are unoccluded on the pending tree. |
- EXPECT_FALSE(tile->is_occluded(PENDING_TREE)); |
- |
- Tile* twin_tile = pending_layer_->GetPendingOrActiveTwinTiling(tiling) |
- ->TileAt(iter.i(), iter.j()); |
- gfx::Rect scaled_content_rect = ScaleToEnclosingRect( |
- tile->content_rect(), 1.0f / tile->contents_scale()); |
- |
- if (scaled_content_rect.Intersects(invalidation_rect)) { |
- // Tiles inside the invalidation rect are only on the pending tree. |
- EXPECT_NE(tile, twin_tile); |
- |
- // Unshared tiles should be unoccluded on the active tree by default. |
- EXPECT_FALSE(tile->is_occluded(ACTIVE_TREE)); |
- } else { |
- // Tiles outside the invalidation rect are shared between both trees. |
- EXPECT_EQ(tile, twin_tile); |
- // Shared tiles are occluded on the active tree iff they lie beneath the |
- // occluding layer. |
- EXPECT_EQ(tile->is_occluded(ACTIVE_TREE), |
- scaled_content_rect.x() >= occluding_layer_position.x()); |
- } |
- } |
- } |
- |
- for (size_t i = 0; i < active_layer_->num_tilings(); ++i) { |
- PictureLayerTiling* tiling = active_layer_->tilings()->tiling_at(i); |
- |
- for (PictureLayerTiling::CoverageIterator iter( |
- tiling, |
- active_layer_->contents_scale_x(), |
- gfx::Rect(layer_bounds)); |
- iter; |
- ++iter) { |
- if (!*iter) |
- continue; |
- const Tile* tile = *iter; |
- |
- Tile* twin_tile = active_layer_->GetPendingOrActiveTwinTiling(tiling) |
- ->TileAt(iter.i(), iter.j()); |
- gfx::Rect scaled_content_rect = ScaleToEnclosingRect( |
- tile->content_rect(), 1.0f / tile->contents_scale()); |
- |
- // Since we've already checked the shared tiles, only consider tiles in |
- // the invalidation rect. |
- if (scaled_content_rect.Intersects(invalidation_rect)) { |
- // Tiles inside the invalidation rect are only on the active tree. |
- EXPECT_NE(tile, twin_tile); |
- |
- // Unshared tiles should be unoccluded on the pending tree by default. |
- EXPECT_FALSE(tile->is_occluded(PENDING_TREE)); |
- |
- // Unshared tiles are occluded on the active tree iff they lie beneath |
- // the occluding layer. |
- EXPECT_EQ(tile->is_occluded(ACTIVE_TREE), |
- scaled_content_rect.x() >= occluding_layer_position.x()); |
- } |
- } |
- } |
-} |
- |
-TEST_F(OcclusionTrackingPictureLayerImplTest, |
- OccludedTilesConsideredDuringEviction) { |
- base::TimeTicks time_ticks; |
- time_ticks += base::TimeDelta::FromMilliseconds(1); |
- host_impl_.SetCurrentBeginFrameArgs( |
- CreateBeginFrameArgsForTesting(BEGINFRAME_FROM_HERE, time_ticks)); |
- |
- gfx::Size tile_size(102, 102); |
- gfx::Size layer_bounds(1000, 1000); |
- gfx::Size viewport_size(1000, 1000); |
- gfx::Point pending_occluding_layer_position(310, 0); |
- gfx::Point active_occluding_layer_position(0, 310); |
- gfx::Rect invalidation_rect(230, 230, 102, 102); |
- |
- host_impl_.SetViewportSize(viewport_size); |
- host_impl_.SetDeviceScaleFactor(2.f); |
- |
- scoped_refptr<FakePicturePileImpl> pending_pile = |
- FakePicturePileImpl::CreateFilledPile(tile_size, layer_bounds); |
- scoped_refptr<FakePicturePileImpl> active_pile = |
- FakePicturePileImpl::CreateFilledPile(tile_size, layer_bounds); |
- |
- SetupPendingTreeWithFixedTileSize(active_pile, tile_size, Region()); |
- |
- // Partially occlude the active layer. |
- pending_layer_->AddChild(LayerImpl::Create(host_impl_.pending_tree(), 2)); |
- LayerImpl* active_occluding_layer = pending_layer_->children()[0]; |
- active_occluding_layer->SetBounds(layer_bounds); |
- active_occluding_layer->SetContentBounds(layer_bounds); |
- active_occluding_layer->SetDrawsContent(true); |
- active_occluding_layer->SetContentsOpaque(true); |
- active_occluding_layer->SetPosition(active_occluding_layer_position); |
- |
- ActivateTree(); |
- |
- // Partially invalidate the pending layer. Tiles inside the invalidation rect |
- // are not shared between trees. |
- SetupPendingTreeWithFixedTileSize(pending_pile, tile_size, invalidation_rect); |
- |
- // Partially occlude the pending layer in a different way. |
- pending_layer_->AddChild(LayerImpl::Create(host_impl_.pending_tree(), 3)); |
- LayerImpl* pending_occluding_layer = pending_layer_->children()[0]; |
- pending_occluding_layer->SetBounds(layer_bounds); |
- pending_occluding_layer->SetContentBounds(layer_bounds); |
- pending_occluding_layer->SetDrawsContent(true); |
- pending_occluding_layer->SetContentsOpaque(true); |
- pending_occluding_layer->SetPosition(pending_occluding_layer_position); |
- |
- EXPECT_EQ(2u, pending_layer_->num_tilings()); |
- EXPECT_EQ(2u, active_layer_->num_tilings()); |
- |
- time_ticks += base::TimeDelta::FromMilliseconds(1); |
- host_impl_.SetCurrentBeginFrameArgs( |
- CreateBeginFrameArgsForTesting(BEGINFRAME_FROM_HERE, time_ticks)); |
- // UpdateDrawProperties with the occluding layer. |
- bool update_lcd_text = false; |
- host_impl_.pending_tree()->UpdateDrawProperties(update_lcd_text); |
- |
- // The expected number of occluded tiles on each of the 2 tilings for each of |
- // the 3 tree priorities. |
- size_t expected_occluded_tile_count_on_both[] = {9u, 1u}; |
- size_t expected_occluded_tile_count_on_active[] = {30u, 3u}; |
- size_t expected_occluded_tile_count_on_pending[] = {30u, 3u}; |
- |
- size_t total_expected_occluded_tile_count_on_trees[] = {33u, 33u}; |
- |
- // Verify number of occluded tiles on the pending layer for each tiling. |
- for (size_t i = 0; i < pending_layer_->num_tilings(); ++i) { |
- PictureLayerTiling* tiling = pending_layer_->tilings()->tiling_at(i); |
- tiling->UpdateAllTilePrioritiesForTesting(); |
- |
- size_t occluded_tile_count_on_pending = 0u; |
- size_t occluded_tile_count_on_active = 0u; |
- size_t occluded_tile_count_on_both = 0u; |
- for (PictureLayerTiling::CoverageIterator iter(tiling, 1.f, |
- gfx::Rect(layer_bounds)); |
- iter; ++iter) { |
- Tile* tile = *iter; |
- |
- if (!tile) |
- continue; |
- if (tile->is_occluded(PENDING_TREE)) |
- occluded_tile_count_on_pending++; |
- if (tile->is_occluded(ACTIVE_TREE)) |
- occluded_tile_count_on_active++; |
- if (tile->is_occluded(PENDING_TREE) && tile->is_occluded(ACTIVE_TREE)) |
- occluded_tile_count_on_both++; |
- } |
- EXPECT_EQ(expected_occluded_tile_count_on_pending[i], |
- occluded_tile_count_on_pending) |
- << tiling->contents_scale(); |
- EXPECT_EQ(expected_occluded_tile_count_on_active[i], |
- occluded_tile_count_on_active) |
- << tiling->contents_scale(); |
- EXPECT_EQ(expected_occluded_tile_count_on_both[i], |
- occluded_tile_count_on_both) |
- << tiling->contents_scale(); |
- } |
- |
- // Verify number of occluded tiles on the active layer for each tiling. |
- for (size_t i = 0; i < active_layer_->num_tilings(); ++i) { |
- PictureLayerTiling* tiling = active_layer_->tilings()->tiling_at(i); |
- tiling->UpdateAllTilePrioritiesForTesting(); |
- |
- size_t occluded_tile_count_on_pending = 0u; |
- size_t occluded_tile_count_on_active = 0u; |
- size_t occluded_tile_count_on_both = 0u; |
- for (PictureLayerTiling::CoverageIterator iter( |
- tiling, |
- pending_layer_->contents_scale_x(), |
- gfx::Rect(layer_bounds)); |
- iter; |
- ++iter) { |
- Tile* tile = *iter; |
- |
- if (!tile) |
- continue; |
- if (tile->is_occluded(PENDING_TREE)) |
- occluded_tile_count_on_pending++; |
- if (tile->is_occluded(ACTIVE_TREE)) |
- occluded_tile_count_on_active++; |
- if (tile->is_occluded(PENDING_TREE) && tile->is_occluded(ACTIVE_TREE)) |
- occluded_tile_count_on_both++; |
- } |
- EXPECT_EQ(expected_occluded_tile_count_on_pending[i], |
- occluded_tile_count_on_pending) |
- << i; |
- EXPECT_EQ(expected_occluded_tile_count_on_active[i], |
- occluded_tile_count_on_active) |
- << i; |
- EXPECT_EQ(expected_occluded_tile_count_on_both[i], |
- occluded_tile_count_on_both) |
- << i; |
- } |
- |
- std::vector<Tile*> all_tiles; |
- for (size_t i = 0; i < pending_layer_->num_tilings(); ++i) { |
- PictureLayerTiling* tiling = pending_layer_->tilings()->tiling_at(i); |
- std::vector<Tile*> tiles = tiling->AllTilesForTesting(); |
- all_tiles.insert(all_tiles.end(), tiles.begin(), tiles.end()); |
- } |
- |
- host_impl_.tile_manager()->InitializeTilesWithResourcesForTesting(all_tiles); |
- |
- VerifyEvictionConsidersOcclusion( |
- pending_layer_, active_layer_, PENDING_TREE, |
- total_expected_occluded_tile_count_on_trees[PENDING_TREE]); |
- VerifyEvictionConsidersOcclusion( |
- active_layer_, pending_layer_, ACTIVE_TREE, |
- total_expected_occluded_tile_count_on_trees[ACTIVE_TREE]); |
- |
- // Repeat the tests without valid active tree priorities. |
- active_layer_->set_has_valid_tile_priorities(false); |
- VerifyEvictionConsidersOcclusion( |
- pending_layer_, active_layer_, PENDING_TREE, |
- total_expected_occluded_tile_count_on_trees[PENDING_TREE]); |
- VerifyEvictionConsidersOcclusion( |
- active_layer_, pending_layer_, ACTIVE_TREE, 0u); |
- active_layer_->set_has_valid_tile_priorities(true); |
- |
- // Repeat the tests without valid pending tree priorities. |
- pending_layer_->set_has_valid_tile_priorities(false); |
- VerifyEvictionConsidersOcclusion( |
- active_layer_, pending_layer_, ACTIVE_TREE, |
- total_expected_occluded_tile_count_on_trees[ACTIVE_TREE]); |
- VerifyEvictionConsidersOcclusion( |
- pending_layer_, active_layer_, PENDING_TREE, 0u); |
- pending_layer_->set_has_valid_tile_priorities(true); |
-} |
- |
-TEST_F(PictureLayerImplTest, PendingOrActiveTwinLayer) { |
- gfx::Size tile_size(102, 102); |
- gfx::Size layer_bounds(1000, 1000); |
- |
- scoped_refptr<FakePicturePileImpl> pile = |
- FakePicturePileImpl::CreateFilledPile(tile_size, layer_bounds); |
- SetupPendingTree(pile); |
- EXPECT_FALSE(pending_layer_->GetPendingOrActiveTwinLayer()); |
- |
- ActivateTree(); |
- EXPECT_FALSE(active_layer_->GetPendingOrActiveTwinLayer()); |
- |
- SetupPendingTree(pile); |
- EXPECT_TRUE(pending_layer_->GetPendingOrActiveTwinLayer()); |
- EXPECT_TRUE(active_layer_->GetPendingOrActiveTwinLayer()); |
- EXPECT_EQ(pending_layer_, active_layer_->GetPendingOrActiveTwinLayer()); |
- EXPECT_EQ(active_layer_, pending_layer_->GetPendingOrActiveTwinLayer()); |
- |
- ActivateTree(); |
- EXPECT_FALSE(active_layer_->GetPendingOrActiveTwinLayer()); |
- |
- // Make an empty pending tree. |
- host_impl_.CreatePendingTree(); |
- host_impl_.pending_tree()->DetachLayerTree(); |
- EXPECT_FALSE(active_layer_->GetPendingOrActiveTwinLayer()); |
-} |
- |
-TEST_F(PictureLayerImplTest, RecycledTwinLayer) { |
- gfx::Size tile_size(102, 102); |
- gfx::Size layer_bounds(1000, 1000); |
- |
- scoped_refptr<FakePicturePileImpl> pile = |
- FakePicturePileImpl::CreateFilledPile(tile_size, layer_bounds); |
- SetupPendingTree(pile); |
- EXPECT_FALSE(pending_layer_->GetRecycledTwinLayer()); |
- |
- ActivateTree(); |
- EXPECT_TRUE(active_layer_->GetRecycledTwinLayer()); |
- EXPECT_EQ(old_pending_layer_, active_layer_->GetRecycledTwinLayer()); |
- |
- SetupPendingTree(pile); |
- EXPECT_FALSE(pending_layer_->GetRecycledTwinLayer()); |
- EXPECT_FALSE(active_layer_->GetRecycledTwinLayer()); |
- |
- ActivateTree(); |
- EXPECT_TRUE(active_layer_->GetRecycledTwinLayer()); |
- EXPECT_EQ(old_pending_layer_, active_layer_->GetRecycledTwinLayer()); |
- |
- // Make an empty pending tree. |
- host_impl_.CreatePendingTree(); |
- host_impl_.pending_tree()->DetachLayerTree(); |
- EXPECT_FALSE(active_layer_->GetRecycledTwinLayer()); |
-} |
- |
-void PictureLayerImplTest::TestQuadsForSolidColor(bool test_for_solid) { |
- base::TimeTicks time_ticks; |
- time_ticks += base::TimeDelta::FromMilliseconds(1); |
- host_impl_.SetCurrentBeginFrameArgs( |
- CreateBeginFrameArgsForTesting(BEGINFRAME_FROM_HERE, time_ticks)); |
- |
- gfx::Size tile_size(100, 100); |
- gfx::Size layer_bounds(200, 200); |
- gfx::Rect layer_rect(layer_bounds); |
- |
- FakeContentLayerClient client; |
- scoped_refptr<PictureLayer> layer = PictureLayer::Create(&client); |
- FakeLayerTreeHostClient host_client(FakeLayerTreeHostClient::DIRECT_3D); |
- scoped_ptr<FakeLayerTreeHost> host = FakeLayerTreeHost::Create(&host_client); |
- host->SetRootLayer(layer); |
- RecordingSource* recording_source = layer->GetRecordingSourceForTesting(); |
- |
- int frame_number = 0; |
- |
- client.set_fill_with_nonsolid_color(!test_for_solid); |
- |
- Region invalidation(layer_rect); |
- recording_source->UpdateAndExpandInvalidation( |
- &client, &invalidation, layer_bounds, layer_rect, frame_number++, |
- RecordingSource::RECORD_NORMALLY); |
- |
- scoped_refptr<RasterSource> pending_raster_source = |
- recording_source->CreateRasterSource(true); |
- |
- SetupPendingTreeWithFixedTileSize(pending_raster_source, tile_size, Region()); |
- ActivateTree(); |
- |
- if (test_for_solid) { |
- EXPECT_EQ(0u, active_layer_->tilings()->num_tilings()); |
- } else { |
- ASSERT_TRUE(active_layer_->tilings()); |
- ASSERT_GT(active_layer_->tilings()->num_tilings(), 0u); |
- std::vector<Tile*> tiles = |
- active_layer_->tilings()->tiling_at(0)->AllTilesForTesting(); |
- EXPECT_FALSE(tiles.empty()); |
- host_impl_.tile_manager()->InitializeTilesWithResourcesForTesting(tiles); |
- } |
- |
- scoped_ptr<RenderPass> render_pass = RenderPass::Create(); |
- AppendQuadsData data; |
- active_layer_->WillDraw(DRAW_MODE_SOFTWARE, nullptr); |
- active_layer_->AppendQuads(render_pass.get(), &data); |
- active_layer_->DidDraw(nullptr); |
- |
- DrawQuad::Material expected = test_for_solid |
- ? DrawQuad::Material::SOLID_COLOR |
- : DrawQuad::Material::TILED_CONTENT; |
- EXPECT_EQ(expected, render_pass->quad_list.front()->material); |
-} |
- |
-TEST_F(PictureLayerImplTest, DrawSolidQuads) { |
- TestQuadsForSolidColor(true); |
-} |
- |
-TEST_F(PictureLayerImplTest, DrawNonSolidQuads) { |
- TestQuadsForSolidColor(false); |
-} |
- |
-TEST_F(PictureLayerImplTest, NonSolidToSolidNoTilings) { |
- base::TimeTicks time_ticks; |
- time_ticks += base::TimeDelta::FromMilliseconds(1); |
- host_impl_.SetCurrentBeginFrameArgs( |
- CreateBeginFrameArgsForTesting(BEGINFRAME_FROM_HERE, time_ticks)); |
- |
- gfx::Size tile_size(100, 100); |
- gfx::Size layer_bounds(200, 200); |
- gfx::Rect layer_rect(layer_bounds); |
- |
- FakeContentLayerClient client; |
- scoped_refptr<PictureLayer> layer = PictureLayer::Create(&client); |
- FakeLayerTreeHostClient host_client(FakeLayerTreeHostClient::DIRECT_3D); |
- scoped_ptr<FakeLayerTreeHost> host = FakeLayerTreeHost::Create(&host_client); |
- host->SetRootLayer(layer); |
- RecordingSource* recording_source = layer->GetRecordingSourceForTesting(); |
- |
- int frame_number = 0; |
- |
- client.set_fill_with_nonsolid_color(true); |
- |
- Region invalidation1(layer_rect); |
- recording_source->UpdateAndExpandInvalidation( |
- &client, &invalidation1, layer_bounds, layer_rect, frame_number++, |
- RecordingSource::RECORD_NORMALLY); |
- |
- scoped_refptr<RasterSource> raster_source1 = |
- recording_source->CreateRasterSource(true); |
- |
- SetupPendingTree(raster_source1); |
- ActivateTree(); |
- bool update_lcd_text = false; |
- host_impl_.active_tree()->UpdateDrawProperties(update_lcd_text); |
- |
- // We've started with a solid layer that contains some tilings. |
- ASSERT_TRUE(active_layer_->tilings()); |
- EXPECT_NE(0u, active_layer_->tilings()->num_tilings()); |
- |
- client.set_fill_with_nonsolid_color(false); |
- |
- Region invalidation2(layer_rect); |
- recording_source->UpdateAndExpandInvalidation( |
- &client, &invalidation2, layer_bounds, layer_rect, frame_number++, |
- RecordingSource::RECORD_NORMALLY); |
- |
- scoped_refptr<RasterSource> raster_source2 = |
- recording_source->CreateRasterSource(true); |
- |
- SetupPendingTree(raster_source2); |
- ActivateTree(); |
- |
- // We've switched to a solid color, so we should end up with no tilings. |
- ASSERT_TRUE(active_layer_->tilings()); |
- EXPECT_EQ(0u, active_layer_->tilings()->num_tilings()); |
-} |
- |
-TEST_F(PictureLayerImplTest, ChangeInViewportAllowsTilingUpdates) { |
- base::TimeTicks time_ticks; |
- time_ticks += base::TimeDelta::FromMilliseconds(1); |
- host_impl_.SetCurrentBeginFrameArgs( |
- CreateBeginFrameArgsForTesting(BEGINFRAME_FROM_HERE, time_ticks)); |
- |
- gfx::Size tile_size(100, 100); |
- gfx::Size layer_bounds(400, 4000); |
- |
- 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; |
- gfx::Rect viewport = gfx::Rect(0, 0, 100, 100); |
- gfx::Transform transform; |
- |
- host_impl_.SetRequiresHighResToDraw(); |
- |
- // Update tiles. |
- pending_layer_->draw_properties().visible_content_rect = viewport; |
- pending_layer_->draw_properties().screen_space_transform = transform; |
- SetupDrawPropertiesAndUpdateTiles(pending_layer_, 1.f, 1.f, 1.f, 1.f, false); |
- pending_layer_->HighResTiling()->UpdateAllTilePrioritiesForTesting(); |
- |
- // Ensure we can't activate. |
- EXPECT_FALSE(host_impl_.tile_manager()->IsReadyToActivate()); |
- |
- // Now in the same frame, move the viewport (this can happen during |
- // animation). |
- viewport = gfx::Rect(0, 2000, 100, 100); |
- |
- // Update tiles. |
- pending_layer_->draw_properties().visible_content_rect = viewport; |
- pending_layer_->draw_properties().screen_space_transform = transform; |
- SetupDrawPropertiesAndUpdateTiles(pending_layer_, 1.f, 1.f, 1.f, 1.f, false); |
- pending_layer_->HighResTiling()->UpdateAllTilePrioritiesForTesting(); |
- |
- // Make sure all viewport tiles (viewport from the tiling) are ready to draw. |
- std::vector<Tile*> tiles; |
- for (PictureLayerTiling::CoverageIterator iter( |
- pending_layer_->HighResTiling(), |
- 1.f, |
- pending_layer_->HighResTiling()->GetCurrentVisibleRectForTesting()); |
- iter; |
- ++iter) { |
- if (*iter) |
- tiles.push_back(*iter); |
- } |
- |
- host_impl_.tile_manager()->InitializeTilesWithResourcesForTesting(tiles); |
- |
- // Ensure we can activate. |
- EXPECT_TRUE(host_impl_.tile_manager()->IsReadyToActivate()); |
-} |
- |
-TEST_F(PictureLayerImplTest, CloneMissingRecordings) { |
- gfx::Size tile_size(100, 100); |
- gfx::Size layer_bounds(400, 400); |
- |
- scoped_refptr<FakePicturePileImpl> filled_pile = |
- FakePicturePileImpl::CreateFilledPile(tile_size, layer_bounds); |
- |
- scoped_ptr<FakePicturePile> partial_recording = |
- FakePicturePile::CreateEmptyPile(tile_size, layer_bounds); |
- for (int i = 1; i < partial_recording->tiling().num_tiles_x(); ++i) { |
- for (int j = 1; j < partial_recording->tiling().num_tiles_y(); ++j) |
- partial_recording->AddRecordingAt(i, j); |
- } |
- scoped_refptr<FakePicturePileImpl> partial_pile = |
- FakePicturePileImpl::CreateFromPile(partial_recording.get(), nullptr); |
- |
- SetupPendingTreeWithFixedTileSize(filled_pile, tile_size, Region()); |
- ActivateTree(); |
- |
- PictureLayerTiling* pending_tiling = old_pending_layer_->HighResTiling(); |
- PictureLayerTiling* active_tiling = active_layer_->HighResTiling(); |
- |
- // We should have all tiles in both tile sets. |
- EXPECT_EQ(5u * 5u, pending_tiling->AllTilesForTesting().size()); |
- EXPECT_EQ(5u * 5u, active_tiling->AllTilesForTesting().size()); |
- |
- // Now put a partially-recorded pile on the pending tree (and invalidate |
- // everything, since the main thread PicturePile will invalidate dropped |
- // recordings). This will cause us to be missing some tiles. |
- SetupPendingTreeWithFixedTileSize(partial_pile, tile_size, |
- Region(gfx::Rect(layer_bounds))); |
- EXPECT_EQ(3u * 3u, pending_tiling->AllTilesForTesting().size()); |
- EXPECT_FALSE(pending_tiling->TileAt(0, 0)); |
- EXPECT_FALSE(pending_tiling->TileAt(1, 1)); |
- EXPECT_TRUE(pending_tiling->TileAt(2, 2)); |
- |
- // Active is not affected yet. |
- EXPECT_EQ(5u * 5u, active_tiling->AllTilesForTesting().size()); |
- |
- // Activate the tree. The same tiles go missing on the active tree. |
- ActivateTree(); |
- EXPECT_EQ(3u * 3u, active_tiling->AllTilesForTesting().size()); |
- EXPECT_FALSE(active_tiling->TileAt(0, 0)); |
- EXPECT_FALSE(active_tiling->TileAt(1, 1)); |
- EXPECT_TRUE(active_tiling->TileAt(2, 2)); |
- |
- // Now put a full recording on the pending tree again. We'll get all our tiles |
- // back. |
- SetupPendingTreeWithFixedTileSize(filled_pile, tile_size, |
- Region(gfx::Rect(layer_bounds))); |
- EXPECT_EQ(5u * 5u, pending_tiling->AllTilesForTesting().size()); |
- |
- // Active is not affected yet. |
- EXPECT_EQ(3u * 3u, active_tiling->AllTilesForTesting().size()); |
- |
- // Activate the tree. The tiles are created and shared on the active tree. |
- ActivateTree(); |
- EXPECT_EQ(5u * 5u, active_tiling->AllTilesForTesting().size()); |
- EXPECT_TRUE(active_tiling->TileAt(0, 0)->is_shared()); |
- EXPECT_TRUE(active_tiling->TileAt(1, 1)->is_shared()); |
- EXPECT_TRUE(active_tiling->TileAt(2, 2)->is_shared()); |
-} |
- |
-class TileSizeSettings : public ImplSidePaintingSettings { |
- public: |
- TileSizeSettings() { |
- default_tile_size = gfx::Size(100, 100); |
- max_untiled_layer_size = gfx::Size(200, 200); |
- } |
-}; |
- |
-class TileSizeTest : public PictureLayerImplTest { |
- public: |
- TileSizeTest() : PictureLayerImplTest(TileSizeSettings()) {} |
-}; |
- |
-TEST_F(TileSizeTest, TileSizes) { |
- host_impl_.CreatePendingTree(); |
- |
- LayerTreeImpl* pending_tree = host_impl_.pending_tree(); |
- scoped_ptr<FakePictureLayerImpl> layer = |
- FakePictureLayerImpl::Create(pending_tree, id_); |
- |
- host_impl_.SetViewportSize(gfx::Size(1000, 1000)); |
- gfx::Size result; |
- |
- host_impl_.SetUseGpuRasterization(false); |
- |
- // Default tile-size for large layers. |
- result = layer->CalculateTileSize(gfx::Size(10000, 10000)); |
- EXPECT_EQ(result.width(), 100); |
- EXPECT_EQ(result.height(), 100); |
- // Don't tile and round-up, when under max_untiled_layer_size. |
- result = layer->CalculateTileSize(gfx::Size(42, 42)); |
- EXPECT_EQ(result.width(), 64); |
- EXPECT_EQ(result.height(), 64); |
- result = layer->CalculateTileSize(gfx::Size(191, 191)); |
- EXPECT_EQ(result.width(), 192); |
- EXPECT_EQ(result.height(), 192); |
- result = layer->CalculateTileSize(gfx::Size(199, 199)); |
- EXPECT_EQ(result.width(), 200); |
- EXPECT_EQ(result.height(), 200); |
- |
- // Gpu-rasterization uses 25% viewport-height tiles. |
- // The +2's below are for border texels. |
- host_impl_.SetUseGpuRasterization(true); |
- host_impl_.SetViewportSize(gfx::Size(2000, 2000)); |
- |
- layer->set_gpu_raster_max_texture_size(host_impl_.device_viewport_size()); |
- result = layer->CalculateTileSize(gfx::Size(10000, 10000)); |
- EXPECT_EQ(result.width(), 2000); |
- EXPECT_EQ(result.height(), 500 + 2); |
- |
- // Clamp and round-up, when smaller than viewport. |
- // Tile-height doubles to 50% when width shrinks to <= 50%. |
- host_impl_.SetViewportSize(gfx::Size(1000, 1000)); |
- layer->set_gpu_raster_max_texture_size(host_impl_.device_viewport_size()); |
- result = layer->CalculateTileSize(gfx::Size(447, 10000)); |
- EXPECT_EQ(result.width(), 448); |
- EXPECT_EQ(result.height(), 500 + 2); |
- |
- // Largest layer is 50% of viewport width (rounded up), and |
- // 50% of viewport in height. |
- result = layer->CalculateTileSize(gfx::Size(447, 400)); |
- EXPECT_EQ(result.width(), 448); |
- EXPECT_EQ(result.height(), 448); |
- result = layer->CalculateTileSize(gfx::Size(500, 499)); |
- EXPECT_EQ(result.width(), 512); |
- EXPECT_EQ(result.height(), 500 + 2); |
-} |
- |
-} // namespace |
-} // namespace cc |