OLD | NEW |
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 Loading... |
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 Loading... |
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 Loading... |
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 Loading... |
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 Loading... |
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 Loading... |
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 Loading... |
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 Loading... |
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 Loading... |
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 Loading... |
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 Loading... |
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 |
OLD | NEW |