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/scoped_ptr_vector.h" | 5 #include "cc/base/scoped_ptr_vector.h" |
6 #include "cc/output/compositor_frame_metadata.h" | 6 #include "cc/output/compositor_frame_metadata.h" |
7 #include "cc/output/gl_renderer.h" | 7 #include "cc/output/gl_renderer.h" |
8 #include "cc/output/output_surface.h" | 8 #include "cc/output/output_surface.h" |
9 #include "cc/output/output_surface_client.h" | 9 #include "cc/output/output_surface_client.h" |
10 #include "cc/output/overlay_candidate_validator.h" | 10 #include "cc/output/overlay_candidate_validator.h" |
(...skipping 43 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
54 class SingleOverlayValidator : public OverlayCandidateValidator { | 54 class SingleOverlayValidator : public OverlayCandidateValidator { |
55 public: | 55 public: |
56 void CheckOverlaySupport(OverlayCandidateList* surfaces) override; | 56 void CheckOverlaySupport(OverlayCandidateList* surfaces) override; |
57 }; | 57 }; |
58 | 58 |
59 void SingleOverlayValidator::CheckOverlaySupport( | 59 void SingleOverlayValidator::CheckOverlaySupport( |
60 OverlayCandidateList* surfaces) { | 60 OverlayCandidateList* surfaces) { |
61 ASSERT_EQ(2U, surfaces->size()); | 61 ASSERT_EQ(2U, surfaces->size()); |
62 | 62 |
63 OverlayCandidate& candidate = surfaces->back(); | 63 OverlayCandidate& candidate = surfaces->back(); |
64 if (candidate.display_rect.width() == 64) | 64 if (candidate.display_rect.width() == 64) { |
65 EXPECT_EQ(kOverlayBottomRightRect, candidate.display_rect); | 65 EXPECT_EQ(kOverlayBottomRightRect, candidate.display_rect); |
66 else | 66 } else { |
67 EXPECT_EQ(kOverlayRect, candidate.display_rect); | 67 EXPECT_NEAR(kOverlayRect.x(), candidate.display_rect.x(), 0.01f); |
| 68 EXPECT_NEAR(kOverlayRect.y(), candidate.display_rect.y(), 0.01f); |
| 69 EXPECT_NEAR(kOverlayRect.width(), candidate.display_rect.width(), 0.01f); |
| 70 EXPECT_NEAR(kOverlayRect.height(), candidate.display_rect.height(), 0.01f); |
| 71 } |
68 EXPECT_EQ(BoundingRect(kUVTopLeft, kUVBottomRight).ToString(), | 72 EXPECT_EQ(BoundingRect(kUVTopLeft, kUVBottomRight).ToString(), |
69 candidate.uv_rect.ToString()); | 73 candidate.uv_rect.ToString()); |
70 candidate.overlay_handled = true; | 74 candidate.overlay_handled = true; |
71 } | 75 } |
72 | 76 |
73 template <typename OverlayStrategyType> | 77 template <typename OverlayStrategyType> |
74 class SingleOverlayProcessor : public OverlayProcessor { | 78 class SingleOverlayProcessor : public OverlayProcessor { |
75 public: | 79 public: |
76 SingleOverlayProcessor(OutputSurface* surface, | 80 SingleOverlayProcessor(OutputSurface* surface, |
77 ResourceProvider* resource_provider) | 81 ResourceProvider* resource_provider) |
(...skipping 455 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
533 pass->shared_quad_state_list.back()->opacity = 0.5f; | 537 pass->shared_quad_state_list.back()->opacity = 0.5f; |
534 | 538 |
535 RenderPassList pass_list; | 539 RenderPassList pass_list; |
536 pass_list.push_back(pass.Pass()); | 540 pass_list.push_back(pass.Pass()); |
537 OverlayCandidateList candidate_list; | 541 OverlayCandidateList candidate_list; |
538 overlay_processor_->ProcessForOverlays(&pass_list, &candidate_list); | 542 overlay_processor_->ProcessForOverlays(&pass_list, &candidate_list); |
539 ASSERT_EQ(1U, pass_list.size()); | 543 ASSERT_EQ(1U, pass_list.size()); |
540 EXPECT_EQ(0U, candidate_list.size()); | 544 EXPECT_EQ(0U, candidate_list.size()); |
541 } | 545 } |
542 | 546 |
543 TEST_F(SingleOverlayOnTopTest, RejectNonScaleTransform) { | 547 TEST_F(SingleOverlayOnTopTest, RejectNonAxisAlignedTransform) { |
544 scoped_ptr<RenderPass> pass = CreateRenderPass(); | 548 scoped_ptr<RenderPass> pass = CreateRenderPass(); |
545 CreateFullscreenCandidateQuad(resource_provider_.get(), | 549 CreateFullscreenCandidateQuad(resource_provider_.get(), |
546 pass->shared_quad_state_list.back(), | 550 pass->shared_quad_state_list.back(), |
547 pass.get()); | 551 pass.get()); |
548 pass->shared_quad_state_list.back() | 552 pass->shared_quad_state_list.back() |
549 ->content_to_target_transform.RotateAboutXAxis(45.f); | 553 ->content_to_target_transform.RotateAboutXAxis(45.f); |
550 | 554 |
551 RenderPassList pass_list; | 555 RenderPassList pass_list; |
552 pass_list.push_back(pass.Pass()); | 556 pass_list.push_back(pass.Pass()); |
553 OverlayCandidateList candidate_list; | 557 OverlayCandidateList candidate_list; |
554 overlay_processor_->ProcessForOverlays(&pass_list, &candidate_list); | 558 overlay_processor_->ProcessForOverlays(&pass_list, &candidate_list); |
555 ASSERT_EQ(1U, pass_list.size()); | 559 ASSERT_EQ(1U, pass_list.size()); |
556 EXPECT_EQ(0U, candidate_list.size()); | 560 EXPECT_EQ(0U, candidate_list.size()); |
557 } | 561 } |
558 | 562 |
559 TEST_F(SingleOverlayOnTopTest, RejectNegativeScaleTransform) { | 563 TEST_F(SingleOverlayOnTopTest, AllowVerticalFlip) { |
| 564 gfx::Rect rect = kOverlayRect; |
| 565 rect.set_width(rect.width() / 2); |
| 566 rect.Offset(0, -rect.height()); |
560 scoped_ptr<RenderPass> pass = CreateRenderPass(); | 567 scoped_ptr<RenderPass> pass = CreateRenderPass(); |
561 CreateFullscreenCandidateQuad(resource_provider_.get(), | 568 CreateCandidateQuadAt(resource_provider_.get(), |
562 pass->shared_quad_state_list.back(), | 569 pass->shared_quad_state_list.back(), pass.get(), rect); |
563 pass.get()); | |
564 pass->shared_quad_state_list.back()->content_to_target_transform.Scale(2.0f, | 570 pass->shared_quad_state_list.back()->content_to_target_transform.Scale(2.0f, |
565 -1.0f); | 571 -1.0f); |
566 | 572 |
567 RenderPassList pass_list; | 573 RenderPassList pass_list; |
568 pass_list.push_back(pass.Pass()); | 574 pass_list.push_back(pass.Pass()); |
569 OverlayCandidateList candidate_list; | 575 OverlayCandidateList candidate_list; |
570 overlay_processor_->ProcessForOverlays(&pass_list, &candidate_list); | 576 overlay_processor_->ProcessForOverlays(&pass_list, &candidate_list); |
571 ASSERT_EQ(1U, pass_list.size()); | 577 ASSERT_EQ(1U, pass_list.size()); |
572 EXPECT_EQ(0U, candidate_list.size()); | 578 ASSERT_EQ(2U, candidate_list.size()); |
| 579 EXPECT_EQ(gfx::OVERLAY_TRANSFORM_FLIP_VERTICAL, |
| 580 candidate_list.back().transform); |
| 581 } |
| 582 |
| 583 TEST_F(SingleOverlayOnTopTest, AllowHorizontalFlip) { |
| 584 gfx::Rect rect = kOverlayRect; |
| 585 rect.set_height(rect.height() / 2); |
| 586 rect.Offset(-rect.width(), 0); |
| 587 scoped_ptr<RenderPass> pass = CreateRenderPass(); |
| 588 CreateCandidateQuadAt(resource_provider_.get(), |
| 589 pass->shared_quad_state_list.back(), pass.get(), rect); |
| 590 pass->shared_quad_state_list.back()->content_to_target_transform.Scale(-1.0f, |
| 591 2.0f); |
| 592 |
| 593 RenderPassList pass_list; |
| 594 pass_list.push_back(pass.Pass()); |
| 595 OverlayCandidateList candidate_list; |
| 596 overlay_processor_->ProcessForOverlays(&pass_list, &candidate_list); |
| 597 ASSERT_EQ(1U, pass_list.size()); |
| 598 ASSERT_EQ(2U, candidate_list.size()); |
| 599 EXPECT_EQ(gfx::OVERLAY_TRANSFORM_FLIP_HORIZONTAL, |
| 600 candidate_list.back().transform); |
573 } | 601 } |
574 | 602 |
575 TEST_F(SingleOverlayOnTopTest, AllowPositiveScaleTransform) { | 603 TEST_F(SingleOverlayOnTopTest, AllowPositiveScaleTransform) { |
576 gfx::Rect rect = kOverlayRect; | 604 gfx::Rect rect = kOverlayRect; |
577 rect.set_width(rect.width() / 2); | 605 rect.set_width(rect.width() / 2); |
578 scoped_ptr<RenderPass> pass = CreateRenderPass(); | 606 scoped_ptr<RenderPass> pass = CreateRenderPass(); |
579 CreateCandidateQuadAt(resource_provider_.get(), | 607 CreateCandidateQuadAt(resource_provider_.get(), |
580 pass->shared_quad_state_list.back(), pass.get(), rect); | 608 pass->shared_quad_state_list.back(), pass.get(), rect); |
581 pass->shared_quad_state_list.back()->content_to_target_transform.Scale(2.0f, | 609 pass->shared_quad_state_list.back()->content_to_target_transform.Scale(2.0f, |
582 1.0f); | 610 1.0f); |
583 | 611 |
584 RenderPassList pass_list; | 612 RenderPassList pass_list; |
585 pass_list.push_back(pass.Pass()); | 613 pass_list.push_back(pass.Pass()); |
586 OverlayCandidateList candidate_list; | 614 OverlayCandidateList candidate_list; |
587 overlay_processor_->ProcessForOverlays(&pass_list, &candidate_list); | 615 overlay_processor_->ProcessForOverlays(&pass_list, &candidate_list); |
588 ASSERT_EQ(1U, pass_list.size()); | 616 ASSERT_EQ(1U, pass_list.size()); |
589 EXPECT_EQ(2U, candidate_list.size()); | 617 EXPECT_EQ(2U, candidate_list.size()); |
590 } | 618 } |
591 | 619 |
| 620 TEST_F(SingleOverlayOnTopTest, Allow90DegreeRotation) { |
| 621 gfx::Rect rect = kOverlayRect; |
| 622 rect.Offset(0, -rect.height()); |
| 623 scoped_ptr<RenderPass> pass = CreateRenderPass(); |
| 624 CreateCandidateQuadAt(resource_provider_.get(), |
| 625 pass->shared_quad_state_list.back(), pass.get(), rect); |
| 626 pass->shared_quad_state_list.back() |
| 627 ->content_to_target_transform.RotateAboutZAxis(90.f); |
| 628 |
| 629 RenderPassList pass_list; |
| 630 pass_list.push_back(pass.Pass()); |
| 631 OverlayCandidateList candidate_list; |
| 632 overlay_processor_->ProcessForOverlays(&pass_list, &candidate_list); |
| 633 ASSERT_EQ(1U, pass_list.size()); |
| 634 ASSERT_EQ(2U, candidate_list.size()); |
| 635 EXPECT_EQ(gfx::OVERLAY_TRANSFORM_ROTATE_90, candidate_list.back().transform); |
| 636 } |
| 637 |
| 638 TEST_F(SingleOverlayOnTopTest, Allow180DegreeRotation) { |
| 639 gfx::Rect rect = kOverlayRect; |
| 640 rect.Offset(-rect.width(), -rect.height()); |
| 641 scoped_ptr<RenderPass> pass = CreateRenderPass(); |
| 642 CreateCandidateQuadAt(resource_provider_.get(), |
| 643 pass->shared_quad_state_list.back(), pass.get(), rect); |
| 644 pass->shared_quad_state_list.back() |
| 645 ->content_to_target_transform.RotateAboutZAxis(180.f); |
| 646 |
| 647 RenderPassList pass_list; |
| 648 pass_list.push_back(pass.Pass()); |
| 649 OverlayCandidateList candidate_list; |
| 650 overlay_processor_->ProcessForOverlays(&pass_list, &candidate_list); |
| 651 ASSERT_EQ(1U, pass_list.size()); |
| 652 ASSERT_EQ(2U, candidate_list.size()); |
| 653 EXPECT_EQ(gfx::OVERLAY_TRANSFORM_ROTATE_180, candidate_list.back().transform); |
| 654 } |
| 655 |
| 656 TEST_F(SingleOverlayOnTopTest, Allow270DegreeRotation) { |
| 657 gfx::Rect rect = kOverlayRect; |
| 658 rect.Offset(-rect.width(), 0); |
| 659 scoped_ptr<RenderPass> pass = CreateRenderPass(); |
| 660 CreateCandidateQuadAt(resource_provider_.get(), |
| 661 pass->shared_quad_state_list.back(), pass.get(), rect); |
| 662 pass->shared_quad_state_list.back() |
| 663 ->content_to_target_transform.RotateAboutZAxis(270.f); |
| 664 |
| 665 RenderPassList pass_list; |
| 666 pass_list.push_back(pass.Pass()); |
| 667 OverlayCandidateList candidate_list; |
| 668 overlay_processor_->ProcessForOverlays(&pass_list, &candidate_list); |
| 669 ASSERT_EQ(1U, pass_list.size()); |
| 670 ASSERT_EQ(2U, candidate_list.size()); |
| 671 EXPECT_EQ(gfx::OVERLAY_TRANSFORM_ROTATE_270, candidate_list.back().transform); |
| 672 } |
| 673 |
592 TEST_F(SingleOverlayOnTopTest, AllowNotTopIfNotOccluded) { | 674 TEST_F(SingleOverlayOnTopTest, AllowNotTopIfNotOccluded) { |
593 scoped_ptr<RenderPass> pass = CreateRenderPass(); | 675 scoped_ptr<RenderPass> pass = CreateRenderPass(); |
594 CreateCheckeredQuadAt(resource_provider_.get(), | 676 CreateCheckeredQuadAt(resource_provider_.get(), |
595 pass->shared_quad_state_list.back(), | 677 pass->shared_quad_state_list.back(), |
596 pass.get(), | 678 pass.get(), |
597 kOverlayTopLeftRect); | 679 kOverlayTopLeftRect); |
598 CreateCandidateQuadAt(resource_provider_.get(), | 680 CreateCandidateQuadAt(resource_provider_.get(), |
599 pass->shared_quad_state_list.back(), | 681 pass->shared_quad_state_list.back(), |
600 pass.get(), | 682 pass.get(), |
601 kOverlayBottomRightRect); | 683 kOverlayBottomRightRect); |
(...skipping 504 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1106 renderer_->BeginDrawingFrame(&frame3); | 1188 renderer_->BeginDrawingFrame(&frame3); |
1107 renderer_->FinishDrawingFrame(&frame3); | 1189 renderer_->FinishDrawingFrame(&frame3); |
1108 EXPECT_TRUE(resource_provider_->InUseByConsumer(resource1)); | 1190 EXPECT_TRUE(resource_provider_->InUseByConsumer(resource1)); |
1109 SwapBuffers(); | 1191 SwapBuffers(); |
1110 EXPECT_FALSE(resource_provider_->InUseByConsumer(resource1)); | 1192 EXPECT_FALSE(resource_provider_->InUseByConsumer(resource1)); |
1111 Mock::VerifyAndClearExpectations(&scheduler_); | 1193 Mock::VerifyAndClearExpectations(&scheduler_); |
1112 } | 1194 } |
1113 | 1195 |
1114 } // namespace | 1196 } // namespace |
1115 } // namespace cc | 1197 } // namespace cc |
OLD | NEW |