Upstream version 11.39.250.0
[platform/framework/web/crosswalk.git] / src / cc / layers / picture_layer_impl_unittest.cc
index c72d19c..46f0ef3 100644 (file)
@@ -165,7 +165,8 @@ class PictureLayerImplTest : public testing::Test {
         maximum_animation_contents_scale;
     layer->draw_properties().screen_space_transform_is_animating =
         animating_transform_to_screen;
-    layer->UpdateTiles(Occlusion());
+    bool resourceless_software_draw = false;
+    layer->UpdateTiles(Occlusion(), resourceless_software_draw);
   }
   static void VerifyAllTilesExistAndHavePile(
       const PictureLayerTiling* tiling,
@@ -265,7 +266,7 @@ class PictureLayerImplTest : public testing::Test {
       // 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_RECT_EQ(*rect_iter, mock_canvas.rects_[0]);
+      EXPECT_EQ(*rect_iter, mock_canvas.rects_[0]);
       rect_iter++;
     }
   }
@@ -355,7 +356,7 @@ TEST_F(PictureLayerImplTest, ExternalViewportRectForPrioritizingTiles) {
                                         resourceless_software_draw);
   active_layer_->draw_properties().visible_content_rect = viewport;
   active_layer_->draw_properties().screen_space_transform = transform;
-  active_layer_->UpdateTiles(Occlusion());
+  active_layer_->UpdateTiles(Occlusion(), resourceless_software_draw);
 
   gfx::Rect viewport_rect_for_tile_priority_in_view_space =
       viewport_rect_for_tile_priority;
@@ -393,7 +394,7 @@ TEST_F(PictureLayerImplTest, ExternalViewportRectForPrioritizingTiles) {
                                         resourceless_software_draw);
   active_layer_->draw_properties().visible_content_rect = viewport;
   active_layer_->draw_properties().screen_space_transform = transform;
-  active_layer_->UpdateTiles(Occlusion());
+  active_layer_->UpdateTiles(Occlusion(), resourceless_software_draw);
 
   gfx::Transform screen_to_view(gfx::Transform::kSkipInitialization);
   bool success = transform_for_tile_priority.GetInverse(&screen_to_view);
@@ -421,8 +422,7 @@ TEST_F(PictureLayerImplTest, ExternalViewportRectForPrioritizingTiles) {
   }
 }
 
-TEST_F(PictureLayerImplTest,
-       ResourcelessSoftwareDrawHasValidViewportForTilePriority) {
+TEST_F(PictureLayerImplTest, InvalidViewportForPrioritizingTiles) {
   base::TimeTicks time_ticks;
   time_ticks += base::TimeDelta::FromMilliseconds(1);
   host_impl_.SetCurrentBeginFrameArgs(
@@ -443,6 +443,8 @@ TEST_F(PictureLayerImplTest,
   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;
@@ -454,7 +456,7 @@ TEST_F(PictureLayerImplTest,
                                         resourceless_software_draw);
   active_layer_->draw_properties().visible_content_rect = viewport;
   active_layer_->draw_properties().screen_space_transform = transform;
-  active_layer_->UpdateTiles(Occlusion());
+  active_layer_->UpdateTiles(Occlusion(), resourceless_software_draw);
 
   gfx::Rect visible_rect_for_tile_priority =
       active_layer_->visible_rect_for_tile_priority();
@@ -465,9 +467,8 @@ TEST_F(PictureLayerImplTest,
   gfx::Transform screen_space_transform_for_tile_priority =
       active_layer_->screen_space_transform_for_tile_priority();
 
-  // PictureLayerImpl does not make a special case for
-  // resource_less_software_draw, so the tile viewport and matrix should be
-  // respected.
+  // 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(time_ticks));
@@ -482,20 +483,36 @@ TEST_F(PictureLayerImplTest,
                                         viewport,
                                         transform,
                                         resourceless_software_draw);
-  active_layer_->UpdateTiles(Occlusion());
-
-  visible_rect_for_tile_priority =
-      gfx::ScaleToEnclosingRect(visible_rect_for_tile_priority, 2);
-  viewport_rect_for_tile_priority =
-      gfx::ScaleToEnclosingRect(viewport_rect_for_tile_priority, 2);
-  screen_space_transform_for_tile_priority = transform;
-  EXPECT_RECT_EQ(visible_rect_for_tile_priority,
-                 active_layer_->visible_rect_for_tile_priority());
-  EXPECT_RECT_EQ(viewport_rect_for_tile_priority,
-                 active_layer_->viewport_rect_for_tile_priority());
+  active_layer_->UpdateTiles(Occlusion(), resourceless_software_draw);
+
+  // Viewport and transform for tile priority are updated.
+  EXPECT_EQ(viewport, active_layer_->viewport_rect_for_tile_priority());
+  EXPECT_TRANSFORMATION_MATRIX_EQ(
+      transform, active_layer_->screen_space_transform_for_tile_priority());
+  // 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(time_ticks));
+  resourceless_software_draw = false;
+  host_impl_.SetExternalDrawConstraints(transform,
+                                        viewport,
+                                        viewport,
+                                        viewport,
+                                        transform,
+                                        resourceless_software_draw);
+  active_layer_->UpdateTiles(Occlusion(), resourceless_software_draw);
+
   EXPECT_TRANSFORMATION_MATRIX_EQ(
-      screen_space_transform_for_tile_priority,
-      active_layer_->screen_space_transform_for_tile_priority());
+      transform, active_layer_->screen_space_transform_for_tile_priority());
+  EXPECT_EQ(viewport, active_layer_->visible_rect_for_tile_priority());
+
+  // Match the reverse translate in |transform|.
+  EXPECT_EQ(viewport - gfx::Vector2d(1, 1),
+            active_layer_->viewport_rect_for_tile_priority());
 }
 
 TEST_F(PictureLayerImplTest, ClonePartialInvalidation) {
@@ -1095,6 +1112,7 @@ TEST_F(PictureLayerImplTest, DontAddLowResDuringAnimation) {
   // Page scale animation, new high res, but not new low res because animating.
   contents_scale = 2.f;
   page_scale = 2.f;
+  maximum_animation_scale = 2.f;
   animating_transform = true;
   SetContentsScaleOnBothLayers(contents_scale,
                                device_scale,
@@ -1412,6 +1430,38 @@ TEST_F(PictureLayerImplTest, MarkRequiredNullTiles) {
   pending_layer_->MarkVisibleResourcesAsRequired();
 }
 
+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);
+  scoped_refptr<FakePicturePileImpl> active_pile =
+      FakePicturePileImpl::CreateEmptyPileThatThinksItHasRecordings(
+          tile_size, layer_bounds);
+
+  pending_pile->set_is_solid_color(false);
+  active_pile->set_is_solid_color(true);
+  SetupTrees(pending_pile, active_pile);
+  // Solid color layer should not have tilings.
+  ASSERT_FALSE(active_layer_->CanHaveTilings());
+
+  // Update properties with solid color pile should not allow tilings at any
+  // scale.
+  host_impl_.active_tree()->UpdateDrawProperties();
+  EXPECT_FALSE(active_layer_->CanHaveTilings());
+  EXPECT_EQ(0.f, active_layer_->ideal_contents_scale());
+
+  // Push non-solid-color pending pile makes active layer can have tilings.
+  active_layer_->UpdatePile(pending_pile);
+  ASSERT_TRUE(active_layer_->CanHaveTilings());
+
+  // Update properties with non-solid color pile should allow tilings.
+  host_impl_.active_tree()->UpdateDrawProperties();
+  EXPECT_TRUE(active_layer_->CanHaveTilings());
+  EXPECT_GT(active_layer_->ideal_contents_scale(), 0.f);
+}
+
 TEST_F(PictureLayerImplTest, MarkRequiredOffscreenTiles) {
   gfx::Size tile_size(100, 100);
   gfx::Size layer_bounds(200, 200);
@@ -1420,14 +1470,23 @@ TEST_F(PictureLayerImplTest, MarkRequiredOffscreenTiles) {
       FakePicturePileImpl::CreateFilledPile(tile_size, layer_bounds);
   SetupPendingTree(pending_pile);
 
+  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);
+
   pending_layer_->set_fixed_tile_size(tile_size);
   ASSERT_TRUE(pending_layer_->CanHaveTilings());
   PictureLayerTiling* tiling = pending_layer_->AddTiling(1.f);
   host_impl_.pending_tree()->UpdateDrawProperties();
   EXPECT_EQ(tiling->resolution(), HIGH_RESOLUTION);
-
-  pending_layer_->draw_properties().visible_content_rect =
-      gfx::Rect(0, 0, 100, 200);
+  EXPECT_EQ(viewport, pending_layer_->visible_rect_for_tile_priority());
 
   // Fake set priorities.
   for (PictureLayerTiling::CoverageIterator iter(
@@ -1440,7 +1499,8 @@ TEST_F(PictureLayerImplTest, MarkRequiredOffscreenTiles) {
     TilePriority priority;
     priority.resolution = HIGH_RESOLUTION;
     gfx::Rect tile_bounds = iter.geometry_rect();
-    if (pending_layer_->visible_content_rect().Intersects(tile_bounds)) {
+    if (pending_layer_->visible_rect_for_tile_priority().Intersects(
+            tile_bounds)) {
       priority.priority_bin = TilePriority::NOW;
       priority.distance_to_visible = 0.f;
     } else {
@@ -1516,7 +1576,7 @@ TEST_F(PictureLayerImplTest, TileOutsideOfViewportForTilePriorityNotRequired) {
   time_ticks += base::TimeDelta::FromMilliseconds(200);
   host_impl_.SetCurrentBeginFrameArgs(
       CreateBeginFrameArgsForTesting(time_ticks));
-  pending_layer_->UpdateTiles(Occlusion());
+  pending_layer_->UpdateTiles(Occlusion(), resourceless_software_draw);
 
   pending_layer_->MarkVisibleResourcesAsRequired();
 
@@ -2313,7 +2373,7 @@ TEST_F(PictureLayerImplTest, HighResTilingDuringAnimationForCpuRasterization) {
   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 the animation's initial scale.
+  // high-res tiling should be created at a source scale of 1.
   animating_transform = true;
   contents_scale = 2.f;
   maximum_animation_scale = 0.f;
@@ -2323,7 +2383,7 @@ TEST_F(PictureLayerImplTest, HighResTilingDuringAnimationForCpuRasterization) {
                                page_scale,
                                maximum_animation_scale,
                                animating_transform);
-  EXPECT_BOTH_EQ(HighResTiling()->contents_scale(), 2.f);
+  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.
@@ -2334,7 +2394,7 @@ TEST_F(PictureLayerImplTest, HighResTilingDuringAnimationForCpuRasterization) {
                                page_scale,
                                maximum_animation_scale,
                                animating_transform);
-  EXPECT_BOTH_EQ(HighResTiling()->contents_scale(), 2.f);
+  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;
@@ -2349,8 +2409,8 @@ TEST_F(PictureLayerImplTest, HighResTilingDuringAnimationForCpuRasterization) {
 
   // 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 the animation's initial scale, not
-  // at its maximum scale.
+  // 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;
@@ -2360,7 +2420,7 @@ TEST_F(PictureLayerImplTest, HighResTilingDuringAnimationForCpuRasterization) {
                                page_scale,
                                maximum_animation_scale,
                                animating_transform);
-  EXPECT_BOTH_EQ(HighResTiling()->contents_scale(), 2.f);
+  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;
@@ -2390,6 +2450,31 @@ TEST_F(PictureLayerImplTest, HighResTilingDuringAnimationForCpuRasterization) {
 
   // 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,
@@ -2583,7 +2668,8 @@ TEST_F(PictureLayerImplTest, LayerRasterTileIterator) {
 
   pending_layer_->draw_properties().visible_content_rect =
       gfx::Rect(1100, 1100, 500, 500);
-  pending_layer_->UpdateTiles(Occlusion());
+  bool resourceless_software_draw = false;
+  pending_layer_->UpdateTiles(Occlusion(), resourceless_software_draw);
 
   unique_tiles.clear();
   high_res_tile_count = 0u;
@@ -2613,7 +2699,7 @@ TEST_F(PictureLayerImplTest, LayerRasterTileIterator) {
 
   pending_layer_->draw_properties().visible_content_rect =
       gfx::Rect(0, 0, 500, 500);
-  pending_layer_->UpdateTiles(Occlusion());
+  pending_layer_->UpdateTiles(Occlusion(), resourceless_software_draw);
 
   std::vector<Tile*> high_res_tiles = high_res_tiling->AllTilesForTesting();
   for (std::vector<Tile*>::iterator tile_it = high_res_tiles.begin();
@@ -3136,8 +3222,7 @@ TEST_F(NoLowResPictureLayerImplTest, NothingRequiredIfActiveMissingTiles) {
     AssertNoTilesRequired(pending_layer_->LowResTiling());
 }
 
-TEST_F(NoLowResPictureLayerImplTest,
-       ResourcelessSoftwareDrawHasValidViewportForTilePriority) {
+TEST_F(NoLowResPictureLayerImplTest, InvalidViewportForPrioritizingTiles) {
   base::TimeTicks time_ticks;
   time_ticks += base::TimeDelta::FromMilliseconds(1);
   host_impl_.SetCurrentBeginFrameArgs(
@@ -3158,6 +3243,8 @@ TEST_F(NoLowResPictureLayerImplTest,
   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;
@@ -3169,7 +3256,7 @@ TEST_F(NoLowResPictureLayerImplTest,
                                         resourceless_software_draw);
   active_layer_->draw_properties().visible_content_rect = viewport;
   active_layer_->draw_properties().screen_space_transform = transform;
-  active_layer_->UpdateTiles(Occlusion());
+  active_layer_->UpdateTiles(Occlusion(), resourceless_software_draw);
 
   gfx::Rect visible_rect_for_tile_priority =
       active_layer_->visible_rect_for_tile_priority();
@@ -3180,9 +3267,8 @@ TEST_F(NoLowResPictureLayerImplTest,
   gfx::Transform screen_space_transform_for_tile_priority =
       active_layer_->screen_space_transform_for_tile_priority();
 
-  // PictureLayerImpl does not make a special case for
-  // resource_less_software_draw, so the tile viewport and matrix should be
-  // respected.
+  // 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(time_ticks));
@@ -3197,21 +3283,36 @@ TEST_F(NoLowResPictureLayerImplTest,
                                         viewport,
                                         transform,
                                         resourceless_software_draw);
-  active_layer_->UpdateTiles(Occlusion());
-
-  visible_rect_for_tile_priority =
-      gfx::ScaleToEnclosingRect(visible_rect_for_tile_priority, 2);
-  viewport_rect_for_tile_priority =
-      gfx::ScaleToEnclosingRect(viewport_rect_for_tile_priority, 2);
-  screen_space_transform_for_tile_priority = transform;
-
-  EXPECT_RECT_EQ(visible_rect_for_tile_priority,
-                 active_layer_->visible_rect_for_tile_priority());
-  EXPECT_RECT_EQ(viewport_rect_for_tile_priority,
-                 active_layer_->viewport_rect_for_tile_priority());
+  active_layer_->UpdateTiles(Occlusion(), resourceless_software_draw);
+
+  // Viewport and transform for tile priority are updated.
+  EXPECT_EQ(viewport, active_layer_->viewport_rect_for_tile_priority());
   EXPECT_TRANSFORMATION_MATRIX_EQ(
-      screen_space_transform_for_tile_priority,
-      active_layer_->screen_space_transform_for_tile_priority());
+      transform, active_layer_->screen_space_transform_for_tile_priority());
+  // 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(time_ticks));
+  resourceless_software_draw = false;
+  host_impl_.SetExternalDrawConstraints(transform,
+                                        viewport,
+                                        viewport,
+                                        viewport,
+                                        transform,
+                                        resourceless_software_draw);
+  active_layer_->UpdateTiles(Occlusion(), resourceless_software_draw);
+
+  EXPECT_TRANSFORMATION_MATRIX_EQ(
+      transform, active_layer_->screen_space_transform_for_tile_priority());
+  EXPECT_EQ(viewport, active_layer_->visible_rect_for_tile_priority());
+
+  // Match the reverse translate in |transform|.
+  EXPECT_EQ(viewport - gfx::Vector2d(1, 1),
+            active_layer_->viewport_rect_for_tile_priority());
 }
 
 TEST_F(NoLowResPictureLayerImplTest, CleanUpTilings) {
@@ -4264,12 +4365,12 @@ void PictureLayerImplTest::TestQuadsForSolidColor(bool test_for_solid) {
   SetupPendingTree(pending_pile);
   ActivateTree();
 
+  active_layer_->set_fixed_tile_size(tile_size);
+  host_impl_.active_tree()->UpdateDrawProperties();
   if (test_for_solid) {
     EXPECT_EQ(0u, active_layer_->tilings()->num_tilings());
   } else {
     ASSERT_TRUE(active_layer_->tilings());
-    active_layer_->set_fixed_tile_size(tile_size);
-    host_impl_.active_tree()->UpdateDrawProperties();
     ASSERT_GT(active_layer_->tilings()->num_tilings(), 0u);
     std::vector<Tile*> tiles =
         active_layer_->tilings()->tiling_at(0)->AllTilesForTesting();