OLD | NEW |
---|---|
1 // Copyright 2012 The Chromium Authors. All rights reserved. | 1 // Copyright 2012 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/scrollbar_layer.h" | 5 #include "cc/layers/scrollbar_layer.h" |
6 | 6 |
7 #include "base/containers/hash_tables.h" | |
7 #include "cc/animation/scrollbar_animation_controller.h" | 8 #include "cc/animation/scrollbar_animation_controller.h" |
8 #include "cc/layers/append_quads_data.h" | 9 #include "cc/layers/append_quads_data.h" |
9 #include "cc/layers/scrollbar_layer_impl.h" | 10 #include "cc/layers/scrollbar_layer_impl.h" |
10 #include "cc/quads/solid_color_draw_quad.h" | 11 #include "cc/quads/solid_color_draw_quad.h" |
11 #include "cc/resources/prioritized_resource_manager.h" | 12 #include "cc/resources/prioritized_resource_manager.h" |
12 #include "cc/resources/priority_calculator.h" | 13 #include "cc/resources/priority_calculator.h" |
13 #include "cc/resources/resource_update_queue.h" | 14 #include "cc/resources/resource_update_queue.h" |
15 #include "cc/resources/ui_resource_manager_client.h" | |
14 #include "cc/test/fake_impl_proxy.h" | 16 #include "cc/test/fake_impl_proxy.h" |
15 #include "cc/test/fake_layer_tree_host_client.h" | 17 #include "cc/test/fake_layer_tree_host_client.h" |
16 #include "cc/test/fake_layer_tree_host_impl.h" | 18 #include "cc/test/fake_layer_tree_host_impl.h" |
17 #include "cc/test/fake_scrollbar.h" | 19 #include "cc/test/fake_scrollbar.h" |
18 #include "cc/test/geometry_test_utils.h" | 20 #include "cc/test/geometry_test_utils.h" |
19 #include "cc/test/layer_tree_test.h" | 21 #include "cc/test/layer_tree_test.h" |
20 #include "cc/test/mock_quad_culler.h" | 22 #include "cc/test/mock_quad_culler.h" |
21 #include "cc/test/test_web_graphics_context_3d.h" | 23 #include "cc/test/test_web_graphics_context_3d.h" |
22 #include "cc/trees/layer_tree_impl.h" | 24 #include "cc/trees/layer_tree_impl.h" |
23 #include "cc/trees/single_thread_proxy.h" | 25 #include "cc/trees/single_thread_proxy.h" |
(...skipping 388 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
412 int max_size = 0; | 414 int max_size = 0; |
413 context->getIntegerv(GL_MAX_TEXTURE_SIZE, &max_size); | 415 context->getIntegerv(GL_MAX_TEXTURE_SIZE, &max_size); |
414 SetScrollbarBounds(gfx::Size(max_size + 100, max_size + 100)); | 416 SetScrollbarBounds(gfx::Size(max_size + 100, max_size + 100)); |
415 RunTest(true, true, true); | 417 RunTest(true, true, true); |
416 } | 418 } |
417 | 419 |
418 class MockLayerTreeHost : public LayerTreeHost { | 420 class MockLayerTreeHost : public LayerTreeHost { |
419 public: | 421 public: |
420 MockLayerTreeHost(LayerTreeHostClient* client, | 422 MockLayerTreeHost(LayerTreeHostClient* client, |
421 const LayerTreeSettings& settings) | 423 const LayerTreeSettings& settings) |
422 : LayerTreeHost(client, settings) { | 424 : LayerTreeHost(client, settings), |
425 ui_resource_next_id_(1), | |
426 total_ui_resource_created_(0), | |
427 total_ui_resource_deleted_(0) { | |
423 Initialize(NULL); | 428 Initialize(NULL); |
424 } | 429 } |
430 | |
431 virtual UIResourceId | |
432 CreateUIResource(const UIResourceCallback& content) OVERRIDE { | |
aelias_OOO_until_Jul13
2013/07/23 00:06:48
Nit: 4-space indent. The usual way to style this
powei
2013/07/24 02:28:29
Done.
| |
433 total_ui_resource_created_++; | |
434 UIResourceId nid = ui_resource_next_id_++; | |
aelias_OOO_until_Jul13
2013/07/23 00:06:48
Nit: rename to next_id
powei
2013/07/24 02:28:29
Done.
| |
435 ui_resource_id_set_.insert(nid); | |
436 return nid; | |
437 } | |
438 | |
439 // Deletes a UI resource. May safely be called more than once. | |
440 virtual void DeleteUIResource(UIResourceId id) OVERRIDE { | |
441 if (ui_resource_id_set_.find(id) != ui_resource_id_set_.end()) { | |
442 ui_resource_id_set_.erase(id); | |
aelias_OOO_until_Jul13
2013/07/23 00:06:48
nit: 2-space indent.
Note that there is a tool th
powei
2013/07/24 02:28:29
Done.
| |
443 total_ui_resource_deleted_++; | |
444 } | |
445 } | |
446 | |
447 size_t UIResourceCount() { return ui_resource_id_set_.size(); } | |
448 int TotalUIResourceDeleted() { return total_ui_resource_deleted_; } | |
449 int TotalUIResourceCreated() { return total_ui_resource_created_; } | |
450 | |
451 private: | |
452 typedef base::hash_set<UIResourceId> UIResourceIdSet; | |
453 UIResourceIdSet ui_resource_id_set_; | |
454 int ui_resource_next_id_; | |
455 int total_ui_resource_created_; | |
456 int total_ui_resource_deleted_; | |
425 }; | 457 }; |
426 | 458 |
427 | 459 |
428 class ScrollbarLayerTestResourceCreation : public testing::Test { | 460 class ScrollbarLayerTestResourceCreation : public testing::Test { |
429 public: | 461 public: |
430 ScrollbarLayerTestResourceCreation() | 462 ScrollbarLayerTestResourceCreation() |
431 : fake_client_(FakeLayerTreeHostClient::DIRECT_3D) {} | 463 : fake_client_(FakeLayerTreeHostClient::DIRECT_3D) {} |
432 | 464 |
433 void TestResourceUpload(size_t expected_resources) { | 465 void TestResourceUpload(int num_updates, |
466 size_t expected_resources, | |
467 int expected_created, | |
468 int expected_deleted) { | |
434 layer_tree_host_.reset( | 469 layer_tree_host_.reset( |
435 new MockLayerTreeHost(&fake_client_, layer_tree_settings_)); | 470 new MockLayerTreeHost(&fake_client_, layer_tree_settings_)); |
436 | 471 |
437 scoped_ptr<Scrollbar> scrollbar(new FakeScrollbar(false, true, false)); | 472 scoped_ptr<Scrollbar> scrollbar(new FakeScrollbar(false, true, false)); |
438 scoped_refptr<Layer> layer_tree_root = Layer::Create(); | 473 scoped_refptr<Layer> layer_tree_root = Layer::Create(); |
439 scoped_refptr<Layer> content_layer = Layer::Create(); | 474 scoped_refptr<Layer> content_layer = Layer::Create(); |
440 scoped_refptr<Layer> scrollbar_layer = | 475 scoped_refptr<Layer> scrollbar_layer = |
441 ScrollbarLayer::Create(scrollbar.Pass(), layer_tree_root->id()); | 476 ScrollbarLayer::Create(scrollbar.Pass(), layer_tree_root->id()); |
442 layer_tree_root->AddChild(content_layer); | 477 layer_tree_root->AddChild(content_layer); |
443 layer_tree_root->AddChild(scrollbar_layer); | 478 layer_tree_root->AddChild(scrollbar_layer); |
(...skipping 11 matching lines...) Expand all Loading... | |
455 content_layer->SetBounds(gfx::Size(100, 200)); | 490 content_layer->SetBounds(gfx::Size(100, 200)); |
456 scrollbar_layer->draw_properties().content_bounds = gfx::Size(100, 200); | 491 scrollbar_layer->draw_properties().content_bounds = gfx::Size(100, 200); |
457 scrollbar_layer->draw_properties().visible_content_rect = | 492 scrollbar_layer->draw_properties().visible_content_rect = |
458 gfx::Rect(0, 0, 100, 200); | 493 gfx::Rect(0, 0, 100, 200); |
459 scrollbar_layer->CreateRenderSurface(); | 494 scrollbar_layer->CreateRenderSurface(); |
460 scrollbar_layer->draw_properties().render_target = scrollbar_layer.get(); | 495 scrollbar_layer->draw_properties().render_target = scrollbar_layer.get(); |
461 | 496 |
462 testing::Mock::VerifyAndClearExpectations(layer_tree_host_.get()); | 497 testing::Mock::VerifyAndClearExpectations(layer_tree_host_.get()); |
463 EXPECT_EQ(scrollbar_layer->layer_tree_host(), layer_tree_host_.get()); | 498 EXPECT_EQ(scrollbar_layer->layer_tree_host(), layer_tree_host_.get()); |
464 | 499 |
465 PriorityCalculator calculator; | |
466 ResourceUpdateQueue queue; | 500 ResourceUpdateQueue queue; |
467 OcclusionTracker occlusion_tracker(gfx::Rect(), false); | 501 OcclusionTracker occlusion_tracker(gfx::Rect(), false); |
468 | 502 |
469 scrollbar_layer->SetTexturePriorities(calculator); | 503 for (int update_counter = 0; update_counter < num_updates; update_counter++) |
470 layer_tree_host_->contents_texture_manager()->PrioritizeTextures(); | 504 scrollbar_layer->Update(&queue, &occlusion_tracker); |
471 scrollbar_layer->Update(&queue, &occlusion_tracker); | 505 |
472 EXPECT_EQ(0u, queue.FullUploadSize()); | 506 // A non-solid-color scrollbar should have requested two textures. |
473 EXPECT_EQ(expected_resources, queue.PartialUploadSize()); | 507 // A solid-color scrollbar should have requested two textures. |
508 EXPECT_EQ(expected_resources, layer_tree_host_->UIResourceCount()); | |
509 EXPECT_EQ(expected_created, layer_tree_host_->TotalUIResourceCreated()); | |
510 EXPECT_EQ(expected_deleted, layer_tree_host_->TotalUIResourceDeleted()); | |
474 | 511 |
475 testing::Mock::VerifyAndClearExpectations(layer_tree_host_.get()); | 512 testing::Mock::VerifyAndClearExpectations(layer_tree_host_.get()); |
476 } | 513 } |
477 | 514 |
478 protected: | 515 protected: |
479 FakeLayerTreeHostClient fake_client_; | 516 FakeLayerTreeHostClient fake_client_; |
480 LayerTreeSettings layer_tree_settings_; | 517 LayerTreeSettings layer_tree_settings_; |
481 scoped_ptr<MockLayerTreeHost> layer_tree_host_; | 518 scoped_ptr<MockLayerTreeHost> layer_tree_host_; |
482 }; | 519 }; |
483 | 520 |
484 TEST_F(ScrollbarLayerTestResourceCreation, ResourceUpload) { | 521 TEST_F(ScrollbarLayerTestResourceCreation, ResourceUpload) { |
485 layer_tree_settings_.solid_color_scrollbars = false; | 522 layer_tree_settings_.solid_color_scrollbars = false; |
486 TestResourceUpload(2); | 523 TestResourceUpload(0, 0, 0, 0); |
524 int num_updates[3] = {1, 5, 10}; | |
525 for (int j = 0; j < 3; j++) { | |
526 TestResourceUpload(num_updates[j], 2, | |
527 num_updates[j] * 2, | |
528 (num_updates[j] - 1) * 2); | |
529 } | |
487 } | 530 } |
488 | 531 |
489 TEST_F(ScrollbarLayerTestResourceCreation, SolidColorNoResourceUpload) { | 532 TEST_F(ScrollbarLayerTestResourceCreation, SolidColorNoResourceUpload) { |
490 layer_tree_settings_.solid_color_scrollbars = true; | 533 layer_tree_settings_.solid_color_scrollbars = true; |
491 TestResourceUpload(0); | 534 TestResourceUpload(0, 0, 0, 0); |
492 } | 535 TestResourceUpload(1, 0, 0, 0); |
493 | |
494 class ScaledScrollbarLayerTestResourceCreation : public testing::Test { | |
495 public: | |
496 ScaledScrollbarLayerTestResourceCreation() | |
497 : fake_client_(FakeLayerTreeHostClient::DIRECT_3D) {} | |
498 | |
499 void TestResourceUpload(size_t expected_resources, const float test_scale) { | |
500 layer_tree_host_.reset( | |
501 new MockLayerTreeHost(&fake_client_, layer_tree_settings_)); | |
502 | |
503 gfx::Point scrollbar_location(0, 185); | |
504 scoped_ptr<FakeScrollbar> scrollbar(new FakeScrollbar(false, true, false)); | |
505 scrollbar->set_location(scrollbar_location); | |
506 | |
507 scoped_refptr<Layer> layer_tree_root = Layer::Create(); | |
508 scoped_refptr<Layer> content_layer = Layer::Create(); | |
509 scoped_refptr<Layer> scrollbar_layer = | |
510 ScrollbarLayer::Create(scrollbar.PassAs<cc::Scrollbar>(), | |
511 layer_tree_root->id()); | |
512 layer_tree_root->AddChild(content_layer); | |
513 layer_tree_root->AddChild(scrollbar_layer); | |
514 | |
515 layer_tree_host_->InitializeOutputSurfaceIfNeeded(); | |
516 layer_tree_host_->contents_texture_manager()-> | |
517 SetMaxMemoryLimitBytes(1024 * 1024); | |
518 layer_tree_host_->SetRootLayer(layer_tree_root); | |
519 | |
520 scrollbar_layer->SetIsDrawable(true); | |
521 scrollbar_layer->SetBounds(gfx::Size(100, 15)); | |
522 scrollbar_layer->SetPosition(scrollbar_location); | |
523 layer_tree_root->SetBounds(gfx::Size(100, 200)); | |
524 content_layer->SetBounds(gfx::Size(100, 200)); | |
525 gfx::SizeF scaled_size = | |
526 gfx::ScaleSize(scrollbar_layer->bounds(), test_scale, test_scale); | |
527 gfx::PointF scaled_location = | |
528 gfx::ScalePoint(scrollbar_layer->position(), test_scale, test_scale); | |
529 scrollbar_layer->draw_properties().content_bounds = | |
530 gfx::Size(scaled_size.width(), scaled_size.height()); | |
531 scrollbar_layer->draw_properties().contents_scale_x = test_scale; | |
532 scrollbar_layer->draw_properties().contents_scale_y = test_scale; | |
533 scrollbar_layer->draw_properties().visible_content_rect = | |
534 gfx::Rect(scaled_location.x(), | |
535 scaled_location.y(), | |
536 scaled_size.width(), | |
537 scaled_size.height()); | |
538 scrollbar_layer->CreateRenderSurface(); | |
539 scrollbar_layer->draw_properties().render_target = scrollbar_layer.get(); | |
540 | |
541 testing::Mock::VerifyAndClearExpectations(layer_tree_host_.get()); | |
542 EXPECT_EQ(scrollbar_layer->layer_tree_host(), layer_tree_host_.get()); | |
543 | |
544 PriorityCalculator calculator; | |
545 ResourceUpdateQueue queue; | |
546 OcclusionTracker occlusion_tracker(gfx::Rect(), false); | |
547 | |
548 scrollbar_layer->SetTexturePriorities(calculator); | |
549 layer_tree_host_->contents_texture_manager()->PrioritizeTextures(); | |
550 scrollbar_layer->Update(&queue, &occlusion_tracker); | |
551 EXPECT_EQ(expected_resources, queue.PartialUploadSize()); | |
552 | |
553 // Verify that we have not generated any content uploads that are larger | |
554 // than their destination textures. | |
555 while (queue.HasMoreUpdates()) { | |
556 ResourceUpdate update = queue.TakeFirstPartialUpload(); | |
557 EXPECT_LE(update.texture->size().width(), | |
558 scrollbar_layer->content_bounds().width()); | |
559 EXPECT_LE(update.texture->size().height(), | |
560 scrollbar_layer->content_bounds().height()); | |
561 | |
562 EXPECT_LE(update.dest_offset.x() + update.content_rect.width(), | |
563 update.texture->size().width()); | |
564 EXPECT_LE(update.dest_offset.y() + update.content_rect.height(), | |
565 update.texture->size().height()); | |
566 } | |
567 | |
568 testing::Mock::VerifyAndClearExpectations(layer_tree_host_.get()); | |
569 } | |
570 | |
571 protected: | |
572 FakeLayerTreeHostClient fake_client_; | |
573 LayerTreeSettings layer_tree_settings_; | |
574 scoped_ptr<MockLayerTreeHost> layer_tree_host_; | |
575 }; | |
576 | |
577 TEST_F(ScaledScrollbarLayerTestResourceCreation, ScaledResourceUpload) { | |
578 layer_tree_settings_.solid_color_scrollbars = false; | |
579 // Pick a test scale that moves the scrollbar's (non-zero) position to | |
580 // a non-pixel-aligned location. | |
581 TestResourceUpload(2, 1.41f); | |
582 } | 536 } |
583 | 537 |
584 } // namespace | 538 } // namespace |
585 } // namespace cc | 539 } // namespace cc |
OLD | NEW |