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