| OLD | NEW |
| 1 // Copyright 2011 The Chromium Authors. All rights reserved. | 1 // Copyright 2011 The Chromium Authors. All rights reserved. |
| 2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
| 4 | 4 |
| 5 #include "cc/layers/tiled_layer.h" | 5 #include "cc/layers/tiled_layer.h" |
| 6 | 6 |
| 7 #include <limits> | 7 #include <limits> |
| 8 #include <vector> | 8 #include <vector> |
| 9 | 9 |
| 10 #include "base/run_loop.h" | 10 #include "base/run_loop.h" |
| 11 #include "cc/debug/overdraw_metrics.h" | |
| 12 #include "cc/resources/bitmap_content_layer_updater.h" | 11 #include "cc/resources/bitmap_content_layer_updater.h" |
| 13 #include "cc/resources/layer_painter.h" | 12 #include "cc/resources/layer_painter.h" |
| 14 #include "cc/resources/prioritized_resource_manager.h" | 13 #include "cc/resources/prioritized_resource_manager.h" |
| 15 #include "cc/resources/resource_update_controller.h" | 14 #include "cc/resources/resource_update_controller.h" |
| 16 #include "cc/test/animation_test_common.h" | 15 #include "cc/test/animation_test_common.h" |
| 17 #include "cc/test/fake_layer_tree_host_client.h" | 16 #include "cc/test/fake_layer_tree_host_client.h" |
| 18 #include "cc/test/fake_layer_tree_host_impl.h" | 17 #include "cc/test/fake_layer_tree_host_impl.h" |
| 19 #include "cc/test/fake_output_surface.h" | 18 #include "cc/test/fake_output_surface.h" |
| 20 #include "cc/test/fake_output_surface_client.h" | 19 #include "cc/test/fake_output_surface_client.h" |
| 21 #include "cc/test/fake_proxy.h" | 20 #include "cc/test/fake_proxy.h" |
| 22 #include "cc/test/fake_rendering_stats_instrumentation.h" | 21 #include "cc/test/fake_rendering_stats_instrumentation.h" |
| 23 #include "cc/test/geometry_test_utils.h" | 22 #include "cc/test/geometry_test_utils.h" |
| 24 #include "cc/test/tiled_layer_test_common.h" | 23 #include "cc/test/tiled_layer_test_common.h" |
| 25 #include "cc/trees/occlusion_tracker.h" | 24 #include "cc/trees/occlusion_tracker.h" |
| 26 #include "cc/trees/single_thread_proxy.h" | 25 #include "cc/trees/single_thread_proxy.h" |
| 27 #include "testing/gtest/include/gtest/gtest.h" | 26 #include "testing/gtest/include/gtest/gtest.h" |
| 28 #include "ui/gfx/rect_conversions.h" | 27 #include "ui/gfx/rect_conversions.h" |
| 29 #include "ui/gfx/transform.h" | 28 #include "ui/gfx/transform.h" |
| 30 | 29 |
| 31 namespace cc { | 30 namespace cc { |
| 32 namespace { | 31 namespace { |
| 33 | 32 |
| 34 class TestOcclusionTracker : public OcclusionTracker<Layer> { | 33 class TestOcclusionTracker : public OcclusionTracker<Layer> { |
| 35 public: | 34 public: |
| 36 TestOcclusionTracker() : OcclusionTracker(gfx::Rect(0, 0, 1000, 1000), true) { | 35 TestOcclusionTracker() : OcclusionTracker(gfx::Rect(0, 0, 1000, 1000)) { |
| 37 stack_.push_back(StackObject()); | 36 stack_.push_back(StackObject()); |
| 38 } | 37 } |
| 39 | 38 |
| 40 void SetRenderTarget(Layer* render_target) { | 39 void SetRenderTarget(Layer* render_target) { |
| 41 stack_.back().target = render_target; | 40 stack_.back().target = render_target; |
| 42 } | 41 } |
| 43 | 42 |
| 44 void SetOcclusion(const Region& occlusion) { | 43 void SetOcclusion(const Region& occlusion) { |
| 45 stack_.back().occlusion_from_inside_target = occlusion; | 44 stack_.back().occlusion_from_inside_target = occlusion; |
| 46 } | 45 } |
| (...skipping 247 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 294 layer_tree_host_->root_layer()->AddChild(layer); | 293 layer_tree_host_->root_layer()->AddChild(layer); |
| 295 | 294 |
| 296 { | 295 { |
| 297 RenderSurfaceLayerList render_surface_layer_list; | 296 RenderSurfaceLayerList render_surface_layer_list; |
| 298 | 297 |
| 299 // The tile size is 100x100, so this invalidates and then paints two tiles. | 298 // The tile size is 100x100, so this invalidates and then paints two tiles. |
| 300 layer->SetBounds(gfx::Size(100, 200)); | 299 layer->SetBounds(gfx::Size(100, 200)); |
| 301 CalcDrawProps(&render_surface_layer_list); | 300 CalcDrawProps(&render_surface_layer_list); |
| 302 UpdateAndPush(layer, layer_impl); | 301 UpdateAndPush(layer, layer_impl); |
| 303 | 302 |
| 304 EXPECT_NEAR(occluded.overdraw_metrics()->pixels_uploaded_opaque(), 0, 1); | |
| 305 EXPECT_NEAR( | |
| 306 occluded.overdraw_metrics()->pixels_uploaded_translucent(), 20000, 1); | |
| 307 EXPECT_EQ(0, occluded.overdraw_metrics()->tiles_culled_for_upload()); | |
| 308 | |
| 309 // We should have both tiles on the impl side. | 303 // We should have both tiles on the impl side. |
| 310 EXPECT_TRUE(layer_impl->HasResourceIdForTileAt(0, 0)); | 304 EXPECT_TRUE(layer_impl->HasResourceIdForTileAt(0, 0)); |
| 311 EXPECT_TRUE(layer_impl->HasResourceIdForTileAt(0, 1)); | 305 EXPECT_TRUE(layer_impl->HasResourceIdForTileAt(0, 1)); |
| 312 } | 306 } |
| 313 | 307 |
| 314 { | 308 { |
| 315 RenderSurfaceLayerList render_surface_layer_list; | 309 RenderSurfaceLayerList render_surface_layer_list; |
| 316 | 310 |
| 317 // Invalidates part of the top tile... | 311 // Invalidates part of the top tile... |
| 318 layer->InvalidateContentRect(gfx::Rect(0, 0, 50, 50)); | 312 layer->InvalidateContentRect(gfx::Rect(0, 0, 50, 50)); |
| 319 // ....but the area is occluded. | 313 // ....but the area is occluded. |
| 320 occluded.SetOcclusion(gfx::Rect(0, 0, 50, 50)); | 314 occluded.SetOcclusion(gfx::Rect(0, 0, 50, 50)); |
| 321 CalcDrawProps(&render_surface_layer_list); | 315 CalcDrawProps(&render_surface_layer_list); |
| 322 UpdateAndPush(layer, layer_impl); | 316 UpdateAndPush(layer, layer_impl); |
| 323 | 317 |
| 324 EXPECT_NEAR(occluded.overdraw_metrics()->pixels_uploaded_opaque(), 0, 1); | |
| 325 EXPECT_NEAR(occluded.overdraw_metrics()->pixels_uploaded_translucent(), | |
| 326 20000 + 2500, | |
| 327 1); | |
| 328 EXPECT_EQ(0, occluded.overdraw_metrics()->tiles_culled_for_upload()); | |
| 329 | |
| 330 // We should still have both tiles, as part of the top tile is still | 318 // We should still have both tiles, as part of the top tile is still |
| 331 // unoccluded. | 319 // unoccluded. |
| 332 EXPECT_TRUE(layer_impl->HasResourceIdForTileAt(0, 0)); | 320 EXPECT_TRUE(layer_impl->HasResourceIdForTileAt(0, 0)); |
| 333 EXPECT_TRUE(layer_impl->HasResourceIdForTileAt(0, 1)); | 321 EXPECT_TRUE(layer_impl->HasResourceIdForTileAt(0, 1)); |
| 334 } | 322 } |
| 335 } | 323 } |
| 336 | 324 |
| 337 TEST_F(TiledLayerTest, PushDeletedTiles) { | 325 TEST_F(TiledLayerTest, PushDeletedTiles) { |
| 338 scoped_refptr<FakeTiledLayer> layer = | 326 scoped_refptr<FakeTiledLayer> layer = |
| 339 make_scoped_refptr(new FakeTiledLayer(resource_manager_.get())); | 327 make_scoped_refptr(new FakeTiledLayer(resource_manager_.get())); |
| (...skipping 226 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 566 | 554 |
| 567 // The tile size is 100x100, so this invalidates one occluded tile, culls it | 555 // The tile size is 100x100, so this invalidates one occluded tile, culls it |
| 568 // during paint, but prepaints it. | 556 // during paint, but prepaints it. |
| 569 occluded.SetOcclusion(gfx::Rect(0, 0, 100, 100)); | 557 occluded.SetOcclusion(gfx::Rect(0, 0, 100, 100)); |
| 570 | 558 |
| 571 layer->SetBounds(gfx::Size(100, 100)); | 559 layer->SetBounds(gfx::Size(100, 100)); |
| 572 CalcDrawProps(&render_surface_layer_list); | 560 CalcDrawProps(&render_surface_layer_list); |
| 573 layer->draw_properties().visible_content_rect = gfx::Rect(0, 0, 100, 100); | 561 layer->draw_properties().visible_content_rect = gfx::Rect(0, 0, 100, 100); |
| 574 UpdateAndPush(layer, layer_impl); | 562 UpdateAndPush(layer, layer_impl); |
| 575 | 563 |
| 576 // We should have the prepainted tile on the impl side, but culled it during | |
| 577 // paint. | |
| 578 EXPECT_TRUE(layer_impl->HasResourceIdForTileAt(0, 0)); | 564 EXPECT_TRUE(layer_impl->HasResourceIdForTileAt(0, 0)); |
| 579 EXPECT_EQ(1, occluded.overdraw_metrics()->tiles_culled_for_upload()); | |
| 580 } | 565 } |
| 581 | 566 |
| 582 TEST_F(TiledLayerTest, PushTilesMarkedDirtyDuringPaint) { | 567 TEST_F(TiledLayerTest, PushTilesMarkedDirtyDuringPaint) { |
| 583 scoped_refptr<FakeTiledLayer> layer = | 568 scoped_refptr<FakeTiledLayer> layer = |
| 584 make_scoped_refptr(new FakeTiledLayer(resource_manager_.get())); | 569 make_scoped_refptr(new FakeTiledLayer(resource_manager_.get())); |
| 585 scoped_ptr<FakeTiledLayerImpl> layer_impl = | 570 scoped_ptr<FakeTiledLayerImpl> layer_impl = |
| 586 make_scoped_ptr(new FakeTiledLayerImpl(host_impl_->active_tree(), 1)); | 571 make_scoped_ptr(new FakeTiledLayerImpl(host_impl_->active_tree(), 1)); |
| 587 RenderSurfaceLayerList render_surface_layer_list; | 572 RenderSurfaceLayerList render_surface_layer_list; |
| 588 | 573 |
| 589 layer_tree_host_->root_layer()->AddChild(layer); | 574 layer_tree_host_->root_layer()->AddChild(layer); |
| (...skipping 631 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1221 layer->draw_properties().visible_content_rect = | 1206 layer->draw_properties().visible_content_rect = |
| 1222 gfx::Rect(layer->content_bounds()); | 1207 gfx::Rect(layer->content_bounds()); |
| 1223 layer->InvalidateContentRect(gfx::Rect(0, 0, 600, 600)); | 1208 layer->InvalidateContentRect(gfx::Rect(0, 0, 600, 600)); |
| 1224 | 1209 |
| 1225 layer->SetTexturePriorities(priority_calculator_); | 1210 layer->SetTexturePriorities(priority_calculator_); |
| 1226 resource_manager_->PrioritizeTextures(); | 1211 resource_manager_->PrioritizeTextures(); |
| 1227 layer->SavePaintProperties(); | 1212 layer->SavePaintProperties(); |
| 1228 layer->Update(queue_.get(), &occluded); | 1213 layer->Update(queue_.get(), &occluded); |
| 1229 EXPECT_EQ(36 - 3, layer->fake_layer_updater()->update_count()); | 1214 EXPECT_EQ(36 - 3, layer->fake_layer_updater()->update_count()); |
| 1230 | 1215 |
| 1231 EXPECT_NEAR(occluded.overdraw_metrics()->pixels_uploaded_opaque(), 0, 1); | |
| 1232 EXPECT_NEAR( | |
| 1233 occluded.overdraw_metrics()->pixels_uploaded_translucent(), 330000, 1); | |
| 1234 EXPECT_EQ(3, occluded.overdraw_metrics()->tiles_culled_for_upload()); | |
| 1235 | |
| 1236 layer->fake_layer_updater()->ClearUpdateCount(); | 1216 layer->fake_layer_updater()->ClearUpdateCount(); |
| 1237 layer->SetTexturePriorities(priority_calculator_); | 1217 layer->SetTexturePriorities(priority_calculator_); |
| 1238 resource_manager_->PrioritizeTextures(); | 1218 resource_manager_->PrioritizeTextures(); |
| 1239 | 1219 |
| 1240 occluded.SetOcclusion(gfx::Rect(250, 200, 300, 100)); | 1220 occluded.SetOcclusion(gfx::Rect(250, 200, 300, 100)); |
| 1241 layer->InvalidateContentRect(gfx::Rect(0, 0, 600, 600)); | 1221 layer->InvalidateContentRect(gfx::Rect(0, 0, 600, 600)); |
| 1242 layer->SavePaintProperties(); | 1222 layer->SavePaintProperties(); |
| 1243 layer->Update(queue_.get(), &occluded); | 1223 layer->Update(queue_.get(), &occluded); |
| 1244 EXPECT_EQ(36 - 2, layer->fake_layer_updater()->update_count()); | 1224 EXPECT_EQ(36 - 2, layer->fake_layer_updater()->update_count()); |
| 1245 | 1225 |
| 1246 EXPECT_NEAR(occluded.overdraw_metrics()->pixels_uploaded_opaque(), 0, 1); | |
| 1247 EXPECT_NEAR(occluded.overdraw_metrics()->pixels_uploaded_translucent(), | |
| 1248 330000 + 340000, | |
| 1249 1); | |
| 1250 EXPECT_EQ(3 + 2, occluded.overdraw_metrics()->tiles_culled_for_upload()); | |
| 1251 | |
| 1252 layer->fake_layer_updater()->ClearUpdateCount(); | 1226 layer->fake_layer_updater()->ClearUpdateCount(); |
| 1253 layer->SetTexturePriorities(priority_calculator_); | 1227 layer->SetTexturePriorities(priority_calculator_); |
| 1254 resource_manager_->PrioritizeTextures(); | 1228 resource_manager_->PrioritizeTextures(); |
| 1255 | 1229 |
| 1256 occluded.SetOcclusion(gfx::Rect(250, 250, 300, 100)); | 1230 occluded.SetOcclusion(gfx::Rect(250, 250, 300, 100)); |
| 1257 layer->InvalidateContentRect(gfx::Rect(0, 0, 600, 600)); | 1231 layer->InvalidateContentRect(gfx::Rect(0, 0, 600, 600)); |
| 1258 layer->SavePaintProperties(); | 1232 layer->SavePaintProperties(); |
| 1259 layer->Update(queue_.get(), &occluded); | 1233 layer->Update(queue_.get(), &occluded); |
| 1260 EXPECT_EQ(36, layer->fake_layer_updater()->update_count()); | 1234 EXPECT_EQ(36, layer->fake_layer_updater()->update_count()); |
| 1261 | |
| 1262 EXPECT_NEAR(occluded.overdraw_metrics()->pixels_uploaded_opaque(), 0, 1); | |
| 1263 EXPECT_NEAR(occluded.overdraw_metrics()->pixels_uploaded_translucent(), | |
| 1264 330000 + 340000 + 360000, | |
| 1265 1); | |
| 1266 EXPECT_EQ(3 + 2, occluded.overdraw_metrics()->tiles_culled_for_upload()); | |
| 1267 } | 1235 } |
| 1268 | 1236 |
| 1269 TEST_F(TiledLayerTest, TilesPaintedWithOcclusionAndVisiblityConstraints) { | 1237 TEST_F(TiledLayerTest, TilesPaintedWithOcclusionAndVisiblityConstraints) { |
| 1270 scoped_refptr<FakeTiledLayer> layer = | 1238 scoped_refptr<FakeTiledLayer> layer = |
| 1271 make_scoped_refptr(new FakeTiledLayer(resource_manager_.get())); | 1239 make_scoped_refptr(new FakeTiledLayer(resource_manager_.get())); |
| 1272 RenderSurfaceLayerList render_surface_layer_list; | 1240 RenderSurfaceLayerList render_surface_layer_list; |
| 1273 TestOcclusionTracker occluded; | 1241 TestOcclusionTracker occluded; |
| 1274 occlusion_ = &occluded; | 1242 occlusion_ = &occluded; |
| 1275 | 1243 |
| 1276 layer_tree_host_->root_layer()->AddChild(layer); | 1244 layer_tree_host_->root_layer()->AddChild(layer); |
| (...skipping 10 matching lines...) Expand all Loading... |
| 1287 layer->draw_properties().drawable_content_rect = gfx::Rect(0, 0, 600, 360); | 1255 layer->draw_properties().drawable_content_rect = gfx::Rect(0, 0, 600, 360); |
| 1288 layer->draw_properties().visible_content_rect = gfx::Rect(0, 0, 600, 360); | 1256 layer->draw_properties().visible_content_rect = gfx::Rect(0, 0, 600, 360); |
| 1289 layer->InvalidateContentRect(gfx::Rect(0, 0, 600, 600)); | 1257 layer->InvalidateContentRect(gfx::Rect(0, 0, 600, 600)); |
| 1290 | 1258 |
| 1291 layer->SetTexturePriorities(priority_calculator_); | 1259 layer->SetTexturePriorities(priority_calculator_); |
| 1292 resource_manager_->PrioritizeTextures(); | 1260 resource_manager_->PrioritizeTextures(); |
| 1293 layer->SavePaintProperties(); | 1261 layer->SavePaintProperties(); |
| 1294 layer->Update(queue_.get(), &occluded); | 1262 layer->Update(queue_.get(), &occluded); |
| 1295 EXPECT_EQ(24 - 3, layer->fake_layer_updater()->update_count()); | 1263 EXPECT_EQ(24 - 3, layer->fake_layer_updater()->update_count()); |
| 1296 | 1264 |
| 1297 EXPECT_NEAR(occluded.overdraw_metrics()->pixels_uploaded_opaque(), 0, 1); | |
| 1298 EXPECT_NEAR( | |
| 1299 occluded.overdraw_metrics()->pixels_uploaded_translucent(), 210000, 1); | |
| 1300 EXPECT_EQ(3, occluded.overdraw_metrics()->tiles_culled_for_upload()); | |
| 1301 | |
| 1302 layer->fake_layer_updater()->ClearUpdateCount(); | 1265 layer->fake_layer_updater()->ClearUpdateCount(); |
| 1303 | 1266 |
| 1304 // Now the visible region stops at the edge of the occlusion so the partly | 1267 // Now the visible region stops at the edge of the occlusion so the partly |
| 1305 // visible tiles become fully occluded. | 1268 // visible tiles become fully occluded. |
| 1306 occluded.SetOcclusion(gfx::Rect(200, 200, 300, 150)); | 1269 occluded.SetOcclusion(gfx::Rect(200, 200, 300, 150)); |
| 1307 layer->draw_properties().drawable_content_rect = gfx::Rect(0, 0, 600, 350); | 1270 layer->draw_properties().drawable_content_rect = gfx::Rect(0, 0, 600, 350); |
| 1308 layer->draw_properties().visible_content_rect = gfx::Rect(0, 0, 600, 350); | 1271 layer->draw_properties().visible_content_rect = gfx::Rect(0, 0, 600, 350); |
| 1309 layer->InvalidateContentRect(gfx::Rect(0, 0, 600, 600)); | 1272 layer->InvalidateContentRect(gfx::Rect(0, 0, 600, 600)); |
| 1310 layer->SetTexturePriorities(priority_calculator_); | 1273 layer->SetTexturePriorities(priority_calculator_); |
| 1311 resource_manager_->PrioritizeTextures(); | 1274 resource_manager_->PrioritizeTextures(); |
| 1312 layer->SavePaintProperties(); | 1275 layer->SavePaintProperties(); |
| 1313 layer->Update(queue_.get(), &occluded); | 1276 layer->Update(queue_.get(), &occluded); |
| 1314 EXPECT_EQ(24 - 6, layer->fake_layer_updater()->update_count()); | 1277 EXPECT_EQ(24 - 6, layer->fake_layer_updater()->update_count()); |
| 1315 | 1278 |
| 1316 EXPECT_NEAR(occluded.overdraw_metrics()->pixels_uploaded_opaque(), 0, 1); | |
| 1317 EXPECT_NEAR(occluded.overdraw_metrics()->pixels_uploaded_translucent(), | |
| 1318 210000 + 180000, | |
| 1319 1); | |
| 1320 EXPECT_EQ(3 + 6, occluded.overdraw_metrics()->tiles_culled_for_upload()); | |
| 1321 | |
| 1322 layer->fake_layer_updater()->ClearUpdateCount(); | 1279 layer->fake_layer_updater()->ClearUpdateCount(); |
| 1323 | 1280 |
| 1324 // Now the visible region is even smaller than the occlusion, it should have | 1281 // Now the visible region is even smaller than the occlusion, it should have |
| 1325 // the same result. | 1282 // the same result. |
| 1326 occluded.SetOcclusion(gfx::Rect(200, 200, 300, 150)); | 1283 occluded.SetOcclusion(gfx::Rect(200, 200, 300, 150)); |
| 1327 layer->draw_properties().drawable_content_rect = gfx::Rect(0, 0, 600, 340); | 1284 layer->draw_properties().drawable_content_rect = gfx::Rect(0, 0, 600, 340); |
| 1328 layer->draw_properties().visible_content_rect = gfx::Rect(0, 0, 600, 340); | 1285 layer->draw_properties().visible_content_rect = gfx::Rect(0, 0, 600, 340); |
| 1329 layer->InvalidateContentRect(gfx::Rect(0, 0, 600, 600)); | 1286 layer->InvalidateContentRect(gfx::Rect(0, 0, 600, 600)); |
| 1330 layer->SetTexturePriorities(priority_calculator_); | 1287 layer->SetTexturePriorities(priority_calculator_); |
| 1331 resource_manager_->PrioritizeTextures(); | 1288 resource_manager_->PrioritizeTextures(); |
| 1332 layer->SavePaintProperties(); | 1289 layer->SavePaintProperties(); |
| 1333 layer->Update(queue_.get(), &occluded); | 1290 layer->Update(queue_.get(), &occluded); |
| 1334 EXPECT_EQ(24 - 6, layer->fake_layer_updater()->update_count()); | 1291 EXPECT_EQ(24 - 6, layer->fake_layer_updater()->update_count()); |
| 1335 | |
| 1336 EXPECT_NEAR(occluded.overdraw_metrics()->pixels_uploaded_opaque(), 0, 1); | |
| 1337 EXPECT_NEAR(occluded.overdraw_metrics()->pixels_uploaded_translucent(), | |
| 1338 210000 + 180000 + 180000, | |
| 1339 1); | |
| 1340 EXPECT_EQ(3 + 6 + 6, occluded.overdraw_metrics()->tiles_culled_for_upload()); | |
| 1341 } | 1292 } |
| 1342 | 1293 |
| 1343 TEST_F(TiledLayerTest, TilesNotPaintedWithoutInvalidation) { | 1294 TEST_F(TiledLayerTest, TilesNotPaintedWithoutInvalidation) { |
| 1344 scoped_refptr<FakeTiledLayer> layer = | 1295 scoped_refptr<FakeTiledLayer> layer = |
| 1345 make_scoped_refptr(new FakeTiledLayer(resource_manager_.get())); | 1296 make_scoped_refptr(new FakeTiledLayer(resource_manager_.get())); |
| 1346 RenderSurfaceLayerList render_surface_layer_list; | 1297 RenderSurfaceLayerList render_surface_layer_list; |
| 1347 TestOcclusionTracker occluded; | 1298 TestOcclusionTracker occluded; |
| 1348 occlusion_ = &occluded; | 1299 occlusion_ = &occluded; |
| 1349 | 1300 |
| 1350 layer_tree_host_->root_layer()->AddChild(layer); | 1301 layer_tree_host_->root_layer()->AddChild(layer); |
| 1351 | 1302 |
| 1352 // The tile size is 100x100. | 1303 // The tile size is 100x100. |
| 1353 | 1304 |
| 1354 layer_tree_host_->SetViewportSize(gfx::Size(600, 600)); | 1305 layer_tree_host_->SetViewportSize(gfx::Size(600, 600)); |
| 1355 layer->SetBounds(gfx::Size(600, 600)); | 1306 layer->SetBounds(gfx::Size(600, 600)); |
| 1356 CalcDrawProps(&render_surface_layer_list); | 1307 CalcDrawProps(&render_surface_layer_list); |
| 1357 | 1308 |
| 1358 occluded.SetOcclusion(gfx::Rect(200, 200, 300, 100)); | 1309 occluded.SetOcclusion(gfx::Rect(200, 200, 300, 100)); |
| 1359 layer->draw_properties().drawable_content_rect = gfx::Rect(0, 0, 600, 600); | 1310 layer->draw_properties().drawable_content_rect = gfx::Rect(0, 0, 600, 600); |
| 1360 layer->draw_properties().visible_content_rect = gfx::Rect(0, 0, 600, 600); | 1311 layer->draw_properties().visible_content_rect = gfx::Rect(0, 0, 600, 600); |
| 1361 layer->InvalidateContentRect(gfx::Rect(0, 0, 600, 600)); | 1312 layer->InvalidateContentRect(gfx::Rect(0, 0, 600, 600)); |
| 1362 layer->SetTexturePriorities(priority_calculator_); | 1313 layer->SetTexturePriorities(priority_calculator_); |
| 1363 resource_manager_->PrioritizeTextures(); | 1314 resource_manager_->PrioritizeTextures(); |
| 1364 layer->SavePaintProperties(); | 1315 layer->SavePaintProperties(); |
| 1365 layer->Update(queue_.get(), &occluded); | 1316 layer->Update(queue_.get(), &occluded); |
| 1366 EXPECT_EQ(36 - 3, layer->fake_layer_updater()->update_count()); | 1317 EXPECT_EQ(36 - 3, layer->fake_layer_updater()->update_count()); |
| 1367 { UpdateTextures(); } | 1318 UpdateTextures(); |
| 1368 | |
| 1369 EXPECT_NEAR(occluded.overdraw_metrics()->pixels_uploaded_opaque(), 0, 1); | |
| 1370 EXPECT_NEAR( | |
| 1371 occluded.overdraw_metrics()->pixels_uploaded_translucent(), 330000, 1); | |
| 1372 EXPECT_EQ(3, occluded.overdraw_metrics()->tiles_culled_for_upload()); | |
| 1373 | 1319 |
| 1374 layer->fake_layer_updater()->ClearUpdateCount(); | 1320 layer->fake_layer_updater()->ClearUpdateCount(); |
| 1375 layer->SetTexturePriorities(priority_calculator_); | 1321 layer->SetTexturePriorities(priority_calculator_); |
| 1376 resource_manager_->PrioritizeTextures(); | 1322 resource_manager_->PrioritizeTextures(); |
| 1377 layer->SavePaintProperties(); | 1323 layer->SavePaintProperties(); |
| 1378 | 1324 |
| 1379 // Repaint without marking it dirty. The 3 culled tiles will be pre-painted | 1325 // Repaint without marking it dirty. The 3 culled tiles will be pre-painted |
| 1380 // now. | 1326 // now. |
| 1381 layer->Update(queue_.get(), &occluded); | 1327 layer->Update(queue_.get(), &occluded); |
| 1382 EXPECT_EQ(3, layer->fake_layer_updater()->update_count()); | 1328 EXPECT_EQ(3, layer->fake_layer_updater()->update_count()); |
| 1383 | |
| 1384 EXPECT_NEAR(occluded.overdraw_metrics()->pixels_uploaded_opaque(), 0, 1); | |
| 1385 EXPECT_NEAR( | |
| 1386 occluded.overdraw_metrics()->pixels_uploaded_translucent(), 330000, 1); | |
| 1387 EXPECT_EQ(6, occluded.overdraw_metrics()->tiles_culled_for_upload()); | |
| 1388 } | 1329 } |
| 1389 | 1330 |
| 1390 TEST_F(TiledLayerTest, TilesPaintedWithOcclusionAndTransforms) { | 1331 TEST_F(TiledLayerTest, TilesPaintedWithOcclusionAndTransforms) { |
| 1391 scoped_refptr<FakeTiledLayer> layer = | 1332 scoped_refptr<FakeTiledLayer> layer = |
| 1392 make_scoped_refptr(new FakeTiledLayer(resource_manager_.get())); | 1333 make_scoped_refptr(new FakeTiledLayer(resource_manager_.get())); |
| 1393 RenderSurfaceLayerList render_surface_layer_list; | 1334 RenderSurfaceLayerList render_surface_layer_list; |
| 1394 TestOcclusionTracker occluded; | 1335 TestOcclusionTracker occluded; |
| 1395 occlusion_ = &occluded; | 1336 occlusion_ = &occluded; |
| 1396 | 1337 |
| 1397 layer_tree_host_->root_layer()->AddChild(layer); | 1338 layer_tree_host_->root_layer()->AddChild(layer); |
| (...skipping 14 matching lines...) Expand all Loading... |
| 1412 layer->draw_properties().drawable_content_rect = | 1353 layer->draw_properties().drawable_content_rect = |
| 1413 gfx::Rect(layer->content_bounds()); | 1354 gfx::Rect(layer->content_bounds()); |
| 1414 layer->draw_properties().visible_content_rect = | 1355 layer->draw_properties().visible_content_rect = |
| 1415 gfx::Rect(layer->content_bounds()); | 1356 gfx::Rect(layer->content_bounds()); |
| 1416 layer->InvalidateContentRect(gfx::Rect(0, 0, 600, 600)); | 1357 layer->InvalidateContentRect(gfx::Rect(0, 0, 600, 600)); |
| 1417 layer->SetTexturePriorities(priority_calculator_); | 1358 layer->SetTexturePriorities(priority_calculator_); |
| 1418 resource_manager_->PrioritizeTextures(); | 1359 resource_manager_->PrioritizeTextures(); |
| 1419 layer->SavePaintProperties(); | 1360 layer->SavePaintProperties(); |
| 1420 layer->Update(queue_.get(), &occluded); | 1361 layer->Update(queue_.get(), &occluded); |
| 1421 EXPECT_EQ(36 - 3, layer->fake_layer_updater()->update_count()); | 1362 EXPECT_EQ(36 - 3, layer->fake_layer_updater()->update_count()); |
| 1422 | |
| 1423 EXPECT_NEAR(occluded.overdraw_metrics()->pixels_uploaded_opaque(), 0, 1); | |
| 1424 EXPECT_NEAR( | |
| 1425 occluded.overdraw_metrics()->pixels_uploaded_translucent(), 330000, 1); | |
| 1426 EXPECT_EQ(3, occluded.overdraw_metrics()->tiles_culled_for_upload()); | |
| 1427 } | 1363 } |
| 1428 | 1364 |
| 1429 TEST_F(TiledLayerTest, TilesPaintedWithOcclusionAndScaling) { | 1365 TEST_F(TiledLayerTest, TilesPaintedWithOcclusionAndScaling) { |
| 1430 scoped_refptr<FakeTiledLayer> layer = | 1366 scoped_refptr<FakeTiledLayer> layer = |
| 1431 new FakeTiledLayer(resource_manager_.get()); | 1367 new FakeTiledLayer(resource_manager_.get()); |
| 1432 RenderSurfaceLayerList render_surface_layer_list; | 1368 RenderSurfaceLayerList render_surface_layer_list; |
| 1433 TestOcclusionTracker occluded; | 1369 TestOcclusionTracker occluded; |
| 1434 occlusion_ = &occluded; | 1370 occlusion_ = &occluded; |
| 1435 | 1371 |
| 1436 scoped_refptr<FakeTiledLayer> scale_layer = | 1372 scoped_refptr<FakeTiledLayer> scale_layer = |
| (...skipping 25 matching lines...) Expand all Loading... |
| 1462 layer->draw_properties().visible_content_rect = | 1398 layer->draw_properties().visible_content_rect = |
| 1463 gfx::Rect(layer->content_bounds()); | 1399 gfx::Rect(layer->content_bounds()); |
| 1464 layer->InvalidateContentRect(gfx::Rect(0, 0, 600, 600)); | 1400 layer->InvalidateContentRect(gfx::Rect(0, 0, 600, 600)); |
| 1465 layer->SetTexturePriorities(priority_calculator_); | 1401 layer->SetTexturePriorities(priority_calculator_); |
| 1466 resource_manager_->PrioritizeTextures(); | 1402 resource_manager_->PrioritizeTextures(); |
| 1467 layer->SavePaintProperties(); | 1403 layer->SavePaintProperties(); |
| 1468 layer->Update(queue_.get(), &occluded); | 1404 layer->Update(queue_.get(), &occluded); |
| 1469 int visible_tiles1 = 6 * 6; | 1405 int visible_tiles1 = 6 * 6; |
| 1470 EXPECT_EQ(visible_tiles1, layer->fake_layer_updater()->update_count()); | 1406 EXPECT_EQ(visible_tiles1, layer->fake_layer_updater()->update_count()); |
| 1471 | 1407 |
| 1472 EXPECT_NEAR(occluded.overdraw_metrics()->pixels_uploaded_opaque(), 0, 1); | |
| 1473 EXPECT_NEAR(occluded.overdraw_metrics()->pixels_uploaded_translucent(), | |
| 1474 visible_tiles1 * 100 * 100, | |
| 1475 1); | |
| 1476 EXPECT_EQ(0, occluded.overdraw_metrics()->tiles_culled_for_upload()); | |
| 1477 | |
| 1478 layer->fake_layer_updater()->ClearUpdateCount(); | 1408 layer->fake_layer_updater()->ClearUpdateCount(); |
| 1479 | 1409 |
| 1480 // The occlusion of 300x100 will be cover 3 tiles as tiles are 100x100 still. | 1410 // The occlusion of 300x100 will be cover 3 tiles as tiles are 100x100 still. |
| 1481 occluded.SetOcclusion(gfx::Rect(200, 200, 300, 100)); | 1411 occluded.SetOcclusion(gfx::Rect(200, 200, 300, 100)); |
| 1482 layer->draw_properties().drawable_content_rect = | 1412 layer->draw_properties().drawable_content_rect = |
| 1483 gfx::Rect(layer->bounds()); | 1413 gfx::Rect(layer->bounds()); |
| 1484 layer->draw_properties().visible_content_rect = | 1414 layer->draw_properties().visible_content_rect = |
| 1485 gfx::Rect(layer->content_bounds()); | 1415 gfx::Rect(layer->content_bounds()); |
| 1486 layer->InvalidateContentRect(gfx::Rect(0, 0, 600, 600)); | 1416 layer->InvalidateContentRect(gfx::Rect(0, 0, 600, 600)); |
| 1487 layer->SetTexturePriorities(priority_calculator_); | 1417 layer->SetTexturePriorities(priority_calculator_); |
| 1488 resource_manager_->PrioritizeTextures(); | 1418 resource_manager_->PrioritizeTextures(); |
| 1489 layer->SavePaintProperties(); | 1419 layer->SavePaintProperties(); |
| 1490 layer->Update(queue_.get(), &occluded); | 1420 layer->Update(queue_.get(), &occluded); |
| 1491 int visible_tiles2 = 6 * 6 - 3; | 1421 int visible_tiles2 = 6 * 6 - 3; |
| 1492 EXPECT_EQ(visible_tiles2, layer->fake_layer_updater()->update_count()); | 1422 EXPECT_EQ(visible_tiles2, layer->fake_layer_updater()->update_count()); |
| 1493 | 1423 |
| 1494 EXPECT_NEAR(occluded.overdraw_metrics()->pixels_uploaded_opaque(), 0, 1); | |
| 1495 EXPECT_NEAR(occluded.overdraw_metrics()->pixels_uploaded_translucent(), | |
| 1496 visible_tiles2 * 100 * 100 + | |
| 1497 visible_tiles1 * 100 * 100, | |
| 1498 1); | |
| 1499 EXPECT_EQ(3, occluded.overdraw_metrics()->tiles_culled_for_upload()); | |
| 1500 | |
| 1501 layer->fake_layer_updater()->ClearUpdateCount(); | 1424 layer->fake_layer_updater()->ClearUpdateCount(); |
| 1502 | 1425 |
| 1503 // This makes sure content scaling and transforms work together. | 1426 // This makes sure content scaling and transforms work together. |
| 1504 // When the tiles are scaled down by half, they are 50x50 each in the | 1427 // When the tiles are scaled down by half, they are 50x50 each in the |
| 1505 // screen. | 1428 // screen. |
| 1506 gfx::Transform screen_transform; | 1429 gfx::Transform screen_transform; |
| 1507 screen_transform.Scale(0.5, 0.5); | 1430 screen_transform.Scale(0.5, 0.5); |
| 1508 layer->draw_properties().screen_space_transform = screen_transform; | 1431 layer->draw_properties().screen_space_transform = screen_transform; |
| 1509 layer->draw_properties().target_space_transform = screen_transform; | 1432 layer->draw_properties().target_space_transform = screen_transform; |
| 1510 | 1433 |
| 1511 // An occlusion of 150x100 will cover 3*2 = 6 tiles. | 1434 // An occlusion of 150x100 will cover 3*2 = 6 tiles. |
| 1512 occluded.SetOcclusion(gfx::Rect(100, 100, 150, 100)); | 1435 occluded.SetOcclusion(gfx::Rect(100, 100, 150, 100)); |
| 1513 | 1436 |
| 1514 gfx::Rect layer_bounds_rect(layer->bounds()); | 1437 gfx::Rect layer_bounds_rect(layer->bounds()); |
| 1515 layer->draw_properties().drawable_content_rect = | 1438 layer->draw_properties().drawable_content_rect = |
| 1516 gfx::ScaleToEnclosingRect(layer_bounds_rect, 0.5f); | 1439 gfx::ScaleToEnclosingRect(layer_bounds_rect, 0.5f); |
| 1517 layer->draw_properties().visible_content_rect = | 1440 layer->draw_properties().visible_content_rect = |
| 1518 gfx::Rect(layer->content_bounds()); | 1441 gfx::Rect(layer->content_bounds()); |
| 1519 layer->InvalidateContentRect(gfx::Rect(0, 0, 600, 600)); | 1442 layer->InvalidateContentRect(gfx::Rect(0, 0, 600, 600)); |
| 1520 layer->SetTexturePriorities(priority_calculator_); | 1443 layer->SetTexturePriorities(priority_calculator_); |
| 1521 resource_manager_->PrioritizeTextures(); | 1444 resource_manager_->PrioritizeTextures(); |
| 1522 layer->SavePaintProperties(); | 1445 layer->SavePaintProperties(); |
| 1523 layer->Update(queue_.get(), &occluded); | 1446 layer->Update(queue_.get(), &occluded); |
| 1524 int visible_tiles3 = 6 * 6 - 6; | 1447 int visible_tiles3 = 6 * 6 - 6; |
| 1525 EXPECT_EQ(visible_tiles3, layer->fake_layer_updater()->update_count()); | 1448 EXPECT_EQ(visible_tiles3, layer->fake_layer_updater()->update_count()); |
| 1526 | |
| 1527 EXPECT_NEAR(occluded.overdraw_metrics()->pixels_uploaded_opaque(), 0, 1); | |
| 1528 EXPECT_NEAR(occluded.overdraw_metrics()->pixels_uploaded_translucent(), | |
| 1529 visible_tiles3 * 100 * 100 + | |
| 1530 visible_tiles2 * 100 * 100 + | |
| 1531 visible_tiles1 * 100 * 100, | |
| 1532 1); | |
| 1533 EXPECT_EQ(6 + 3, occluded.overdraw_metrics()->tiles_culled_for_upload()); | |
| 1534 } | 1449 } |
| 1535 | 1450 |
| 1536 TEST_F(TiledLayerTest, VisibleContentOpaqueRegion) { | 1451 TEST_F(TiledLayerTest, VisibleContentOpaqueRegion) { |
| 1537 scoped_refptr<FakeTiledLayer> layer = | 1452 scoped_refptr<FakeTiledLayer> layer = |
| 1538 make_scoped_refptr(new FakeTiledLayer(resource_manager_.get())); | 1453 make_scoped_refptr(new FakeTiledLayer(resource_manager_.get())); |
| 1539 RenderSurfaceLayerList render_surface_layer_list; | 1454 RenderSurfaceLayerList render_surface_layer_list; |
| 1540 TestOcclusionTracker occluded; | 1455 TestOcclusionTracker occluded; |
| 1541 occlusion_ = &occluded; | 1456 occlusion_ = &occluded; |
| 1542 layer_tree_host_->SetViewportSize(gfx::Size(1000, 1000)); | 1457 layer_tree_host_->SetViewportSize(gfx::Size(1000, 1000)); |
| 1543 | 1458 |
| (...skipping 17 matching lines...) Expand all Loading... |
| 1561 // VisibleContentOpaqueRegion should be empty. | 1476 // VisibleContentOpaqueRegion should be empty. |
| 1562 layer->fake_layer_updater()->SetOpaquePaintRect(gfx::Rect()); | 1477 layer->fake_layer_updater()->SetOpaquePaintRect(gfx::Rect()); |
| 1563 layer->InvalidateContentRect(content_bounds); | 1478 layer->InvalidateContentRect(content_bounds); |
| 1564 layer->SetTexturePriorities(priority_calculator_); | 1479 layer->SetTexturePriorities(priority_calculator_); |
| 1565 resource_manager_->PrioritizeTextures(); | 1480 resource_manager_->PrioritizeTextures(); |
| 1566 layer->SavePaintProperties(); | 1481 layer->SavePaintProperties(); |
| 1567 layer->Update(queue_.get(), &occluded); | 1482 layer->Update(queue_.get(), &occluded); |
| 1568 opaque_contents = layer->VisibleContentOpaqueRegion(); | 1483 opaque_contents = layer->VisibleContentOpaqueRegion(); |
| 1569 EXPECT_TRUE(opaque_contents.IsEmpty()); | 1484 EXPECT_TRUE(opaque_contents.IsEmpty()); |
| 1570 | 1485 |
| 1571 EXPECT_NEAR(occluded.overdraw_metrics()->pixels_painted(), 20000, 1); | |
| 1572 EXPECT_NEAR(occluded.overdraw_metrics()->pixels_uploaded_opaque(), 0, 1); | |
| 1573 EXPECT_NEAR( | |
| 1574 occluded.overdraw_metrics()->pixels_uploaded_translucent(), 20000, 1); | |
| 1575 EXPECT_EQ(0, occluded.overdraw_metrics()->tiles_culled_for_upload()); | |
| 1576 | |
| 1577 // VisibleContentOpaqueRegion should match the visible part of what is painted | 1486 // VisibleContentOpaqueRegion should match the visible part of what is painted |
| 1578 // opaque. | 1487 // opaque. |
| 1579 opaque_paint_rect = gfx::Rect(10, 10, 90, 190); | 1488 opaque_paint_rect = gfx::Rect(10, 10, 90, 190); |
| 1580 layer->fake_layer_updater()->SetOpaquePaintRect(opaque_paint_rect); | 1489 layer->fake_layer_updater()->SetOpaquePaintRect(opaque_paint_rect); |
| 1581 layer->InvalidateContentRect(content_bounds); | 1490 layer->InvalidateContentRect(content_bounds); |
| 1582 layer->SetTexturePriorities(priority_calculator_); | 1491 layer->SetTexturePriorities(priority_calculator_); |
| 1583 resource_manager_->PrioritizeTextures(); | 1492 resource_manager_->PrioritizeTextures(); |
| 1584 layer->SavePaintProperties(); | 1493 layer->SavePaintProperties(); |
| 1585 layer->Update(queue_.get(), &occluded); | 1494 layer->Update(queue_.get(), &occluded); |
| 1586 UpdateTextures(); | 1495 UpdateTextures(); |
| 1587 opaque_contents = layer->VisibleContentOpaqueRegion(); | 1496 opaque_contents = layer->VisibleContentOpaqueRegion(); |
| 1588 EXPECT_EQ(gfx::IntersectRects(opaque_paint_rect, visible_bounds).ToString(), | 1497 EXPECT_EQ(gfx::IntersectRects(opaque_paint_rect, visible_bounds).ToString(), |
| 1589 opaque_contents.ToString()); | 1498 opaque_contents.ToString()); |
| 1590 | 1499 |
| 1591 EXPECT_NEAR(occluded.overdraw_metrics()->pixels_painted(), 20000 * 2, 1); | |
| 1592 EXPECT_NEAR(occluded.overdraw_metrics()->pixels_uploaded_opaque(), 17100, 1); | |
| 1593 EXPECT_NEAR(occluded.overdraw_metrics()->pixels_uploaded_translucent(), | |
| 1594 20000 + 20000 - 17100, | |
| 1595 1); | |
| 1596 EXPECT_EQ(0, occluded.overdraw_metrics()->tiles_culled_for_upload()); | |
| 1597 | |
| 1598 // If we paint again without invalidating, the same stuff should be opaque. | 1500 // If we paint again without invalidating, the same stuff should be opaque. |
| 1599 layer->fake_layer_updater()->SetOpaquePaintRect(gfx::Rect()); | 1501 layer->fake_layer_updater()->SetOpaquePaintRect(gfx::Rect()); |
| 1600 layer->SetTexturePriorities(priority_calculator_); | 1502 layer->SetTexturePriorities(priority_calculator_); |
| 1601 resource_manager_->PrioritizeTextures(); | 1503 resource_manager_->PrioritizeTextures(); |
| 1602 layer->SavePaintProperties(); | 1504 layer->SavePaintProperties(); |
| 1603 layer->Update(queue_.get(), &occluded); | 1505 layer->Update(queue_.get(), &occluded); |
| 1604 UpdateTextures(); | 1506 UpdateTextures(); |
| 1605 opaque_contents = layer->VisibleContentOpaqueRegion(); | 1507 opaque_contents = layer->VisibleContentOpaqueRegion(); |
| 1606 EXPECT_EQ(gfx::IntersectRects(opaque_paint_rect, visible_bounds).ToString(), | 1508 EXPECT_EQ(gfx::IntersectRects(opaque_paint_rect, visible_bounds).ToString(), |
| 1607 opaque_contents.ToString()); | 1509 opaque_contents.ToString()); |
| 1608 | 1510 |
| 1609 EXPECT_NEAR(occluded.overdraw_metrics()->pixels_painted(), 20000 * 2, 1); | |
| 1610 EXPECT_NEAR(occluded.overdraw_metrics()->pixels_uploaded_opaque(), 17100, 1); | |
| 1611 EXPECT_NEAR(occluded.overdraw_metrics()->pixels_uploaded_translucent(), | |
| 1612 20000 + 20000 - 17100, | |
| 1613 1); | |
| 1614 EXPECT_EQ(0, occluded.overdraw_metrics()->tiles_culled_for_upload()); | |
| 1615 | |
| 1616 // If we repaint a non-opaque part of the tile, then it shouldn't lose its | 1511 // If we repaint a non-opaque part of the tile, then it shouldn't lose its |
| 1617 // opaque-ness. And other tiles should not be affected. | 1512 // opaque-ness. And other tiles should not be affected. |
| 1618 layer->fake_layer_updater()->SetOpaquePaintRect(gfx::Rect()); | 1513 layer->fake_layer_updater()->SetOpaquePaintRect(gfx::Rect()); |
| 1619 layer->InvalidateContentRect(gfx::Rect(0, 0, 1, 1)); | 1514 layer->InvalidateContentRect(gfx::Rect(0, 0, 1, 1)); |
| 1620 layer->SetTexturePriorities(priority_calculator_); | 1515 layer->SetTexturePriorities(priority_calculator_); |
| 1621 resource_manager_->PrioritizeTextures(); | 1516 resource_manager_->PrioritizeTextures(); |
| 1622 layer->SavePaintProperties(); | 1517 layer->SavePaintProperties(); |
| 1623 layer->Update(queue_.get(), &occluded); | 1518 layer->Update(queue_.get(), &occluded); |
| 1624 UpdateTextures(); | 1519 UpdateTextures(); |
| 1625 opaque_contents = layer->VisibleContentOpaqueRegion(); | 1520 opaque_contents = layer->VisibleContentOpaqueRegion(); |
| 1626 EXPECT_EQ(gfx::IntersectRects(opaque_paint_rect, visible_bounds).ToString(), | 1521 EXPECT_EQ(gfx::IntersectRects(opaque_paint_rect, visible_bounds).ToString(), |
| 1627 opaque_contents.ToString()); | 1522 opaque_contents.ToString()); |
| 1628 | 1523 |
| 1629 EXPECT_NEAR(occluded.overdraw_metrics()->pixels_painted(), 20000 * 2 + 1, 1); | |
| 1630 EXPECT_NEAR(occluded.overdraw_metrics()->pixels_uploaded_opaque(), 17100, 1); | |
| 1631 EXPECT_NEAR(occluded.overdraw_metrics()->pixels_uploaded_translucent(), | |
| 1632 20000 + 20000 - 17100 + 1, | |
| 1633 1); | |
| 1634 EXPECT_EQ(0, occluded.overdraw_metrics()->tiles_culled_for_upload()); | |
| 1635 | |
| 1636 // If we repaint an opaque part of the tile, then it should lose its | 1524 // If we repaint an opaque part of the tile, then it should lose its |
| 1637 // opaque-ness. But other tiles should still not be affected. | 1525 // opaque-ness. But other tiles should still not be affected. |
| 1638 layer->fake_layer_updater()->SetOpaquePaintRect(gfx::Rect()); | 1526 layer->fake_layer_updater()->SetOpaquePaintRect(gfx::Rect()); |
| 1639 layer->InvalidateContentRect(gfx::Rect(10, 10, 1, 1)); | 1527 layer->InvalidateContentRect(gfx::Rect(10, 10, 1, 1)); |
| 1640 layer->SetTexturePriorities(priority_calculator_); | 1528 layer->SetTexturePriorities(priority_calculator_); |
| 1641 resource_manager_->PrioritizeTextures(); | 1529 resource_manager_->PrioritizeTextures(); |
| 1642 layer->SavePaintProperties(); | 1530 layer->SavePaintProperties(); |
| 1643 layer->Update(queue_.get(), &occluded); | 1531 layer->Update(queue_.get(), &occluded); |
| 1644 UpdateTextures(); | 1532 UpdateTextures(); |
| 1645 opaque_contents = layer->VisibleContentOpaqueRegion(); | 1533 opaque_contents = layer->VisibleContentOpaqueRegion(); |
| 1646 EXPECT_EQ(gfx::IntersectRects(gfx::Rect(10, 100, 90, 100), | 1534 EXPECT_EQ(gfx::IntersectRects(gfx::Rect(10, 100, 90, 100), |
| 1647 visible_bounds).ToString(), | 1535 visible_bounds).ToString(), |
| 1648 opaque_contents.ToString()); | 1536 opaque_contents.ToString()); |
| 1649 | |
| 1650 EXPECT_NEAR( | |
| 1651 occluded.overdraw_metrics()->pixels_painted(), 20000 * 2 + 1 + 1, 1); | |
| 1652 EXPECT_NEAR(occluded.overdraw_metrics()->pixels_uploaded_opaque(), 17100, 1); | |
| 1653 EXPECT_NEAR(occluded.overdraw_metrics()->pixels_uploaded_translucent(), | |
| 1654 20000 + 20000 - 17100 + 1 + 1, | |
| 1655 1); | |
| 1656 EXPECT_EQ(0, occluded.overdraw_metrics()->tiles_culled_for_upload()); | |
| 1657 } | |
| 1658 | |
| 1659 TEST_F(TiledLayerTest, PixelsPaintedMetrics) { | |
| 1660 scoped_refptr<FakeTiledLayer> layer = | |
| 1661 make_scoped_refptr(new FakeTiledLayer(resource_manager_.get())); | |
| 1662 RenderSurfaceLayerList render_surface_layer_list; | |
| 1663 TestOcclusionTracker occluded; | |
| 1664 occlusion_ = &occluded; | |
| 1665 layer_tree_host_->SetViewportSize(gfx::Size(1000, 1000)); | |
| 1666 | |
| 1667 layer_tree_host_->root_layer()->AddChild(layer); | |
| 1668 | |
| 1669 // The tile size is 100x100, so this invalidates and then paints two tiles in | |
| 1670 // various ways. | |
| 1671 | |
| 1672 gfx::Rect opaque_paint_rect; | |
| 1673 Region opaque_contents; | |
| 1674 | |
| 1675 gfx::Rect content_bounds = gfx::Rect(0, 0, 100, 300); | |
| 1676 layer->SetBounds(content_bounds.size()); | |
| 1677 CalcDrawProps(&render_surface_layer_list); | |
| 1678 | |
| 1679 // Invalidates and paints the whole layer. | |
| 1680 layer->fake_layer_updater()->SetOpaquePaintRect(gfx::Rect()); | |
| 1681 layer->InvalidateContentRect(content_bounds); | |
| 1682 layer->SetTexturePriorities(priority_calculator_); | |
| 1683 resource_manager_->PrioritizeTextures(); | |
| 1684 layer->SavePaintProperties(); | |
| 1685 layer->Update(queue_.get(), &occluded); | |
| 1686 UpdateTextures(); | |
| 1687 opaque_contents = layer->VisibleContentOpaqueRegion(); | |
| 1688 EXPECT_TRUE(opaque_contents.IsEmpty()); | |
| 1689 | |
| 1690 EXPECT_NEAR(occluded.overdraw_metrics()->pixels_painted(), 30000, 1); | |
| 1691 EXPECT_NEAR(occluded.overdraw_metrics()->pixels_uploaded_opaque(), 0, 1); | |
| 1692 EXPECT_NEAR( | |
| 1693 occluded.overdraw_metrics()->pixels_uploaded_translucent(), 30000, 1); | |
| 1694 EXPECT_EQ(0, occluded.overdraw_metrics()->tiles_culled_for_upload()); | |
| 1695 | |
| 1696 // Invalidates an area on the top and bottom tile, which will cause us to | |
| 1697 // paint the tile in the middle, even though it is not dirty and will not be | |
| 1698 // uploaded. | |
| 1699 layer->fake_layer_updater()->SetOpaquePaintRect(gfx::Rect()); | |
| 1700 layer->InvalidateContentRect(gfx::Rect(0, 0, 1, 1)); | |
| 1701 layer->InvalidateContentRect(gfx::Rect(50, 200, 10, 10)); | |
| 1702 layer->SetTexturePriorities(priority_calculator_); | |
| 1703 resource_manager_->PrioritizeTextures(); | |
| 1704 layer->SavePaintProperties(); | |
| 1705 layer->Update(queue_.get(), &occluded); | |
| 1706 UpdateTextures(); | |
| 1707 opaque_contents = layer->VisibleContentOpaqueRegion(); | |
| 1708 EXPECT_TRUE(opaque_contents.IsEmpty()); | |
| 1709 | |
| 1710 // The middle tile was painted even though not invalidated. | |
| 1711 EXPECT_NEAR( | |
| 1712 occluded.overdraw_metrics()->pixels_painted(), 30000 + 60 * 210, 1); | |
| 1713 // The pixels uploaded will not include the non-invalidated tile in the | |
| 1714 // middle. | |
| 1715 EXPECT_NEAR(occluded.overdraw_metrics()->pixels_uploaded_opaque(), 0, 1); | |
| 1716 EXPECT_NEAR(occluded.overdraw_metrics()->pixels_uploaded_translucent(), | |
| 1717 30000 + 1 + 100, | |
| 1718 1); | |
| 1719 EXPECT_EQ(0, occluded.overdraw_metrics()->tiles_culled_for_upload()); | |
| 1720 } | 1537 } |
| 1721 | 1538 |
| 1722 TEST_F(TiledLayerTest, DontAllocateContentsWhenTargetSurfaceCantBeAllocated) { | 1539 TEST_F(TiledLayerTest, DontAllocateContentsWhenTargetSurfaceCantBeAllocated) { |
| 1723 // Tile size is 100x100. | 1540 // Tile size is 100x100. |
| 1724 gfx::Rect root_rect(0, 0, 300, 200); | 1541 gfx::Rect root_rect(0, 0, 300, 200); |
| 1725 gfx::Rect child_rect(0, 0, 300, 100); | 1542 gfx::Rect child_rect(0, 0, 300, 100); |
| 1726 gfx::Rect child2_rect(0, 100, 300, 100); | 1543 gfx::Rect child2_rect(0, 100, 300, 100); |
| 1727 | 1544 |
| 1728 scoped_refptr<FakeTiledLayer> root = make_scoped_refptr( | 1545 scoped_refptr<FakeTiledLayer> root = make_scoped_refptr( |
| 1729 new FakeTiledLayer(layer_tree_host_->contents_texture_manager())); | 1546 new FakeTiledLayer(layer_tree_host_->contents_texture_manager())); |
| (...skipping 265 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1995 // Invalidate the entire layer in layer space. When painting, the rect given | 1812 // Invalidate the entire layer in layer space. When painting, the rect given |
| 1996 // to webkit should match the layer's bounds. | 1813 // to webkit should match the layer's bounds. |
| 1997 layer->SetNeedsDisplayRect(layer_rect); | 1814 layer->SetNeedsDisplayRect(layer_rect); |
| 1998 layer->Update(queue_.get(), NULL); | 1815 layer->Update(queue_.get(), NULL); |
| 1999 | 1816 |
| 2000 EXPECT_RECT_EQ(layer_rect, layer->tracking_layer_painter()->PaintedRect()); | 1817 EXPECT_RECT_EQ(layer_rect, layer->tracking_layer_painter()->PaintedRect()); |
| 2001 } | 1818 } |
| 2002 | 1819 |
| 2003 } // namespace | 1820 } // namespace |
| 2004 } // namespace cc | 1821 } // namespace cc |
| OLD | NEW |