Chromium Code Reviews| 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 13 matching lines...) Expand all Loading... | |
| 24 #include "testing/gmock/include/gmock/gmock.h" | 24 #include "testing/gmock/include/gmock/gmock.h" |
| 25 #include "testing/gtest/include/gtest/gtest.h" | 25 #include "testing/gtest/include/gtest/gtest.h" |
| 26 | 26 |
| 27 using testing::_; | 27 using testing::_; |
| 28 using testing::Mock; | 28 using testing::Mock; |
| 29 | 29 |
| 30 namespace cc { | 30 namespace cc { |
| 31 namespace { | 31 namespace { |
| 32 | 32 |
| 33 const gfx::Rect kOverlayRect(0, 0, 128, 128); | 33 const gfx::Rect kOverlayRect(0, 0, 128, 128); |
| 34 const gfx::RectF kExpectedDisplayRect(0, 0, 128, 128); | |
| 34 const gfx::Rect kOverlayTopLeftRect(0, 0, 64, 64); | 35 const gfx::Rect kOverlayTopLeftRect(0, 0, 64, 64); |
| 35 const gfx::Rect kOverlayBottomRightRect(64, 64, 64, 64); | 36 const gfx::Rect kOverlayBottomRightRect(64, 64, 64, 64); |
| 36 const gfx::PointF kUVTopLeft(0.1f, 0.2f); | 37 const gfx::PointF kUVTopLeft(0.1f, 0.2f); |
| 37 const gfx::PointF kUVBottomRight(1.0f, 1.0f); | 38 const gfx::PointF kUVBottomRight(1.0f, 1.0f); |
| 38 const gfx::Transform kNormalTransform = | 39 const gfx::Transform kNormalTransform = |
| 39 gfx::Transform(0.9f, 0, 0, 0.8f, 0.1f, 0.2f); // x,y -> x,y. | 40 gfx::Transform(0.9f, 0, 0, 0.8f, 0.1f, 0.2f); // x,y -> x,y. |
| 40 const gfx::Transform kXMirrorTransform = | 41 const gfx::Transform kXMirrorTransform = |
| 41 gfx::Transform(-0.9f, 0, 0, 0.8f, 1.0f, 0.2f); // x,y -> 1-x,y. | 42 gfx::Transform(-0.9f, 0, 0, 0.8f, 1.0f, 0.2f); // x,y -> 1-x,y. |
| 42 const gfx::Transform kYMirrorTransform = | 43 const gfx::Transform kYMirrorTransform = |
| 43 gfx::Transform(0.9f, 0, 0, -0.8f, 0.1f, 1.0f); // x,y -> x,1-y. | 44 gfx::Transform(0.9f, 0, 0, -0.8f, 0.1f, 1.0f); // x,y -> x,1-y. |
| (...skipping 10 matching lines...) Expand all Loading... | |
| 54 class SingleOverlayValidator : public OverlayCandidateValidator { | 55 class SingleOverlayValidator : public OverlayCandidateValidator { |
| 55 public: | 56 public: |
| 56 void CheckOverlaySupport(OverlayCandidateList* surfaces) override; | 57 void CheckOverlaySupport(OverlayCandidateList* surfaces) override; |
| 57 }; | 58 }; |
| 58 | 59 |
| 59 void SingleOverlayValidator::CheckOverlaySupport( | 60 void SingleOverlayValidator::CheckOverlaySupport( |
| 60 OverlayCandidateList* surfaces) { | 61 OverlayCandidateList* surfaces) { |
| 61 ASSERT_EQ(2U, surfaces->size()); | 62 ASSERT_EQ(2U, surfaces->size()); |
| 62 | 63 |
| 63 OverlayCandidate& candidate = surfaces->back(); | 64 OverlayCandidate& candidate = surfaces->back(); |
| 64 if (candidate.display_rect.width() == 64) | 65 if (candidate.display_rect.width() == 64) { |
| 65 EXPECT_EQ(kOverlayBottomRightRect, candidate.display_rect); | 66 EXPECT_EQ(kOverlayBottomRightRect, candidate.display_rect); |
| 66 else | 67 } else { |
| 67 EXPECT_EQ(kOverlayRect, candidate.display_rect); | 68 EXPECT_NEAR(kOverlayRect.x(), candidate.display_rect.x(), 0.01f); |
| 69 EXPECT_NEAR(kOverlayRect.y(), candidate.display_rect.y(), 0.01f); | |
| 70 EXPECT_NEAR(kOverlayRect.width(), candidate.display_rect.width(), 0.01f); | |
| 71 EXPECT_NEAR(kOverlayRect.height(), candidate.display_rect.height(), 0.01f); | |
| 72 } | |
| 68 EXPECT_EQ(BoundingRect(kUVTopLeft, kUVBottomRight).ToString(), | 73 EXPECT_EQ(BoundingRect(kUVTopLeft, kUVBottomRight).ToString(), |
| 69 candidate.uv_rect.ToString()); | 74 candidate.uv_rect.ToString()); |
| 70 candidate.overlay_handled = true; | 75 candidate.overlay_handled = true; |
| 71 } | 76 } |
| 72 | 77 |
| 73 template <typename OverlayStrategyType> | 78 template <typename OverlayStrategyType> |
| 74 class SingleOverlayProcessor : public OverlayProcessor { | 79 class SingleOverlayProcessor : public OverlayProcessor { |
| 75 public: | 80 public: |
| 76 SingleOverlayProcessor(OutputSurface* surface, | 81 SingleOverlayProcessor(OutputSurface* surface, |
| 77 ResourceProvider* resource_provider) | 82 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; | 538 pass->shared_quad_state_list.back()->opacity = 0.5f; |
| 534 | 539 |
| 535 RenderPassList pass_list; | 540 RenderPassList pass_list; |
| 536 pass_list.push_back(pass.Pass()); | 541 pass_list.push_back(pass.Pass()); |
| 537 OverlayCandidateList candidate_list; | 542 OverlayCandidateList candidate_list; |
| 538 overlay_processor_->ProcessForOverlays(&pass_list, &candidate_list); | 543 overlay_processor_->ProcessForOverlays(&pass_list, &candidate_list); |
| 539 ASSERT_EQ(1U, pass_list.size()); | 544 ASSERT_EQ(1U, pass_list.size()); |
| 540 EXPECT_EQ(0U, candidate_list.size()); | 545 EXPECT_EQ(0U, candidate_list.size()); |
| 541 } | 546 } |
| 542 | 547 |
| 543 TEST_F(SingleOverlayOnTopTest, RejectNonScaleTransform) { | 548 TEST_F(SingleOverlayOnTopTest, RejectNonAxisAlignedTransform) { |
| 544 scoped_ptr<RenderPass> pass = CreateRenderPass(); | 549 scoped_ptr<RenderPass> pass = CreateRenderPass(); |
| 545 CreateFullscreenCandidateQuad(resource_provider_.get(), | 550 CreateFullscreenCandidateQuad(resource_provider_.get(), |
| 546 pass->shared_quad_state_list.back(), | 551 pass->shared_quad_state_list.back(), |
| 547 pass.get()); | 552 pass.get()); |
| 548 pass->shared_quad_state_list.back() | 553 pass->shared_quad_state_list.back() |
| 549 ->content_to_target_transform.RotateAboutXAxis(45.f); | 554 ->content_to_target_transform.RotateAboutXAxis(45.f); |
| 550 | 555 |
| 551 RenderPassList pass_list; | 556 RenderPassList pass_list; |
| 552 pass_list.push_back(pass.Pass()); | 557 pass_list.push_back(pass.Pass()); |
| 553 OverlayCandidateList candidate_list; | 558 OverlayCandidateList candidate_list; |
| 554 overlay_processor_->ProcessForOverlays(&pass_list, &candidate_list); | 559 overlay_processor_->ProcessForOverlays(&pass_list, &candidate_list); |
| 555 ASSERT_EQ(1U, pass_list.size()); | 560 ASSERT_EQ(1U, pass_list.size()); |
| 556 EXPECT_EQ(0U, candidate_list.size()); | 561 EXPECT_EQ(0U, candidate_list.size()); |
| 557 } | 562 } |
| 558 | 563 |
| 559 TEST_F(SingleOverlayOnTopTest, RejectNegativeScaleTransform) { | 564 TEST_F(SingleOverlayOnTopTest, AllowVerticalFlip) { |
| 565 gfx::Rect rect = kOverlayRect; | |
| 566 rect.set_width(rect.width() / 2); | |
|
danakj
2015/05/12 23:32:15
why the width/2 ?
halliwell
2015/05/13 00:49:50
Following the same pattern as existing tests (you
danakj
2015/05/13 16:29:25
Ah, missed the scale2 down there.
| |
| 567 rect.Offset(0, -rect.height()); | |
| 560 scoped_ptr<RenderPass> pass = CreateRenderPass(); | 568 scoped_ptr<RenderPass> pass = CreateRenderPass(); |
| 561 CreateFullscreenCandidateQuad(resource_provider_.get(), | 569 CreateCandidateQuadAt(resource_provider_.get(), |
| 562 pass->shared_quad_state_list.back(), | 570 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, | 571 pass->shared_quad_state_list.back()->content_to_target_transform.Scale(2.0f, |
| 565 -1.0f); | 572 -1.0f); |
| 566 | 573 |
| 567 RenderPassList pass_list; | 574 RenderPassList pass_list; |
| 568 pass_list.push_back(pass.Pass()); | 575 pass_list.push_back(pass.Pass()); |
| 569 OverlayCandidateList candidate_list; | 576 OverlayCandidateList candidate_list; |
| 570 overlay_processor_->ProcessForOverlays(&pass_list, &candidate_list); | 577 overlay_processor_->ProcessForOverlays(&pass_list, &candidate_list); |
| 571 ASSERT_EQ(1U, pass_list.size()); | 578 ASSERT_EQ(1U, pass_list.size()); |
| 572 EXPECT_EQ(0U, candidate_list.size()); | 579 ASSERT_EQ(2U, candidate_list.size()); |
| 580 EXPECT_EQ(gfx::OVERLAY_TRANSFORM_FLIP_VERTICAL, | |
| 581 candidate_list.back().transform); | |
| 582 } | |
| 583 | |
| 584 TEST_F(SingleOverlayOnTopTest, AllowHorizontalFlip) { | |
| 585 gfx::Rect rect = kOverlayRect; | |
| 586 rect.set_height(rect.height() / 2); | |
|
danakj
2015/05/12 23:32:15
why height/2 ?
halliwell
2015/05/13 00:49:50
Same reason as previous test. In this case, y sca
| |
| 587 rect.Offset(-rect.width(), 0); | |
| 588 scoped_ptr<RenderPass> pass = CreateRenderPass(); | |
| 589 CreateCandidateQuadAt(resource_provider_.get(), | |
| 590 pass->shared_quad_state_list.back(), pass.get(), rect); | |
| 591 pass->shared_quad_state_list.back()->content_to_target_transform.Scale(-1.0f, | |
| 592 2.0f); | |
| 593 | |
| 594 RenderPassList pass_list; | |
| 595 pass_list.push_back(pass.Pass()); | |
| 596 OverlayCandidateList candidate_list; | |
| 597 overlay_processor_->ProcessForOverlays(&pass_list, &candidate_list); | |
| 598 ASSERT_EQ(1U, pass_list.size()); | |
| 599 ASSERT_EQ(2U, candidate_list.size()); | |
| 600 EXPECT_EQ(gfx::OVERLAY_TRANSFORM_FLIP_HORIZONTAL, | |
| 601 candidate_list.back().transform); | |
| 573 } | 602 } |
| 574 | 603 |
| 575 TEST_F(SingleOverlayOnTopTest, AllowPositiveScaleTransform) { | 604 TEST_F(SingleOverlayOnTopTest, AllowPositiveScaleTransform) { |
| 576 gfx::Rect rect = kOverlayRect; | 605 gfx::Rect rect = kOverlayRect; |
| 577 rect.set_width(rect.width() / 2); | 606 rect.set_width(rect.width() / 2); |
| 578 scoped_ptr<RenderPass> pass = CreateRenderPass(); | 607 scoped_ptr<RenderPass> pass = CreateRenderPass(); |
| 579 CreateCandidateQuadAt(resource_provider_.get(), | 608 CreateCandidateQuadAt(resource_provider_.get(), |
| 580 pass->shared_quad_state_list.back(), pass.get(), rect); | 609 pass->shared_quad_state_list.back(), pass.get(), rect); |
| 581 pass->shared_quad_state_list.back()->content_to_target_transform.Scale(2.0f, | 610 pass->shared_quad_state_list.back()->content_to_target_transform.Scale(2.0f, |
| 582 1.0f); | 611 1.0f); |
| 583 | 612 |
| 584 RenderPassList pass_list; | 613 RenderPassList pass_list; |
| 585 pass_list.push_back(pass.Pass()); | 614 pass_list.push_back(pass.Pass()); |
| 586 OverlayCandidateList candidate_list; | 615 OverlayCandidateList candidate_list; |
| 587 overlay_processor_->ProcessForOverlays(&pass_list, &candidate_list); | 616 overlay_processor_->ProcessForOverlays(&pass_list, &candidate_list); |
| 588 ASSERT_EQ(1U, pass_list.size()); | 617 ASSERT_EQ(1U, pass_list.size()); |
| 589 EXPECT_EQ(2U, candidate_list.size()); | 618 EXPECT_EQ(2U, candidate_list.size()); |
| 590 } | 619 } |
| 591 | 620 |
| 621 TEST_F(SingleOverlayOnTopTest, Allow90DegreeRotation) { | |
| 622 gfx::Rect rect = kOverlayRect; | |
| 623 rect.Offset(0, -rect.height()); | |
| 624 scoped_ptr<RenderPass> pass = CreateRenderPass(); | |
| 625 CreateCandidateQuadAt(resource_provider_.get(), | |
| 626 pass->shared_quad_state_list.back(), pass.get(), rect); | |
| 627 pass->shared_quad_state_list.back() | |
| 628 ->content_to_target_transform.RotateAboutZAxis(90.f); | |
| 629 | |
| 630 RenderPassList pass_list; | |
| 631 pass_list.push_back(pass.Pass()); | |
| 632 OverlayCandidateList candidate_list; | |
| 633 overlay_processor_->ProcessForOverlays(&pass_list, &candidate_list); | |
| 634 ASSERT_EQ(1U, pass_list.size()); | |
| 635 ASSERT_EQ(2U, candidate_list.size()); | |
| 636 EXPECT_EQ(gfx::OVERLAY_TRANSFORM_ROTATE_90, candidate_list.back().transform); | |
| 637 } | |
| 638 | |
| 639 TEST_F(SingleOverlayOnTopTest, Allow180DegreeRotation) { | |
| 640 gfx::Rect rect = kOverlayRect; | |
| 641 rect.Offset(-rect.width(), -rect.height()); | |
| 642 scoped_ptr<RenderPass> pass = CreateRenderPass(); | |
| 643 CreateCandidateQuadAt(resource_provider_.get(), | |
| 644 pass->shared_quad_state_list.back(), pass.get(), rect); | |
| 645 pass->shared_quad_state_list.back() | |
| 646 ->content_to_target_transform.RotateAboutZAxis(180.f); | |
| 647 | |
| 648 RenderPassList pass_list; | |
| 649 pass_list.push_back(pass.Pass()); | |
| 650 OverlayCandidateList candidate_list; | |
| 651 overlay_processor_->ProcessForOverlays(&pass_list, &candidate_list); | |
| 652 ASSERT_EQ(1U, pass_list.size()); | |
| 653 ASSERT_EQ(2U, candidate_list.size()); | |
| 654 EXPECT_EQ(gfx::OVERLAY_TRANSFORM_ROTATE_180, candidate_list.back().transform); | |
| 655 } | |
| 656 | |
| 657 TEST_F(SingleOverlayOnTopTest, Allow270DegreeRotation) { | |
| 658 gfx::Rect rect = kOverlayRect; | |
| 659 rect.Offset(-rect.width(), 0); | |
| 660 scoped_ptr<RenderPass> pass = CreateRenderPass(); | |
| 661 CreateCandidateQuadAt(resource_provider_.get(), | |
| 662 pass->shared_quad_state_list.back(), pass.get(), rect); | |
| 663 pass->shared_quad_state_list.back() | |
| 664 ->content_to_target_transform.RotateAboutZAxis(270.f); | |
| 665 | |
| 666 RenderPassList pass_list; | |
| 667 pass_list.push_back(pass.Pass()); | |
| 668 OverlayCandidateList candidate_list; | |
| 669 overlay_processor_->ProcessForOverlays(&pass_list, &candidate_list); | |
| 670 ASSERT_EQ(1U, pass_list.size()); | |
| 671 ASSERT_EQ(2U, candidate_list.size()); | |
| 672 EXPECT_EQ(gfx::OVERLAY_TRANSFORM_ROTATE_270, candidate_list.back().transform); | |
| 673 } | |
| 674 | |
| 592 TEST_F(SingleOverlayOnTopTest, AllowNotTopIfNotOccluded) { | 675 TEST_F(SingleOverlayOnTopTest, AllowNotTopIfNotOccluded) { |
| 593 scoped_ptr<RenderPass> pass = CreateRenderPass(); | 676 scoped_ptr<RenderPass> pass = CreateRenderPass(); |
| 594 CreateCheckeredQuadAt(resource_provider_.get(), | 677 CreateCheckeredQuadAt(resource_provider_.get(), |
| 595 pass->shared_quad_state_list.back(), | 678 pass->shared_quad_state_list.back(), |
| 596 pass.get(), | 679 pass.get(), |
| 597 kOverlayTopLeftRect); | 680 kOverlayTopLeftRect); |
| 598 CreateCandidateQuadAt(resource_provider_.get(), | 681 CreateCandidateQuadAt(resource_provider_.get(), |
| 599 pass->shared_quad_state_list.back(), | 682 pass->shared_quad_state_list.back(), |
| 600 pass.get(), | 683 pass.get(), |
| 601 kOverlayBottomRightRect); | 684 kOverlayBottomRightRect); |
| (...skipping 501 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 1103 renderer_->BeginDrawingFrame(&frame3); | 1186 renderer_->BeginDrawingFrame(&frame3); |
| 1104 renderer_->FinishDrawingFrame(&frame3); | 1187 renderer_->FinishDrawingFrame(&frame3); |
| 1105 EXPECT_TRUE(resource_provider_->InUseByConsumer(resource1)); | 1188 EXPECT_TRUE(resource_provider_->InUseByConsumer(resource1)); |
| 1106 SwapBuffers(); | 1189 SwapBuffers(); |
| 1107 EXPECT_FALSE(resource_provider_->InUseByConsumer(resource1)); | 1190 EXPECT_FALSE(resource_provider_->InUseByConsumer(resource1)); |
| 1108 Mock::VerifyAndClearExpectations(&scheduler_); | 1191 Mock::VerifyAndClearExpectations(&scheduler_); |
| 1109 } | 1192 } |
| 1110 | 1193 |
| 1111 } // namespace | 1194 } // namespace |
| 1112 } // namespace cc | 1195 } // namespace cc |
| OLD | NEW |