Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(115)

Side by Side Diff: cc/layers/scrollbar_layer_unittest.cc

Issue 18191020: UI Resource Manager (Closed) Base URL: https://src.chromium.org/chrome/trunk/src/
Patch Set: Created 7 years, 5 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
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
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
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
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698