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

Side by Side Diff: cc/output/overlay_unittest.cc

Issue 1330563004: Avoid Copying damage rect when using Overlays (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Remove blending checks Created 5 years, 1 month 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
« no previous file with comments | « cc/output/overlay_strategy_underlay.cc ('k') | no next file » | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 // Copyright 2014 The Chromium Authors. All rights reserved. 1 // Copyright 2014 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/base/region.h" 5 #include "cc/base/region.h"
6 #include "cc/base/scoped_ptr_vector.h" 6 #include "cc/base/scoped_ptr_vector.h"
7 #include "cc/output/compositor_frame_metadata.h" 7 #include "cc/output/compositor_frame_metadata.h"
8 #include "cc/output/gl_renderer.h" 8 #include "cc/output/gl_renderer.h"
9 #include "cc/output/output_surface.h" 9 #include "cc/output/output_surface.h"
10 #include "cc/output/output_surface_client.h" 10 #include "cc/output/output_surface_client.h"
(...skipping 348 matching lines...) Expand 10 before | Expand all | Expand 10 after
359 overlay_processor_.reset(new OverlayProcessor(output_surface_.get())); 359 overlay_processor_.reset(new OverlayProcessor(output_surface_.get()));
360 overlay_processor_->Initialize(); 360 overlay_processor_->Initialize();
361 } 361 }
362 362
363 scoped_refptr<TestContextProvider> provider_; 363 scoped_refptr<TestContextProvider> provider_;
364 scoped_ptr<OverlayOutputSurface> output_surface_; 364 scoped_ptr<OverlayOutputSurface> output_surface_;
365 FakeOutputSurfaceClient client_; 365 FakeOutputSurfaceClient client_;
366 scoped_ptr<SharedBitmapManager> shared_bitmap_manager_; 366 scoped_ptr<SharedBitmapManager> shared_bitmap_manager_;
367 scoped_ptr<ResourceProvider> resource_provider_; 367 scoped_ptr<ResourceProvider> resource_provider_;
368 scoped_ptr<OverlayProcessor> overlay_processor_; 368 scoped_ptr<OverlayProcessor> overlay_processor_;
369 gfx::Rect damage_rect_;
369 }; 370 };
370 371
371 typedef OverlayTest<SingleOnTopOverlayValidator> SingleOverlayOnTopTest; 372 typedef OverlayTest<SingleOnTopOverlayValidator> SingleOverlayOnTopTest;
372 typedef OverlayTest<UnderlayOverlayValidator> UnderlayTest; 373 typedef OverlayTest<UnderlayOverlayValidator> UnderlayTest;
373 typedef OverlayTest<SandwichOverlayValidator> SandwichTest; 374 typedef OverlayTest<SandwichOverlayValidator> SandwichTest;
374 typedef OverlayTest<AllOrNothingOverlayValidator> AllOrNothingOverlayTest; 375 typedef OverlayTest<AllOrNothingOverlayValidator> AllOrNothingOverlayTest;
375 376
376 TEST(OverlayTest, NoOverlaysByDefault) { 377 TEST(OverlayTest, NoOverlaysByDefault) {
377 scoped_refptr<TestContextProvider> provider = TestContextProvider::Create(); 378 scoped_refptr<TestContextProvider> provider = TestContextProvider::Create();
378 OverlayOutputSurface output_surface(provider); 379 OverlayOutputSurface output_surface(provider);
(...skipping 33 matching lines...) Expand 10 before | Expand all | Expand 10 after
412 pass->shared_quad_state_list.back(), pass.get()); 413 pass->shared_quad_state_list.back(), pass.get());
413 CreateFullscreenOpaqueQuad(resource_provider_.get(), 414 CreateFullscreenOpaqueQuad(resource_provider_.get(),
414 pass->shared_quad_state_list.back(), pass.get()); 415 pass->shared_quad_state_list.back(), pass.get());
415 416
416 RenderPassList pass_list; 417 RenderPassList pass_list;
417 pass_list.push_back(pass.Pass()); 418 pass_list.push_back(pass.Pass());
418 419
419 // Check for potential candidates. 420 // Check for potential candidates.
420 OverlayCandidateList candidate_list; 421 OverlayCandidateList candidate_list;
421 overlay_processor_->ProcessForOverlays(resource_provider_.get(), &pass_list, 422 overlay_processor_->ProcessForOverlays(resource_provider_.get(), &pass_list,
422 &candidate_list); 423 &candidate_list, &damage_rect_);
423 424
424 ASSERT_EQ(1U, pass_list.size()); 425 ASSERT_EQ(1U, pass_list.size());
425 ASSERT_EQ(1U, candidate_list.size()); 426 ASSERT_EQ(1U, candidate_list.size());
426 427
427 RenderPass* main_pass = pass_list.back(); 428 RenderPass* main_pass = pass_list.back();
428 // Check that the quad is gone. 429 // Check that the quad is gone.
429 EXPECT_EQ(2U, main_pass->quad_list.size()); 430 EXPECT_EQ(2U, main_pass->quad_list.size());
430 const QuadList& quad_list = main_pass->quad_list; 431 const QuadList& quad_list = main_pass->quad_list;
431 for (QuadList::ConstBackToFrontIterator it = quad_list.BackToFrontBegin(); 432 for (QuadList::ConstBackToFrontIterator it = quad_list.BackToFrontBegin();
432 it != quad_list.BackToFrontEnd(); ++it) { 433 it != quad_list.BackToFrontEnd(); ++it) {
(...skipping 21 matching lines...) Expand all
454 pass->shared_quad_state_list.back(), pass.get()); 455 pass->shared_quad_state_list.back(), pass.get());
455 CreateFullscreenOpaqueQuad(resource_provider_.get(), 456 CreateFullscreenOpaqueQuad(resource_provider_.get(),
456 pass->shared_quad_state_list.back(), pass.get()); 457 pass->shared_quad_state_list.back(), pass.get());
457 458
458 RenderPassList pass_list; 459 RenderPassList pass_list;
459 pass_list.push_back(pass.Pass()); 460 pass_list.push_back(pass.Pass());
460 461
461 // Check for potential candidates. 462 // Check for potential candidates.
462 OverlayCandidateList candidate_list; 463 OverlayCandidateList candidate_list;
463 overlay_processor_->ProcessForOverlays(resource_provider_.get(), &pass_list, 464 overlay_processor_->ProcessForOverlays(resource_provider_.get(), &pass_list,
464 &candidate_list); 465 &candidate_list, &damage_rect_);
465 466
466 // Ensure that the display and uv rects have cropping applied to them. 467 // Ensure that the display and uv rects have cropping applied to them.
467 ASSERT_EQ(1U, pass_list.size()); 468 ASSERT_EQ(1U, pass_list.size());
468 ASSERT_EQ(1U, candidate_list.size()); 469 ASSERT_EQ(1U, candidate_list.size());
469 EXPECT_EQ(candidate_id, candidate_list[0].resource_id); 470 EXPECT_EQ(candidate_id, candidate_list[0].resource_id);
470 EXPECT_EQ(gfx::RectF(0.f, 32.f, 64.f, 64.f), candidate_list[0].display_rect); 471 EXPECT_EQ(gfx::RectF(0.f, 32.f, 64.f, 64.f), candidate_list[0].display_rect);
471 EXPECT_EQ(gfx::RectF(0.f, 0.25f, 0.5f, 0.5f), candidate_list[0].uv_rect); 472 EXPECT_EQ(gfx::RectF(0.f, 0.25f, 0.5f, 0.5f), candidate_list[0].uv_rect);
472 } 473 }
473 474
474 TEST_F(SandwichTest, SuccessfulTwoOverlays) { 475 TEST_F(SandwichTest, SuccessfulTwoOverlays) {
475 scoped_ptr<RenderPass> pass = CreateRenderPass(); 476 scoped_ptr<RenderPass> pass = CreateRenderPass();
476 477
477 // Add two non-overlapping candidates. 478 // Add two non-overlapping candidates.
478 CreateCandidateQuadAt(resource_provider_.get(), 479 CreateCandidateQuadAt(resource_provider_.get(),
479 pass->shared_quad_state_list.back(), pass.get(), 480 pass->shared_quad_state_list.back(), pass.get(),
480 kOverlayTopLeftRect); 481 kOverlayTopLeftRect);
481 CreateCandidateQuadAt(resource_provider_.get(), 482 CreateCandidateQuadAt(resource_provider_.get(),
482 pass->shared_quad_state_list.back(), pass.get(), 483 pass->shared_quad_state_list.back(), pass.get(),
483 kOverlayBottomRightRect); 484 kOverlayBottomRightRect);
484 485
485 // Add something behind it. 486 // Add something behind it.
486 CreateFullscreenOpaqueQuad(resource_provider_.get(), 487 CreateFullscreenOpaqueQuad(resource_provider_.get(),
487 pass->shared_quad_state_list.back(), pass.get()); 488 pass->shared_quad_state_list.back(), pass.get());
488 489
489 RenderPassList pass_list; 490 RenderPassList pass_list;
490 pass_list.push_back(pass.Pass()); 491 pass_list.push_back(pass.Pass());
491 OverlayCandidateList candidate_list; 492 OverlayCandidateList candidate_list;
492 overlay_processor_->ProcessForOverlays(resource_provider_.get(), &pass_list, 493 overlay_processor_->ProcessForOverlays(resource_provider_.get(), &pass_list,
493 &candidate_list); 494 &candidate_list, &damage_rect_);
494 495
495 // Both candidates should become overlays. 496 // Both candidates should become overlays.
496 EXPECT_EQ(1u, pass_list.size()); 497 EXPECT_EQ(1u, pass_list.size());
497 EXPECT_EQ(2u, candidate_list.size()); 498 EXPECT_EQ(2u, candidate_list.size());
498 EXPECT_EQ(gfx::RectF(kOverlayTopLeftRect), candidate_list[0].display_rect); 499 EXPECT_EQ(gfx::RectF(kOverlayTopLeftRect), candidate_list[0].display_rect);
499 EXPECT_EQ(gfx::RectF(kOverlayBottomRightRect), 500 EXPECT_EQ(gfx::RectF(kOverlayBottomRightRect),
500 candidate_list[1].display_rect); 501 candidate_list[1].display_rect);
501 502
502 // The overlay quads should be gone. 503 // The overlay quads should be gone.
503 const QuadList& quad_list = pass_list.back()->quad_list; 504 const QuadList& quad_list = pass_list.back()->quad_list;
(...skipping 13 matching lines...) Expand all
517 kOverlayRect); 518 kOverlayRect);
518 519
519 // Add something behind it. 520 // Add something behind it.
520 CreateFullscreenOpaqueQuad(resource_provider_.get(), 521 CreateFullscreenOpaqueQuad(resource_provider_.get(),
521 pass->shared_quad_state_list.back(), pass.get()); 522 pass->shared_quad_state_list.back(), pass.get());
522 523
523 RenderPassList pass_list; 524 RenderPassList pass_list;
524 pass_list.push_back(pass.Pass()); 525 pass_list.push_back(pass.Pass());
525 OverlayCandidateList candidate_list; 526 OverlayCandidateList candidate_list;
526 overlay_processor_->ProcessForOverlays(resource_provider_.get(), &pass_list, 527 overlay_processor_->ProcessForOverlays(resource_provider_.get(), &pass_list,
527 &candidate_list); 528 &candidate_list, &damage_rect_);
528 529
529 // Only one of the candidates should become an overlay. 530 // Only one of the candidates should become an overlay.
530 EXPECT_EQ(1u, pass_list.size()); 531 EXPECT_EQ(1u, pass_list.size());
531 EXPECT_EQ(1u, candidate_list.size()); 532 EXPECT_EQ(1u, candidate_list.size());
532 EXPECT_EQ(gfx::RectF(kOverlayTopLeftRect), candidate_list[0].display_rect); 533 EXPECT_EQ(gfx::RectF(kOverlayTopLeftRect), candidate_list[0].display_rect);
533 534
534 // One of the overlay quads should be gone. 535 // One of the overlay quads should be gone.
535 const QuadList& quad_list = pass_list.back()->quad_list; 536 const QuadList& quad_list = pass_list.back()->quad_list;
536 EXPECT_EQ(2u, quad_list.size()); 537 EXPECT_EQ(2u, quad_list.size());
537 EXPECT_EQ(DrawQuad::TEXTURE_CONTENT, quad_list.front()->material); 538 EXPECT_EQ(DrawQuad::TEXTURE_CONTENT, quad_list.front()->material);
(...skipping 14 matching lines...) Expand all
552 CreateOpaqueQuadAt(resource_provider_.get(), 553 CreateOpaqueQuadAt(resource_provider_.get(),
553 pass->shared_quad_state_list.back(), pass.get(), 554 pass->shared_quad_state_list.back(), pass.get(),
554 gfx::Rect(kDisplaySize)); 555 gfx::Rect(kDisplaySize));
555 556
556 RenderPassList pass_list; 557 RenderPassList pass_list;
557 pass_list.push_back(pass.Pass()); 558 pass_list.push_back(pass.Pass());
558 559
559 // Check for potential candidates. 560 // Check for potential candidates.
560 OverlayCandidateList candidate_list; 561 OverlayCandidateList candidate_list;
561 overlay_processor_->ProcessForOverlays(resource_provider_.get(), &pass_list, 562 overlay_processor_->ProcessForOverlays(resource_provider_.get(), &pass_list,
562 &candidate_list); 563 &candidate_list, &damage_rect_);
563
564 ASSERT_EQ(1U, pass_list.size()); 564 ASSERT_EQ(1U, pass_list.size());
565 ASSERT_EQ(2U, candidate_list.size()); 565 ASSERT_EQ(2U, candidate_list.size());
566 566
567 RenderPass* main_pass = pass_list.back(); 567 RenderPass* main_pass = pass_list.back();
568 // Check that the quad is gone. 568 // Check that the quad is gone.
569 EXPECT_EQ(3U, main_pass->quad_list.size()); 569 EXPECT_EQ(3U, main_pass->quad_list.size());
570 const QuadList& quad_list = main_pass->quad_list; 570 const QuadList& quad_list = main_pass->quad_list;
571 for (QuadList::ConstBackToFrontIterator it = quad_list.BackToFrontBegin(); 571 for (QuadList::ConstBackToFrontIterator it = quad_list.BackToFrontBegin();
572 it != quad_list.BackToFrontEnd(); ++it) { 572 it != quad_list.BackToFrontEnd(); ++it) {
573 EXPECT_NE(DrawQuad::TEXTURE_CONTENT, it->material); 573 EXPECT_NE(DrawQuad::TEXTURE_CONTENT, it->material);
(...skipping 34 matching lines...) Expand 10 before | Expand all | Expand 10 after
608 gfx::Rect(kDisplaySize)); 608 gfx::Rect(kDisplaySize));
609 609
610 RenderPassList pass_list; 610 RenderPassList pass_list;
611 pass_list.push_back(pass.Pass()); 611 pass_list.push_back(pass.Pass());
612 612
613 // Run the overlay strategy on that input. 613 // Run the overlay strategy on that input.
614 RenderPass* main_pass = pass_list.back(); 614 RenderPass* main_pass = pass_list.back();
615 OverlayCandidateList candidate_list; 615 OverlayCandidateList candidate_list;
616 EXPECT_EQ(4U, main_pass->quad_list.size()); 616 EXPECT_EQ(4U, main_pass->quad_list.size());
617 overlay_processor_->ProcessForOverlays(resource_provider_.get(), &pass_list, 617 overlay_processor_->ProcessForOverlays(resource_provider_.get(), &pass_list,
618 &candidate_list); 618 &candidate_list, &damage_rect_);
619 ASSERT_EQ(1U, pass_list.size()); 619 ASSERT_EQ(1U, pass_list.size());
620 ASSERT_EQ(3U, candidate_list.size()); 620 ASSERT_EQ(3U, candidate_list.size());
621 621
622 // Check that the candidate quad is gone and that we now have two transparent 622 // Check that the candidate quad is gone and that we now have two transparent
623 // quads for the same region that was covered on the overlay. 623 // quads for the same region that was covered on the overlay.
624 EXPECT_EQ(5U, main_pass->quad_list.size()); 624 EXPECT_EQ(5U, main_pass->quad_list.size());
625 const QuadList& quad_list = main_pass->quad_list; 625 const QuadList& quad_list = main_pass->quad_list;
626 Region transparent_quad_region; 626 Region transparent_quad_region;
627 for (QuadList::ConstBackToFrontIterator it = quad_list.BackToFrontBegin(); 627 for (QuadList::ConstBackToFrontIterator it = quad_list.BackToFrontBegin();
628 it != quad_list.BackToFrontEnd(); ++it) { 628 it != quad_list.BackToFrontEnd(); ++it) {
(...skipping 11 matching lines...) Expand all
640 EXPECT_EQ(candidate_id, candidate_list[0].resource_id); 640 EXPECT_EQ(candidate_id, candidate_list[0].resource_id);
641 EXPECT_EQ(gfx::RectF(64.f, 64.f), candidate_list[0].display_rect); 641 EXPECT_EQ(gfx::RectF(64.f, 64.f), candidate_list[0].display_rect);
642 EXPECT_TRUE(candidate_list[1].use_output_surface_for_resource); 642 EXPECT_TRUE(candidate_list[1].use_output_surface_for_resource);
643 EXPECT_TRUE(candidate_list[2].use_output_surface_for_resource); 643 EXPECT_TRUE(candidate_list[2].use_output_surface_for_resource);
644 Region overlay_region; 644 Region overlay_region;
645 overlay_region.Union(gfx::ToEnclosingRect(candidate_list[1].display_rect)); 645 overlay_region.Union(gfx::ToEnclosingRect(candidate_list[1].display_rect));
646 overlay_region.Union(gfx::ToEnclosingRect(candidate_list[2].display_rect)); 646 overlay_region.Union(gfx::ToEnclosingRect(candidate_list[2].display_rect));
647 DCHECK(covered_region == overlay_region); 647 DCHECK(covered_region == overlay_region);
648 } 648 }
649 649
650 TEST_F(SandwichTest, DamageRect) {
651 scoped_ptr<RenderPass> pass = CreateRenderPass();
652 CreateFullscreenCandidateQuad(resource_provider_.get(),
653 pass->shared_quad_state_list.back(),
654 pass.get());
655
656 damage_rect_ = kOverlayRect;
657
658 // Add something behind it.
659 CreateFullscreenOpaqueQuad(resource_provider_.get(),
660 pass->shared_quad_state_list.back(), pass.get());
661 CreateFullscreenOpaqueQuad(resource_provider_.get(),
662 pass->shared_quad_state_list.back(), pass.get());
663
664 RenderPassList pass_list;
665 pass_list.push_back(pass.Pass());
666
667 // Check for potential candidates.
668 OverlayCandidateList candidate_list;
669
670 // Primary plane.
671 OverlayCandidate output_surface_plane;
672 output_surface_plane.display_rect = gfx::RectF(kOverlayRect);
673 output_surface_plane.quad_rect_in_target_space = kOverlayRect;
674 output_surface_plane.use_output_surface_for_resource = true;
675 output_surface_plane.overlay_handled = true;
676 candidate_list.push_back(output_surface_plane);
677
678 overlay_processor_->ProcessForOverlays(resource_provider_.get(), &pass_list,
679 &candidate_list, &damage_rect_);
680 DCHECK(!damage_rect_.IsEmpty());
681 }
682
650 TEST_F(SingleOverlayOnTopTest, SuccessfullOverlay) { 683 TEST_F(SingleOverlayOnTopTest, SuccessfullOverlay) {
651 scoped_ptr<RenderPass> pass = CreateRenderPass(); 684 scoped_ptr<RenderPass> pass = CreateRenderPass();
652 TextureDrawQuad* original_quad = 685 TextureDrawQuad* original_quad =
653 CreateFullscreenCandidateQuad(resource_provider_.get(), 686 CreateFullscreenCandidateQuad(resource_provider_.get(),
654 pass->shared_quad_state_list.back(), 687 pass->shared_quad_state_list.back(),
655 pass.get()); 688 pass.get());
656 unsigned original_resource_id = original_quad->resource_id(); 689 unsigned original_resource_id = original_quad->resource_id();
657 690
658 // Add something behind it. 691 // Add something behind it.
659 CreateFullscreenOpaqueQuad(resource_provider_.get(), 692 CreateFullscreenOpaqueQuad(resource_provider_.get(),
660 pass->shared_quad_state_list.back(), pass.get()); 693 pass->shared_quad_state_list.back(), pass.get());
661 CreateFullscreenOpaqueQuad(resource_provider_.get(), 694 CreateFullscreenOpaqueQuad(resource_provider_.get(),
662 pass->shared_quad_state_list.back(), pass.get()); 695 pass->shared_quad_state_list.back(), pass.get());
663 696
664 RenderPassList pass_list; 697 RenderPassList pass_list;
665 pass_list.push_back(pass.Pass()); 698 pass_list.push_back(pass.Pass());
666 699
667 // Check for potential candidates. 700 // Check for potential candidates.
668 OverlayCandidateList candidate_list; 701 OverlayCandidateList candidate_list;
669 overlay_processor_->ProcessForOverlays(resource_provider_.get(), &pass_list, 702 overlay_processor_->ProcessForOverlays(resource_provider_.get(), &pass_list,
670 &candidate_list); 703 &candidate_list, &damage_rect_);
671 704
672 ASSERT_EQ(1U, pass_list.size()); 705 ASSERT_EQ(1U, pass_list.size());
673 ASSERT_EQ(1U, candidate_list.size()); 706 ASSERT_EQ(1U, candidate_list.size());
674 707
675 RenderPass* main_pass = pass_list.back(); 708 RenderPass* main_pass = pass_list.back();
676 // Check that the quad is gone. 709 // Check that the quad is gone.
677 EXPECT_EQ(2U, main_pass->quad_list.size()); 710 EXPECT_EQ(2U, main_pass->quad_list.size());
678 const QuadList& quad_list = main_pass->quad_list; 711 const QuadList& quad_list = main_pass->quad_list;
679 for (QuadList::ConstBackToFrontIterator it = quad_list.BackToFrontBegin(); 712 for (QuadList::ConstBackToFrontIterator it = quad_list.BackToFrontBegin();
680 it != quad_list.BackToFrontEnd(); 713 it != quad_list.BackToFrontEnd();
681 ++it) { 714 ++it) {
682 EXPECT_NE(DrawQuad::TEXTURE_CONTENT, it->material); 715 EXPECT_NE(DrawQuad::TEXTURE_CONTENT, it->material);
683 } 716 }
684 717
685 // Check that the right resource id got extracted. 718 // Check that the right resource id got extracted.
686 EXPECT_EQ(original_resource_id, candidate_list.back().resource_id); 719 EXPECT_EQ(original_resource_id, candidate_list.back().resource_id);
687 } 720 }
688 721
722 TEST_F(SingleOverlayOnTopTest, DamageRect) {
723 scoped_ptr<RenderPass> pass = CreateRenderPass();
724 CreateFullscreenCandidateQuad(resource_provider_.get(),
725 pass->shared_quad_state_list.back(),
726 pass.get());
727 damage_rect_ = kOverlayRect;
728
729 // Add something behind it.
730 CreateFullscreenOpaqueQuad(resource_provider_.get(),
731 pass->shared_quad_state_list.back(), pass.get());
732 CreateFullscreenOpaqueQuad(resource_provider_.get(),
733 pass->shared_quad_state_list.back(), pass.get());
734
735 RenderPassList pass_list;
736 pass_list.push_back(pass.Pass());
737
738 // Check for potential candidates.
739 OverlayCandidateList candidate_list;
740
741 // Primary plane.
742 OverlayCandidate output_surface_plane;
743 output_surface_plane.display_rect = gfx::RectF(kOverlayRect);
744 output_surface_plane.quad_rect_in_target_space = kOverlayRect;
745 output_surface_plane.use_output_surface_for_resource = true;
746 output_surface_plane.overlay_handled = true;
747 candidate_list.push_back(output_surface_plane);
748
749 overlay_processor_->ProcessForOverlays(resource_provider_.get(), &pass_list,
750 &candidate_list, &damage_rect_);
751 DCHECK(damage_rect_.IsEmpty());
752 }
753
689 TEST_F(SingleOverlayOnTopTest, NoCandidates) { 754 TEST_F(SingleOverlayOnTopTest, NoCandidates) {
690 scoped_ptr<RenderPass> pass = CreateRenderPass(); 755 scoped_ptr<RenderPass> pass = CreateRenderPass();
691 CreateFullscreenOpaqueQuad(resource_provider_.get(), 756 CreateFullscreenOpaqueQuad(resource_provider_.get(),
692 pass->shared_quad_state_list.back(), pass.get()); 757 pass->shared_quad_state_list.back(), pass.get());
693 CreateFullscreenOpaqueQuad(resource_provider_.get(), 758 CreateFullscreenOpaqueQuad(resource_provider_.get(),
694 pass->shared_quad_state_list.back(), pass.get()); 759 pass->shared_quad_state_list.back(), pass.get());
695 760
696 RenderPassList pass_list; 761 RenderPassList pass_list;
697 pass_list.push_back(pass.Pass()); 762 pass_list.push_back(pass.Pass());
698 763
699 RenderPassList original_pass_list; 764 RenderPassList original_pass_list;
700 RenderPass::CopyAll(pass_list, &original_pass_list); 765 RenderPass::CopyAll(pass_list, &original_pass_list);
701 766
702 OverlayCandidateList candidate_list; 767 OverlayCandidateList candidate_list;
703 overlay_processor_->ProcessForOverlays(resource_provider_.get(), &pass_list, 768 overlay_processor_->ProcessForOverlays(resource_provider_.get(), &pass_list,
704 &candidate_list); 769 &candidate_list, &damage_rect_);
705 EXPECT_EQ(0U, candidate_list.size()); 770 EXPECT_EQ(0U, candidate_list.size());
706 // There should be nothing new here. 771 // There should be nothing new here.
707 CompareRenderPassLists(pass_list, original_pass_list); 772 CompareRenderPassLists(pass_list, original_pass_list);
708 } 773 }
709 774
710 TEST_F(SingleOverlayOnTopTest, OccludedCandidates) { 775 TEST_F(SingleOverlayOnTopTest, OccludedCandidates) {
711 scoped_ptr<RenderPass> pass = CreateRenderPass(); 776 scoped_ptr<RenderPass> pass = CreateRenderPass();
712 CreateFullscreenOpaqueQuad(resource_provider_.get(), 777 CreateFullscreenOpaqueQuad(resource_provider_.get(),
713 pass->shared_quad_state_list.back(), pass.get()); 778 pass->shared_quad_state_list.back(), pass.get());
714 CreateFullscreenOpaqueQuad(resource_provider_.get(), 779 CreateFullscreenOpaqueQuad(resource_provider_.get(),
715 pass->shared_quad_state_list.back(), pass.get()); 780 pass->shared_quad_state_list.back(), pass.get());
716 781
717 CreateFullscreenCandidateQuad(resource_provider_.get(), 782 CreateFullscreenCandidateQuad(resource_provider_.get(),
718 pass->shared_quad_state_list.back(), 783 pass->shared_quad_state_list.back(),
719 pass.get()); 784 pass.get());
720 785
721 RenderPassList pass_list; 786 RenderPassList pass_list;
722 pass_list.push_back(pass.Pass()); 787 pass_list.push_back(pass.Pass());
723 788
724 RenderPassList original_pass_list; 789 RenderPassList original_pass_list;
725 RenderPass::CopyAll(pass_list, &original_pass_list); 790 RenderPass::CopyAll(pass_list, &original_pass_list);
726 791
727 OverlayCandidateList candidate_list; 792 OverlayCandidateList candidate_list;
728 overlay_processor_->ProcessForOverlays(resource_provider_.get(), &pass_list, 793 overlay_processor_->ProcessForOverlays(resource_provider_.get(), &pass_list,
729 &candidate_list); 794 &candidate_list, &damage_rect_);
730 EXPECT_EQ(0U, candidate_list.size()); 795 EXPECT_EQ(0U, candidate_list.size());
731 // There should be nothing new here. 796 // There should be nothing new here.
732 CompareRenderPassLists(pass_list, original_pass_list); 797 CompareRenderPassLists(pass_list, original_pass_list);
733 } 798 }
734 799
735 // Test with multiple render passes. 800 // Test with multiple render passes.
736 TEST_F(SingleOverlayOnTopTest, MultipleRenderPasses) { 801 TEST_F(SingleOverlayOnTopTest, MultipleRenderPasses) {
737 RenderPassList pass_list; 802 RenderPassList pass_list;
738 pass_list.push_back(CreateRenderPass()); 803 pass_list.push_back(CreateRenderPass());
739 804
740 scoped_ptr<RenderPass> pass = CreateRenderPass(); 805 scoped_ptr<RenderPass> pass = CreateRenderPass();
741 CreateFullscreenCandidateQuad(resource_provider_.get(), 806 CreateFullscreenCandidateQuad(resource_provider_.get(),
742 pass->shared_quad_state_list.back(), 807 pass->shared_quad_state_list.back(),
743 pass.get()); 808 pass.get());
744 809
745 // Add something behind it. 810 // Add something behind it.
746 CreateFullscreenOpaqueQuad(resource_provider_.get(), 811 CreateFullscreenOpaqueQuad(resource_provider_.get(),
747 pass->shared_quad_state_list.back(), pass.get()); 812 pass->shared_quad_state_list.back(), pass.get());
748 CreateFullscreenOpaqueQuad(resource_provider_.get(), 813 CreateFullscreenOpaqueQuad(resource_provider_.get(),
749 pass->shared_quad_state_list.back(), pass.get()); 814 pass->shared_quad_state_list.back(), pass.get());
750 815
751 pass_list.push_back(pass.Pass()); 816 pass_list.push_back(pass.Pass());
752 817
753 RenderPassList original_pass_list; 818 RenderPassList original_pass_list;
754 RenderPass::CopyAll(pass_list, &original_pass_list); 819 RenderPass::CopyAll(pass_list, &original_pass_list);
755 820
756 // Check for potential candidates. 821 // Check for potential candidates.
757 OverlayCandidateList candidate_list; 822 OverlayCandidateList candidate_list;
758 overlay_processor_->ProcessForOverlays(resource_provider_.get(), &pass_list, 823 overlay_processor_->ProcessForOverlays(resource_provider_.get(), &pass_list,
759 &candidate_list); 824 &candidate_list, &damage_rect_);
760 EXPECT_EQ(1U, candidate_list.size()); 825 EXPECT_EQ(1U, candidate_list.size());
761 826
762 // This should be the same. 827 // This should be the same.
763 ASSERT_EQ(2U, pass_list.size()); 828 ASSERT_EQ(2U, pass_list.size());
764 } 829 }
765 830
766 TEST_F(SingleOverlayOnTopTest, RejectPremultipliedAlpha) { 831 TEST_F(SingleOverlayOnTopTest, RejectPremultipliedAlpha) {
767 scoped_ptr<RenderPass> pass = CreateRenderPass(); 832 scoped_ptr<RenderPass> pass = CreateRenderPass();
768 TextureDrawQuad* quad = 833 TextureDrawQuad* quad =
769 CreateFullscreenCandidateQuad(resource_provider_.get(), 834 CreateFullscreenCandidateQuad(resource_provider_.get(),
770 pass->shared_quad_state_list.back(), 835 pass->shared_quad_state_list.back(),
771 pass.get()); 836 pass.get());
772 quad->premultiplied_alpha = true; 837 quad->premultiplied_alpha = true;
773 838
774 RenderPassList pass_list; 839 RenderPassList pass_list;
775 pass_list.push_back(pass.Pass()); 840 pass_list.push_back(pass.Pass());
776 OverlayCandidateList candidate_list; 841 OverlayCandidateList candidate_list;
777 overlay_processor_->ProcessForOverlays(resource_provider_.get(), &pass_list, 842 overlay_processor_->ProcessForOverlays(resource_provider_.get(), &pass_list,
778 &candidate_list); 843 &candidate_list, &damage_rect_);
779 EXPECT_EQ(1U, pass_list.size()); 844 EXPECT_EQ(1U, pass_list.size());
780 EXPECT_EQ(0U, candidate_list.size()); 845 EXPECT_EQ(0U, candidate_list.size());
781 } 846 }
782 847
783 TEST_F(SingleOverlayOnTopTest, RejectBlending) { 848 TEST_F(SingleOverlayOnTopTest, RejectBlending) {
784 scoped_ptr<RenderPass> pass = CreateRenderPass(); 849 scoped_ptr<RenderPass> pass = CreateRenderPass();
785 TextureDrawQuad* quad = 850 TextureDrawQuad* quad =
786 CreateFullscreenCandidateQuad(resource_provider_.get(), 851 CreateFullscreenCandidateQuad(resource_provider_.get(),
787 pass->shared_quad_state_list.back(), 852 pass->shared_quad_state_list.back(),
788 pass.get()); 853 pass.get());
789 quad->needs_blending = true; 854 quad->needs_blending = true;
790 855
791 RenderPassList pass_list; 856 RenderPassList pass_list;
792 pass_list.push_back(pass.Pass()); 857 pass_list.push_back(pass.Pass());
793 OverlayCandidateList candidate_list; 858 OverlayCandidateList candidate_list;
794 overlay_processor_->ProcessForOverlays(resource_provider_.get(), &pass_list, 859 overlay_processor_->ProcessForOverlays(resource_provider_.get(), &pass_list,
795 &candidate_list); 860 &candidate_list, &damage_rect_);
796 ASSERT_EQ(1U, pass_list.size()); 861 ASSERT_EQ(1U, pass_list.size());
797 EXPECT_EQ(0U, candidate_list.size()); 862 EXPECT_EQ(0U, candidate_list.size());
798 } 863 }
799 864
800 TEST_F(SingleOverlayOnTopTest, RejectBackgroundColor) { 865 TEST_F(SingleOverlayOnTopTest, RejectBackgroundColor) {
801 scoped_ptr<RenderPass> pass = CreateRenderPass(); 866 scoped_ptr<RenderPass> pass = CreateRenderPass();
802 TextureDrawQuad* quad = 867 TextureDrawQuad* quad =
803 CreateFullscreenCandidateQuad(resource_provider_.get(), 868 CreateFullscreenCandidateQuad(resource_provider_.get(),
804 pass->shared_quad_state_list.back(), 869 pass->shared_quad_state_list.back(),
805 pass.get()); 870 pass.get());
806 quad->background_color = SK_ColorBLACK; 871 quad->background_color = SK_ColorBLACK;
807 872
808 RenderPassList pass_list; 873 RenderPassList pass_list;
809 pass_list.push_back(pass.Pass()); 874 pass_list.push_back(pass.Pass());
810 OverlayCandidateList candidate_list; 875 OverlayCandidateList candidate_list;
811 overlay_processor_->ProcessForOverlays(resource_provider_.get(), &pass_list, 876 overlay_processor_->ProcessForOverlays(resource_provider_.get(), &pass_list,
812 &candidate_list); 877 &candidate_list, &damage_rect_);
813 ASSERT_EQ(1U, pass_list.size()); 878 ASSERT_EQ(1U, pass_list.size());
814 EXPECT_EQ(0U, candidate_list.size()); 879 EXPECT_EQ(0U, candidate_list.size());
815 } 880 }
816 881
817 TEST_F(SingleOverlayOnTopTest, RejectBlendMode) { 882 TEST_F(SingleOverlayOnTopTest, RejectBlendMode) {
818 scoped_ptr<RenderPass> pass = CreateRenderPass(); 883 scoped_ptr<RenderPass> pass = CreateRenderPass();
819 CreateFullscreenCandidateQuad(resource_provider_.get(), 884 CreateFullscreenCandidateQuad(resource_provider_.get(),
820 pass->shared_quad_state_list.back(), 885 pass->shared_quad_state_list.back(),
821 pass.get()); 886 pass.get());
822 pass->shared_quad_state_list.back()->blend_mode = SkXfermode::kScreen_Mode; 887 pass->shared_quad_state_list.back()->blend_mode = SkXfermode::kScreen_Mode;
823 888
824 RenderPassList pass_list; 889 RenderPassList pass_list;
825 pass_list.push_back(pass.Pass()); 890 pass_list.push_back(pass.Pass());
826 OverlayCandidateList candidate_list; 891 OverlayCandidateList candidate_list;
827 overlay_processor_->ProcessForOverlays(resource_provider_.get(), &pass_list, 892 overlay_processor_->ProcessForOverlays(resource_provider_.get(), &pass_list,
828 &candidate_list); 893 &candidate_list, &damage_rect_);
829 ASSERT_EQ(1U, pass_list.size()); 894 ASSERT_EQ(1U, pass_list.size());
830 EXPECT_EQ(0U, candidate_list.size()); 895 EXPECT_EQ(0U, candidate_list.size());
831 } 896 }
832 897
833 TEST_F(SingleOverlayOnTopTest, RejectOpacity) { 898 TEST_F(SingleOverlayOnTopTest, RejectOpacity) {
834 scoped_ptr<RenderPass> pass = CreateRenderPass(); 899 scoped_ptr<RenderPass> pass = CreateRenderPass();
835 CreateFullscreenCandidateQuad(resource_provider_.get(), 900 CreateFullscreenCandidateQuad(resource_provider_.get(),
836 pass->shared_quad_state_list.back(), 901 pass->shared_quad_state_list.back(),
837 pass.get()); 902 pass.get());
838 pass->shared_quad_state_list.back()->opacity = 0.5f; 903 pass->shared_quad_state_list.back()->opacity = 0.5f;
839 904
840 RenderPassList pass_list; 905 RenderPassList pass_list;
841 pass_list.push_back(pass.Pass()); 906 pass_list.push_back(pass.Pass());
842 OverlayCandidateList candidate_list; 907 OverlayCandidateList candidate_list;
843 overlay_processor_->ProcessForOverlays(resource_provider_.get(), &pass_list, 908 overlay_processor_->ProcessForOverlays(resource_provider_.get(), &pass_list,
844 &candidate_list); 909 &candidate_list, &damage_rect_);
845 ASSERT_EQ(1U, pass_list.size()); 910 ASSERT_EQ(1U, pass_list.size());
846 EXPECT_EQ(0U, candidate_list.size()); 911 EXPECT_EQ(0U, candidate_list.size());
847 } 912 }
848 913
849 TEST_F(SingleOverlayOnTopTest, RejectNonAxisAlignedTransform) { 914 TEST_F(SingleOverlayOnTopTest, RejectNonAxisAlignedTransform) {
850 scoped_ptr<RenderPass> pass = CreateRenderPass(); 915 scoped_ptr<RenderPass> pass = CreateRenderPass();
851 CreateFullscreenCandidateQuad(resource_provider_.get(), 916 CreateFullscreenCandidateQuad(resource_provider_.get(),
852 pass->shared_quad_state_list.back(), 917 pass->shared_quad_state_list.back(),
853 pass.get()); 918 pass.get());
854 pass->shared_quad_state_list.back() 919 pass->shared_quad_state_list.back()
855 ->quad_to_target_transform.RotateAboutXAxis(45.f); 920 ->quad_to_target_transform.RotateAboutXAxis(45.f);
856 921
857 RenderPassList pass_list; 922 RenderPassList pass_list;
858 pass_list.push_back(pass.Pass()); 923 pass_list.push_back(pass.Pass());
859 OverlayCandidateList candidate_list; 924 OverlayCandidateList candidate_list;
860 overlay_processor_->ProcessForOverlays(resource_provider_.get(), &pass_list, 925 overlay_processor_->ProcessForOverlays(resource_provider_.get(), &pass_list,
861 &candidate_list); 926 &candidate_list, &damage_rect_);
862 ASSERT_EQ(1U, pass_list.size()); 927 ASSERT_EQ(1U, pass_list.size());
863 EXPECT_EQ(0U, candidate_list.size()); 928 EXPECT_EQ(0U, candidate_list.size());
864 } 929 }
865 930
866 TEST_F(SingleOverlayOnTopTest, AllowClipped) { 931 TEST_F(SingleOverlayOnTopTest, AllowClipped) {
867 scoped_ptr<RenderPass> pass = CreateRenderPass(); 932 scoped_ptr<RenderPass> pass = CreateRenderPass();
868 CreateFullscreenCandidateQuad(resource_provider_.get(), 933 CreateFullscreenCandidateQuad(resource_provider_.get(),
869 pass->shared_quad_state_list.back(), 934 pass->shared_quad_state_list.back(),
870 pass.get()); 935 pass.get());
871 pass->shared_quad_state_list.back()->is_clipped = true; 936 pass->shared_quad_state_list.back()->is_clipped = true;
872 pass->shared_quad_state_list.back()->clip_rect = kOverlayClipRect; 937 pass->shared_quad_state_list.back()->clip_rect = kOverlayClipRect;
873 938
874 RenderPassList pass_list; 939 RenderPassList pass_list;
875 pass_list.push_back(pass.Pass()); 940 pass_list.push_back(pass.Pass());
876 OverlayCandidateList candidate_list; 941 OverlayCandidateList candidate_list;
877 overlay_processor_->ProcessForOverlays(resource_provider_.get(), &pass_list, 942 overlay_processor_->ProcessForOverlays(resource_provider_.get(), &pass_list,
878 &candidate_list); 943 &candidate_list, &damage_rect_);
879 ASSERT_EQ(1U, pass_list.size()); 944 ASSERT_EQ(1U, pass_list.size());
880 EXPECT_EQ(1U, candidate_list.size()); 945 EXPECT_EQ(1U, candidate_list.size());
881 } 946 }
882 947
883 TEST_F(SingleOverlayOnTopTest, AllowVerticalFlip) { 948 TEST_F(SingleOverlayOnTopTest, AllowVerticalFlip) {
884 gfx::Rect rect = kOverlayRect; 949 gfx::Rect rect = kOverlayRect;
885 rect.set_width(rect.width() / 2); 950 rect.set_width(rect.width() / 2);
886 rect.Offset(0, -rect.height()); 951 rect.Offset(0, -rect.height());
887 scoped_ptr<RenderPass> pass = CreateRenderPass(); 952 scoped_ptr<RenderPass> pass = CreateRenderPass();
888 CreateCandidateQuadAt(resource_provider_.get(), 953 CreateCandidateQuadAt(resource_provider_.get(),
889 pass->shared_quad_state_list.back(), pass.get(), rect); 954 pass->shared_quad_state_list.back(), pass.get(), rect);
890 pass->shared_quad_state_list.back()->quad_to_target_transform.Scale(2.0f, 955 pass->shared_quad_state_list.back()->quad_to_target_transform.Scale(2.0f,
891 -1.0f); 956 -1.0f);
892 957
893 RenderPassList pass_list; 958 RenderPassList pass_list;
894 pass_list.push_back(pass.Pass()); 959 pass_list.push_back(pass.Pass());
895 OverlayCandidateList candidate_list; 960 OverlayCandidateList candidate_list;
896 overlay_processor_->ProcessForOverlays(resource_provider_.get(), &pass_list, 961 overlay_processor_->ProcessForOverlays(resource_provider_.get(), &pass_list,
897 &candidate_list); 962 &candidate_list, &damage_rect_);
898 ASSERT_EQ(1U, pass_list.size()); 963 ASSERT_EQ(1U, pass_list.size());
899 ASSERT_EQ(1U, candidate_list.size()); 964 ASSERT_EQ(1U, candidate_list.size());
900 EXPECT_EQ(gfx::OVERLAY_TRANSFORM_FLIP_VERTICAL, 965 EXPECT_EQ(gfx::OVERLAY_TRANSFORM_FLIP_VERTICAL,
901 candidate_list.back().transform); 966 candidate_list.back().transform);
902 } 967 }
903 968
904 TEST_F(SingleOverlayOnTopTest, AllowHorizontalFlip) { 969 TEST_F(SingleOverlayOnTopTest, AllowHorizontalFlip) {
905 gfx::Rect rect = kOverlayRect; 970 gfx::Rect rect = kOverlayRect;
906 rect.set_height(rect.height() / 2); 971 rect.set_height(rect.height() / 2);
907 rect.Offset(-rect.width(), 0); 972 rect.Offset(-rect.width(), 0);
908 scoped_ptr<RenderPass> pass = CreateRenderPass(); 973 scoped_ptr<RenderPass> pass = CreateRenderPass();
909 CreateCandidateQuadAt(resource_provider_.get(), 974 CreateCandidateQuadAt(resource_provider_.get(),
910 pass->shared_quad_state_list.back(), pass.get(), rect); 975 pass->shared_quad_state_list.back(), pass.get(), rect);
911 pass->shared_quad_state_list.back()->quad_to_target_transform.Scale(-1.0f, 976 pass->shared_quad_state_list.back()->quad_to_target_transform.Scale(-1.0f,
912 2.0f); 977 2.0f);
913 978
914 RenderPassList pass_list; 979 RenderPassList pass_list;
915 pass_list.push_back(pass.Pass()); 980 pass_list.push_back(pass.Pass());
916 OverlayCandidateList candidate_list; 981 OverlayCandidateList candidate_list;
917 overlay_processor_->ProcessForOverlays(resource_provider_.get(), &pass_list, 982 overlay_processor_->ProcessForOverlays(resource_provider_.get(), &pass_list,
918 &candidate_list); 983 &candidate_list, &damage_rect_);
919 ASSERT_EQ(1U, pass_list.size()); 984 ASSERT_EQ(1U, pass_list.size());
920 ASSERT_EQ(1U, candidate_list.size()); 985 ASSERT_EQ(1U, candidate_list.size());
921 EXPECT_EQ(gfx::OVERLAY_TRANSFORM_FLIP_HORIZONTAL, 986 EXPECT_EQ(gfx::OVERLAY_TRANSFORM_FLIP_HORIZONTAL,
922 candidate_list.back().transform); 987 candidate_list.back().transform);
923 } 988 }
924 989
925 TEST_F(SingleOverlayOnTopTest, AllowPositiveScaleTransform) { 990 TEST_F(SingleOverlayOnTopTest, AllowPositiveScaleTransform) {
926 gfx::Rect rect = kOverlayRect; 991 gfx::Rect rect = kOverlayRect;
927 rect.set_width(rect.width() / 2); 992 rect.set_width(rect.width() / 2);
928 scoped_ptr<RenderPass> pass = CreateRenderPass(); 993 scoped_ptr<RenderPass> pass = CreateRenderPass();
929 CreateCandidateQuadAt(resource_provider_.get(), 994 CreateCandidateQuadAt(resource_provider_.get(),
930 pass->shared_quad_state_list.back(), pass.get(), rect); 995 pass->shared_quad_state_list.back(), pass.get(), rect);
931 pass->shared_quad_state_list.back()->quad_to_target_transform.Scale(2.0f, 996 pass->shared_quad_state_list.back()->quad_to_target_transform.Scale(2.0f,
932 1.0f); 997 1.0f);
933 998
934 RenderPassList pass_list; 999 RenderPassList pass_list;
935 pass_list.push_back(pass.Pass()); 1000 pass_list.push_back(pass.Pass());
936 OverlayCandidateList candidate_list; 1001 OverlayCandidateList candidate_list;
937 overlay_processor_->ProcessForOverlays(resource_provider_.get(), &pass_list, 1002 overlay_processor_->ProcessForOverlays(resource_provider_.get(), &pass_list,
938 &candidate_list); 1003 &candidate_list, &damage_rect_);
939 ASSERT_EQ(1U, pass_list.size()); 1004 ASSERT_EQ(1U, pass_list.size());
940 EXPECT_EQ(1U, candidate_list.size()); 1005 EXPECT_EQ(1U, candidate_list.size());
941 } 1006 }
942 1007
943 TEST_F(SingleOverlayOnTopTest, Allow90DegreeRotation) { 1008 TEST_F(SingleOverlayOnTopTest, Allow90DegreeRotation) {
944 gfx::Rect rect = kOverlayRect; 1009 gfx::Rect rect = kOverlayRect;
945 rect.Offset(0, -rect.height()); 1010 rect.Offset(0, -rect.height());
946 scoped_ptr<RenderPass> pass = CreateRenderPass(); 1011 scoped_ptr<RenderPass> pass = CreateRenderPass();
947 CreateCandidateQuadAt(resource_provider_.get(), 1012 CreateCandidateQuadAt(resource_provider_.get(),
948 pass->shared_quad_state_list.back(), pass.get(), rect); 1013 pass->shared_quad_state_list.back(), pass.get(), rect);
949 pass->shared_quad_state_list.back() 1014 pass->shared_quad_state_list.back()
950 ->quad_to_target_transform.RotateAboutZAxis(90.f); 1015 ->quad_to_target_transform.RotateAboutZAxis(90.f);
951 1016
952 RenderPassList pass_list; 1017 RenderPassList pass_list;
953 pass_list.push_back(pass.Pass()); 1018 pass_list.push_back(pass.Pass());
954 OverlayCandidateList candidate_list; 1019 OverlayCandidateList candidate_list;
955 overlay_processor_->ProcessForOverlays(resource_provider_.get(), &pass_list, 1020 overlay_processor_->ProcessForOverlays(resource_provider_.get(), &pass_list,
956 &candidate_list); 1021 &candidate_list, &damage_rect_);
957 ASSERT_EQ(1U, pass_list.size()); 1022 ASSERT_EQ(1U, pass_list.size());
958 ASSERT_EQ(1U, candidate_list.size()); 1023 ASSERT_EQ(1U, candidate_list.size());
959 EXPECT_EQ(gfx::OVERLAY_TRANSFORM_ROTATE_90, candidate_list.back().transform); 1024 EXPECT_EQ(gfx::OVERLAY_TRANSFORM_ROTATE_90, candidate_list.back().transform);
960 } 1025 }
961 1026
962 TEST_F(SingleOverlayOnTopTest, Allow180DegreeRotation) { 1027 TEST_F(SingleOverlayOnTopTest, Allow180DegreeRotation) {
963 gfx::Rect rect = kOverlayRect; 1028 gfx::Rect rect = kOverlayRect;
964 rect.Offset(-rect.width(), -rect.height()); 1029 rect.Offset(-rect.width(), -rect.height());
965 scoped_ptr<RenderPass> pass = CreateRenderPass(); 1030 scoped_ptr<RenderPass> pass = CreateRenderPass();
966 CreateCandidateQuadAt(resource_provider_.get(), 1031 CreateCandidateQuadAt(resource_provider_.get(),
967 pass->shared_quad_state_list.back(), pass.get(), rect); 1032 pass->shared_quad_state_list.back(), pass.get(), rect);
968 pass->shared_quad_state_list.back() 1033 pass->shared_quad_state_list.back()
969 ->quad_to_target_transform.RotateAboutZAxis(180.f); 1034 ->quad_to_target_transform.RotateAboutZAxis(180.f);
970 1035
971 RenderPassList pass_list; 1036 RenderPassList pass_list;
972 pass_list.push_back(pass.Pass()); 1037 pass_list.push_back(pass.Pass());
973 OverlayCandidateList candidate_list; 1038 OverlayCandidateList candidate_list;
974 overlay_processor_->ProcessForOverlays(resource_provider_.get(), &pass_list, 1039 overlay_processor_->ProcessForOverlays(resource_provider_.get(), &pass_list,
975 &candidate_list); 1040 &candidate_list, &damage_rect_);
976 ASSERT_EQ(1U, pass_list.size()); 1041 ASSERT_EQ(1U, pass_list.size());
977 ASSERT_EQ(1U, candidate_list.size()); 1042 ASSERT_EQ(1U, candidate_list.size());
978 EXPECT_EQ(gfx::OVERLAY_TRANSFORM_ROTATE_180, candidate_list.back().transform); 1043 EXPECT_EQ(gfx::OVERLAY_TRANSFORM_ROTATE_180, candidate_list.back().transform);
979 } 1044 }
980 1045
981 TEST_F(SingleOverlayOnTopTest, Allow270DegreeRotation) { 1046 TEST_F(SingleOverlayOnTopTest, Allow270DegreeRotation) {
982 gfx::Rect rect = kOverlayRect; 1047 gfx::Rect rect = kOverlayRect;
983 rect.Offset(-rect.width(), 0); 1048 rect.Offset(-rect.width(), 0);
984 scoped_ptr<RenderPass> pass = CreateRenderPass(); 1049 scoped_ptr<RenderPass> pass = CreateRenderPass();
985 CreateCandidateQuadAt(resource_provider_.get(), 1050 CreateCandidateQuadAt(resource_provider_.get(),
986 pass->shared_quad_state_list.back(), pass.get(), rect); 1051 pass->shared_quad_state_list.back(), pass.get(), rect);
987 pass->shared_quad_state_list.back() 1052 pass->shared_quad_state_list.back()
988 ->quad_to_target_transform.RotateAboutZAxis(270.f); 1053 ->quad_to_target_transform.RotateAboutZAxis(270.f);
989 1054
990 RenderPassList pass_list; 1055 RenderPassList pass_list;
991 pass_list.push_back(pass.Pass()); 1056 pass_list.push_back(pass.Pass());
992 OverlayCandidateList candidate_list; 1057 OverlayCandidateList candidate_list;
993 overlay_processor_->ProcessForOverlays(resource_provider_.get(), &pass_list, 1058 overlay_processor_->ProcessForOverlays(resource_provider_.get(), &pass_list,
994 &candidate_list); 1059 &candidate_list, &damage_rect_);
995 ASSERT_EQ(1U, pass_list.size()); 1060 ASSERT_EQ(1U, pass_list.size());
996 ASSERT_EQ(1U, candidate_list.size()); 1061 ASSERT_EQ(1U, candidate_list.size());
997 EXPECT_EQ(gfx::OVERLAY_TRANSFORM_ROTATE_270, candidate_list.back().transform); 1062 EXPECT_EQ(gfx::OVERLAY_TRANSFORM_ROTATE_270, candidate_list.back().transform);
998 } 1063 }
999 1064
1000 TEST_F(SingleOverlayOnTopTest, AllowNotTopIfNotOccluded) { 1065 TEST_F(SingleOverlayOnTopTest, AllowNotTopIfNotOccluded) {
1001 scoped_ptr<RenderPass> pass = CreateRenderPass(); 1066 scoped_ptr<RenderPass> pass = CreateRenderPass();
1002 CreateOpaqueQuadAt(resource_provider_.get(), 1067 CreateOpaqueQuadAt(resource_provider_.get(),
1003 pass->shared_quad_state_list.back(), pass.get(), 1068 pass->shared_quad_state_list.back(), pass.get(),
1004 kOverlayTopLeftRect); 1069 kOverlayTopLeftRect);
1005 CreateCandidateQuadAt(resource_provider_.get(), 1070 CreateCandidateQuadAt(resource_provider_.get(),
1006 pass->shared_quad_state_list.back(), 1071 pass->shared_quad_state_list.back(),
1007 pass.get(), 1072 pass.get(),
1008 kOverlayBottomRightRect); 1073 kOverlayBottomRightRect);
1009 1074
1010 RenderPassList pass_list; 1075 RenderPassList pass_list;
1011 pass_list.push_back(pass.Pass()); 1076 pass_list.push_back(pass.Pass());
1012 1077
1013 RenderPassList original_pass_list; 1078 RenderPassList original_pass_list;
1014 RenderPass::CopyAll(pass_list, &original_pass_list); 1079 RenderPass::CopyAll(pass_list, &original_pass_list);
1015 1080
1016 OverlayCandidateList candidate_list; 1081 OverlayCandidateList candidate_list;
1017 overlay_processor_->ProcessForOverlays(resource_provider_.get(), &pass_list, 1082 overlay_processor_->ProcessForOverlays(resource_provider_.get(), &pass_list,
1018 &candidate_list); 1083 &candidate_list, &damage_rect_);
1019 EXPECT_EQ(1U, pass_list.size()); 1084 EXPECT_EQ(1U, pass_list.size());
1020 EXPECT_EQ(1U, candidate_list.size()); 1085 EXPECT_EQ(1U, candidate_list.size());
1021 } 1086 }
1022 1087
1023 TEST_F(SingleOverlayOnTopTest, AllowTransparentOnTop) { 1088 TEST_F(SingleOverlayOnTopTest, AllowTransparentOnTop) {
1024 scoped_ptr<RenderPass> pass = CreateRenderPass(); 1089 scoped_ptr<RenderPass> pass = CreateRenderPass();
1025 SharedQuadState* shared_state = pass->CreateAndAppendSharedQuadState(); 1090 SharedQuadState* shared_state = pass->CreateAndAppendSharedQuadState();
1026 shared_state->opacity = 0.f; 1091 shared_state->opacity = 0.f;
1027 CreateSolidColorQuadAt(shared_state, SK_ColorBLACK, pass.get(), 1092 CreateSolidColorQuadAt(shared_state, SK_ColorBLACK, pass.get(),
1028 kOverlayBottomRightRect); 1093 kOverlayBottomRightRect);
1029 shared_state = pass->CreateAndAppendSharedQuadState(); 1094 shared_state = pass->CreateAndAppendSharedQuadState();
1030 shared_state->opacity = 1.f; 1095 shared_state->opacity = 1.f;
1031 CreateCandidateQuadAt(resource_provider_.get(), shared_state, pass.get(), 1096 CreateCandidateQuadAt(resource_provider_.get(), shared_state, pass.get(),
1032 kOverlayBottomRightRect); 1097 kOverlayBottomRightRect);
1033 1098
1034 RenderPassList pass_list; 1099 RenderPassList pass_list;
1035 pass_list.push_back(pass.Pass()); 1100 pass_list.push_back(pass.Pass());
1036 1101
1037 RenderPassList original_pass_list; 1102 RenderPassList original_pass_list;
1038 RenderPass::CopyAll(pass_list, &original_pass_list); 1103 RenderPass::CopyAll(pass_list, &original_pass_list);
1039 1104
1040 OverlayCandidateList candidate_list; 1105 OverlayCandidateList candidate_list;
1041 overlay_processor_->ProcessForOverlays(resource_provider_.get(), &pass_list, 1106 overlay_processor_->ProcessForOverlays(resource_provider_.get(), &pass_list,
1042 &candidate_list); 1107 &candidate_list, &damage_rect_);
1043 EXPECT_EQ(1U, pass_list.size()); 1108 EXPECT_EQ(1U, pass_list.size());
1044 EXPECT_EQ(1U, candidate_list.size()); 1109 EXPECT_EQ(1U, candidate_list.size());
1045 } 1110 }
1046 1111
1047 TEST_F(SingleOverlayOnTopTest, AllowTransparentColorOnTop) { 1112 TEST_F(SingleOverlayOnTopTest, AllowTransparentColorOnTop) {
1048 scoped_ptr<RenderPass> pass = CreateRenderPass(); 1113 scoped_ptr<RenderPass> pass = CreateRenderPass();
1049 CreateSolidColorQuadAt(pass->shared_quad_state_list.back(), 1114 CreateSolidColorQuadAt(pass->shared_quad_state_list.back(),
1050 SK_ColorTRANSPARENT, pass.get(), 1115 SK_ColorTRANSPARENT, pass.get(),
1051 kOverlayBottomRightRect); 1116 kOverlayBottomRightRect);
1052 CreateCandidateQuadAt(resource_provider_.get(), 1117 CreateCandidateQuadAt(resource_provider_.get(),
1053 pass->shared_quad_state_list.back(), pass.get(), 1118 pass->shared_quad_state_list.back(), pass.get(),
1054 kOverlayBottomRightRect); 1119 kOverlayBottomRightRect);
1055 1120
1056 RenderPassList pass_list; 1121 RenderPassList pass_list;
1057 pass_list.push_back(pass.Pass()); 1122 pass_list.push_back(pass.Pass());
1058 1123
1059 RenderPassList original_pass_list; 1124 RenderPassList original_pass_list;
1060 RenderPass::CopyAll(pass_list, &original_pass_list); 1125 RenderPass::CopyAll(pass_list, &original_pass_list);
1061 1126
1062 OverlayCandidateList candidate_list; 1127 OverlayCandidateList candidate_list;
1063 overlay_processor_->ProcessForOverlays(resource_provider_.get(), &pass_list, 1128 overlay_processor_->ProcessForOverlays(resource_provider_.get(), &pass_list,
1064 &candidate_list); 1129 &candidate_list, &damage_rect_);
1065 EXPECT_EQ(1U, pass_list.size()); 1130 EXPECT_EQ(1U, pass_list.size());
1066 EXPECT_EQ(1U, candidate_list.size()); 1131 EXPECT_EQ(1U, candidate_list.size());
1067 } 1132 }
1068 1133
1069 TEST_F(SingleOverlayOnTopTest, RejectOpaqueColorOnTop) { 1134 TEST_F(SingleOverlayOnTopTest, RejectOpaqueColorOnTop) {
1070 scoped_ptr<RenderPass> pass = CreateRenderPass(); 1135 scoped_ptr<RenderPass> pass = CreateRenderPass();
1071 SharedQuadState* shared_state = pass->CreateAndAppendSharedQuadState(); 1136 SharedQuadState* shared_state = pass->CreateAndAppendSharedQuadState();
1072 shared_state->opacity = 0.5f; 1137 shared_state->opacity = 0.5f;
1073 CreateSolidColorQuadAt(shared_state, SK_ColorBLACK, pass.get(), 1138 CreateSolidColorQuadAt(shared_state, SK_ColorBLACK, pass.get(),
1074 kOverlayBottomRightRect); 1139 kOverlayBottomRightRect);
1075 shared_state = pass->CreateAndAppendSharedQuadState(); 1140 shared_state = pass->CreateAndAppendSharedQuadState();
1076 shared_state->opacity = 1.f; 1141 shared_state->opacity = 1.f;
1077 CreateCandidateQuadAt(resource_provider_.get(), shared_state, pass.get(), 1142 CreateCandidateQuadAt(resource_provider_.get(), shared_state, pass.get(),
1078 kOverlayBottomRightRect); 1143 kOverlayBottomRightRect);
1079 1144
1080 RenderPassList pass_list; 1145 RenderPassList pass_list;
1081 pass_list.push_back(pass.Pass()); 1146 pass_list.push_back(pass.Pass());
1082 1147
1083 RenderPassList original_pass_list; 1148 RenderPassList original_pass_list;
1084 RenderPass::CopyAll(pass_list, &original_pass_list); 1149 RenderPass::CopyAll(pass_list, &original_pass_list);
1085 1150
1086 OverlayCandidateList candidate_list; 1151 OverlayCandidateList candidate_list;
1087 overlay_processor_->ProcessForOverlays(resource_provider_.get(), &pass_list, 1152 overlay_processor_->ProcessForOverlays(resource_provider_.get(), &pass_list,
1088 &candidate_list); 1153 &candidate_list, &damage_rect_);
1089 EXPECT_EQ(1U, pass_list.size()); 1154 EXPECT_EQ(1U, pass_list.size());
1090 EXPECT_EQ(0U, candidate_list.size()); 1155 EXPECT_EQ(0U, candidate_list.size());
1091 } 1156 }
1092 1157
1093 TEST_F(SingleOverlayOnTopTest, RejectTransparentColorOnTopWithoutBlending) { 1158 TEST_F(SingleOverlayOnTopTest, RejectTransparentColorOnTopWithoutBlending) {
1094 scoped_ptr<RenderPass> pass = CreateRenderPass(); 1159 scoped_ptr<RenderPass> pass = CreateRenderPass();
1095 SharedQuadState* shared_state = pass->CreateAndAppendSharedQuadState(); 1160 SharedQuadState* shared_state = pass->CreateAndAppendSharedQuadState();
1096 CreateSolidColorQuadAt(shared_state, SK_ColorTRANSPARENT, pass.get(), 1161 CreateSolidColorQuadAt(shared_state, SK_ColorTRANSPARENT, pass.get(),
1097 kOverlayBottomRightRect)->opaque_rect = 1162 kOverlayBottomRightRect)->opaque_rect =
1098 kOverlayBottomRightRect; 1163 kOverlayBottomRightRect;
1099 CreateCandidateQuadAt(resource_provider_.get(), shared_state, pass.get(), 1164 CreateCandidateQuadAt(resource_provider_.get(), shared_state, pass.get(),
1100 kOverlayBottomRightRect); 1165 kOverlayBottomRightRect);
1101 1166
1102 RenderPassList pass_list; 1167 RenderPassList pass_list;
1103 pass_list.push_back(pass.Pass()); 1168 pass_list.push_back(pass.Pass());
1104 1169
1105 RenderPassList original_pass_list; 1170 RenderPassList original_pass_list;
1106 RenderPass::CopyAll(pass_list, &original_pass_list); 1171 RenderPass::CopyAll(pass_list, &original_pass_list);
1107 1172
1108 OverlayCandidateList candidate_list; 1173 OverlayCandidateList candidate_list;
1109 overlay_processor_->ProcessForOverlays(resource_provider_.get(), &pass_list, 1174 overlay_processor_->ProcessForOverlays(resource_provider_.get(), &pass_list,
1110 &candidate_list); 1175 &candidate_list, &damage_rect_);
1111 EXPECT_EQ(1U, pass_list.size()); 1176 EXPECT_EQ(1U, pass_list.size());
1112 EXPECT_EQ(0U, candidate_list.size()); 1177 EXPECT_EQ(0U, candidate_list.size());
1113 } 1178 }
1114 1179
1115 TEST_F(SingleOverlayOnTopTest, RejectVideoSwapTransform) { 1180 TEST_F(SingleOverlayOnTopTest, RejectVideoSwapTransform) {
1116 scoped_ptr<RenderPass> pass = CreateRenderPass(); 1181 scoped_ptr<RenderPass> pass = CreateRenderPass();
1117 CreateFullscreenCandidateVideoQuad(resource_provider_.get(), 1182 CreateFullscreenCandidateVideoQuad(resource_provider_.get(),
1118 pass->shared_quad_state_list.back(), 1183 pass->shared_quad_state_list.back(),
1119 pass.get(), kSwapTransform); 1184 pass.get(), kSwapTransform);
1120 1185
1121 RenderPassList pass_list; 1186 RenderPassList pass_list;
1122 pass_list.push_back(pass.Pass()); 1187 pass_list.push_back(pass.Pass());
1123 OverlayCandidateList candidate_list; 1188 OverlayCandidateList candidate_list;
1124 overlay_processor_->ProcessForOverlays(resource_provider_.get(), &pass_list, 1189 overlay_processor_->ProcessForOverlays(resource_provider_.get(), &pass_list,
1125 &candidate_list); 1190 &candidate_list, &damage_rect_);
1126 ASSERT_EQ(1U, pass_list.size()); 1191 ASSERT_EQ(1U, pass_list.size());
1127 EXPECT_EQ(0U, candidate_list.size()); 1192 EXPECT_EQ(0U, candidate_list.size());
1128 } 1193 }
1129 1194
1130 TEST_F(SingleOverlayOnTopTest, AllowVideoXMirrorTransform) { 1195 TEST_F(SingleOverlayOnTopTest, AllowVideoXMirrorTransform) {
1131 scoped_ptr<RenderPass> pass = CreateRenderPass(); 1196 scoped_ptr<RenderPass> pass = CreateRenderPass();
1132 CreateFullscreenCandidateVideoQuad(resource_provider_.get(), 1197 CreateFullscreenCandidateVideoQuad(resource_provider_.get(),
1133 pass->shared_quad_state_list.back(), 1198 pass->shared_quad_state_list.back(),
1134 pass.get(), kXMirrorTransform); 1199 pass.get(), kXMirrorTransform);
1135 1200
1136 RenderPassList pass_list; 1201 RenderPassList pass_list;
1137 pass_list.push_back(pass.Pass()); 1202 pass_list.push_back(pass.Pass());
1138 OverlayCandidateList candidate_list; 1203 OverlayCandidateList candidate_list;
1139 overlay_processor_->ProcessForOverlays(resource_provider_.get(), &pass_list, 1204 overlay_processor_->ProcessForOverlays(resource_provider_.get(), &pass_list,
1140 &candidate_list); 1205 &candidate_list, &damage_rect_);
1141 ASSERT_EQ(1U, pass_list.size()); 1206 ASSERT_EQ(1U, pass_list.size());
1142 EXPECT_EQ(1U, candidate_list.size()); 1207 EXPECT_EQ(1U, candidate_list.size());
1143 } 1208 }
1144 1209
1145 TEST_F(SingleOverlayOnTopTest, AllowVideoBothMirrorTransform) { 1210 TEST_F(SingleOverlayOnTopTest, AllowVideoBothMirrorTransform) {
1146 scoped_ptr<RenderPass> pass = CreateRenderPass(); 1211 scoped_ptr<RenderPass> pass = CreateRenderPass();
1147 CreateFullscreenCandidateVideoQuad(resource_provider_.get(), 1212 CreateFullscreenCandidateVideoQuad(resource_provider_.get(),
1148 pass->shared_quad_state_list.back(), 1213 pass->shared_quad_state_list.back(),
1149 pass.get(), kBothMirrorTransform); 1214 pass.get(), kBothMirrorTransform);
1150 1215
1151 RenderPassList pass_list; 1216 RenderPassList pass_list;
1152 pass_list.push_back(pass.Pass()); 1217 pass_list.push_back(pass.Pass());
1153 OverlayCandidateList candidate_list; 1218 OverlayCandidateList candidate_list;
1154 overlay_processor_->ProcessForOverlays(resource_provider_.get(), &pass_list, 1219 overlay_processor_->ProcessForOverlays(resource_provider_.get(), &pass_list,
1155 &candidate_list); 1220 &candidate_list, &damage_rect_);
1156 ASSERT_EQ(1U, pass_list.size()); 1221 ASSERT_EQ(1U, pass_list.size());
1157 EXPECT_EQ(1U, candidate_list.size()); 1222 EXPECT_EQ(1U, candidate_list.size());
1158 } 1223 }
1159 1224
1160 TEST_F(SingleOverlayOnTopTest, AllowVideoNormalTransform) { 1225 TEST_F(SingleOverlayOnTopTest, AllowVideoNormalTransform) {
1161 scoped_ptr<RenderPass> pass = CreateRenderPass(); 1226 scoped_ptr<RenderPass> pass = CreateRenderPass();
1162 CreateFullscreenCandidateVideoQuad(resource_provider_.get(), 1227 CreateFullscreenCandidateVideoQuad(resource_provider_.get(),
1163 pass->shared_quad_state_list.back(), 1228 pass->shared_quad_state_list.back(),
1164 pass.get(), kNormalTransform); 1229 pass.get(), kNormalTransform);
1165 1230
1166 RenderPassList pass_list; 1231 RenderPassList pass_list;
1167 pass_list.push_back(pass.Pass()); 1232 pass_list.push_back(pass.Pass());
1168 OverlayCandidateList candidate_list; 1233 OverlayCandidateList candidate_list;
1169 overlay_processor_->ProcessForOverlays(resource_provider_.get(), &pass_list, 1234 overlay_processor_->ProcessForOverlays(resource_provider_.get(), &pass_list,
1170 &candidate_list); 1235 &candidate_list, &damage_rect_);
1171 ASSERT_EQ(1U, pass_list.size()); 1236 ASSERT_EQ(1U, pass_list.size());
1172 EXPECT_EQ(1U, candidate_list.size()); 1237 EXPECT_EQ(1U, candidate_list.size());
1173 } 1238 }
1174 1239
1175 TEST_F(SingleOverlayOnTopTest, AllowVideoYMirrorTransform) { 1240 TEST_F(SingleOverlayOnTopTest, AllowVideoYMirrorTransform) {
1176 scoped_ptr<RenderPass> pass = CreateRenderPass(); 1241 scoped_ptr<RenderPass> pass = CreateRenderPass();
1177 CreateFullscreenCandidateVideoQuad(resource_provider_.get(), 1242 CreateFullscreenCandidateVideoQuad(resource_provider_.get(),
1178 pass->shared_quad_state_list.back(), 1243 pass->shared_quad_state_list.back(),
1179 pass.get(), kYMirrorTransform); 1244 pass.get(), kYMirrorTransform);
1180 1245
1181 RenderPassList pass_list; 1246 RenderPassList pass_list;
1182 pass_list.push_back(pass.Pass()); 1247 pass_list.push_back(pass.Pass());
1183 OverlayCandidateList candidate_list; 1248 OverlayCandidateList candidate_list;
1184 overlay_processor_->ProcessForOverlays(resource_provider_.get(), &pass_list, 1249 overlay_processor_->ProcessForOverlays(resource_provider_.get(), &pass_list,
1185 &candidate_list); 1250 &candidate_list, &damage_rect_);
1186 ASSERT_EQ(1U, pass_list.size()); 1251 ASSERT_EQ(1U, pass_list.size());
1187 EXPECT_EQ(1U, candidate_list.size()); 1252 EXPECT_EQ(1U, candidate_list.size());
1188 } 1253 }
1189 1254
1190 TEST_F(UnderlayTest, OverlayLayerUnderMainLayer) { 1255 TEST_F(UnderlayTest, OverlayLayerUnderMainLayer) {
1191 scoped_ptr<RenderPass> pass = CreateRenderPass(); 1256 scoped_ptr<RenderPass> pass = CreateRenderPass();
1192 CreateFullscreenOpaqueQuad(resource_provider_.get(), 1257 CreateFullscreenOpaqueQuad(resource_provider_.get(),
1193 pass->shared_quad_state_list.back(), pass.get()); 1258 pass->shared_quad_state_list.back(), pass.get());
1194 CreateCandidateQuadAt(resource_provider_.get(), 1259 CreateCandidateQuadAt(resource_provider_.get(),
1195 pass->shared_quad_state_list.back(), pass.get(), 1260 pass->shared_quad_state_list.back(), pass.get(),
1196 kOverlayBottomRightRect); 1261 kOverlayBottomRightRect);
1197 1262
1198 RenderPassList pass_list; 1263 RenderPassList pass_list;
1199 pass_list.push_back(pass.Pass()); 1264 pass_list.push_back(pass.Pass());
1200 1265
1201 OverlayCandidateList candidate_list; 1266 OverlayCandidateList candidate_list;
1202 overlay_processor_->ProcessForOverlays(resource_provider_.get(), &pass_list, 1267 overlay_processor_->ProcessForOverlays(resource_provider_.get(), &pass_list,
1203 &candidate_list); 1268 &candidate_list, &damage_rect_);
1204 EXPECT_EQ(1U, pass_list.size()); 1269 EXPECT_EQ(1U, pass_list.size());
1205 ASSERT_EQ(1U, candidate_list.size()); 1270 ASSERT_EQ(1U, candidate_list.size());
1206 EXPECT_EQ(-1, candidate_list[0].plane_z_order); 1271 EXPECT_EQ(-1, candidate_list[0].plane_z_order);
1207 EXPECT_EQ(2U, pass_list[0]->quad_list.size()); 1272 EXPECT_EQ(2U, pass_list[0]->quad_list.size());
1208 // The overlay quad should have changed to a SOLID_COLOR quad. 1273 // The overlay quad should have changed to a SOLID_COLOR quad.
1209 EXPECT_EQ(pass_list[0]->quad_list.back()->material, DrawQuad::SOLID_COLOR); 1274 EXPECT_EQ(pass_list[0]->quad_list.back()->material, DrawQuad::SOLID_COLOR);
1210 } 1275 }
1211 1276
1212 TEST_F(UnderlayTest, AllowOnTop) { 1277 TEST_F(UnderlayTest, AllowOnTop) {
1213 scoped_ptr<RenderPass> pass = CreateRenderPass(); 1278 scoped_ptr<RenderPass> pass = CreateRenderPass();
1214 CreateFullscreenCandidateQuad(resource_provider_.get(), 1279 CreateFullscreenCandidateQuad(resource_provider_.get(),
1215 pass->shared_quad_state_list.back(), 1280 pass->shared_quad_state_list.back(),
1216 pass.get()); 1281 pass.get());
1217 pass->CreateAndAppendSharedQuadState()->opacity = 0.5f; 1282 pass->CreateAndAppendSharedQuadState()->opacity = 0.5f;
1218 CreateFullscreenOpaqueQuad(resource_provider_.get(), 1283 CreateFullscreenOpaqueQuad(resource_provider_.get(),
1219 pass->shared_quad_state_list.back(), pass.get()); 1284 pass->shared_quad_state_list.back(), pass.get());
1220 1285
1221 RenderPassList pass_list; 1286 RenderPassList pass_list;
1222 pass_list.push_back(pass.Pass()); 1287 pass_list.push_back(pass.Pass());
1223 1288
1224 OverlayCandidateList candidate_list; 1289 OverlayCandidateList candidate_list;
1225 overlay_processor_->ProcessForOverlays(resource_provider_.get(), &pass_list, 1290 overlay_processor_->ProcessForOverlays(resource_provider_.get(), &pass_list,
1226 &candidate_list); 1291 &candidate_list, &damage_rect_);
1227 EXPECT_EQ(1U, pass_list.size()); 1292 EXPECT_EQ(1U, pass_list.size());
1228 ASSERT_EQ(1U, candidate_list.size()); 1293 ASSERT_EQ(1U, candidate_list.size());
1229 EXPECT_EQ(-1, candidate_list[0].plane_z_order); 1294 EXPECT_EQ(-1, candidate_list[0].plane_z_order);
1230 // The overlay quad should have changed to a SOLID_COLOR quad. 1295 // The overlay quad should have changed to a SOLID_COLOR quad.
1231 EXPECT_EQ(pass_list[0]->quad_list.front()->material, DrawQuad::SOLID_COLOR); 1296 EXPECT_EQ(pass_list[0]->quad_list.front()->material, DrawQuad::SOLID_COLOR);
1232 } 1297 }
1233 1298
1299 TEST_F(UnderlayTest, DamageRect) {
1300 scoped_ptr<RenderPass> pass = CreateRenderPass();
1301 CreateFullscreenCandidateQuad(resource_provider_.get(),
1302 pass->shared_quad_state_list.back(),
1303 pass.get());
1304
1305 damage_rect_ = kOverlayRect;
1306
1307 // Add something behind it.
1308 CreateFullscreenOpaqueQuad(resource_provider_.get(),
1309 pass->shared_quad_state_list.back(), pass.get());
1310 CreateFullscreenOpaqueQuad(resource_provider_.get(),
1311 pass->shared_quad_state_list.back(), pass.get());
1312
1313 RenderPassList pass_list;
1314 pass_list.push_back(pass.Pass());
1315
1316 // Check for potential candidates.
1317 OverlayCandidateList candidate_list;
1318
1319 // Primary plane.
1320 OverlayCandidate output_surface_plane;
1321 output_surface_plane.display_rect = gfx::RectF(kOverlayRect);
1322 output_surface_plane.quad_rect_in_target_space = kOverlayRect;
1323 output_surface_plane.use_output_surface_for_resource = true;
1324 output_surface_plane.overlay_handled = true;
1325 candidate_list.push_back(output_surface_plane);
1326
1327 overlay_processor_->ProcessForOverlays(resource_provider_.get(), &pass_list,
1328 &candidate_list, &damage_rect_);
1329 DCHECK(!damage_rect_.IsEmpty());
1330 }
1331
1234 TEST_F(AllOrNothingOverlayTest, SuccessfulOverlappingOverlays) { 1332 TEST_F(AllOrNothingOverlayTest, SuccessfulOverlappingOverlays) {
1235 scoped_ptr<RenderPass> pass = CreateRenderPass(); 1333 scoped_ptr<RenderPass> pass = CreateRenderPass();
1236 1334
1237 // Add two overlapping candidates. 1335 // Add two overlapping candidates.
1238 CreateCandidateQuadAt(resource_provider_.get(), 1336 CreateCandidateQuadAt(resource_provider_.get(),
1239 pass->shared_quad_state_list.back(), pass.get(), 1337 pass->shared_quad_state_list.back(), pass.get(),
1240 kOverlayTopLeftRect); 1338 kOverlayTopLeftRect);
1241 CreateCandidateQuadAt(resource_provider_.get(), 1339 CreateCandidateQuadAt(resource_provider_.get(),
1242 pass->shared_quad_state_list.back(), pass.get(), 1340 pass->shared_quad_state_list.back(), pass.get(),
1243 kOverlayRect); 1341 kOverlayRect);
1244 1342
1245 RenderPassList pass_list; 1343 RenderPassList pass_list;
1246 pass_list.push_back(pass.Pass()); 1344 pass_list.push_back(pass.Pass());
1247 OverlayCandidateList candidates; 1345 OverlayCandidateList candidates;
1248 overlay_processor_->ProcessForOverlays(resource_provider_.get(), &pass_list, 1346 overlay_processor_->ProcessForOverlays(resource_provider_.get(), &pass_list,
1249 &candidates); 1347 &candidates, &damage_rect_);
1250 1348
1251 // Both quads should become overlays. 1349 // Both quads should become overlays.
1252 EXPECT_EQ(2u, candidates.size()); 1350 EXPECT_EQ(2u, candidates.size());
1253 EXPECT_EQ(-1, candidates[0].plane_z_order); 1351 EXPECT_EQ(-1, candidates[0].plane_z_order);
1254 EXPECT_EQ(-2, candidates[1].plane_z_order); 1352 EXPECT_EQ(-2, candidates[1].plane_z_order);
1255 EXPECT_EQ(gfx::RectF(kOverlayTopLeftRect), candidates[0].display_rect); 1353 EXPECT_EQ(gfx::RectF(kOverlayTopLeftRect), candidates[0].display_rect);
1256 EXPECT_EQ(gfx::RectF(kOverlayRect), candidates[1].display_rect); 1354 EXPECT_EQ(gfx::RectF(kOverlayRect), candidates[1].display_rect);
1257 1355
1258 // All quads should be gone. 1356 // All quads should be gone.
1259 EXPECT_TRUE(pass_list.back()->quad_list.empty()); 1357 EXPECT_TRUE(pass_list.back()->quad_list.empty());
(...skipping 10 matching lines...) Expand all
1270 SharedQuadState* shared_state = pass->CreateAndAppendSharedQuadState(); 1368 SharedQuadState* shared_state = pass->CreateAndAppendSharedQuadState();
1271 shared_state->opacity = 1.f; 1369 shared_state->opacity = 1.f;
1272 shared_state->quad_to_target_transform.Rotate(90); 1370 shared_state->quad_to_target_transform.Rotate(90);
1273 CreateSolidColorQuadAt(shared_state, SK_ColorBLACK, pass.get(), 1371 CreateSolidColorQuadAt(shared_state, SK_ColorBLACK, pass.get(),
1274 kOverlayBottomRightRect); 1372 kOverlayBottomRightRect);
1275 1373
1276 RenderPassList pass_list; 1374 RenderPassList pass_list;
1277 pass_list.push_back(pass.Pass()); 1375 pass_list.push_back(pass.Pass());
1278 OverlayCandidateList candidates; 1376 OverlayCandidateList candidates;
1279 overlay_processor_->ProcessForOverlays(resource_provider_.get(), &pass_list, 1377 overlay_processor_->ProcessForOverlays(resource_provider_.get(), &pass_list,
1280 &candidates); 1378 &candidates, &damage_rect_);
1281 1379
1282 // No quads should become overlays. 1380 // No quads should become overlays.
1283 EXPECT_EQ(0u, candidates.size()); 1381 EXPECT_EQ(0u, candidates.size());
1284 EXPECT_EQ(2u, pass_list.back()->quad_list.size()); 1382 EXPECT_EQ(2u, pass_list.back()->quad_list.size());
1285 } 1383 }
1286 1384
1385 TEST_F(AllOrNothingOverlayTest, DamageRect) {
1386 scoped_ptr<RenderPass> pass = CreateRenderPass();
1387 CreateFullscreenCandidateQuad(resource_provider_.get(),
1388 pass->shared_quad_state_list.back(),
1389 pass.get());
1390
1391 damage_rect_ = kOverlayRect;
1392
1393 // Add something behind it.
1394 CreateFullscreenOpaqueQuad(resource_provider_.get(),
1395 pass->shared_quad_state_list.back(), pass.get());
1396 CreateFullscreenOpaqueQuad(resource_provider_.get(),
1397 pass->shared_quad_state_list.back(), pass.get());
1398
1399 RenderPassList pass_list;
1400 pass_list.push_back(pass.Pass());
1401
1402 // Check for potential candidates.
1403 OverlayCandidateList candidate_list;
1404
1405 // Primary plane.
1406 OverlayCandidate output_surface_plane;
1407 output_surface_plane.display_rect = gfx::RectF(kOverlayRect);
1408 output_surface_plane.quad_rect_in_target_space = kOverlayRect;
1409 output_surface_plane.use_output_surface_for_resource = true;
1410 output_surface_plane.overlay_handled = true;
1411 candidate_list.push_back(output_surface_plane);
1412
1413 overlay_processor_->ProcessForOverlays(resource_provider_.get(), &pass_list,
1414 &candidate_list, &damage_rect_);
1415 DCHECK(!damage_rect_.IsEmpty());
1416 }
1417
1287 class OverlayInfoRendererGL : public GLRenderer { 1418 class OverlayInfoRendererGL : public GLRenderer {
1288 public: 1419 public:
1289 OverlayInfoRendererGL(RendererClient* client, 1420 OverlayInfoRendererGL(RendererClient* client,
1290 const RendererSettings* settings, 1421 const RendererSettings* settings,
1291 OutputSurface* output_surface, 1422 OutputSurface* output_surface,
1292 ResourceProvider* resource_provider) 1423 ResourceProvider* resource_provider)
1293 : GLRenderer(client, 1424 : GLRenderer(client,
1294 settings, 1425 settings,
1295 output_surface, 1426 output_surface,
1296 resource_provider, 1427 resource_provider,
(...skipping 10 matching lines...) Expand all
1307 1438
1308 void FinishDrawingFrame(DrawingFrame* frame) override { 1439 void FinishDrawingFrame(DrawingFrame* frame) override {
1309 GLRenderer::FinishDrawingFrame(frame); 1440 GLRenderer::FinishDrawingFrame(frame);
1310 1441
1311 if (!expect_overlays_) { 1442 if (!expect_overlays_) {
1312 EXPECT_EQ(0U, frame->overlay_list.size()); 1443 EXPECT_EQ(0U, frame->overlay_list.size());
1313 return; 1444 return;
1314 } 1445 }
1315 1446
1316 ASSERT_EQ(2U, frame->overlay_list.size()); 1447 ASSERT_EQ(2U, frame->overlay_list.size());
1317 EXPECT_NE(0U, frame->overlay_list.back().resource_id); 1448 EXPECT_GE(frame->overlay_list.back().resource_id, 0U);
1318 } 1449 }
1319 1450
1320 void set_expect_overlays(bool expect_overlays) { 1451 void set_expect_overlays(bool expect_overlays) {
1321 expect_overlays_ = expect_overlays; 1452 expect_overlays_ = expect_overlays;
1322 } 1453 }
1323 1454
1324 private: 1455 private:
1325 bool expect_overlays_; 1456 bool expect_overlays_;
1326 }; 1457 };
1327 1458
(...skipping 50 matching lines...) Expand 10 before | Expand all | Expand 10 after
1378 }; 1509 };
1379 1510
1380 TEST_F(GLRendererWithOverlaysTest, OverlayQuadNotDrawn) { 1511 TEST_F(GLRendererWithOverlaysTest, OverlayQuadNotDrawn) {
1381 bool use_validator = true; 1512 bool use_validator = true;
1382 Init(use_validator); 1513 Init(use_validator);
1383 renderer_->set_expect_overlays(true); 1514 renderer_->set_expect_overlays(true);
1384 gfx::Rect viewport_rect(16, 16); 1515 gfx::Rect viewport_rect(16, 16);
1385 1516
1386 scoped_ptr<RenderPass> pass = CreateRenderPass(); 1517 scoped_ptr<RenderPass> pass = CreateRenderPass();
1387 1518
1388 CreateFullscreenCandidateQuad(resource_provider_.get(), 1519 CreateCandidateQuadAt(resource_provider_.get(),
1389 pass->shared_quad_state_list.back(), 1520 pass->shared_quad_state_list.back(), pass.get(),
1390 pass.get()); 1521 kOverlayBottomRightRect);
1391
1392 CreateFullscreenOpaqueQuad(resource_provider_.get(), 1522 CreateFullscreenOpaqueQuad(resource_provider_.get(),
1393 pass->shared_quad_state_list.back(), pass.get()); 1523 pass->shared_quad_state_list.back(), pass.get());
1394 CreateFullscreenOpaqueQuad(resource_provider_.get(), 1524 CreateFullscreenOpaqueQuad(resource_provider_.get(),
1395 pass->shared_quad_state_list.back(), pass.get()); 1525 pass->shared_quad_state_list.back(), pass.get());
1396 1526
1397 RenderPassList pass_list; 1527 RenderPassList pass_list;
1398 pass_list.push_back(pass.Pass()); 1528 pass_list.push_back(pass.Pass());
1399 1529
1400 // Candidate pass was taken out and extra skipped pass added, 1530 // Candidate pass was taken out and extra skipped pass added,
1401 // so only draw 2 quads. 1531 // so only draw 2 quads.
1402 EXPECT_CALL(*renderer_, DoDrawQuad(_, _, _)).Times(2); 1532 EXPECT_CALL(*renderer_, DoDrawQuad(_, _, _)).Times(2);
1403 EXPECT_CALL(scheduler_, 1533 EXPECT_CALL(scheduler_,
1404 Schedule(0, gfx::OVERLAY_TRANSFORM_NONE, _, 1534 Schedule(0, gfx::OVERLAY_TRANSFORM_NONE, _,
1405 gfx::Rect(kDisplaySize), gfx::RectF(0, 0, 1, 1))) 1535 gfx::Rect(kDisplaySize), gfx::RectF(0, 0, 1, 1)))
1406 .Times(1); 1536 .Times(1);
1407 EXPECT_CALL(scheduler_, 1537 EXPECT_CALL(scheduler_, Schedule(1, gfx::OVERLAY_TRANSFORM_NONE, _,
1408 Schedule(1, gfx::OVERLAY_TRANSFORM_NONE, _, kOverlayRect, 1538 kOverlayBottomRightRect,
1409 BoundingRect(kUVTopLeft, kUVBottomRight))) 1539 BoundingRect(kUVTopLeft, kUVBottomRight)))
1410 .Times(1); 1540 .Times(1);
1411 renderer_->DrawFrame(&pass_list, 1.f, viewport_rect, viewport_rect, false); 1541 renderer_->DrawFrame(&pass_list, 1.f, viewport_rect, viewport_rect, false);
1412 1542
1413 SwapBuffers(); 1543 SwapBuffers();
1414 1544
1415 Mock::VerifyAndClearExpectations(renderer_.get()); 1545 Mock::VerifyAndClearExpectations(renderer_.get());
1416 Mock::VerifyAndClearExpectations(&scheduler_); 1546 Mock::VerifyAndClearExpectations(&scheduler_);
1417 } 1547 }
1418 1548
1419 TEST_F(GLRendererWithOverlaysTest, OccludedQuadInUnderlay) { 1549 TEST_F(GLRendererWithOverlaysTest, OccludedQuadInUnderlay) {
(...skipping 182 matching lines...) Expand 10 before | Expand all | Expand 10 after
1602 renderer_->BeginDrawingFrame(&frame_no_overlays); 1732 renderer_->BeginDrawingFrame(&frame_no_overlays);
1603 renderer_->FinishDrawingFrame(&frame_no_overlays); 1733 renderer_->FinishDrawingFrame(&frame_no_overlays);
1604 EXPECT_TRUE(resource_provider_->InUseByConsumer(resource1)); 1734 EXPECT_TRUE(resource_provider_->InUseByConsumer(resource1));
1605 SwapBuffers(); 1735 SwapBuffers();
1606 EXPECT_FALSE(resource_provider_->InUseByConsumer(resource1)); 1736 EXPECT_FALSE(resource_provider_->InUseByConsumer(resource1));
1607 Mock::VerifyAndClearExpectations(&scheduler_); 1737 Mock::VerifyAndClearExpectations(&scheduler_);
1608 } 1738 }
1609 1739
1610 } // namespace 1740 } // namespace
1611 } // namespace cc 1741 } // namespace cc
OLDNEW
« no previous file with comments | « cc/output/overlay_strategy_underlay.cc ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698