| OLD | NEW |
| (Empty) |
| 1 // Copyright 2013 The Chromium Authors. All rights reserved. | |
| 2 // Use of this source code is governed by a BSD-style license that can be | |
| 3 // found in the LICENSE file. | |
| 4 | |
| 5 #include "cc/trees/layer_tree_host.h" | |
| 6 | |
| 7 #include "cc/test/fake_content_layer_client.h" | |
| 8 #include "cc/test/fake_picture_layer.h" | |
| 9 #include "cc/test/fake_picture_layer_impl.h" | |
| 10 #include "cc/test/layer_tree_test.h" | |
| 11 #include "cc/trees/layer_tree_impl.h" | |
| 12 | |
| 13 namespace cc { | |
| 14 namespace { | |
| 15 | |
| 16 // These tests deal with picture layers. | |
| 17 class LayerTreeHostPictureTest : public LayerTreeTest { | |
| 18 protected: | |
| 19 void SetupTreeWithSinglePictureLayer(const gfx::Size& size) { | |
| 20 scoped_refptr<Layer> root = Layer::Create(); | |
| 21 root->SetBounds(size); | |
| 22 | |
| 23 root_picture_layer_ = FakePictureLayer::Create(&client_); | |
| 24 root_picture_layer_->SetBounds(size); | |
| 25 root->AddChild(root_picture_layer_); | |
| 26 | |
| 27 layer_tree_host()->SetRootLayer(root); | |
| 28 } | |
| 29 | |
| 30 scoped_refptr<FakePictureLayer> root_picture_layer_; | |
| 31 FakeContentLayerClient client_; | |
| 32 }; | |
| 33 | |
| 34 class LayerTreeHostPictureTestTwinLayer | |
| 35 : public LayerTreeHostPictureTest { | |
| 36 void SetupTree() override { | |
| 37 SetupTreeWithSinglePictureLayer(gfx::Size(1, 1)); | |
| 38 } | |
| 39 | |
| 40 void BeginTest() override { | |
| 41 activates_ = 0; | |
| 42 PostSetNeedsCommitToMainThread(); | |
| 43 } | |
| 44 | |
| 45 void DidCommit() override { | |
| 46 switch (layer_tree_host()->source_frame_number()) { | |
| 47 case 1: | |
| 48 // Activate while there are pending and active twins in place. | |
| 49 layer_tree_host()->SetNeedsCommit(); | |
| 50 break; | |
| 51 case 2: | |
| 52 // Drop the picture layer from the tree so the activate will have an | |
| 53 // active layer without a pending twin. | |
| 54 layer_tree_host()->root_layer()->children()[0]->RemoveFromParent(); | |
| 55 break; | |
| 56 case 3: { | |
| 57 // Add a new picture layer so the activate will have a pending layer | |
| 58 // without an active twin. | |
| 59 scoped_refptr<FakePictureLayer> picture = | |
| 60 FakePictureLayer::Create(&client_); | |
| 61 layer_tree_host()->root_layer()->AddChild(picture); | |
| 62 break; | |
| 63 } | |
| 64 case 4: | |
| 65 // Active while there are pending and active twins again. | |
| 66 layer_tree_host()->SetNeedsCommit(); | |
| 67 break; | |
| 68 case 5: | |
| 69 EndTest(); | |
| 70 break; | |
| 71 } | |
| 72 } | |
| 73 | |
| 74 void WillActivateTreeOnThread(LayerTreeHostImpl* impl) override { | |
| 75 LayerImpl* pending_root_impl = impl->pending_tree()->root_layer(); | |
| 76 LayerImpl* active_root_impl = impl->active_tree()->root_layer(); | |
| 77 | |
| 78 if (pending_root_impl->children().empty()) { | |
| 79 EXPECT_EQ(2, activates_); | |
| 80 return; | |
| 81 } | |
| 82 | |
| 83 FakePictureLayerImpl* pending_picture_impl = | |
| 84 static_cast<FakePictureLayerImpl*>(pending_root_impl->children()[0]); | |
| 85 | |
| 86 if (!active_root_impl) { | |
| 87 EXPECT_EQ(0, activates_); | |
| 88 EXPECT_EQ(nullptr, pending_picture_impl->GetPendingOrActiveTwinLayer()); | |
| 89 return; | |
| 90 } | |
| 91 | |
| 92 if (active_root_impl->children().empty()) { | |
| 93 EXPECT_EQ(3, activates_); | |
| 94 EXPECT_EQ(nullptr, pending_picture_impl->GetPendingOrActiveTwinLayer()); | |
| 95 return; | |
| 96 } | |
| 97 | |
| 98 FakePictureLayerImpl* active_picture_impl = | |
| 99 static_cast<FakePictureLayerImpl*>(active_root_impl->children()[0]); | |
| 100 | |
| 101 // After the first activation, when we commit again, we'll have a pending | |
| 102 // and active layer. Then we recreate a picture layer in the 4th activate | |
| 103 // and the next commit will have a pending and active twin again. | |
| 104 EXPECT_TRUE(activates_ == 1 || activates_ == 4) << activates_; | |
| 105 | |
| 106 EXPECT_EQ(pending_picture_impl, | |
| 107 active_picture_impl->GetPendingOrActiveTwinLayer()); | |
| 108 EXPECT_EQ(active_picture_impl, | |
| 109 pending_picture_impl->GetPendingOrActiveTwinLayer()); | |
| 110 EXPECT_EQ(nullptr, active_picture_impl->GetRecycledTwinLayer()); | |
| 111 } | |
| 112 | |
| 113 void DidActivateTreeOnThread(LayerTreeHostImpl* impl) override { | |
| 114 LayerImpl* active_root_impl = impl->active_tree()->root_layer(); | |
| 115 LayerImpl* recycle_root_impl = impl->recycle_tree()->root_layer(); | |
| 116 | |
| 117 if (active_root_impl->children().empty()) { | |
| 118 EXPECT_EQ(2, activates_); | |
| 119 } else { | |
| 120 FakePictureLayerImpl* active_picture_impl = | |
| 121 static_cast<FakePictureLayerImpl*>(active_root_impl->children()[0]); | |
| 122 FakePictureLayerImpl* recycle_picture_impl = | |
| 123 static_cast<FakePictureLayerImpl*>(recycle_root_impl->children()[0]); | |
| 124 | |
| 125 EXPECT_EQ(nullptr, active_picture_impl->GetPendingOrActiveTwinLayer()); | |
| 126 EXPECT_EQ(recycle_picture_impl, | |
| 127 active_picture_impl->GetRecycledTwinLayer()); | |
| 128 } | |
| 129 | |
| 130 ++activates_; | |
| 131 } | |
| 132 | |
| 133 void AfterTest() override { EXPECT_EQ(5, activates_); } | |
| 134 | |
| 135 int activates_; | |
| 136 }; | |
| 137 | |
| 138 // There is no pending layers in single thread mode. | |
| 139 MULTI_THREAD_IMPL_TEST_F(LayerTreeHostPictureTestTwinLayer); | |
| 140 | |
| 141 class LayerTreeHostPictureTestResizeViewportWithGpuRaster | |
| 142 : public LayerTreeHostPictureTest { | |
| 143 void InitializeSettings(LayerTreeSettings* settings) override { | |
| 144 settings->gpu_rasterization_forced = true; | |
| 145 } | |
| 146 | |
| 147 void SetupTree() override { | |
| 148 scoped_refptr<Layer> root = Layer::Create(); | |
| 149 root->SetBounds(gfx::Size(768, 960)); | |
| 150 | |
| 151 client_.set_fill_with_nonsolid_color(true); | |
| 152 picture_ = FakePictureLayer::Create(&client_); | |
| 153 picture_->SetBounds(gfx::Size(768, 960)); | |
| 154 root->AddChild(picture_); | |
| 155 | |
| 156 layer_tree_host()->SetRootLayer(root); | |
| 157 LayerTreeHostPictureTest::SetupTree(); | |
| 158 } | |
| 159 | |
| 160 void BeginTest() override { PostSetNeedsCommitToMainThread(); } | |
| 161 | |
| 162 void CommitCompleteOnThread(LayerTreeHostImpl* impl) override { | |
| 163 LayerImpl* child = impl->sync_tree()->root_layer()->children()[0]; | |
| 164 FakePictureLayerImpl* picture_impl = | |
| 165 static_cast<FakePictureLayerImpl*>(child); | |
| 166 gfx::Size tile_size = | |
| 167 picture_impl->HighResTiling()->TileAt(0, 0)->content_rect().size(); | |
| 168 | |
| 169 switch (impl->sync_tree()->source_frame_number()) { | |
| 170 case 0: | |
| 171 tile_size_ = tile_size; | |
| 172 // GPU Raster picks a tile size based on the viewport size. | |
| 173 EXPECT_EQ(gfx::Size(768, 256), tile_size); | |
| 174 break; | |
| 175 case 1: | |
| 176 // When the viewport changed size, the new frame's tiles should change | |
| 177 // along with it. | |
| 178 EXPECT_NE(gfx::Size(768, 256), tile_size); | |
| 179 } | |
| 180 } | |
| 181 | |
| 182 void DidCommit() override { | |
| 183 switch (layer_tree_host()->source_frame_number()) { | |
| 184 case 1: | |
| 185 // Change the picture layer's size along with the viewport, so it will | |
| 186 // consider picking a new tile size. | |
| 187 picture_->SetBounds(gfx::Size(768, 1056)); | |
| 188 layer_tree_host()->SetViewportSize(gfx::Size(768, 1056)); | |
| 189 break; | |
| 190 case 2: | |
| 191 EndTest(); | |
| 192 } | |
| 193 } | |
| 194 | |
| 195 void AfterTest() override {} | |
| 196 | |
| 197 gfx::Size tile_size_; | |
| 198 FakeContentLayerClient client_; | |
| 199 scoped_refptr<FakePictureLayer> picture_; | |
| 200 }; | |
| 201 | |
| 202 SINGLE_AND_MULTI_THREAD_IMPL_TEST_F( | |
| 203 LayerTreeHostPictureTestResizeViewportWithGpuRaster); | |
| 204 | |
| 205 class LayerTreeHostPictureTestChangeLiveTilesRectWithRecycleTree | |
| 206 : public LayerTreeHostPictureTest { | |
| 207 void SetupTree() override { | |
| 208 frame_ = 0; | |
| 209 did_post_commit_ = false; | |
| 210 | |
| 211 scoped_refptr<Layer> root = Layer::Create(); | |
| 212 root->SetBounds(gfx::Size(100, 100)); | |
| 213 | |
| 214 // The layer is big enough that the live tiles rect won't cover the full | |
| 215 // layer. | |
| 216 client_.set_fill_with_nonsolid_color(true); | |
| 217 picture_ = FakePictureLayer::Create(&client_); | |
| 218 picture_->SetBounds(gfx::Size(100, 100000)); | |
| 219 root->AddChild(picture_); | |
| 220 | |
| 221 layer_tree_host()->SetRootLayer(root); | |
| 222 LayerTreeHostPictureTest::SetupTree(); | |
| 223 } | |
| 224 | |
| 225 void BeginTest() override { PostSetNeedsCommitToMainThread(); } | |
| 226 | |
| 227 void DrawLayersOnThread(LayerTreeHostImpl* impl) override { | |
| 228 LayerImpl* child = impl->active_tree()->root_layer()->children()[0]; | |
| 229 FakePictureLayerImpl* picture_impl = | |
| 230 static_cast<FakePictureLayerImpl*>(child); | |
| 231 FakePictureLayerImpl* recycled_impl = static_cast<FakePictureLayerImpl*>( | |
| 232 picture_impl->GetRecycledTwinLayer()); | |
| 233 | |
| 234 switch (++frame_) { | |
| 235 case 1: { | |
| 236 PictureLayerTiling* tiling = picture_impl->HighResTiling(); | |
| 237 PictureLayerTiling* recycled_tiling = recycled_impl->HighResTiling(); | |
| 238 int num_tiles_y = tiling->TilingDataForTesting().num_tiles_y(); | |
| 239 | |
| 240 // There should be tiles at the top of the picture layer but not at the | |
| 241 // bottom. | |
| 242 EXPECT_TRUE(tiling->TileAt(0, 0)); | |
| 243 EXPECT_FALSE(tiling->TileAt(0, num_tiles_y)); | |
| 244 | |
| 245 // The recycled tiling matches it. | |
| 246 EXPECT_TRUE(recycled_tiling->TileAt(0, 0)); | |
| 247 EXPECT_FALSE(recycled_tiling->TileAt(0, num_tiles_y)); | |
| 248 | |
| 249 // The live tiles rect matches on the recycled tree. | |
| 250 EXPECT_EQ(tiling->live_tiles_rect(), | |
| 251 recycled_tiling->live_tiles_rect()); | |
| 252 | |
| 253 // Make the bottom of the layer visible. | |
| 254 picture_impl->SetPosition(gfx::PointF(0.f, -100000.f + 100.f)); | |
| 255 impl->SetNeedsRedraw(); | |
| 256 break; | |
| 257 } | |
| 258 case 2: { | |
| 259 PictureLayerTiling* tiling = picture_impl->HighResTiling(); | |
| 260 PictureLayerTiling* recycled_tiling = recycled_impl->HighResTiling(); | |
| 261 | |
| 262 // There not be tiles at the top of the layer now. | |
| 263 EXPECT_FALSE(tiling->TileAt(0, 0)); | |
| 264 | |
| 265 // The recycled twin tiling should not have unshared tiles at the top | |
| 266 // either. | |
| 267 EXPECT_FALSE(recycled_tiling->TileAt(0, 0)); | |
| 268 | |
| 269 // The live tiles rect matches on the recycled tree. | |
| 270 EXPECT_EQ(tiling->live_tiles_rect(), | |
| 271 recycled_tiling->live_tiles_rect()); | |
| 272 | |
| 273 // Make the top of the layer visible again. | |
| 274 picture_impl->SetPosition(gfx::PointF()); | |
| 275 impl->SetNeedsRedraw(); | |
| 276 break; | |
| 277 } | |
| 278 case 3: { | |
| 279 PictureLayerTiling* tiling = picture_impl->HighResTiling(); | |
| 280 PictureLayerTiling* recycled_tiling = recycled_impl->HighResTiling(); | |
| 281 int num_tiles_y = tiling->TilingDataForTesting().num_tiles_y(); | |
| 282 | |
| 283 // There should be tiles at the top of the picture layer again. | |
| 284 EXPECT_TRUE(tiling->TileAt(0, 0)); | |
| 285 EXPECT_FALSE(tiling->TileAt(0, num_tiles_y)); | |
| 286 | |
| 287 // The recycled tiling should also have tiles at the top. | |
| 288 EXPECT_TRUE(recycled_tiling->TileAt(0, 0)); | |
| 289 EXPECT_FALSE(recycled_tiling->TileAt(0, num_tiles_y)); | |
| 290 | |
| 291 // The live tiles rect matches on the recycled tree. | |
| 292 EXPECT_EQ(tiling->live_tiles_rect(), | |
| 293 recycled_tiling->live_tiles_rect()); | |
| 294 | |
| 295 // Make a new main frame without changing the picture layer at all, so | |
| 296 // it won't need to update or push properties. | |
| 297 did_post_commit_ = true; | |
| 298 PostSetNeedsCommitToMainThread(); | |
| 299 break; | |
| 300 } | |
| 301 } | |
| 302 } | |
| 303 | |
| 304 void WillActivateTreeOnThread(LayerTreeHostImpl* impl) override { | |
| 305 LayerImpl* child = impl->sync_tree()->root_layer()->children()[0]; | |
| 306 FakePictureLayerImpl* picture_impl = | |
| 307 static_cast<FakePictureLayerImpl*>(child); | |
| 308 PictureLayerTiling* tiling = picture_impl->HighResTiling(); | |
| 309 int num_tiles_y = tiling->TilingDataForTesting().num_tiles_y(); | |
| 310 | |
| 311 // The pending layer should always have tiles at the top of it each commit. | |
| 312 // The tile is part of the required for activation set so it should exist. | |
| 313 EXPECT_TRUE(tiling->TileAt(0, 0)); | |
| 314 EXPECT_FALSE(tiling->TileAt(0, num_tiles_y)); | |
| 315 | |
| 316 if (did_post_commit_) | |
| 317 EndTest(); | |
| 318 } | |
| 319 | |
| 320 void AfterTest() override {} | |
| 321 | |
| 322 int frame_; | |
| 323 bool did_post_commit_; | |
| 324 FakeContentLayerClient client_; | |
| 325 scoped_refptr<FakePictureLayer> picture_; | |
| 326 }; | |
| 327 | |
| 328 // Multi-thread only since there is no recycle tree in single thread. | |
| 329 MULTI_THREAD_IMPL_TEST_F( | |
| 330 LayerTreeHostPictureTestChangeLiveTilesRectWithRecycleTree); | |
| 331 | |
| 332 class LayerTreeHostPictureTestRSLLMembership : public LayerTreeHostPictureTest { | |
| 333 void SetupTree() override { | |
| 334 scoped_refptr<Layer> root = Layer::Create(); | |
| 335 root->SetBounds(gfx::Size(100, 100)); | |
| 336 | |
| 337 child_ = Layer::Create(); | |
| 338 root->AddChild(child_); | |
| 339 | |
| 340 // Don't be solid color so the layer has tilings/tiles. | |
| 341 client_.set_fill_with_nonsolid_color(true); | |
| 342 picture_ = FakePictureLayer::Create(&client_); | |
| 343 picture_->SetBounds(gfx::Size(100, 100)); | |
| 344 child_->AddChild(picture_); | |
| 345 | |
| 346 layer_tree_host()->SetRootLayer(root); | |
| 347 LayerTreeHostPictureTest::SetupTree(); | |
| 348 } | |
| 349 | |
| 350 void BeginTest() override { PostSetNeedsCommitToMainThread(); } | |
| 351 | |
| 352 void CommitCompleteOnThread(LayerTreeHostImpl* impl) override { | |
| 353 LayerImpl* root = impl->sync_tree()->root_layer(); | |
| 354 LayerImpl* child = root->children()[0]; | |
| 355 LayerImpl* gchild = child->children()[0]; | |
| 356 FakePictureLayerImpl* picture = static_cast<FakePictureLayerImpl*>(gchild); | |
| 357 | |
| 358 switch (impl->sync_tree()->source_frame_number()) { | |
| 359 case 0: | |
| 360 // On 1st commit the layer has tilings. | |
| 361 EXPECT_GT(picture->tilings()->num_tilings(), 0u); | |
| 362 break; | |
| 363 case 1: | |
| 364 // On 2nd commit, the layer is transparent, but its tilings are left | |
| 365 // there. | |
| 366 EXPECT_GT(picture->tilings()->num_tilings(), 0u); | |
| 367 break; | |
| 368 case 2: | |
| 369 // On 3rd commit, the layer is visible again, so has tilings. | |
| 370 EXPECT_GT(picture->tilings()->num_tilings(), 0u); | |
| 371 } | |
| 372 } | |
| 373 | |
| 374 void DidActivateTreeOnThread(LayerTreeHostImpl* impl) override { | |
| 375 LayerImpl* root = impl->active_tree()->root_layer(); | |
| 376 LayerImpl* child = root->children()[0]; | |
| 377 LayerImpl* gchild = child->children()[0]; | |
| 378 FakePictureLayerImpl* picture = static_cast<FakePictureLayerImpl*>(gchild); | |
| 379 | |
| 380 switch (impl->active_tree()->source_frame_number()) { | |
| 381 case 0: | |
| 382 // On 1st commit the layer has tilings. | |
| 383 EXPECT_GT(picture->tilings()->num_tilings(), 0u); | |
| 384 break; | |
| 385 case 1: | |
| 386 // On 2nd commit, the layer is transparent, but its tilings are left | |
| 387 // there. | |
| 388 EXPECT_GT(picture->tilings()->num_tilings(), 0u); | |
| 389 break; | |
| 390 case 2: | |
| 391 // On 3rd commit, the layer is visible again, so has tilings. | |
| 392 EXPECT_GT(picture->tilings()->num_tilings(), 0u); | |
| 393 EndTest(); | |
| 394 } | |
| 395 } | |
| 396 | |
| 397 void DidCommit() override { | |
| 398 switch (layer_tree_host()->source_frame_number()) { | |
| 399 case 1: | |
| 400 // For the 2nd commit, change opacity to 0 so that the layer will not be | |
| 401 // part of the visible frame. | |
| 402 child_->SetOpacity(0.f); | |
| 403 break; | |
| 404 case 2: | |
| 405 // For the 3rd commit, change opacity to 1 so that the layer will again | |
| 406 // be part of the visible frame. | |
| 407 child_->SetOpacity(1.f); | |
| 408 } | |
| 409 } | |
| 410 | |
| 411 void AfterTest() override {} | |
| 412 | |
| 413 FakeContentLayerClient client_; | |
| 414 scoped_refptr<Layer> child_; | |
| 415 scoped_refptr<FakePictureLayer> picture_; | |
| 416 }; | |
| 417 | |
| 418 SINGLE_AND_MULTI_THREAD_IMPL_TEST_F(LayerTreeHostPictureTestRSLLMembership); | |
| 419 | |
| 420 class LayerTreeHostPictureTestRSLLMembershipWithScale | |
| 421 : public LayerTreeHostPictureTest { | |
| 422 void SetupTree() override { | |
| 423 scoped_refptr<Layer> root = Layer::Create(); | |
| 424 root->SetBounds(gfx::Size(100, 100)); | |
| 425 | |
| 426 pinch_ = Layer::Create(); | |
| 427 pinch_->SetBounds(gfx::Size(500, 500)); | |
| 428 pinch_->SetScrollClipLayerId(root->id()); | |
| 429 pinch_->SetIsContainerForFixedPositionLayers(true); | |
| 430 root->AddChild(pinch_); | |
| 431 | |
| 432 // Don't be solid color so the layer has tilings/tiles. | |
| 433 client_.set_fill_with_nonsolid_color(true); | |
| 434 picture_ = FakePictureLayer::Create(&client_); | |
| 435 picture_->SetBounds(gfx::Size(100, 100)); | |
| 436 pinch_->AddChild(picture_); | |
| 437 | |
| 438 layer_tree_host()->RegisterViewportLayers(NULL, root, pinch_, pinch_); | |
| 439 layer_tree_host()->SetPageScaleFactorAndLimits(1.f, 1.f, 4.f); | |
| 440 layer_tree_host()->SetRootLayer(root); | |
| 441 LayerTreeHostPictureTest::SetupTree(); | |
| 442 } | |
| 443 | |
| 444 void InitializeSettings(LayerTreeSettings* settings) override { | |
| 445 settings->layer_transforms_should_scale_layer_contents = true; | |
| 446 } | |
| 447 | |
| 448 void BeginTest() override { | |
| 449 frame_ = 0; | |
| 450 draws_in_frame_ = 0; | |
| 451 last_frame_drawn_ = -1; | |
| 452 PostSetNeedsCommitToMainThread(); | |
| 453 } | |
| 454 | |
| 455 void WillActivateTreeOnThread(LayerTreeHostImpl* impl) override { | |
| 456 LayerImpl* root = impl->sync_tree()->root_layer(); | |
| 457 LayerImpl* pinch = root->children()[0]; | |
| 458 LayerImpl* gchild = pinch->children()[0]; | |
| 459 FakePictureLayerImpl* picture = static_cast<FakePictureLayerImpl*>(gchild); | |
| 460 | |
| 461 switch (frame_) { | |
| 462 case 0: | |
| 463 // On 1st commit the layer has tilings. | |
| 464 EXPECT_GT(picture->tilings()->num_tilings(), 0u); | |
| 465 break; | |
| 466 case 1: | |
| 467 // On 2nd commit, the layer is transparent, so does not have tilings. | |
| 468 EXPECT_EQ(0u, picture->tilings()->num_tilings()); | |
| 469 break; | |
| 470 case 2: | |
| 471 // On 3rd commit, the layer is visible again, so has tilings. | |
| 472 EXPECT_GT(picture->tilings()->num_tilings(), 0u); | |
| 473 } | |
| 474 } | |
| 475 | |
| 476 void DrawLayersOnThread(LayerTreeHostImpl* impl) override { | |
| 477 LayerImpl* root = impl->active_tree()->root_layer(); | |
| 478 LayerImpl* pinch = root->children()[0]; | |
| 479 LayerImpl* gchild = pinch->children()[0]; | |
| 480 FakePictureLayerImpl* picture = static_cast<FakePictureLayerImpl*>(gchild); | |
| 481 | |
| 482 if (frame_ != last_frame_drawn_) | |
| 483 draws_in_frame_ = 0; | |
| 484 ++draws_in_frame_; | |
| 485 last_frame_drawn_ = frame_; | |
| 486 | |
| 487 switch (frame_) { | |
| 488 case 0: | |
| 489 if (draws_in_frame_ == 1) { | |
| 490 // On 1st commit the layer has tilings. | |
| 491 EXPECT_GT(picture->tilings()->num_tilings(), 0u); | |
| 492 EXPECT_EQ(1.f, picture->HighResTiling()->contents_scale()); | |
| 493 | |
| 494 // Pinch zoom in to change the scale on the active tree. | |
| 495 impl->PinchGestureBegin(); | |
| 496 impl->PinchGestureUpdate(2.f, gfx::Point(1, 1)); | |
| 497 impl->PinchGestureEnd(); | |
| 498 } else if (picture->tilings()->num_tilings() == 1) { | |
| 499 // If the pinch gesture caused a commit we could get here with a | |
| 500 // pending tree. | |
| 501 EXPECT_FALSE(impl->pending_tree()); | |
| 502 // The active layer now has only a 2.f scale tiling, which means the | |
| 503 // recycled layer's tiling is destroyed. | |
| 504 EXPECT_EQ(2.f, picture->HighResTiling()->contents_scale()); | |
| 505 EXPECT_EQ(0u, picture->GetRecycledTwinLayer() | |
| 506 ->picture_layer_tiling_set() | |
| 507 ->num_tilings()); | |
| 508 | |
| 509 ++frame_; | |
| 510 MainThreadTaskRunner()->PostTask( | |
| 511 FROM_HERE, | |
| 512 base::Bind( | |
| 513 &LayerTreeHostPictureTestRSLLMembershipWithScale::NextStep, | |
| 514 base::Unretained(this))); | |
| 515 } | |
| 516 break; | |
| 517 case 1: | |
| 518 EXPECT_EQ(1, draws_in_frame_); | |
| 519 // On 2nd commit, the layer is transparent, so does not create | |
| 520 // tilings. Since the 1.f tiling was destroyed in the recycle tree, it | |
| 521 // has no tilings left. This is propogated to the active tree. | |
| 522 EXPECT_EQ(0u, picture->picture_layer_tiling_set()->num_tilings()); | |
| 523 EXPECT_EQ(0u, picture->GetRecycledTwinLayer() | |
| 524 ->picture_layer_tiling_set() | |
| 525 ->num_tilings()); | |
| 526 ++frame_; | |
| 527 MainThreadTaskRunner()->PostTask( | |
| 528 FROM_HERE, | |
| 529 base::Bind( | |
| 530 &LayerTreeHostPictureTestRSLLMembershipWithScale::NextStep, | |
| 531 base::Unretained(this))); | |
| 532 break; | |
| 533 case 2: | |
| 534 EXPECT_EQ(1, draws_in_frame_); | |
| 535 // On 3rd commit, the layer is visible again, so has tilings. | |
| 536 EXPECT_GT(picture->tilings()->num_tilings(), 0u); | |
| 537 EndTest(); | |
| 538 } | |
| 539 } | |
| 540 | |
| 541 void NextStep() { | |
| 542 switch (frame_) { | |
| 543 case 1: | |
| 544 // For the 2nd commit, change opacity to 0 so that the layer will not be | |
| 545 // part of the visible frame. | |
| 546 pinch_->SetOpacity(0.f); | |
| 547 break; | |
| 548 case 2: | |
| 549 // For the 3rd commit, change opacity to 1 so that the layer will again | |
| 550 // be part of the visible frame. | |
| 551 pinch_->SetOpacity(1.f); | |
| 552 break; | |
| 553 } | |
| 554 } | |
| 555 | |
| 556 void AfterTest() override {} | |
| 557 | |
| 558 FakeContentLayerClient client_; | |
| 559 scoped_refptr<Layer> pinch_; | |
| 560 scoped_refptr<FakePictureLayer> picture_; | |
| 561 int frame_; | |
| 562 int draws_in_frame_; | |
| 563 int last_frame_drawn_; | |
| 564 }; | |
| 565 | |
| 566 // Multi-thread only because in single thread you can't pinch zoom on the | |
| 567 // compositor thread. | |
| 568 // Disabled due to flakiness. See http://crbug.com/460581 | |
| 569 // MULTI_THREAD_IMPL_TEST_F(LayerTreeHostPictureTestRSLLMembershipWithScale); | |
| 570 | |
| 571 } // namespace | |
| 572 } // namespace cc | |
| OLD | NEW |