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

Side by Side Diff: services/ui/surfaces/display_compositor_unittest.cc

Issue 2541683004: Add/remove surface references via MojoCompositorFrameSink. (Closed)
Patch Set: Created 4 years 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 2016 The Chromium Authors. All rights reserved. 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 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 "services/ui/surfaces/display_compositor.h" 5 #include "services/ui/surfaces/display_compositor.h"
6 6
7 #include <inttypes.h> 7 #include <inttypes.h>
8 8
9 #include <string> 9 #include <string>
10 #include <utility> 10 #include <utility>
11 11
12 #include "base/logging.h" 12 #include "base/logging.h"
13 #include "base/macros.h" 13 #include "base/macros.h"
14 #include "base/memory/ref_counted.h" 14 #include "base/memory/ref_counted.h"
15 #include "base/strings/stringprintf.h" 15 #include "base/strings/stringprintf.h"
16 #include "cc/ipc/display_compositor.mojom.h" 16 #include "cc/ipc/display_compositor.mojom.h"
17 #include "cc/surfaces/surface_id.h" 17 #include "cc/surfaces/surface_id.h"
18 #include "cc/surfaces/surface_observer.h" 18 #include "cc/surfaces/surface_observer.h"
19 #include "cc/surfaces/surface_reference.h"
19 #include "mojo/public/cpp/bindings/binding.h" 20 #include "mojo/public/cpp/bindings/binding.h"
20 #include "mojo/public/cpp/bindings/interface_request.h" 21 #include "mojo/public/cpp/bindings/interface_request.h"
21 #include "services/ui/common/task_runner_test_base.h" 22 #include "services/ui/common/task_runner_test_base.h"
22 #include "testing/gtest/include/gtest/gtest.h" 23 #include "testing/gtest/include/gtest/gtest.h"
23 #include "ui/gfx/geometry/size.h" 24 #include "ui/gfx/geometry/size.h"
24 25
25 using cc::SurfaceId; 26 using cc::SurfaceId;
26 27
27 namespace ui { 28 namespace ui {
28 namespace test { 29 namespace test {
(...skipping 34 matching lines...) Expand 10 before | Expand all | Expand 10 after
63 void AddEvent(const std::string& text) { 64 void AddEvent(const std::string& text) {
64 if (!events_.empty()) 65 if (!events_.empty())
65 events_ += ";"; 66 events_ += ";";
66 events_ += text; 67 events_ += text;
67 } 68 }
68 69
69 // cc::mojom::DisplayCompositorClient: 70 // cc::mojom::DisplayCompositorClient:
70 void OnSurfaceCreated(const cc::SurfaceId& surface_id, 71 void OnSurfaceCreated(const cc::SurfaceId& surface_id,
71 const gfx::Size& frame_size, 72 const gfx::Size& frame_size,
72 float device_scale_factor) override { 73 float device_scale_factor) override {
74 EXPECT_TRUE(got_root_surface_id_);
73 AddEvent(base::StringPrintf("OnSurfaceCreated(%s)", 75 AddEvent(base::StringPrintf("OnSurfaceCreated(%s)",
74 SurfaceIdString(surface_id).c_str())); 76 SurfaceIdString(surface_id).c_str()));
75 } 77 }
78 void OnRootSurfaceId(const cc::SurfaceId& root_surface_id) override {
79 got_root_surface_id_ = true;
80 }
76 81
77 mojo::Binding<cc::mojom::DisplayCompositorClient> binding_; 82 mojo::Binding<cc::mojom::DisplayCompositorClient> binding_;
78 std::string events_; 83 std::string events_;
84 bool got_root_surface_id_ = false;
79 85
80 DISALLOW_COPY_AND_ASSIGN(TestDisplayCompositorClient); 86 DISALLOW_COPY_AND_ASSIGN(TestDisplayCompositorClient);
81 }; 87 };
82 88
83 // Test SurfaceReferenceManager that records AddSurfaceReference() and 89 // Test SurfaceReferenceManager that records AddSurfaceReference() and
84 // RemoveSurfaceReference() events. 90 // RemoveSurfaceReference() events.
85 class TestSurfaceReferenceManager : public cc::SurfaceReferenceManager { 91 class TestSurfaceReferenceManager : public cc::SurfaceReferenceManager {
86 public: 92 public:
87 ~TestSurfaceReferenceManager() override {} 93 ~TestSurfaceReferenceManager() override {}
88 94
89 const SurfaceId& GetRootSurfaceId() const override { return root_id_; } 95 const SurfaceId& GetRootSurfaceId() const override { return root_id_; }
90 96
91 void AddSurfaceReference(const SurfaceId& parent_id, 97 bool AddSurfaceReference(const SurfaceId& parent_id,
92 const SurfaceId& child_id) override { 98 const SurfaceId& child_id) override {
93 AddEvent(base::StringPrintf("Add(%s-%s)", 99 AddEvent(base::StringPrintf("Add(%s-%s)",
94 SurfaceIdString(parent_id).c_str(), 100 SurfaceIdString(parent_id).c_str(),
95 SurfaceIdString(child_id).c_str())); 101 SurfaceIdString(child_id).c_str()));
102 return true;
96 } 103 }
97 104
98 void RemoveSurfaceReference(const SurfaceId& parent_id, 105 bool RemoveSurfaceReference(const SurfaceId& parent_id,
99 const SurfaceId& child_id) override { 106 const SurfaceId& child_id) override {
100 AddEvent(base::StringPrintf("Remove(%s-%s)", 107 AddEvent(base::StringPrintf("Remove(%s-%s)",
101 SurfaceIdString(parent_id).c_str(), 108 SurfaceIdString(parent_id).c_str(),
102 SurfaceIdString(child_id).c_str())); 109 SurfaceIdString(child_id).c_str()));
110 return true;
103 } 111 }
104 112
105 size_t GetSurfaceReferenceCount(const SurfaceId& surface_id) const override { 113 size_t GetSurfaceReferenceCount(const SurfaceId& surface_id) const override {
106 NOTREACHED(); 114 NOTREACHED();
107 return 0; 115 return 0;
108 } 116 }
109 117
110 size_t GetReferencedSurfaceCount(const SurfaceId& surface_id) const override { 118 size_t GetReferencedSurfaceCount(const SurfaceId& surface_id) const override {
111 NOTREACHED(); 119 NOTREACHED();
112 return 0; 120 return 0;
(...skipping 19 matching lines...) Expand all
132 140
133 } // namespace 141 } // namespace
134 142
135 class DisplayCompositorTest : public TaskRunnerTestBase { 143 class DisplayCompositorTest : public TaskRunnerTestBase {
136 public: 144 public:
137 DisplayCompositorTest() {} 145 DisplayCompositorTest() {}
138 ~DisplayCompositorTest() override {} 146 ~DisplayCompositorTest() override {}
139 147
140 cc::SurfaceObserver* surface_observer() { return display_compositor_.get(); } 148 cc::SurfaceObserver* surface_observer() { return display_compositor_.get(); }
141 149
150 const cc::SurfaceId& GetRootSurfaceId() {
151 return reference_manager_.GetRootSurfaceId();
152 }
153
142 // Returns the total number of temporary references held by DisplayCompositor. 154 // Returns the total number of temporary references held by DisplayCompositor.
143 size_t CountTempReferences() { 155 size_t CountTempReferences() {
144 size_t size = 0; 156 size_t size = 0;
145 for (auto& map_entry : display_compositor_->temp_references_) { 157 for (auto& map_entry : display_compositor_->temp_references_) {
146 size += map_entry.second.size(); 158 size += map_entry.second.size();
147 } 159 }
148 return size; 160 return size;
149 } 161 }
150 162
151 // TaskRunnerTestBase: 163 // TaskRunnerTestBase:
(...skipping 23 matching lines...) Expand all
175 const SurfaceId parent_id = MakeSurfaceId(1, 1, 1); 187 const SurfaceId parent_id = MakeSurfaceId(1, 1, 1);
176 const SurfaceId surface_id = MakeSurfaceId(2, 1, 1); 188 const SurfaceId surface_id = MakeSurfaceId(2, 1, 1);
177 surface_observer()->OnSurfaceCreated(surface_id, gfx::Size(1, 1), 1.0f); 189 surface_observer()->OnSurfaceCreated(surface_id, gfx::Size(1, 1), 1.0f);
178 RunUntilIdle(); 190 RunUntilIdle();
179 191
180 // Client should get OnSurfaceCreated call and temporary reference added. 192 // Client should get OnSurfaceCreated call and temporary reference added.
181 EXPECT_EQ("OnSurfaceCreated(2:1:1)", client_.events()); 193 EXPECT_EQ("OnSurfaceCreated(2:1:1)", client_.events());
182 EXPECT_EQ("Add(0:0:0-2:1:1)", reference_manager_.events()); 194 EXPECT_EQ("Add(0:0:0-2:1:1)", reference_manager_.events());
183 EXPECT_EQ(1u, CountTempReferences()); 195 EXPECT_EQ(1u, CountTempReferences());
184 196
185 display_compositor_->AddSurfaceReference(parent_id, surface_id); 197 display_compositor_->AddSurfaceReference(
198 cc::SurfaceReference(parent_id, surface_id));
186 RunUntilIdle(); 199 RunUntilIdle();
187 200
188 // Real reference is added then temporary reference removed. 201 // Real reference is added then temporary reference removed.
189 EXPECT_EQ("Add(1:1:1-2:1:1);Remove(0:0:0-2:1:1)", 202 EXPECT_EQ("Add(1:1:1-2:1:1);Remove(0:0:0-2:1:1)",
190 reference_manager_.events()); 203 reference_manager_.events());
191 EXPECT_EQ(0u, CountTempReferences()); 204 EXPECT_EQ(0u, CountTempReferences());
192 } 205 }
193 206
194 TEST_F(DisplayCompositorTest, AddSurfaceThenRootReference) { 207 TEST_F(DisplayCompositorTest, AddSurfaceThenRootReference) {
195 const SurfaceId surface_id = MakeSurfaceId(1, 1, 1); 208 const SurfaceId surface_id = MakeSurfaceId(1, 1, 1);
196 surface_observer()->OnSurfaceCreated(surface_id, gfx::Size(1, 1), 1.0f); 209 surface_observer()->OnSurfaceCreated(surface_id, gfx::Size(1, 1), 1.0f);
197 RunUntilIdle(); 210 RunUntilIdle();
198 211
199 // Temporary reference should be added. 212 // Temporary reference should be added.
200 EXPECT_EQ("Add(0:0:0-1:1:1)", reference_manager_.events()); 213 EXPECT_EQ("Add(0:0:0-1:1:1)", reference_manager_.events());
201 EXPECT_EQ(1u, CountTempReferences()); 214 EXPECT_EQ(1u, CountTempReferences());
202 215
203 display_compositor_->AddRootSurfaceReference(surface_id); 216 display_compositor_->AddSurfaceReference(
217 cc::SurfaceReference(GetRootSurfaceId(), surface_id));
204 RunUntilIdle(); 218 RunUntilIdle();
205 219
206 // Adding real reference doesn't need to change anything in 220 // Adding real reference doesn't need to change anything in
207 // SurfaceReferenceManager does remove the temporary reference marker. 221 // SurfaceReferenceManager does remove the temporary reference marker.
208 EXPECT_EQ("", reference_manager_.events()); 222 EXPECT_EQ("", reference_manager_.events());
209 EXPECT_EQ(0u, CountTempReferences()); 223 EXPECT_EQ(0u, CountTempReferences());
210 } 224 }
211 225
212 TEST_F(DisplayCompositorTest, AddTwoSurfacesThenOneReference) { 226 TEST_F(DisplayCompositorTest, AddTwoSurfacesThenOneReference) {
213 const SurfaceId parent_id = MakeSurfaceId(1, 1, 1); 227 const SurfaceId parent_id = MakeSurfaceId(1, 1, 1);
214 const SurfaceId surface_id1 = MakeSurfaceId(2, 1, 1); 228 const SurfaceId surface_id1 = MakeSurfaceId(2, 1, 1);
215 const SurfaceId surface_id2 = MakeSurfaceId(3, 1, 1); 229 const SurfaceId surface_id2 = MakeSurfaceId(3, 1, 1);
216 230
217 // Add two surfaces with different FrameSinkIds. 231 // Add two surfaces with different FrameSinkIds.
218 surface_observer()->OnSurfaceCreated(surface_id1, gfx::Size(1, 1), 1.0f); 232 surface_observer()->OnSurfaceCreated(surface_id1, gfx::Size(1, 1), 1.0f);
219 surface_observer()->OnSurfaceCreated(surface_id2, gfx::Size(1, 1), 1.0f); 233 surface_observer()->OnSurfaceCreated(surface_id2, gfx::Size(1, 1), 1.0f);
220 RunUntilIdle(); 234 RunUntilIdle();
221 235
222 // Temporary reference should be added for both surfaces. 236 // Temporary reference should be added for both surfaces.
223 EXPECT_EQ("Add(0:0:0-2:1:1);Add(0:0:0-3:1:1)", reference_manager_.events()); 237 EXPECT_EQ("Add(0:0:0-2:1:1);Add(0:0:0-3:1:1)", reference_manager_.events());
224 EXPECT_EQ(2u, CountTempReferences()); 238 EXPECT_EQ(2u, CountTempReferences());
225 239
226 display_compositor_->AddSurfaceReference(parent_id, surface_id1); 240 display_compositor_->AddSurfaceReference(
241 cc::SurfaceReference(parent_id, surface_id1));
227 RunUntilIdle(); 242 RunUntilIdle();
228 243
229 // Real reference is added then temporary reference removed for 2:1:1. There 244 // Real reference is added then temporary reference removed for 2:1:1. There
230 // should still be a temporary reference left to 3:1:1 245 // should still be a temporary reference left to 3:1:1
231 EXPECT_EQ("Add(1:1:1-2:1:1);Remove(0:0:0-2:1:1)", 246 EXPECT_EQ("Add(1:1:1-2:1:1);Remove(0:0:0-2:1:1)",
232 reference_manager_.events()); 247 reference_manager_.events());
233 EXPECT_EQ(1u, CountTempReferences()); 248 EXPECT_EQ(1u, CountTempReferences());
234 } 249 }
235 250
236 TEST_F(DisplayCompositorTest, AddSurfacesSkipReference) { 251 TEST_F(DisplayCompositorTest, AddSurfacesSkipReference) {
237 const SurfaceId parent_id = MakeSurfaceId(1, 1, 1); 252 const SurfaceId parent_id = MakeSurfaceId(1, 1, 1);
238 const SurfaceId surface_id1 = MakeSurfaceId(2, 1, 1); 253 const SurfaceId surface_id1 = MakeSurfaceId(2, 1, 1);
239 const SurfaceId surface_id2 = MakeSurfaceId(2, 1, 2); 254 const SurfaceId surface_id2 = MakeSurfaceId(2, 1, 2);
240 255
241 // Add two surfaces that have the same FrameSinkId. This would happen when a 256 // Add two surfaces that have the same FrameSinkId. This would happen when a
242 // client submits two CFs before parent submits a new CF. 257 // client submits two CFs before parent submits a new CF.
243 surface_observer()->OnSurfaceCreated(surface_id1, gfx::Size(1, 1), 1.0f); 258 surface_observer()->OnSurfaceCreated(surface_id1, gfx::Size(1, 1), 1.0f);
244 surface_observer()->OnSurfaceCreated(surface_id2, gfx::Size(1, 1), 1.0f); 259 surface_observer()->OnSurfaceCreated(surface_id2, gfx::Size(1, 1), 1.0f);
245 RunUntilIdle(); 260 RunUntilIdle();
246 261
247 // Client should get OnSurfaceCreated call and temporary reference added for 262 // Client should get OnSurfaceCreated call and temporary reference added for
248 // both surfaces. 263 // both surfaces.
249 EXPECT_EQ("OnSurfaceCreated(2:1:1);OnSurfaceCreated(2:1:2)", 264 EXPECT_EQ("OnSurfaceCreated(2:1:1);OnSurfaceCreated(2:1:2)",
250 client_.events()); 265 client_.events());
251 EXPECT_EQ("Add(0:0:0-2:1:1);Add(0:0:0-2:1:2)", reference_manager_.events()); 266 EXPECT_EQ("Add(0:0:0-2:1:1);Add(0:0:0-2:1:2)", reference_manager_.events());
252 EXPECT_EQ(2u, CountTempReferences()); 267 EXPECT_EQ(2u, CountTempReferences());
253 268
254 // Add a reference to the surface with the later LocalFrameId. 269 // Add a reference to the surface with the later LocalFrameId.
255 display_compositor_->AddSurfaceReference(parent_id, surface_id2); 270 display_compositor_->AddSurfaceReference(
271 cc::SurfaceReference(parent_id, surface_id2));
256 RunUntilIdle(); 272 RunUntilIdle();
257 273
258 // The real reference should be added for 2:1:2 and both temporary references 274 // The real reference should be added for 2:1:2 and both temporary references
259 // should be removed. 275 // should be removed.
260 EXPECT_EQ("Add(1:1:1-2:1:2);Remove(0:0:0-2:1:2);Remove(0:0:0-2:1:1)", 276 EXPECT_EQ("Add(1:1:1-2:1:2);Remove(0:0:0-2:1:2);Remove(0:0:0-2:1:1)",
261 reference_manager_.events()); 277 reference_manager_.events());
262 EXPECT_EQ(0u, CountTempReferences()); 278 EXPECT_EQ(0u, CountTempReferences());
263 } 279 }
264 280
265 } // namespace test 281 } // namespace test
266 } // namespace ui 282 } // namespace ui
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698