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

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: Fix mojo surfaces unit test, chase flipped rename to TextureQuadState 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
« no previous file with comments | « cc/output/overlay_strategy_common.cc ('k') | cc/output/software_renderer.cc » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
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 43 matching lines...) Expand 10 before | Expand all | Expand 10 after
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
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
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
OLDNEW
« no previous file with comments | « cc/output/overlay_strategy_common.cc ('k') | cc/output/software_renderer.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698