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

Side by Side Diff: cc/surfaces/compositor_frame_sink_support_unittest.cc

Issue 2714973002: Fix check for changing SurfaceId. (Closed)
Patch Set: Add test for display root references. 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
« no previous file with comments | « cc/surfaces/compositor_frame_sink_support.cc ('k') | no next file » | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 // Copyright 2017 The Chromium Authors. All rights reserved. 1 // Copyright 2017 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/surfaces/compositor_frame_sink_support.h" 5 #include "cc/surfaces/compositor_frame_sink_support.h"
6 6
7 #include "base/macros.h" 7 #include "base/macros.h"
8 #include "cc/output/compositor_frame.h" 8 #include "cc/output/compositor_frame.h"
9 #include "cc/surfaces/compositor_frame_sink_support_client.h" 9 #include "cc/surfaces/compositor_frame_sink_support_client.h"
10 #include "cc/surfaces/frame_sink_id.h" 10 #include "cc/surfaces/frame_sink_id.h"
11 #include "cc/surfaces/surface_id.h" 11 #include "cc/surfaces/surface_id.h"
12 #include "cc/surfaces/surface_manager.h" 12 #include "cc/surfaces/surface_manager.h"
13 #include "cc/test/begin_frame_args_test.h" 13 #include "cc/test/begin_frame_args_test.h"
14 #include "cc/test/fake_external_begin_frame_source.h" 14 #include "cc/test/fake_external_begin_frame_source.h"
15 #include "testing/gmock/include/gmock/gmock.h" 15 #include "testing/gmock/include/gmock/gmock.h"
16 #include "testing/gtest/include/gtest/gtest.h" 16 #include "testing/gtest/include/gtest/gtest.h"
17 17
18 using testing::UnorderedElementsAre; 18 using testing::UnorderedElementsAre;
19 using testing::IsEmpty; 19 using testing::IsEmpty;
20 using testing::SizeIs; 20 using testing::SizeIs;
21 21
22 namespace cc { 22 namespace cc {
23 namespace test { 23 namespace test {
24 namespace { 24 namespace {
25 25
26 constexpr FrameSinkId kParentFrameSink(2, 1); 26 constexpr FrameSinkId kDisplayFrameSink(2, 0);
27 constexpr FrameSinkId kChildFrameSink1(65563, 1); 27 constexpr FrameSinkId kParentFrameSink(3, 0);
28 constexpr FrameSinkId kChildFrameSink2(65564, 1); 28 constexpr FrameSinkId kChildFrameSink1(65563, 0);
29 constexpr FrameSinkId kChildFrameSink2(65564, 0);
29 constexpr FrameSinkId kArbitraryFrameSink(1337, 7331); 30 constexpr FrameSinkId kArbitraryFrameSink(1337, 7331);
30 31
31 std::vector<SurfaceId> empty_surface_ids() { 32 std::vector<SurfaceId> empty_surface_ids() {
32 return std::vector<SurfaceId>(); 33 return std::vector<SurfaceId>();
33 } 34 }
34 35
35 SurfaceId MakeSurfaceId(const FrameSinkId& frame_sink_id, uint32_t local_id) { 36 SurfaceId MakeSurfaceId(const FrameSinkId& frame_sink_id, uint32_t local_id) {
36 return SurfaceId( 37 return SurfaceId(
37 frame_sink_id, 38 frame_sink_id,
38 LocalSurfaceId(local_id, base::UnguessableToken::Deserialize(0, 1u))); 39 LocalSurfaceId(local_id, base::UnguessableToken::Deserialize(0, 1u)));
(...skipping 31 matching lines...) Expand 10 before | Expand all | Expand 10 after
70 71
71 } // namespace 72 } // namespace
72 73
73 class CompositorFrameSinkSupportTest : public testing::Test, 74 class CompositorFrameSinkSupportTest : public testing::Test,
74 public CompositorFrameSinkSupportClient { 75 public CompositorFrameSinkSupportClient {
75 public: 76 public:
76 CompositorFrameSinkSupportTest() 77 CompositorFrameSinkSupportTest()
77 : surface_manager_(SurfaceManager::LifetimeType::REFERENCES) {} 78 : surface_manager_(SurfaceManager::LifetimeType::REFERENCES) {}
78 ~CompositorFrameSinkSupportTest() override {} 79 ~CompositorFrameSinkSupportTest() override {}
79 80
80 CompositorFrameSinkSupport& parent_support() { return *supports_[0]; } 81 CompositorFrameSinkSupport& display_support() { return *supports_[0]; }
82
83 CompositorFrameSinkSupport& parent_support() { return *supports_[1]; }
81 Surface* parent_surface() { 84 Surface* parent_surface() {
82 return parent_support().current_surface_for_testing(); 85 return parent_support().current_surface_for_testing();
83 } 86 }
84 const ReferencedSurfaceTracker& parent_reference_tracker() { 87 const ReferencedSurfaceTracker& parent_reference_tracker() {
85 return parent_support().ReferenceTrackerForTesting(); 88 return parent_support().ReferenceTrackerForTesting();
86 } 89 }
87 90
88 CompositorFrameSinkSupport& child_support1() { return *supports_[1]; } 91 CompositorFrameSinkSupport& child_support1() { return *supports_[2]; }
89 Surface* child_surface1() { 92 Surface* child_surface1() {
90 return child_support1().current_surface_for_testing(); 93 return child_support1().current_surface_for_testing();
91 } 94 }
92 95
93 CompositorFrameSinkSupport& child_support2() { return *supports_[2]; } 96 CompositorFrameSinkSupport& child_support2() { return *supports_[3]; }
94 Surface* child_surface2() { 97 Surface* child_surface2() {
95 return child_support2().current_surface_for_testing(); 98 return child_support2().current_surface_for_testing();
96 } 99 }
97 100
98 CompositorFrameSinkSupport& support(int index) { return *supports_[index]; } 101 CompositorFrameSinkSupport& support(int index) { return *supports_[index]; }
99 Surface* surface(int index) { 102 Surface* surface(int index) {
100 return support(index).current_surface_for_testing(); 103 return support(index).current_surface_for_testing();
101 } 104 }
102 105
103 SurfaceManager& surface_manager() { return surface_manager_; } 106 SurfaceManager& surface_manager() { return surface_manager_; }
(...skipping 25 matching lines...) Expand all
129 // testing::Test: 132 // testing::Test:
130 void SetUp() override { 133 void SetUp() override {
131 testing::Test::SetUp(); 134 testing::Test::SetUp();
132 begin_frame_source_ = 135 begin_frame_source_ =
133 base::MakeUnique<FakeExternalBeginFrameSource>(0.f, false); 136 base::MakeUnique<FakeExternalBeginFrameSource>(0.f, false);
134 std::unique_ptr<SurfaceDependencyTracker> dependency_tracker( 137 std::unique_ptr<SurfaceDependencyTracker> dependency_tracker(
135 new SurfaceDependencyTracker(&surface_manager_, 138 new SurfaceDependencyTracker(&surface_manager_,
136 begin_frame_source_.get())); 139 begin_frame_source_.get()));
137 surface_manager_.SetDependencyTracker(std::move(dependency_tracker)); 140 surface_manager_.SetDependencyTracker(std::move(dependency_tracker));
138 supports_.push_back(base::MakeUnique<CompositorFrameSinkSupport>( 141 supports_.push_back(base::MakeUnique<CompositorFrameSinkSupport>(
142 this, &surface_manager_, kDisplayFrameSink, true /* is_root */,
143 true /* handles_frame_sink_id_invalidation */,
144 true /* needs_sync_points */));
145 supports_.push_back(base::MakeUnique<CompositorFrameSinkSupport>(
139 this, &surface_manager_, kParentFrameSink, false /* is_root */, 146 this, &surface_manager_, kParentFrameSink, false /* is_root */,
140 true /* handles_frame_sink_id_invalidation */, 147 true /* handles_frame_sink_id_invalidation */,
141 true /* needs_sync_points */)); 148 true /* needs_sync_points */));
142 supports_.push_back(base::MakeUnique<CompositorFrameSinkSupport>( 149 supports_.push_back(base::MakeUnique<CompositorFrameSinkSupport>(
143 this, &surface_manager_, kChildFrameSink1, false /* is_root */, 150 this, &surface_manager_, kChildFrameSink1, false /* is_root */,
144 true /* handles_frame_sink_id_invalidation */, 151 true /* handles_frame_sink_id_invalidation */,
145 true /* needs_sync_points */)); 152 true /* needs_sync_points */));
146 supports_.push_back(base::MakeUnique<CompositorFrameSinkSupport>( 153 supports_.push_back(base::MakeUnique<CompositorFrameSinkSupport>(
147 this, &surface_manager_, kChildFrameSink2, false /* is_root */, 154 this, &surface_manager_, kChildFrameSink2, false /* is_root */,
148 true /* handles_frame_sink_id_invalidation */, 155 true /* handles_frame_sink_id_invalidation */,
(...skipping 21 matching lines...) Expand all
170 177
171 private: 178 private:
172 SurfaceManager surface_manager_; 179 SurfaceManager surface_manager_;
173 std::unique_ptr<FakeExternalBeginFrameSource> begin_frame_source_; 180 std::unique_ptr<FakeExternalBeginFrameSource> begin_frame_source_;
174 std::vector<std::unique_ptr<CompositorFrameSinkSupport>> supports_; 181 std::vector<std::unique_ptr<CompositorFrameSinkSupport>> supports_;
175 ReturnedResourceArray last_returned_resources_; 182 ReturnedResourceArray last_returned_resources_;
176 183
177 DISALLOW_COPY_AND_ASSIGN(CompositorFrameSinkSupportTest); 184 DISALLOW_COPY_AND_ASSIGN(CompositorFrameSinkSupportTest);
178 }; 185 };
179 186
187 // The display root surface should have a surface reference from the top-level
188 // root added/removed when a CompositorFrame is submitted with a new SurfaceId.
189 TEST_F(CompositorFrameSinkSupportTest, RootSurfaceReceivesReferences) {
190 const SurfaceId display_id_first = MakeSurfaceId(kDisplayFrameSink, 1);
191 const SurfaceId display_id_second = MakeSurfaceId(kDisplayFrameSink, 2);
192
193 // Submit a CompositorFrame for the first display root surface.
194 display_support().SubmitCompositorFrame(
195 display_id_first.local_surface_id(),
196 MakeCompositorFrame({MakeSurfaceId(kParentFrameSink, 1)}));
197
198 // A surface reference from the top-level root is added and there shouldn't be
199 // a temporary reference.
200 EXPECT_THAT(GetTempReferences(kDisplayFrameSink), IsEmpty());
201 EXPECT_THAT(GetChildReferences(surface_manager().GetRootSurfaceId()),
202 UnorderedElementsAre(display_id_first));
203
204 // Submit a CompositorFrame for the second display root surface.
205 display_support().SubmitCompositorFrame(
206 display_id_second.local_surface_id(),
207 MakeCompositorFrame({MakeSurfaceId(kParentFrameSink, 2)}));
208
209 // A surface reference from the top-level root to |display_id_second| should
210 // be added and the reference to |display_root_first| removed.
211 EXPECT_THAT(GetTempReferences(kDisplayFrameSink), IsEmpty());
212 EXPECT_THAT(GetChildReferences(surface_manager().GetRootSurfaceId()),
213 UnorderedElementsAre(display_id_second));
214
215 // Surface |display_id_first| is unreachable and should get deleted.
216 EXPECT_EQ(nullptr, surface_manager().GetSurfaceForId(display_id_first));
217 }
218
180 // The parent Surface is blocked on |child_id1| and |child_id2|. 219 // The parent Surface is blocked on |child_id1| and |child_id2|.
181 TEST_F(CompositorFrameSinkSupportTest, DisplayCompositorLockingBlockedOnTwo) { 220 TEST_F(CompositorFrameSinkSupportTest, DisplayCompositorLockingBlockedOnTwo) {
182 const SurfaceId parent_id = MakeSurfaceId(kParentFrameSink, 1); 221 const SurfaceId parent_id = MakeSurfaceId(kParentFrameSink, 1);
183 const SurfaceId child_id1 = MakeSurfaceId(kChildFrameSink1, 1); 222 const SurfaceId child_id1 = MakeSurfaceId(kChildFrameSink1, 1);
184 const SurfaceId child_id2 = MakeSurfaceId(kChildFrameSink2, 1); 223 const SurfaceId child_id2 = MakeSurfaceId(kChildFrameSink2, 1);
185 224
186 parent_support().SubmitCompositorFrame( 225 parent_support().SubmitCompositorFrame(
187 parent_id.local_surface_id(), 226 parent_id.local_surface_id(),
188 MakeCompositorFrame({child_id1, child_id2})); 227 MakeCompositorFrame({child_id1, child_id2}));
189 228
(...skipping 490 matching lines...) Expand 10 before | Expand all | Expand 10 after
680 // CompositorFrame. Also verify that |child_id1| is no longer a child 719 // CompositorFrame. Also verify that |child_id1| is no longer a child
681 // reference of |parent_id|. 720 // reference of |parent_id|.
682 EXPECT_TRUE(parent_surface()->HasActiveFrame()); 721 EXPECT_TRUE(parent_surface()->HasActiveFrame());
683 EXPECT_FALSE(parent_surface()->HasPendingFrame()); 722 EXPECT_FALSE(parent_surface()->HasPendingFrame());
684 EXPECT_THAT(parent_surface()->blocking_surfaces_for_testing(), IsEmpty()); 723 EXPECT_THAT(parent_surface()->blocking_surfaces_for_testing(), IsEmpty());
685 EXPECT_THAT(GetChildReferences(parent_id), UnorderedElementsAre(child_id2)); 724 EXPECT_THAT(GetChildReferences(parent_id), UnorderedElementsAre(child_id2));
686 } 725 }
687 726
688 } // namespace test 727 } // namespace test
689 } // namespace cc 728 } // namespace cc
OLDNEW
« no previous file with comments | « cc/surfaces/compositor_frame_sink_support.cc ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698