| 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 |