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); | |
danakj
2015/03/18 21:30:14
What if you just removed that quad, you'd still pa
achaulk
2015/03/23 19:16:03
Oh right, didn't notice the other quad was also so
| |
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(), | |
danakj
2015/03/18 21:30:14
Can you use a non-opaque quad on top?
achaulk
2015/03/23 19:16:03
Done.
| |
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 |