Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(240)

Side by Side Diff: cc/output/overlay_unittest.cc

Issue 2736643004: Add DCLayerOverlayProcessor and supporting DCLayer structures. (Closed)
Patch Set: Created 3 years, 9 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
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
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
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
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
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
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
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
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698