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

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

Issue 1135813005: Add detection for rotation and flip overlay transforms (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Created 5 years, 7 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
1 // Copyright 2014 The Chromium Authors. All rights reserved. 1 // Copyright 2014 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 #include "cc/base/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
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
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
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);
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);
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
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
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698