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 <stddef.h> | 5 #include <stddef.h> |
6 | 6 |
7 #include <utility> | 7 #include <utility> |
8 #include <vector> | 8 #include <vector> |
9 | 9 |
10 #include "base/memory/ptr_util.h" | 10 #include "base/memory/ptr_util.h" |
(...skipping 55 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
66 void MailboxReleased(const gpu::SyncToken& sync_token, | 66 void MailboxReleased(const gpu::SyncToken& sync_token, |
67 bool lost_resource, | 67 bool lost_resource, |
68 BlockingTaskRunner* main_thread_task_runner) {} | 68 BlockingTaskRunner* main_thread_task_runner) {} |
69 | 69 |
70 class FullscreenOverlayValidator : public OverlayCandidateValidator { | 70 class FullscreenOverlayValidator : public OverlayCandidateValidator { |
71 public: | 71 public: |
72 void GetStrategies(OverlayProcessor::StrategyList* strategies) override { | 72 void GetStrategies(OverlayProcessor::StrategyList* strategies) override { |
73 strategies->push_back(base::MakeUnique<OverlayStrategyFullscreen>(this)); | 73 strategies->push_back(base::MakeUnique<OverlayStrategyFullscreen>(this)); |
74 } | 74 } |
75 bool AllowCALayerOverlays() override { return false; } | 75 bool AllowCALayerOverlays() override { return false; } |
| 76 bool AllowDCLayerOverlays() override { return false; } |
76 void CheckOverlaySupport(OverlayCandidateList* surfaces) override {} | 77 void CheckOverlaySupport(OverlayCandidateList* surfaces) override {} |
77 }; | 78 }; |
78 | 79 |
79 class SingleOverlayValidator : public OverlayCandidateValidator { | 80 class SingleOverlayValidator : public OverlayCandidateValidator { |
80 public: | 81 public: |
81 SingleOverlayValidator() : expected_rect_(kOverlayRect) {} | 82 SingleOverlayValidator() : expected_rect_(kOverlayRect) {} |
82 | 83 |
83 void GetStrategies(OverlayProcessor::StrategyList* strategies) override { | 84 void GetStrategies(OverlayProcessor::StrategyList* strategies) override { |
84 strategies->push_back(base::MakeUnique<OverlayStrategySingleOnTop>(this)); | 85 strategies->push_back(base::MakeUnique<OverlayStrategySingleOnTop>(this)); |
85 strategies->push_back(base::MakeUnique<OverlayStrategyUnderlay>(this)); | 86 strategies->push_back(base::MakeUnique<OverlayStrategyUnderlay>(this)); |
86 } | 87 } |
87 bool AllowCALayerOverlays() override { return false; } | 88 bool AllowCALayerOverlays() override { return false; } |
| 89 bool AllowDCLayerOverlays() override { return false; } |
88 void CheckOverlaySupport(OverlayCandidateList* surfaces) override { | 90 void CheckOverlaySupport(OverlayCandidateList* surfaces) override { |
89 // We may have 1 or 2 surfaces depending on whether this ran through the | 91 // We may have 1 or 2 surfaces depending on whether this ran through the |
90 // full renderer and picked up the output surface, or not. | 92 // full renderer and picked up the output surface, or not. |
91 ASSERT_LE(1U, surfaces->size()); | 93 ASSERT_LE(1U, surfaces->size()); |
92 ASSERT_GE(2U, surfaces->size()); | 94 ASSERT_GE(2U, surfaces->size()); |
93 | 95 |
94 OverlayCandidate& candidate = surfaces->back(); | 96 OverlayCandidate& candidate = surfaces->back(); |
95 EXPECT_TRUE(!candidate.use_output_surface_for_resource); | 97 EXPECT_TRUE(!candidate.use_output_surface_for_resource); |
96 EXPECT_NEAR(expected_rect_.x(), candidate.display_rect.x(), 0.01f); | 98 EXPECT_NEAR(expected_rect_.x(), candidate.display_rect.x(), 0.01f); |
97 EXPECT_NEAR(expected_rect_.y(), candidate.display_rect.y(), 0.01f); | 99 EXPECT_NEAR(expected_rect_.y(), candidate.display_rect.y(), 0.01f); |
(...skipping 13 matching lines...) Expand all Loading... |
111 void SetExpectedRect(const gfx::RectF& rect) { expected_rect_ = rect; } | 113 void SetExpectedRect(const gfx::RectF& rect) { expected_rect_ = rect; } |
112 | 114 |
113 private: | 115 private: |
114 gfx::RectF expected_rect_; | 116 gfx::RectF expected_rect_; |
115 }; | 117 }; |
116 | 118 |
117 class CALayerValidator : public OverlayCandidateValidator { | 119 class CALayerValidator : public OverlayCandidateValidator { |
118 public: | 120 public: |
119 void GetStrategies(OverlayProcessor::StrategyList* strategies) override {} | 121 void GetStrategies(OverlayProcessor::StrategyList* strategies) override {} |
120 bool AllowCALayerOverlays() override { return true; } | 122 bool AllowCALayerOverlays() override { return true; } |
| 123 bool AllowDCLayerOverlays() override { return false; } |
121 void CheckOverlaySupport(OverlayCandidateList* surfaces) override {} | 124 void CheckOverlaySupport(OverlayCandidateList* surfaces) override {} |
122 }; | 125 }; |
123 | 126 |
| 127 class DCLayerValidator : public OverlayCandidateValidator { |
| 128 public: |
| 129 void GetStrategies(OverlayProcessor::StrategyList* strategies) override {} |
| 130 bool AllowCALayerOverlays() override { return false; } |
| 131 bool AllowDCLayerOverlays() override { return true; } |
| 132 void CheckOverlaySupport(OverlayCandidateList* surfaces) override {} |
| 133 }; |
| 134 |
124 class SingleOnTopOverlayValidator : public SingleOverlayValidator { | 135 class SingleOnTopOverlayValidator : public SingleOverlayValidator { |
125 public: | 136 public: |
126 void GetStrategies(OverlayProcessor::StrategyList* strategies) override { | 137 void GetStrategies(OverlayProcessor::StrategyList* strategies) override { |
127 strategies->push_back(base::MakeUnique<OverlayStrategySingleOnTop>(this)); | 138 strategies->push_back(base::MakeUnique<OverlayStrategySingleOnTop>(this)); |
128 } | 139 } |
129 }; | 140 }; |
130 | 141 |
131 class UnderlayOverlayValidator : public SingleOverlayValidator { | 142 class UnderlayOverlayValidator : public SingleOverlayValidator { |
132 public: | 143 public: |
133 void GetStrategies(OverlayProcessor::StrategyList* strategies) override { | 144 void GetStrategies(OverlayProcessor::StrategyList* strategies) override { |
(...skipping 180 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
314 StreamVideoDrawQuad* CreateFullscreenCandidateVideoQuad( | 325 StreamVideoDrawQuad* CreateFullscreenCandidateVideoQuad( |
315 ResourceProvider* resource_provider, | 326 ResourceProvider* resource_provider, |
316 const SharedQuadState* shared_quad_state, | 327 const SharedQuadState* shared_quad_state, |
317 RenderPass* render_pass, | 328 RenderPass* render_pass, |
318 const gfx::Transform& transform) { | 329 const gfx::Transform& transform) { |
319 return CreateCandidateVideoQuadAt(resource_provider, shared_quad_state, | 330 return CreateCandidateVideoQuadAt(resource_provider, shared_quad_state, |
320 render_pass, render_pass->output_rect, | 331 render_pass, render_pass->output_rect, |
321 transform); | 332 transform); |
322 } | 333 } |
323 | 334 |
| 335 YUVVideoDrawQuad* CreateFullscreenCandidateYUVVideoQuad( |
| 336 ResourceProvider* resource_provider, |
| 337 const SharedQuadState* shared_quad_state, |
| 338 RenderPass* render_pass) { |
| 339 gfx::RectF tex_coord_rect(0, 0, 1, 1); |
| 340 gfx::Rect rect = render_pass->output_rect; |
| 341 gfx::Size resource_size_in_pixels = rect.size(); |
| 342 bool is_overlay_candidate = true; |
| 343 ResourceId resource_id = CreateResource( |
| 344 resource_provider, resource_size_in_pixels, is_overlay_candidate); |
| 345 |
| 346 YUVVideoDrawQuad* overlay_quad = |
| 347 render_pass->CreateAndAppendDrawQuad<YUVVideoDrawQuad>(); |
| 348 overlay_quad->SetNew(shared_quad_state, rect, rect, rect, tex_coord_rect, |
| 349 tex_coord_rect, resource_size_in_pixels, |
| 350 resource_size_in_pixels, resource_id, resource_id, |
| 351 resource_id, resource_id, YUVVideoDrawQuad::REC_601, |
| 352 gfx::ColorSpace(), 0, 1.0, 8); |
| 353 |
| 354 return overlay_quad; |
| 355 } |
| 356 |
324 void CreateOpaqueQuadAt(ResourceProvider* resource_provider, | 357 void CreateOpaqueQuadAt(ResourceProvider* resource_provider, |
325 const SharedQuadState* shared_quad_state, | 358 const SharedQuadState* shared_quad_state, |
326 RenderPass* render_pass, | 359 RenderPass* render_pass, |
327 const gfx::Rect& rect) { | 360 const gfx::Rect& rect) { |
328 SolidColorDrawQuad* color_quad = | 361 SolidColorDrawQuad* color_quad = |
329 render_pass->CreateAndAppendDrawQuad<SolidColorDrawQuad>(); | 362 render_pass->CreateAndAppendDrawQuad<SolidColorDrawQuad>(); |
330 color_quad->SetNew(shared_quad_state, rect, rect, SK_ColorBLACK, false); | 363 color_quad->SetNew(shared_quad_state, rect, rect, SK_ColorBLACK, false); |
331 } | 364 } |
332 | 365 |
333 void CreateOpaqueQuadAt(ResourceProvider* resource_provider, | 366 void CreateOpaqueQuadAt(ResourceProvider* resource_provider, |
(...skipping 73 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
407 std::unique_ptr<OverlayProcessor> overlay_processor_; | 440 std::unique_ptr<OverlayProcessor> overlay_processor_; |
408 gfx::Rect damage_rect_; | 441 gfx::Rect damage_rect_; |
409 std::vector<gfx::Rect> content_bounds_; | 442 std::vector<gfx::Rect> content_bounds_; |
410 }; | 443 }; |
411 | 444 |
412 using FullscreenOverlayTest = OverlayTest<FullscreenOverlayValidator>; | 445 using FullscreenOverlayTest = OverlayTest<FullscreenOverlayValidator>; |
413 using SingleOverlayOnTopTest = OverlayTest<SingleOnTopOverlayValidator>; | 446 using SingleOverlayOnTopTest = OverlayTest<SingleOnTopOverlayValidator>; |
414 using UnderlayTest = OverlayTest<UnderlayOverlayValidator>; | 447 using UnderlayTest = OverlayTest<UnderlayOverlayValidator>; |
415 using UnderlayCastTest = OverlayTest<UnderlayCastOverlayValidator>; | 448 using UnderlayCastTest = OverlayTest<UnderlayCastOverlayValidator>; |
416 using CALayerOverlayTest = OverlayTest<CALayerValidator>; | 449 using CALayerOverlayTest = OverlayTest<CALayerValidator>; |
| 450 using DCLayerOverlayTest = OverlayTest<DCLayerValidator>; |
417 | 451 |
418 TEST(OverlayTest, NoOverlaysByDefault) { | 452 TEST(OverlayTest, NoOverlaysByDefault) { |
419 scoped_refptr<TestContextProvider> provider = TestContextProvider::Create(); | 453 scoped_refptr<TestContextProvider> provider = TestContextProvider::Create(); |
420 OverlayOutputSurface<OverlayCandidateValidator> output_surface(provider); | 454 OverlayOutputSurface<OverlayCandidateValidator> output_surface(provider); |
421 EXPECT_EQ(NULL, output_surface.GetOverlayCandidateValidator()); | 455 EXPECT_EQ(NULL, output_surface.GetOverlayCandidateValidator()); |
422 | 456 |
423 output_surface.SetOverlayCandidateValidator(new SingleOverlayValidator); | 457 output_surface.SetOverlayCandidateValidator(new SingleOverlayValidator); |
424 EXPECT_TRUE(output_surface.GetOverlayCandidateValidator() != NULL); | 458 EXPECT_TRUE(output_surface.GetOverlayCandidateValidator() != NULL); |
425 } | 459 } |
426 | 460 |
(...skipping 1205 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1632 overlay_processor_->ProcessForOverlays( | 1666 overlay_processor_->ProcessForOverlays( |
1633 resource_provider_.get(), pass.get(), render_pass_filters, | 1667 resource_provider_.get(), pass.get(), render_pass_filters, |
1634 render_pass_background_filters, &overlay_list, &ca_layer_list, | 1668 render_pass_background_filters, &overlay_list, &ca_layer_list, |
1635 &damage_rect_, &content_bounds_); | 1669 &damage_rect_, &content_bounds_); |
1636 EXPECT_EQ(gfx::Rect(), damage_rect); | 1670 EXPECT_EQ(gfx::Rect(), damage_rect); |
1637 EXPECT_EQ(0U, overlay_list.size()); | 1671 EXPECT_EQ(0U, overlay_list.size()); |
1638 EXPECT_EQ(0U, ca_layer_list.size()); | 1672 EXPECT_EQ(0U, ca_layer_list.size()); |
1639 EXPECT_EQ(0U, output_surface_->bind_framebuffer_count()); | 1673 EXPECT_EQ(0U, output_surface_->bind_framebuffer_count()); |
1640 } | 1674 } |
1641 | 1675 |
| 1676 TEST_F(DCLayerOverlayTest, AllowNonAxisAlignedTransform) { |
| 1677 std::unique_ptr<RenderPass> pass = CreateRenderPass(); |
| 1678 CreateFullscreenCandidateYUVVideoQuad(resource_provider_.get(), |
| 1679 pass->shared_quad_state_list.back(), |
| 1680 pass.get()); |
| 1681 pass->shared_quad_state_list.back() |
| 1682 ->quad_to_target_transform.RotateAboutZAxis(45.f); |
| 1683 |
| 1684 gfx::Rect damage_rect; |
| 1685 CALayerOverlayList ca_layer_list; |
| 1686 OverlayCandidateList overlay_list; |
| 1687 RenderPassFilterList render_pass_filters; |
| 1688 RenderPassFilterList render_pass_background_filters; |
| 1689 damage_rect_ = gfx::Rect(1, 1, 10, 10); |
| 1690 overlay_processor_->ProcessForOverlays( |
| 1691 resource_provider_.get(), pass.get(), render_pass_filters, |
| 1692 render_pass_background_filters, &overlay_list, &ca_layer_list, |
| 1693 &damage_rect_, &content_bounds_); |
| 1694 EXPECT_EQ(gfx::Rect(), damage_rect); |
| 1695 EXPECT_EQ(0U, overlay_list.size()); |
| 1696 EXPECT_EQ(1U, ca_layer_list.size()); |
| 1697 EXPECT_EQ(1U, ca_layer_list.back().shared_state->sorting_context_id); |
| 1698 EXPECT_EQ(0U, output_surface_->bind_framebuffer_count()); |
| 1699 EXPECT_EQ(gfx::Rect(1, 1, 10, 10), damage_rect_); |
| 1700 } |
| 1701 |
| 1702 TEST_F(DCLayerOverlayTest, Occluded) { |
| 1703 { |
| 1704 std::unique_ptr<RenderPass> pass = CreateRenderPass(); |
| 1705 CreateOpaqueQuadAt(resource_provider_.get(), |
| 1706 pass->shared_quad_state_list.back(), pass.get(), |
| 1707 gfx::Rect(0, 2, 100, 100), SK_ColorWHITE); |
| 1708 CreateFullscreenCandidateYUVVideoQuad(resource_provider_.get(), |
| 1709 pass->shared_quad_state_list.back(), |
| 1710 pass.get()); |
| 1711 |
| 1712 gfx::Rect damage_rect; |
| 1713 CALayerOverlayList ca_layer_list; |
| 1714 OverlayCandidateList overlay_list; |
| 1715 RenderPassFilterList render_pass_filters; |
| 1716 RenderPassFilterList render_pass_background_filters; |
| 1717 damage_rect_ = gfx::Rect(1, 1, 10, 10); |
| 1718 overlay_processor_->ProcessForOverlays( |
| 1719 resource_provider_.get(), pass.get(), render_pass_filters, |
| 1720 render_pass_background_filters, &overlay_list, &ca_layer_list, |
| 1721 &damage_rect_, &content_bounds_); |
| 1722 EXPECT_EQ(gfx::Rect(), damage_rect); |
| 1723 EXPECT_EQ(0U, overlay_list.size()); |
| 1724 EXPECT_EQ(1U, ca_layer_list.size()); |
| 1725 EXPECT_EQ(0U, output_surface_->bind_framebuffer_count()); |
| 1726 EXPECT_EQ(static_cast<unsigned>(-1), |
| 1727 ca_layer_list.back().shared_state->sorting_context_id); |
| 1728 // Entire underlay rect must be redrawn. |
| 1729 EXPECT_EQ(gfx::Rect(0, 0, 256, 256), damage_rect_); |
| 1730 } |
| 1731 { |
| 1732 std::unique_ptr<RenderPass> pass = CreateRenderPass(); |
| 1733 CreateOpaqueQuadAt(resource_provider_.get(), |
| 1734 pass->shared_quad_state_list.back(), pass.get(), |
| 1735 gfx::Rect(2, 2, 100, 100), SK_ColorWHITE); |
| 1736 CreateFullscreenCandidateYUVVideoQuad(resource_provider_.get(), |
| 1737 pass->shared_quad_state_list.back(), |
| 1738 pass.get()); |
| 1739 |
| 1740 gfx::Rect damage_rect; |
| 1741 CALayerOverlayList ca_layer_list; |
| 1742 OverlayCandidateList overlay_list; |
| 1743 RenderPassFilterList render_pass_filters; |
| 1744 RenderPassFilterList render_pass_background_filters; |
| 1745 damage_rect_ = gfx::Rect(1, 1, 10, 10); |
| 1746 overlay_processor_->ProcessForOverlays( |
| 1747 resource_provider_.get(), pass.get(), render_pass_filters, |
| 1748 render_pass_background_filters, &overlay_list, &ca_layer_list, |
| 1749 &damage_rect_, &content_bounds_); |
| 1750 EXPECT_EQ(gfx::Rect(), damage_rect); |
| 1751 EXPECT_EQ(0U, overlay_list.size()); |
| 1752 EXPECT_EQ(1U, ca_layer_list.size()); |
| 1753 EXPECT_EQ(0U, output_surface_->bind_framebuffer_count()); |
| 1754 EXPECT_EQ(static_cast<unsigned>(-1), |
| 1755 ca_layer_list.back().shared_state->sorting_context_id); |
| 1756 // The underlay rectangle is the same, so the damage is contained within |
| 1757 // the combined occluding rects for this and the last frame. |
| 1758 EXPECT_EQ(gfx::Rect(1, 2, 10, 9), damage_rect_); |
| 1759 } |
| 1760 } |
| 1761 |
| 1762 TEST_F(DCLayerOverlayTest, DamageRect) { |
| 1763 std::unique_ptr<RenderPass> pass = CreateRenderPass(); |
| 1764 CreateFullscreenCandidateYUVVideoQuad(resource_provider_.get(), |
| 1765 pass->shared_quad_state_list.back(), |
| 1766 pass.get()); |
| 1767 |
| 1768 gfx::Rect damage_rect; |
| 1769 CALayerOverlayList ca_layer_list; |
| 1770 OverlayCandidateList overlay_list; |
| 1771 RenderPassFilterList render_pass_filters; |
| 1772 RenderPassFilterList render_pass_background_filters; |
| 1773 damage_rect_ = gfx::Rect(1, 1, 10, 10); |
| 1774 overlay_processor_->ProcessForOverlays( |
| 1775 resource_provider_.get(), pass.get(), render_pass_filters, |
| 1776 render_pass_background_filters, &overlay_list, &ca_layer_list, |
| 1777 &damage_rect_, &content_bounds_); |
| 1778 EXPECT_EQ(gfx::Rect(), damage_rect); |
| 1779 EXPECT_EQ(0U, overlay_list.size()); |
| 1780 EXPECT_EQ(1U, ca_layer_list.size()); |
| 1781 EXPECT_EQ(0U, output_surface_->bind_framebuffer_count()); |
| 1782 EXPECT_EQ(1U, ca_layer_list.back().shared_state->sorting_context_id); |
| 1783 EXPECT_TRUE(damage_rect_.IsEmpty()); |
| 1784 } |
| 1785 |
1642 class OverlayInfoRendererGL : public GLRenderer { | 1786 class OverlayInfoRendererGL : public GLRenderer { |
1643 public: | 1787 public: |
1644 OverlayInfoRendererGL(const RendererSettings* settings, | 1788 OverlayInfoRendererGL(const RendererSettings* settings, |
1645 OutputSurface* output_surface, | 1789 OutputSurface* output_surface, |
1646 ResourceProvider* resource_provider) | 1790 ResourceProvider* resource_provider) |
1647 : GLRenderer(settings, output_surface, resource_provider, NULL, 0), | 1791 : GLRenderer(settings, output_surface, resource_provider, NULL, 0), |
1648 expect_overlays_(false) {} | 1792 expect_overlays_(false) {} |
1649 | 1793 |
1650 MOCK_METHOD2(DoDrawQuad, | 1794 MOCK_METHOD2(DoDrawQuad, |
1651 void(const DrawQuad* quad, const gfx::QuadF* draw_region)); | 1795 void(const DrawQuad* quad, const gfx::QuadF* draw_region)); |
(...skipping 639 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2291 kOverlayRect, render_pass_id_, 2, gfx::RectF(), gfx::Size(), | 2435 kOverlayRect, render_pass_id_, 2, gfx::RectF(), gfx::Size(), |
2292 gfx::Vector2dF(1, 1), gfx::PointF(), gfx::RectF()); | 2436 gfx::Vector2dF(1, 1), gfx::PointF(), gfx::RectF()); |
2293 } | 2437 } |
2294 | 2438 |
2295 ProcessForOverlays(); | 2439 ProcessForOverlays(); |
2296 EXPECT_EQ(0U, ca_layer_list_.size()); | 2440 EXPECT_EQ(0U, ca_layer_list_.size()); |
2297 } | 2441 } |
2298 | 2442 |
2299 } // namespace | 2443 } // namespace |
2300 } // namespace cc | 2444 } // namespace cc |
OLD | NEW |