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" |
11 #include "cc/output/overlay_processor.h" | 11 #include "cc/output/overlay_processor.h" |
12 #include "cc/output/overlay_strategy_single_on_top.h" | 12 #include "cc/output/overlay_strategy_single_on_top.h" |
| 13 #include "cc/output/overlay_strategy_underlay.h" |
13 #include "cc/quads/checkerboard_draw_quad.h" | 14 #include "cc/quads/checkerboard_draw_quad.h" |
14 #include "cc/quads/render_pass.h" | 15 #include "cc/quads/render_pass.h" |
15 #include "cc/quads/stream_video_draw_quad.h" | 16 #include "cc/quads/stream_video_draw_quad.h" |
16 #include "cc/quads/texture_draw_quad.h" | 17 #include "cc/quads/texture_draw_quad.h" |
17 #include "cc/resources/resource_provider.h" | 18 #include "cc/resources/resource_provider.h" |
18 #include "cc/resources/texture_mailbox.h" | 19 #include "cc/resources/texture_mailbox.h" |
19 #include "cc/test/fake_output_surface_client.h" | 20 #include "cc/test/fake_output_surface_client.h" |
20 #include "cc/test/geometry_test_utils.h" | 21 #include "cc/test/geometry_test_utils.h" |
21 #include "cc/test/test_context_provider.h" | 22 #include "cc/test/test_context_provider.h" |
22 #include "cc/test/test_shared_bitmap_manager.h" | 23 #include "cc/test/test_shared_bitmap_manager.h" |
(...skipping 39 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
62 OverlayCandidate& candidate = surfaces->back(); | 63 OverlayCandidate& candidate = surfaces->back(); |
63 if (candidate.display_rect.width() == 64) | 64 if (candidate.display_rect.width() == 64) |
64 EXPECT_EQ(kOverlayBottomRightRect, candidate.display_rect); | 65 EXPECT_EQ(kOverlayBottomRightRect, candidate.display_rect); |
65 else | 66 else |
66 EXPECT_EQ(kOverlayRect, candidate.display_rect); | 67 EXPECT_EQ(kOverlayRect, candidate.display_rect); |
67 EXPECT_EQ(BoundingRect(kUVTopLeft, kUVBottomRight).ToString(), | 68 EXPECT_EQ(BoundingRect(kUVTopLeft, kUVBottomRight).ToString(), |
68 candidate.uv_rect.ToString()); | 69 candidate.uv_rect.ToString()); |
69 candidate.overlay_handled = true; | 70 candidate.overlay_handled = true; |
70 } | 71 } |
71 | 72 |
| 73 template <typename OverlayStrategyType> |
72 class SingleOverlayProcessor : public OverlayProcessor { | 74 class SingleOverlayProcessor : public OverlayProcessor { |
73 public: | 75 public: |
74 SingleOverlayProcessor(OutputSurface* surface, | 76 SingleOverlayProcessor(OutputSurface* surface, |
75 ResourceProvider* resource_provider); | 77 ResourceProvider* resource_provider) |
| 78 : OverlayProcessor(surface, resource_provider) { |
| 79 EXPECT_EQ(surface, surface_); |
| 80 EXPECT_EQ(resource_provider, resource_provider_); |
| 81 } |
| 82 |
76 // Virtual to allow testing different strategies. | 83 // Virtual to allow testing different strategies. |
77 void Initialize() override; | 84 void Initialize() override { |
| 85 OverlayCandidateValidator* candidates = |
| 86 surface_->overlay_candidate_validator(); |
| 87 ASSERT_TRUE(candidates != NULL); |
| 88 strategies_.push_back(scoped_ptr<Strategy>( |
| 89 new OverlayStrategyType(candidates, resource_provider_))); |
| 90 } |
78 }; | 91 }; |
79 | 92 |
80 SingleOverlayProcessor::SingleOverlayProcessor( | |
81 OutputSurface* surface, | |
82 ResourceProvider* resource_provider) | |
83 : OverlayProcessor(surface, resource_provider) { | |
84 EXPECT_EQ(surface, surface_); | |
85 EXPECT_EQ(resource_provider, resource_provider_); | |
86 } | |
87 | |
88 void SingleOverlayProcessor::Initialize() { | |
89 OverlayCandidateValidator* candidates = | |
90 surface_->overlay_candidate_validator(); | |
91 ASSERT_TRUE(candidates != NULL); | |
92 strategies_.push_back(scoped_ptr<Strategy>( | |
93 new OverlayStrategySingleOnTop(candidates, resource_provider_))); | |
94 } | |
95 | |
96 class DefaultOverlayProcessor : public OverlayProcessor { | 93 class DefaultOverlayProcessor : public OverlayProcessor { |
97 public: | 94 public: |
98 DefaultOverlayProcessor(OutputSurface* surface, | 95 DefaultOverlayProcessor(OutputSurface* surface, |
99 ResourceProvider* resource_provider); | 96 ResourceProvider* resource_provider); |
100 size_t GetStrategyCount(); | 97 size_t GetStrategyCount(); |
101 }; | 98 }; |
102 | 99 |
103 DefaultOverlayProcessor::DefaultOverlayProcessor( | 100 DefaultOverlayProcessor::DefaultOverlayProcessor( |
104 OutputSurface* surface, | 101 OutputSurface* surface, |
105 ResourceProvider* resource_provider) | 102 ResourceProvider* resource_provider) |
(...skipping 190 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
296 new TestSharedBitmapManager()); | 293 new TestSharedBitmapManager()); |
297 scoped_ptr<ResourceProvider> resource_provider(ResourceProvider::Create( | 294 scoped_ptr<ResourceProvider> resource_provider(ResourceProvider::Create( |
298 &output_surface, shared_bitmap_manager.get(), NULL, NULL, 0, false, 1)); | 295 &output_surface, shared_bitmap_manager.get(), NULL, NULL, 0, false, 1)); |
299 | 296 |
300 scoped_ptr<DefaultOverlayProcessor> overlay_processor( | 297 scoped_ptr<DefaultOverlayProcessor> overlay_processor( |
301 new DefaultOverlayProcessor(&output_surface, resource_provider.get())); | 298 new DefaultOverlayProcessor(&output_surface, resource_provider.get())); |
302 overlay_processor->Initialize(); | 299 overlay_processor->Initialize(); |
303 EXPECT_GE(1U, overlay_processor->GetStrategyCount()); | 300 EXPECT_GE(1U, overlay_processor->GetStrategyCount()); |
304 } | 301 } |
305 | 302 |
306 class SingleOverlayOnTopTest : public testing::Test { | 303 template <typename OverlayStrategyType> |
| 304 class OverlayTest : public testing::Test { |
307 protected: | 305 protected: |
308 void SetUp() override { | 306 void SetUp() override { |
309 provider_ = TestContextProvider::Create(); | 307 provider_ = TestContextProvider::Create(); |
310 output_surface_.reset(new OverlayOutputSurface(provider_)); | 308 output_surface_.reset(new OverlayOutputSurface(provider_)); |
311 EXPECT_TRUE(output_surface_->BindToClient(&client_)); | 309 EXPECT_TRUE(output_surface_->BindToClient(&client_)); |
312 output_surface_->InitWithSingleOverlayValidator(); | 310 output_surface_->InitWithSingleOverlayValidator(); |
313 EXPECT_TRUE(output_surface_->overlay_candidate_validator() != NULL); | 311 EXPECT_TRUE(output_surface_->overlay_candidate_validator() != NULL); |
314 | 312 |
315 shared_bitmap_manager_.reset(new TestSharedBitmapManager()); | 313 shared_bitmap_manager_.reset(new TestSharedBitmapManager()); |
316 resource_provider_ = ResourceProvider::Create(output_surface_.get(), | 314 resource_provider_ = ResourceProvider::Create(output_surface_.get(), |
317 shared_bitmap_manager_.get(), | 315 shared_bitmap_manager_.get(), |
318 NULL, | 316 NULL, |
319 NULL, | 317 NULL, |
320 0, | 318 0, |
321 false, | 319 false, |
322 1); | 320 1); |
323 | 321 |
324 overlay_processor_.reset(new SingleOverlayProcessor( | 322 overlay_processor_.reset(new SingleOverlayProcessor<OverlayStrategyType>( |
325 output_surface_.get(), resource_provider_.get())); | 323 output_surface_.get(), resource_provider_.get())); |
326 overlay_processor_->Initialize(); | 324 overlay_processor_->Initialize(); |
327 } | 325 } |
328 | 326 |
329 scoped_refptr<TestContextProvider> provider_; | 327 scoped_refptr<TestContextProvider> provider_; |
330 scoped_ptr<OverlayOutputSurface> output_surface_; | 328 scoped_ptr<OverlayOutputSurface> output_surface_; |
331 FakeOutputSurfaceClient client_; | 329 FakeOutputSurfaceClient client_; |
332 scoped_ptr<SharedBitmapManager> shared_bitmap_manager_; | 330 scoped_ptr<SharedBitmapManager> shared_bitmap_manager_; |
333 scoped_ptr<ResourceProvider> resource_provider_; | 331 scoped_ptr<ResourceProvider> resource_provider_; |
334 scoped_ptr<SingleOverlayProcessor> overlay_processor_; | 332 scoped_ptr<SingleOverlayProcessor<OverlayStrategyType>> overlay_processor_; |
335 }; | 333 }; |
336 | 334 |
| 335 typedef OverlayTest<OverlayStrategySingleOnTop> SingleOverlayOnTopTest; |
| 336 typedef OverlayTest<OverlayStrategyUnderlay> UnderlayTest; |
| 337 |
337 TEST_F(SingleOverlayOnTopTest, SuccessfullOverlay) { | 338 TEST_F(SingleOverlayOnTopTest, SuccessfullOverlay) { |
338 scoped_ptr<RenderPass> pass = CreateRenderPass(); | 339 scoped_ptr<RenderPass> pass = CreateRenderPass(); |
339 TextureDrawQuad* original_quad = | 340 TextureDrawQuad* original_quad = |
340 CreateFullscreenCandidateQuad(resource_provider_.get(), | 341 CreateFullscreenCandidateQuad(resource_provider_.get(), |
341 pass->shared_quad_state_list.back(), | 342 pass->shared_quad_state_list.back(), |
342 pass.get()); | 343 pass.get()); |
343 unsigned original_resource_id = original_quad->resource_id; | 344 unsigned original_resource_id = original_quad->resource_id; |
344 | 345 |
345 // Add something behind it. | 346 // Add something behind it. |
346 CreateFullscreenCheckeredQuad(resource_provider_.get(), | 347 CreateFullscreenCheckeredQuad(resource_provider_.get(), |
(...skipping 408 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
755 pass.get(), kYMirrorTransform); | 756 pass.get(), kYMirrorTransform); |
756 | 757 |
757 RenderPassList pass_list; | 758 RenderPassList pass_list; |
758 pass_list.push_back(pass.Pass()); | 759 pass_list.push_back(pass.Pass()); |
759 OverlayCandidateList candidate_list; | 760 OverlayCandidateList candidate_list; |
760 overlay_processor_->ProcessForOverlays(&pass_list, &candidate_list); | 761 overlay_processor_->ProcessForOverlays(&pass_list, &candidate_list); |
761 ASSERT_EQ(1U, pass_list.size()); | 762 ASSERT_EQ(1U, pass_list.size()); |
762 EXPECT_EQ(2U, candidate_list.size()); | 763 EXPECT_EQ(2U, candidate_list.size()); |
763 } | 764 } |
764 | 765 |
| 766 TEST_F(UnderlayTest, OverlayLayerUnderMainLayer) { |
| 767 scoped_ptr<RenderPass> pass = CreateRenderPass(); |
| 768 CreateFullscreenCheckeredQuad(resource_provider_.get(), |
| 769 pass->shared_quad_state_list.back(), |
| 770 pass.get()); |
| 771 CreateCandidateQuadAt(resource_provider_.get(), |
| 772 pass->shared_quad_state_list.back(), pass.get(), |
| 773 kOverlayBottomRightRect); |
| 774 |
| 775 RenderPassList pass_list; |
| 776 pass_list.push_back(pass.Pass()); |
| 777 |
| 778 OverlayCandidateList candidate_list; |
| 779 overlay_processor_->ProcessForOverlays(&pass_list, &candidate_list); |
| 780 EXPECT_EQ(1U, pass_list.size()); |
| 781 ASSERT_EQ(2U, candidate_list.size()); |
| 782 EXPECT_EQ(0, candidate_list[0].plane_z_order); |
| 783 EXPECT_EQ(-1, candidate_list[1].plane_z_order); |
| 784 EXPECT_EQ(2U, pass_list[0]->quad_list.size()); |
| 785 // The overlay quad should have changed to a SOLID_COLOR quad. |
| 786 EXPECT_EQ(pass_list[0]->quad_list.back()->material, DrawQuad::SOLID_COLOR); |
| 787 } |
| 788 |
| 789 TEST_F(UnderlayTest, AllowOnTop) { |
| 790 scoped_ptr<RenderPass> pass = CreateRenderPass(); |
| 791 CreateFullscreenCandidateQuad(resource_provider_.get(), |
| 792 pass->shared_quad_state_list.back(), |
| 793 pass.get()); |
| 794 pass->CreateAndAppendSharedQuadState()->opacity = 0.5f; |
| 795 CreateFullscreenCheckeredQuad(resource_provider_.get(), |
| 796 pass->shared_quad_state_list.back(), |
| 797 pass.get()); |
| 798 |
| 799 RenderPassList pass_list; |
| 800 pass_list.push_back(pass.Pass()); |
| 801 |
| 802 OverlayCandidateList candidate_list; |
| 803 overlay_processor_->ProcessForOverlays(&pass_list, &candidate_list); |
| 804 EXPECT_EQ(1U, pass_list.size()); |
| 805 ASSERT_EQ(2U, candidate_list.size()); |
| 806 EXPECT_EQ(0, candidate_list[0].plane_z_order); |
| 807 EXPECT_EQ(-1, candidate_list[1].plane_z_order); |
| 808 // The overlay quad should have changed to a SOLID_COLOR quad. |
| 809 EXPECT_EQ(pass_list[0]->quad_list.front()->material, DrawQuad::SOLID_COLOR); |
| 810 } |
| 811 |
765 class OverlayInfoRendererGL : public GLRenderer { | 812 class OverlayInfoRendererGL : public GLRenderer { |
766 public: | 813 public: |
767 OverlayInfoRendererGL(RendererClient* client, | 814 OverlayInfoRendererGL(RendererClient* client, |
768 const RendererSettings* settings, | 815 const RendererSettings* settings, |
769 OutputSurface* output_surface, | 816 OutputSurface* output_surface, |
770 ResourceProvider* resource_provider) | 817 ResourceProvider* resource_provider) |
771 : GLRenderer(client, | 818 : GLRenderer(client, |
772 settings, | 819 settings, |
773 output_surface, | 820 output_surface, |
774 resource_provider, | 821 resource_provider, |
(...skipping 274 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1049 renderer_->BeginDrawingFrame(&frame3); | 1096 renderer_->BeginDrawingFrame(&frame3); |
1050 renderer_->FinishDrawingFrame(&frame3); | 1097 renderer_->FinishDrawingFrame(&frame3); |
1051 EXPECT_TRUE(resource_provider_->InUseByConsumer(resource1)); | 1098 EXPECT_TRUE(resource_provider_->InUseByConsumer(resource1)); |
1052 SwapBuffers(); | 1099 SwapBuffers(); |
1053 EXPECT_FALSE(resource_provider_->InUseByConsumer(resource1)); | 1100 EXPECT_FALSE(resource_provider_->InUseByConsumer(resource1)); |
1054 Mock::VerifyAndClearExpectations(&scheduler_); | 1101 Mock::VerifyAndClearExpectations(&scheduler_); |
1055 } | 1102 } |
1056 | 1103 |
1057 } // namespace | 1104 } // namespace |
1058 } // namespace cc | 1105 } // namespace cc |
OLD | NEW |