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