| 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/region.h" | 5 #include "cc/base/region.h" |
| 6 #include "cc/base/scoped_ptr_vector.h" | 6 #include "cc/base/scoped_ptr_vector.h" |
| 7 #include "cc/output/compositor_frame_metadata.h" | 7 #include "cc/output/compositor_frame_metadata.h" |
| 8 #include "cc/output/gl_renderer.h" | 8 #include "cc/output/gl_renderer.h" |
| 9 #include "cc/output/output_surface.h" | 9 #include "cc/output/output_surface.h" |
| 10 #include "cc/output/output_surface_client.h" | 10 #include "cc/output/output_surface_client.h" |
| 11 #include "cc/output/overlay_candidate_validator.h" | 11 #include "cc/output/overlay_candidate_validator.h" |
| 12 #include "cc/output/overlay_processor.h" | 12 #include "cc/output/overlay_processor.h" |
| 13 #include "cc/output/overlay_strategy_all_or_nothing.h" |
| 13 #include "cc/output/overlay_strategy_sandwich.h" | 14 #include "cc/output/overlay_strategy_sandwich.h" |
| 14 #include "cc/output/overlay_strategy_single_on_top.h" | 15 #include "cc/output/overlay_strategy_single_on_top.h" |
| 15 #include "cc/output/overlay_strategy_underlay.h" | 16 #include "cc/output/overlay_strategy_underlay.h" |
| 16 #include "cc/quads/render_pass.h" | 17 #include "cc/quads/render_pass.h" |
| 17 #include "cc/quads/solid_color_draw_quad.h" | 18 #include "cc/quads/solid_color_draw_quad.h" |
| 18 #include "cc/quads/stream_video_draw_quad.h" | 19 #include "cc/quads/stream_video_draw_quad.h" |
| 19 #include "cc/quads/texture_draw_quad.h" | 20 #include "cc/quads/texture_draw_quad.h" |
| 20 #include "cc/resources/resource_provider.h" | 21 #include "cc/resources/resource_provider.h" |
| 21 #include "cc/resources/texture_mailbox.h" | 22 #include "cc/resources/texture_mailbox.h" |
| 22 #include "cc/test/fake_output_surface_client.h" | 23 #include "cc/test/fake_output_surface_client.h" |
| (...skipping 86 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 109 void GetStrategies(OverlayProcessor::StrategyList* strategies) override { | 110 void GetStrategies(OverlayProcessor::StrategyList* strategies) override { |
| 110 strategies->push_back(make_scoped_ptr( | 111 strategies->push_back(make_scoped_ptr( |
| 111 new OverlayStrategyCommon(this, new OverlayStrategySandwich))); | 112 new OverlayStrategyCommon(this, new OverlayStrategySandwich))); |
| 112 } | 113 } |
| 113 void CheckOverlaySupport(OverlayCandidateList* surfaces) override { | 114 void CheckOverlaySupport(OverlayCandidateList* surfaces) override { |
| 114 for (OverlayCandidate& candidate : *surfaces) | 115 for (OverlayCandidate& candidate : *surfaces) |
| 115 candidate.overlay_handled = true; | 116 candidate.overlay_handled = true; |
| 116 } | 117 } |
| 117 }; | 118 }; |
| 118 | 119 |
| 120 class AllOrNothingOverlayValidator : public OverlayCandidateValidator { |
| 121 public: |
| 122 void GetStrategies(OverlayProcessor::StrategyList* strategies) override { |
| 123 strategies->push_back( |
| 124 make_scoped_ptr(new OverlayStrategyAllOrNothing(this))); |
| 125 } |
| 126 void CheckOverlaySupport(OverlayCandidateList* surfaces) override { |
| 127 for (OverlayCandidate& candidate : *surfaces) |
| 128 candidate.overlay_handled = true; |
| 129 } |
| 130 }; |
| 131 |
| 119 class DefaultOverlayProcessor : public OverlayProcessor { | 132 class DefaultOverlayProcessor : public OverlayProcessor { |
| 120 public: | 133 public: |
| 121 explicit DefaultOverlayProcessor(OutputSurface* surface); | 134 explicit DefaultOverlayProcessor(OutputSurface* surface); |
| 122 size_t GetStrategyCount(); | 135 size_t GetStrategyCount(); |
| 123 }; | 136 }; |
| 124 | 137 |
| 125 DefaultOverlayProcessor::DefaultOverlayProcessor(OutputSurface* surface) | 138 DefaultOverlayProcessor::DefaultOverlayProcessor(OutputSurface* surface) |
| 126 : OverlayProcessor(surface) { | 139 : OverlayProcessor(surface) { |
| 127 } | 140 } |
| 128 | 141 |
| (...skipping 207 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 336 scoped_ptr<OverlayOutputSurface> output_surface_; | 349 scoped_ptr<OverlayOutputSurface> output_surface_; |
| 337 FakeOutputSurfaceClient client_; | 350 FakeOutputSurfaceClient client_; |
| 338 scoped_ptr<SharedBitmapManager> shared_bitmap_manager_; | 351 scoped_ptr<SharedBitmapManager> shared_bitmap_manager_; |
| 339 scoped_ptr<ResourceProvider> resource_provider_; | 352 scoped_ptr<ResourceProvider> resource_provider_; |
| 340 scoped_ptr<OverlayProcessor> overlay_processor_; | 353 scoped_ptr<OverlayProcessor> overlay_processor_; |
| 341 }; | 354 }; |
| 342 | 355 |
| 343 typedef OverlayTest<SingleOnTopOverlayValidator> SingleOverlayOnTopTest; | 356 typedef OverlayTest<SingleOnTopOverlayValidator> SingleOverlayOnTopTest; |
| 344 typedef OverlayTest<UnderlayOverlayValidator> UnderlayTest; | 357 typedef OverlayTest<UnderlayOverlayValidator> UnderlayTest; |
| 345 typedef OverlayTest<SandwichOverlayValidator> SandwichTest; | 358 typedef OverlayTest<SandwichOverlayValidator> SandwichTest; |
| 359 typedef OverlayTest<AllOrNothingOverlayValidator> AllOrNothingOverlayTest; |
| 346 | 360 |
| 347 TEST(OverlayTest, NoOverlaysByDefault) { | 361 TEST(OverlayTest, NoOverlaysByDefault) { |
| 348 scoped_refptr<TestContextProvider> provider = TestContextProvider::Create(); | 362 scoped_refptr<TestContextProvider> provider = TestContextProvider::Create(); |
| 349 OverlayOutputSurface output_surface(provider); | 363 OverlayOutputSurface output_surface(provider); |
| 350 EXPECT_EQ(NULL, output_surface.GetOverlayCandidateValidator()); | 364 EXPECT_EQ(NULL, output_surface.GetOverlayCandidateValidator()); |
| 351 | 365 |
| 352 output_surface.SetOverlayCandidateValidator(new SingleOverlayValidator); | 366 output_surface.SetOverlayCandidateValidator(new SingleOverlayValidator); |
| 353 EXPECT_TRUE(output_surface.GetOverlayCandidateValidator() != NULL); | 367 EXPECT_TRUE(output_surface.GetOverlayCandidateValidator() != NULL); |
| 354 } | 368 } |
| 355 | 369 |
| (...skipping 808 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1164 OverlayCandidateList candidate_list; | 1178 OverlayCandidateList candidate_list; |
| 1165 overlay_processor_->ProcessForOverlays(&pass_list, &candidate_list); | 1179 overlay_processor_->ProcessForOverlays(&pass_list, &candidate_list); |
| 1166 EXPECT_EQ(1U, pass_list.size()); | 1180 EXPECT_EQ(1U, pass_list.size()); |
| 1167 ASSERT_EQ(2U, candidate_list.size()); | 1181 ASSERT_EQ(2U, candidate_list.size()); |
| 1168 EXPECT_EQ(0, candidate_list[0].plane_z_order); | 1182 EXPECT_EQ(0, candidate_list[0].plane_z_order); |
| 1169 EXPECT_EQ(-1, candidate_list[1].plane_z_order); | 1183 EXPECT_EQ(-1, candidate_list[1].plane_z_order); |
| 1170 // The overlay quad should have changed to a SOLID_COLOR quad. | 1184 // The overlay quad should have changed to a SOLID_COLOR quad. |
| 1171 EXPECT_EQ(pass_list[0]->quad_list.front()->material, DrawQuad::SOLID_COLOR); | 1185 EXPECT_EQ(pass_list[0]->quad_list.front()->material, DrawQuad::SOLID_COLOR); |
| 1172 } | 1186 } |
| 1173 | 1187 |
| 1188 TEST_F(AllOrNothingOverlayTest, SuccessfulOverlappingOverlays) { |
| 1189 scoped_ptr<RenderPass> pass = CreateRenderPass(); |
| 1190 |
| 1191 // Add two overlapping candidates. |
| 1192 CreateCandidateQuadAt(resource_provider_.get(), |
| 1193 pass->shared_quad_state_list.back(), pass.get(), |
| 1194 kOverlayTopLeftRect); |
| 1195 CreateCandidateQuadAt(resource_provider_.get(), |
| 1196 pass->shared_quad_state_list.back(), pass.get(), |
| 1197 kOverlayRect); |
| 1198 |
| 1199 RenderPassList pass_list; |
| 1200 pass_list.push_back(pass.Pass()); |
| 1201 OverlayCandidateList candidates; |
| 1202 overlay_processor_->ProcessForOverlays(&pass_list, &candidates); |
| 1203 |
| 1204 // Both quads should become overlays. |
| 1205 EXPECT_EQ(2u, candidates.size()); |
| 1206 EXPECT_EQ(-1, candidates[0].plane_z_order); |
| 1207 EXPECT_EQ(-2, candidates[1].plane_z_order); |
| 1208 EXPECT_EQ(gfx::RectF(kOverlayTopLeftRect), candidates[0].display_rect); |
| 1209 EXPECT_EQ(gfx::RectF(kOverlayRect), candidates[1].display_rect); |
| 1210 |
| 1211 // All quads should be gone. |
| 1212 EXPECT_TRUE(pass_list.back()->quad_list.empty()); |
| 1213 } |
| 1214 |
| 1215 TEST_F(AllOrNothingOverlayTest, RejectQuadWithTransform) { |
| 1216 scoped_ptr<RenderPass> pass = CreateRenderPass(); |
| 1217 |
| 1218 CreateCandidateQuadAt(resource_provider_.get(), |
| 1219 pass->shared_quad_state_list.back(), pass.get(), |
| 1220 kOverlayTopLeftRect); |
| 1221 |
| 1222 // Add a rotated quad that can't be promoted into overlay. |
| 1223 SharedQuadState* shared_state = pass->CreateAndAppendSharedQuadState(); |
| 1224 shared_state->opacity = 1.f; |
| 1225 shared_state->quad_to_target_transform.Rotate(90); |
| 1226 CreateSolidColorQuadAt(shared_state, SK_ColorBLACK, pass.get(), |
| 1227 kOverlayBottomRightRect); |
| 1228 |
| 1229 RenderPassList pass_list; |
| 1230 pass_list.push_back(pass.Pass()); |
| 1231 OverlayCandidateList candidates; |
| 1232 overlay_processor_->ProcessForOverlays(&pass_list, &candidates); |
| 1233 |
| 1234 // No quads should become overlays. |
| 1235 EXPECT_EQ(0u, candidates.size()); |
| 1236 EXPECT_EQ(2u, pass_list.back()->quad_list.size()); |
| 1237 } |
| 1238 |
| 1174 class OverlayInfoRendererGL : public GLRenderer { | 1239 class OverlayInfoRendererGL : public GLRenderer { |
| 1175 public: | 1240 public: |
| 1176 OverlayInfoRendererGL(RendererClient* client, | 1241 OverlayInfoRendererGL(RendererClient* client, |
| 1177 const RendererSettings* settings, | 1242 const RendererSettings* settings, |
| 1178 OutputSurface* output_surface, | 1243 OutputSurface* output_surface, |
| 1179 ResourceProvider* resource_provider) | 1244 ResourceProvider* resource_provider) |
| 1180 : GLRenderer(client, | 1245 : GLRenderer(client, |
| 1181 settings, | 1246 settings, |
| 1182 output_surface, | 1247 output_surface, |
| 1183 resource_provider, | 1248 resource_provider, |
| (...skipping 386 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1570 renderer_->BeginDrawingFrame(&frame_no_overlays); | 1635 renderer_->BeginDrawingFrame(&frame_no_overlays); |
| 1571 renderer_->FinishDrawingFrame(&frame_no_overlays); | 1636 renderer_->FinishDrawingFrame(&frame_no_overlays); |
| 1572 EXPECT_TRUE(resource_provider_->InUseByConsumer(resource1)); | 1637 EXPECT_TRUE(resource_provider_->InUseByConsumer(resource1)); |
| 1573 SwapBuffers(); | 1638 SwapBuffers(); |
| 1574 EXPECT_FALSE(resource_provider_->InUseByConsumer(resource1)); | 1639 EXPECT_FALSE(resource_provider_->InUseByConsumer(resource1)); |
| 1575 Mock::VerifyAndClearExpectations(&scheduler_); | 1640 Mock::VerifyAndClearExpectations(&scheduler_); |
| 1576 } | 1641 } |
| 1577 | 1642 |
| 1578 } // namespace | 1643 } // namespace |
| 1579 } // namespace cc | 1644 } // namespace cc |
| OLD | NEW |