| 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 |