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

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

Issue 2455663003: Add cc::Surface ref counting. (Closed)
Patch Set: Created 4 years, 1 month 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
(Empty)
1 // Copyright 2016 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file.
4
5 #include <stddef.h>
6
7 #include "base/memory/ptr_util.h"
8 #include "cc/surfaces/surface_id.h"
9 #include "cc/surfaces/surface_manager.h"
10 #include "testing/gtest/include/gtest/gtest.h"
11
12 namespace cc {
13 namespace {
14
15 // Creates a new SurfaceId for the provided client and sink ids.
16 constexpr SurfaceId MakeSurfaceId(uint32_t client_id, uint32_t sink_id) {
17 return SurfaceId(FrameSinkId(client_id, sink_id), LocalFrameId(1u, 1u));
18 }
19
20 // Creates a SurfaceId with the next LocalFrameId.
21 SurfaceId NextSurfaceId(const SurfaceId& existing_id) {
22 return SurfaceId(
23 existing_id.frame_sink_id(),
24 LocalFrameId(existing_id.local_frame_id().local_id() + 1u, 1u));
25 }
26
27 constexpr SurfaceId kId1 = MakeSurfaceId(1, 0);
28 constexpr SurfaceId kId2 = MakeSurfaceId(2, 0);
29 constexpr SurfaceId kId3 = MakeSurfaceId(3, 0);
30
31 class SurfaceManagerRefTest : public testing::Test {
32 public:
33 SurfaceManager& manager() { return *manager_; }
34
35 void SetUp() override {
36 testing::Test::SetUp();
37 manager_ = base::MakeUnique<SurfaceManager>();
38 }
39
40 protected:
41 std::unique_ptr<SurfaceManager> manager_;
Fady Samuel 2016/10/27 04:14:49 No need to place it in a unique_ptr I think.
kylechar 2016/10/27 21:14:10 I'd have to add a reset method to SurfaceManager o
42 };
43
44 } // namespace
45
46 TEST_F(SurfaceManagerRefTest, AddRemoveRef) {
47 manager().AddSurfaceIdReference(kId1, kId2);
48 EXPECT_EQ(manager().CountSurfaceReferences(kId1), 0);
Fady Samuel 2016/10/27 04:14:49 Hmm, what do we do about top-level surfaces? I gue
kylechar 2016/10/27 21:14:10 So my WIP patch beyond this one has a constant "Su
49 EXPECT_EQ(manager().CountSurfaceReferences(kId2), 1);
50 EXPECT_EQ(manager().CountSurfaceReferees(kId1), 1);
51 EXPECT_EQ(manager().CountSurfaceReferees(kId2), 0);
52
53 manager().RemoveSurfaceIdReference(kId1, kId2);
54 EXPECT_EQ(manager().CountSurfaceReferences(kId1), 0);
55 EXPECT_EQ(manager().CountSurfaceReferences(kId2), 0);
56 EXPECT_EQ(manager().CountSurfaceReferees(kId1), 0);
57 EXPECT_EQ(manager().CountSurfaceReferees(kId2), 0);
58 }
59
60 TEST_F(SurfaceManagerRefTest, AddRemoveRefDouble) {
61 manager().AddSurfaceIdReference(kId1, kId2);
62 manager().AddSurfaceIdReference(kId2, kId3);
63 EXPECT_EQ(manager().CountSurfaceReferences(kId1), 0);
64 EXPECT_EQ(manager().CountSurfaceReferences(kId2), 1);
65 EXPECT_EQ(manager().CountSurfaceReferences(kId3), 1);
66 EXPECT_EQ(manager().CountSurfaceReferees(kId1), 1);
67 EXPECT_EQ(manager().CountSurfaceReferees(kId2), 1);
68 EXPECT_EQ(manager().CountSurfaceReferees(kId3), 0);
69
70 // Should remove references from id1 -> id2 and then since kId2 has zero
71 // references all references it holds should be removed.
72 manager().RemoveSurfaceIdReference(kId1, kId2);
73 EXPECT_EQ(manager().CountSurfaceReferences(kId1), 0);
74 EXPECT_EQ(manager().CountSurfaceReferences(kId2), 0);
75 EXPECT_EQ(manager().CountSurfaceReferences(kId3), 0);
76 EXPECT_EQ(manager().CountSurfaceReferees(kId1), 0);
77 EXPECT_EQ(manager().CountSurfaceReferees(kId2), 0);
78 EXPECT_EQ(manager().CountSurfaceReferees(kId3), 0);
79 }
80
81 TEST_F(SurfaceManagerRefTest, AddRemoveSameFrameSinkId) {
82 SurfaceId next_id = NextSurfaceId(kId2);
83 ASSERT_EQ(kId2.frame_sink_id(), next_id.frame_sink_id());
84
85 manager().AddSurfaceIdReference(kId1, kId2);
86 manager().AddSurfaceIdReference(kId2, kId3);
87 manager().AddSurfaceIdReference(kId2, next_id);
88 EXPECT_EQ(manager().CountSurfaceReferences(kId3), 1);
89 EXPECT_EQ(manager().CountSurfaceReferences(next_id), 1);
90
91 manager().RemoveSurfaceIdReference(kId2, kId3);
92 EXPECT_EQ(manager().CountSurfaceReferences(kId3), 0);
93 EXPECT_EQ(manager().CountSurfaceReferences(next_id), 1);
94 }
95
96 TEST_F(SurfaceManagerRefTest, RemoveAllRoot) {
97 manager().AddSurfaceIdReference(kId1, kId2);
98 manager().AddSurfaceIdReference(kId2, kId3);
99 manager().RemoveAllReferencesForFrameSink(kId1.frame_sink_id());
100
101 EXPECT_EQ(manager().CountSurfaceReferences(kId2), 0);
102 EXPECT_EQ(manager().CountSurfaceReferences(kId3), 0);
103 EXPECT_EQ(manager().CountSurfaceReferees(kId1), 0);
104 EXPECT_EQ(manager().CountSurfaceReferees(kId2), 0);
105 }
106
107 TEST_F(SurfaceManagerRefTest, RemoveAllLeafReference) {
108 manager().AddSurfaceIdReference(kId1, kId2);
109 manager().AddSurfaceIdReference(kId2, kId3);
110 manager().RemoveAllReferencesForFrameSink(kId3.frame_sink_id());
111
112 EXPECT_EQ(manager().CountSurfaceReferences(kId2), 1);
113 EXPECT_EQ(manager().CountSurfaceReferences(kId3), 0);
114 EXPECT_EQ(manager().CountSurfaceReferees(kId1), 1);
115 EXPECT_EQ(manager().CountSurfaceReferees(kId2), 0);
116 }
117
118 TEST_F(SurfaceManagerRefTest, RemoveAllRecursive) {
119 manager().AddSurfaceIdReference(kId1, kId2);
120 manager().AddSurfaceIdReference(kId2, kId3);
121 manager().RemoveAllReferencesForFrameSink(kId2.frame_sink_id());
122
123 EXPECT_EQ(manager().CountSurfaceReferences(kId2), 0);
124 EXPECT_EQ(manager().CountSurfaceReferences(kId3), 0);
125 EXPECT_EQ(manager().CountSurfaceReferees(kId1), 0);
126 EXPECT_EQ(manager().CountSurfaceReferees(kId2), 0);
127 }
128
129 TEST_F(SurfaceManagerRefTest, RemoveAllRecusiveMultipleSurfaces) {
Fady Samuel 2016/10/27 04:14:49 An interesting test or two or three to add would m
130 SurfaceId next_id = NextSurfaceId(kId2);
131 ASSERT_EQ(kId2.frame_sink_id(), next_id.frame_sink_id());
132
133 manager().AddSurfaceIdReference(kId1, kId2);
134 manager().AddSurfaceIdReference(kId1, next_id);
135 manager().AddSurfaceIdReference(kId2, kId3);
136 manager().AddSurfaceIdReference(next_id, kId3);
137
138 EXPECT_EQ(manager().CountSurfaceReferees(kId2), 1);
139 EXPECT_EQ(manager().CountSurfaceReferees(next_id), 1);
140 EXPECT_EQ(manager().CountSurfaceReferences(kId3), 2);
141
142 manager().RemoveAllReferencesForFrameSink(next_id.frame_sink_id());
143
144 EXPECT_EQ(manager().CountSurfaceReferences(kId2), 0);
145 EXPECT_EQ(manager().CountSurfaceReferences(next_id), 0);
146 EXPECT_EQ(manager().CountSurfaceReferences(kId3), 0);
147 EXPECT_EQ(manager().CountSurfaceReferees(next_id), 0);
148 EXPECT_EQ(manager().CountSurfaceReferees(kId2), 0);
149 }
150
151 } // namespace cc
OLDNEW
« cc/surfaces/surface_manager.cc ('K') | « cc/surfaces/surface_manager.cc ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698