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

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

Issue 855403002: cc: Change the restrictions on overlays for video (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: rebase Created 5 years, 10 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_single_on_top.cc ('k') | no next file » | 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/gl_renderer.h" 6 #include "cc/output/gl_renderer.h"
7 #include "cc/output/output_surface.h" 7 #include "cc/output/output_surface.h"
8 #include "cc/output/output_surface_client.h" 8 #include "cc/output/output_surface_client.h"
9 #include "cc/output/overlay_candidate_validator.h" 9 #include "cc/output/overlay_candidate_validator.h"
10 #include "cc/output/overlay_processor.h" 10 #include "cc/output/overlay_processor.h"
11 #include "cc/output/overlay_strategy_single_on_top.h" 11 #include "cc/output/overlay_strategy_single_on_top.h"
12 #include "cc/quads/checkerboard_draw_quad.h" 12 #include "cc/quads/checkerboard_draw_quad.h"
13 #include "cc/quads/render_pass.h" 13 #include "cc/quads/render_pass.h"
14 #include "cc/quads/stream_video_draw_quad.h"
14 #include "cc/quads/texture_draw_quad.h" 15 #include "cc/quads/texture_draw_quad.h"
15 #include "cc/resources/resource_provider.h" 16 #include "cc/resources/resource_provider.h"
16 #include "cc/resources/texture_mailbox.h" 17 #include "cc/resources/texture_mailbox.h"
17 #include "cc/test/fake_output_surface_client.h" 18 #include "cc/test/fake_output_surface_client.h"
18 #include "cc/test/geometry_test_utils.h" 19 #include "cc/test/geometry_test_utils.h"
19 #include "cc/test/test_context_provider.h" 20 #include "cc/test/test_context_provider.h"
20 #include "cc/test/test_shared_bitmap_manager.h" 21 #include "cc/test/test_shared_bitmap_manager.h"
21 #include "testing/gmock/include/gmock/gmock.h" 22 #include "testing/gmock/include/gmock/gmock.h"
22 #include "testing/gtest/include/gtest/gtest.h" 23 #include "testing/gtest/include/gtest/gtest.h"
23 24
24 using testing::_; 25 using testing::_;
25 using testing::Mock; 26 using testing::Mock;
26 27
27 namespace cc { 28 namespace cc {
28 namespace { 29 namespace {
29 30
30 const gfx::Rect kOverlayRect(0, 0, 128, 128); 31 const gfx::Rect kOverlayRect(0, 0, 128, 128);
31 const gfx::Rect kOverlayTopLeftRect(0, 0, 64, 64); 32 const gfx::Rect kOverlayTopLeftRect(0, 0, 64, 64);
32 const gfx::Rect kOverlayBottomRightRect(64, 64, 64, 64); 33 const gfx::Rect kOverlayBottomRightRect(64, 64, 64, 64);
33 const gfx::PointF kUVTopLeft(0.1f, 0.2f); 34 const gfx::PointF kUVTopLeft(0.1f, 0.2f);
34 const gfx::PointF kUVBottomRight(1.0f, 1.0f); 35 const gfx::PointF kUVBottomRight(1.0f, 1.0f);
36 const gfx::Transform kNormalTransform =
37 gfx::Transform(0.9f, 0, 0, 0.8f, 0.1f, 0.2f); // x,y -> x,y.
38 const gfx::Transform kXMirrorTransform =
39 gfx::Transform(-0.9f, 0, 0, 0.8f, 1.0f, 0.2f); // x,y -> 1-x,y.
40 const gfx::Transform kYMirrorTransform =
41 gfx::Transform(0.9f, 0, 0, -0.8f, 0.1f, 1.0f); // x,y -> x,1-y.
42 const gfx::Transform kBothMirrorTransform =
43 gfx::Transform(-0.9f, 0, 0, -0.8f, 1.0f, 1.0f); // x,y -> 1-x,1-y.
44 const gfx::Transform kSwapTransform =
45 gfx::Transform(0, 1, 1, 0, 0, 0); // x,y -> y,x.
35 46
36 void MailboxReleased(unsigned sync_point, 47 void MailboxReleased(unsigned sync_point,
37 bool lost_resource, 48 bool lost_resource,
38 BlockingTaskRunner* main_thread_task_runner) { 49 BlockingTaskRunner* main_thread_task_runner) {
39 } 50 }
40 51
41 class SingleOverlayValidator : public OverlayCandidateValidator { 52 class SingleOverlayValidator : public OverlayCandidateValidator {
42 public: 53 public:
43 void CheckOverlaySupport(OverlayCandidateList* surfaces) override; 54 void CheckOverlaySupport(OverlayCandidateList* surfaces) override;
44 }; 55 };
(...skipping 121 matching lines...) Expand 10 before | Expand all | Expand 10 after
166 kUVTopLeft, 177 kUVTopLeft,
167 kUVBottomRight, 178 kUVBottomRight,
168 SK_ColorTRANSPARENT, 179 SK_ColorTRANSPARENT,
169 vertex_opacity, 180 vertex_opacity,
170 flipped, 181 flipped,
171 nearest_neighbor); 182 nearest_neighbor);
172 183
173 return overlay_quad; 184 return overlay_quad;
174 } 185 }
175 186
187 StreamVideoDrawQuad* CreateCandidateVideoQuadAt(
188 ResourceProvider* resource_provider,
189 const SharedQuadState* shared_quad_state,
190 RenderPass* render_pass,
191 const gfx::Rect& rect,
192 const gfx::Transform& transform) {
193 ResourceProvider::ResourceId resource_id = CreateResource(resource_provider);
194
195 StreamVideoDrawQuad* overlay_quad =
196 render_pass->CreateAndAppendDrawQuad<StreamVideoDrawQuad>();
197 overlay_quad->SetNew(shared_quad_state, rect, rect, rect, resource_id,
198 transform);
199
200 return overlay_quad;
201 }
202
176 TextureDrawQuad* CreateFullscreenCandidateQuad( 203 TextureDrawQuad* CreateFullscreenCandidateQuad(
177 ResourceProvider* resource_provider, 204 ResourceProvider* resource_provider,
178 const SharedQuadState* shared_quad_state, 205 const SharedQuadState* shared_quad_state,
179 RenderPass* render_pass) { 206 RenderPass* render_pass) {
180 return CreateCandidateQuadAt( 207 return CreateCandidateQuadAt(
181 resource_provider, shared_quad_state, render_pass, kOverlayRect); 208 resource_provider, shared_quad_state, render_pass, kOverlayRect);
182 } 209 }
183 210
211 StreamVideoDrawQuad* CreateFullscreenCandidateVideoQuad(
212 ResourceProvider* resource_provider,
213 const SharedQuadState* shared_quad_state,
214 RenderPass* render_pass,
215 const gfx::Transform& transform) {
216 return CreateCandidateVideoQuadAt(resource_provider, shared_quad_state,
217 render_pass, kOverlayRect, transform);
218 }
219
184 void CreateCheckeredQuadAt(ResourceProvider* resource_provider, 220 void CreateCheckeredQuadAt(ResourceProvider* resource_provider,
185 const SharedQuadState* shared_quad_state, 221 const SharedQuadState* shared_quad_state,
186 RenderPass* render_pass, 222 RenderPass* render_pass,
187 const gfx::Rect& rect) { 223 const gfx::Rect& rect) {
188 CheckerboardDrawQuad* checkerboard_quad = 224 CheckerboardDrawQuad* checkerboard_quad =
189 render_pass->CreateAndAppendDrawQuad<CheckerboardDrawQuad>(); 225 render_pass->CreateAndAppendDrawQuad<CheckerboardDrawQuad>();
190 checkerboard_quad->SetNew(shared_quad_state, rect, rect, SkColor()); 226 checkerboard_quad->SetNew(shared_quad_state, rect, rect, SkColor());
191 } 227 }
192 228
193 void CreateFullscreenCheckeredQuad(ResourceProvider* resource_provider, 229 void CreateFullscreenCheckeredQuad(ResourceProvider* resource_provider,
(...skipping 283 matching lines...) Expand 10 before | Expand all | Expand 10 after
477 pass->shared_quad_state_list.back()->opacity = 0.5f; 513 pass->shared_quad_state_list.back()->opacity = 0.5f;
478 514
479 RenderPassList pass_list; 515 RenderPassList pass_list;
480 pass_list.push_back(pass.Pass()); 516 pass_list.push_back(pass.Pass());
481 OverlayCandidateList candidate_list; 517 OverlayCandidateList candidate_list;
482 overlay_processor_->ProcessForOverlays(&pass_list, &candidate_list); 518 overlay_processor_->ProcessForOverlays(&pass_list, &candidate_list);
483 ASSERT_EQ(1U, pass_list.size()); 519 ASSERT_EQ(1U, pass_list.size());
484 EXPECT_EQ(0U, candidate_list.size()); 520 EXPECT_EQ(0U, candidate_list.size());
485 } 521 }
486 522
487 TEST_F(SingleOverlayOnTopTest, RejectTransform) { 523 TEST_F(SingleOverlayOnTopTest, RejectNonScaleTransform) {
488 scoped_ptr<RenderPass> pass = CreateRenderPass(); 524 scoped_ptr<RenderPass> pass = CreateRenderPass();
489 CreateFullscreenCandidateQuad(resource_provider_.get(), 525 CreateFullscreenCandidateQuad(resource_provider_.get(),
490 pass->shared_quad_state_list.back(), 526 pass->shared_quad_state_list.back(),
491 pass.get()); 527 pass.get());
492 pass->shared_quad_state_list.back()->content_to_target_transform.Scale(2.f, 528 pass->shared_quad_state_list.back()
493 2.f); 529 ->content_to_target_transform.RotateAboutXAxis(45.f);
494 530
495 RenderPassList pass_list; 531 RenderPassList pass_list;
496 pass_list.push_back(pass.Pass()); 532 pass_list.push_back(pass.Pass());
497 OverlayCandidateList candidate_list; 533 OverlayCandidateList candidate_list;
498 overlay_processor_->ProcessForOverlays(&pass_list, &candidate_list); 534 overlay_processor_->ProcessForOverlays(&pass_list, &candidate_list);
499 ASSERT_EQ(1U, pass_list.size()); 535 ASSERT_EQ(1U, pass_list.size());
500 EXPECT_EQ(0U, candidate_list.size()); 536 EXPECT_EQ(0U, candidate_list.size());
501 } 537 }
502 538
539 TEST_F(SingleOverlayOnTopTest, RejectNegativeScaleTransform) {
540 scoped_ptr<RenderPass> pass = CreateRenderPass();
541 CreateFullscreenCandidateQuad(resource_provider_.get(),
542 pass->shared_quad_state_list.back(),
543 pass.get());
544 pass->shared_quad_state_list.back()->content_to_target_transform.Scale(2.0f,
545 -1.0f);
546
547 RenderPassList pass_list;
548 pass_list.push_back(pass.Pass());
549 OverlayCandidateList candidate_list;
550 overlay_processor_->ProcessForOverlays(&pass_list, &candidate_list);
551 ASSERT_EQ(1U, pass_list.size());
552 EXPECT_EQ(0U, candidate_list.size());
553 }
554
555 TEST_F(SingleOverlayOnTopTest, AllowPositiveScaleTransform) {
556 gfx::Rect rect = kOverlayRect;
557 rect.set_width(rect.width() / 2);
558 scoped_ptr<RenderPass> pass = CreateRenderPass();
559 CreateCandidateQuadAt(resource_provider_.get(),
560 pass->shared_quad_state_list.back(), pass.get(), rect);
561 pass->shared_quad_state_list.back()->content_to_target_transform.Scale(2.0f,
562 1.0f);
563
564 RenderPassList pass_list;
565 pass_list.push_back(pass.Pass());
566 OverlayCandidateList candidate_list;
567 overlay_processor_->ProcessForOverlays(&pass_list, &candidate_list);
568 ASSERT_EQ(1U, pass_list.size());
569 EXPECT_EQ(2U, candidate_list.size());
570 }
571
503 TEST_F(SingleOverlayOnTopTest, AllowNotTopIfNotOccluded) { 572 TEST_F(SingleOverlayOnTopTest, AllowNotTopIfNotOccluded) {
504 scoped_ptr<RenderPass> pass = CreateRenderPass(); 573 scoped_ptr<RenderPass> pass = CreateRenderPass();
505 CreateCheckeredQuadAt(resource_provider_.get(), 574 CreateCheckeredQuadAt(resource_provider_.get(),
506 pass->shared_quad_state_list.back(), 575 pass->shared_quad_state_list.back(),
507 pass.get(), 576 pass.get(),
508 kOverlayTopLeftRect); 577 kOverlayTopLeftRect);
509 CreateCandidateQuadAt(resource_provider_.get(), 578 CreateCandidateQuadAt(resource_provider_.get(),
510 pass->shared_quad_state_list.back(), 579 pass->shared_quad_state_list.back(),
511 pass.get(), 580 pass.get(),
512 kOverlayBottomRightRect); 581 kOverlayBottomRightRect);
513 582
514 RenderPassList pass_list; 583 RenderPassList pass_list;
515 pass_list.push_back(pass.Pass()); 584 pass_list.push_back(pass.Pass());
516 585
517 RenderPassList original_pass_list; 586 RenderPassList original_pass_list;
518 RenderPass::CopyAll(pass_list, &original_pass_list); 587 RenderPass::CopyAll(pass_list, &original_pass_list);
519 588
520 OverlayCandidateList candidate_list; 589 OverlayCandidateList candidate_list;
521 overlay_processor_->ProcessForOverlays(&pass_list, &candidate_list); 590 overlay_processor_->ProcessForOverlays(&pass_list, &candidate_list);
522 EXPECT_EQ(1U, pass_list.size()); 591 EXPECT_EQ(1U, pass_list.size());
523 EXPECT_EQ(2U, candidate_list.size()); 592 EXPECT_EQ(2U, candidate_list.size());
524 } 593 }
525 594
595 TEST_F(SingleOverlayOnTopTest, RejectVideoSwapTransform) {
596 scoped_ptr<RenderPass> pass = CreateRenderPass();
597 CreateFullscreenCandidateVideoQuad(resource_provider_.get(),
598 pass->shared_quad_state_list.back(),
599 pass.get(), kSwapTransform);
600
601 RenderPassList pass_list;
602 pass_list.push_back(pass.Pass());
603 OverlayCandidateList candidate_list;
604 overlay_processor_->ProcessForOverlays(&pass_list, &candidate_list);
605 ASSERT_EQ(1U, pass_list.size());
606 EXPECT_EQ(0U, candidate_list.size());
607 }
608
609 TEST_F(SingleOverlayOnTopTest, AllowVideoXMirrorTransform) {
610 scoped_ptr<RenderPass> pass = CreateRenderPass();
611 CreateFullscreenCandidateVideoQuad(resource_provider_.get(),
612 pass->shared_quad_state_list.back(),
613 pass.get(), kXMirrorTransform);
614
615 RenderPassList pass_list;
616 pass_list.push_back(pass.Pass());
617 OverlayCandidateList candidate_list;
618 overlay_processor_->ProcessForOverlays(&pass_list, &candidate_list);
619 ASSERT_EQ(1U, pass_list.size());
620 EXPECT_EQ(2U, candidate_list.size());
621 }
622
623 TEST_F(SingleOverlayOnTopTest, AllowVideoBothMirrorTransform) {
624 scoped_ptr<RenderPass> pass = CreateRenderPass();
625 CreateFullscreenCandidateVideoQuad(resource_provider_.get(),
626 pass->shared_quad_state_list.back(),
627 pass.get(), kBothMirrorTransform);
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 EXPECT_EQ(2U, candidate_list.size());
635 }
636
637 TEST_F(SingleOverlayOnTopTest, AllowVideoNormalTransform) {
638 scoped_ptr<RenderPass> pass = CreateRenderPass();
639 CreateFullscreenCandidateVideoQuad(resource_provider_.get(),
640 pass->shared_quad_state_list.back(),
641 pass.get(), kNormalTransform);
642
643 RenderPassList pass_list;
644 pass_list.push_back(pass.Pass());
645 OverlayCandidateList candidate_list;
646 overlay_processor_->ProcessForOverlays(&pass_list, &candidate_list);
647 ASSERT_EQ(1U, pass_list.size());
648 EXPECT_EQ(2U, candidate_list.size());
649 }
650
651 TEST_F(SingleOverlayOnTopTest, AllowVideoYMirrorTransform) {
652 scoped_ptr<RenderPass> pass = CreateRenderPass();
653 CreateFullscreenCandidateVideoQuad(resource_provider_.get(),
654 pass->shared_quad_state_list.back(),
655 pass.get(), kYMirrorTransform);
656
657 RenderPassList pass_list;
658 pass_list.push_back(pass.Pass());
659 OverlayCandidateList candidate_list;
660 overlay_processor_->ProcessForOverlays(&pass_list, &candidate_list);
661 ASSERT_EQ(1U, pass_list.size());
662 EXPECT_EQ(2U, candidate_list.size());
663 }
664
526 class OverlayInfoRendererGL : public GLRenderer { 665 class OverlayInfoRendererGL : public GLRenderer {
527 public: 666 public:
528 OverlayInfoRendererGL(RendererClient* client, 667 OverlayInfoRendererGL(RendererClient* client,
529 const RendererSettings* settings, 668 const RendererSettings* settings,
530 OutputSurface* output_surface, 669 OutputSurface* output_surface,
531 ResourceProvider* resource_provider) 670 ResourceProvider* resource_provider)
532 : GLRenderer(client, 671 : GLRenderer(client,
533 settings, 672 settings,
534 output_surface, 673 output_surface,
535 resource_provider, 674 resource_provider,
(...skipping 271 matching lines...) Expand 10 before | Expand all | Expand 10 after
807 renderer_->BeginDrawingFrame(&frame3); 946 renderer_->BeginDrawingFrame(&frame3);
808 renderer_->FinishDrawingFrame(&frame3); 947 renderer_->FinishDrawingFrame(&frame3);
809 EXPECT_TRUE(resource_provider_->InUseByConsumer(resource1)); 948 EXPECT_TRUE(resource_provider_->InUseByConsumer(resource1));
810 SwapBuffers(); 949 SwapBuffers();
811 EXPECT_FALSE(resource_provider_->InUseByConsumer(resource1)); 950 EXPECT_FALSE(resource_provider_->InUseByConsumer(resource1));
812 Mock::VerifyAndClearExpectations(&scheduler_); 951 Mock::VerifyAndClearExpectations(&scheduler_);
813 } 952 }
814 953
815 } // namespace 954 } // namespace
816 } // namespace cc 955 } // namespace cc
OLDNEW
« no previous file with comments | « cc/output/overlay_strategy_single_on_top.cc ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698