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

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

Issue 2541683004: Add/remove surface references via MojoCompositorFrameSink. (Closed)
Patch Set: Cleanup. 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 namespace ui { 26 namespace ui {
26 namespace test { 27 namespace test {
27 namespace { 28 namespace {
28 29
(...skipping 29 matching lines...) Expand all
58 } 59 }
59 60
60 private: 61 private:
61 void AddEvent(const std::string& text) { 62 void AddEvent(const std::string& text) {
62 if (!events_.empty()) 63 if (!events_.empty())
63 events_ += ";"; 64 events_ += ";";
64 events_ += text; 65 events_ += text;
65 } 66 }
66 67
67 // cc::mojom::DisplayCompositorClient: 68 // cc::mojom::DisplayCompositorClient:
69 void OnDisplayCompositorCreated(
70 const cc::SurfaceId& root_surface_id) override {
71 got_root_surface_id_ = true;
72 }
73
68 void OnSurfaceCreated(const cc::SurfaceId& surface_id, 74 void OnSurfaceCreated(const cc::SurfaceId& surface_id,
69 const gfx::Size& frame_size, 75 const gfx::Size& frame_size,
70 float device_scale_factor) override { 76 float device_scale_factor) override {
77 EXPECT_TRUE(got_root_surface_id_);
71 AddEvent(base::StringPrintf("OnSurfaceCreated(%s)", 78 AddEvent(base::StringPrintf("OnSurfaceCreated(%s)",
72 SurfaceIdString(surface_id).c_str())); 79 SurfaceIdString(surface_id).c_str()));
73 } 80 }
74 81
75 mojo::Binding<cc::mojom::DisplayCompositorClient> binding_; 82 mojo::Binding<cc::mojom::DisplayCompositorClient> binding_;
76 std::string events_; 83 std::string events_;
84 bool got_root_surface_id_ = false;
77 85
78 DISALLOW_COPY_AND_ASSIGN(TestDisplayCompositorClient); 86 DISALLOW_COPY_AND_ASSIGN(TestDisplayCompositorClient);
79 }; 87 };
80 88
81 // Test SurfaceReferenceManager that records AddSurfaceReference() and 89 // Test SurfaceReferenceManager that records AddSurfaceReference() and
82 // RemoveSurfaceReference() events. 90 // RemoveSurfaceReference() events.
83 class TestSurfaceReferenceManager : public cc::SurfaceReferenceManager { 91 class TestSurfaceReferenceManager : public cc::SurfaceReferenceManager {
84 public: 92 public:
85 ~TestSurfaceReferenceManager() override {} 93 ~TestSurfaceReferenceManager() override {}
86 94
(...skipping 45 matching lines...) Expand 10 before | Expand all | Expand 10 after
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() const {
151 return reference_manager_.GetRootSurfaceId();
152 }
153
154 void AddSurfaceReference(const cc::SurfaceId& parent_id,
155 const cc::SurfaceId& child_id) {
156 display_compositor_->AddSurfaceReferences(std::vector<cc::SurfaceReference>{
157 cc::SurfaceReference(parent_id, child_id)});
158 }
159
142 // Returns the total number of temporary references held by DisplayCompositor. 160 // Returns the total number of temporary references held by DisplayCompositor.
143 size_t CountTempReferences() { 161 size_t CountTempReferences() {
144 size_t size = 0; 162 size_t size = 0;
145 for (auto& map_entry : display_compositor_->temp_references_) { 163 for (auto& map_entry : display_compositor_->temp_references_) {
146 size += map_entry.second.size(); 164 size += map_entry.second.size();
147 } 165 }
148 return size; 166 return size;
149 } 167 }
150 168
151 // TaskRunnerTestBase: 169 // TaskRunnerTestBase:
(...skipping 23 matching lines...) Expand all
175 const cc::SurfaceId parent_id = MakeSurfaceId(1, 1, 1); 193 const cc::SurfaceId parent_id = MakeSurfaceId(1, 1, 1);
176 const cc::SurfaceId surface_id = MakeSurfaceId(2, 1, 1); 194 const cc::SurfaceId surface_id = MakeSurfaceId(2, 1, 1);
177 surface_observer()->OnSurfaceCreated(surface_id, gfx::Size(1, 1), 1.0f); 195 surface_observer()->OnSurfaceCreated(surface_id, gfx::Size(1, 1), 1.0f);
178 RunUntilIdle(); 196 RunUntilIdle();
179 197
180 // Client should get OnSurfaceCreated call and temporary reference added. 198 // Client should get OnSurfaceCreated call and temporary reference added.
181 EXPECT_EQ("OnSurfaceCreated(2:1:1)", client_.events()); 199 EXPECT_EQ("OnSurfaceCreated(2:1:1)", client_.events());
182 EXPECT_EQ("Add(0:0:0-2:1:1)", reference_manager_.events()); 200 EXPECT_EQ("Add(0:0:0-2:1:1)", reference_manager_.events());
183 EXPECT_EQ(1u, CountTempReferences()); 201 EXPECT_EQ(1u, CountTempReferences());
184 202
185 display_compositor_->AddSurfaceReference(parent_id, surface_id); 203 AddSurfaceReference(parent_id, surface_id);
186 RunUntilIdle(); 204 RunUntilIdle();
187 205
188 // Real reference is added then temporary reference removed. 206 // 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)", 207 EXPECT_EQ("Add(1:1:1-2:1:1);Remove(0:0:0-2:1:1)",
190 reference_manager_.events()); 208 reference_manager_.events());
191 EXPECT_EQ(0u, CountTempReferences()); 209 EXPECT_EQ(0u, CountTempReferences());
192 } 210 }
193 211
194 TEST_F(DisplayCompositorTest, AddSurfaceThenRootReference) { 212 TEST_F(DisplayCompositorTest, AddSurfaceThenRootReference) {
195 const cc::SurfaceId surface_id = MakeSurfaceId(1, 1, 1); 213 const cc::SurfaceId surface_id = MakeSurfaceId(1, 1, 1);
196 surface_observer()->OnSurfaceCreated(surface_id, gfx::Size(1, 1), 1.0f); 214 surface_observer()->OnSurfaceCreated(surface_id, gfx::Size(1, 1), 1.0f);
197 RunUntilIdle(); 215 RunUntilIdle();
198 216
199 // Temporary reference should be added. 217 // Temporary reference should be added.
200 EXPECT_EQ("Add(0:0:0-1:1:1)", reference_manager_.events()); 218 EXPECT_EQ("Add(0:0:0-1:1:1)", reference_manager_.events());
201 EXPECT_EQ(1u, CountTempReferences()); 219 EXPECT_EQ(1u, CountTempReferences());
202 220
203 display_compositor_->AddRootSurfaceReference(surface_id); 221 AddSurfaceReference(GetRootSurfaceId(), surface_id);
204 RunUntilIdle(); 222 RunUntilIdle();
205 223
206 // Adding real reference doesn't need to change anything in 224 // Adding real reference doesn't need to change anything in
207 // SurfaceReferenceManager does remove the temporary reference marker. 225 // SurfaceReferenceManager does remove the temporary reference marker.
208 EXPECT_EQ("", reference_manager_.events()); 226 EXPECT_EQ("", reference_manager_.events());
209 EXPECT_EQ(0u, CountTempReferences()); 227 EXPECT_EQ(0u, CountTempReferences());
210 } 228 }
211 229
212 TEST_F(DisplayCompositorTest, AddTwoSurfacesThenOneReference) { 230 TEST_F(DisplayCompositorTest, AddTwoSurfacesThenOneReference) {
213 const cc::SurfaceId parent_id = MakeSurfaceId(1, 1, 1); 231 const cc::SurfaceId parent_id = MakeSurfaceId(1, 1, 1);
214 const cc::SurfaceId surface_id1 = MakeSurfaceId(2, 1, 1); 232 const cc::SurfaceId surface_id1 = MakeSurfaceId(2, 1, 1);
215 const cc::SurfaceId surface_id2 = MakeSurfaceId(3, 1, 1); 233 const cc::SurfaceId surface_id2 = MakeSurfaceId(3, 1, 1);
216 234
217 // Add two surfaces with different FrameSinkIds. 235 // Add two surfaces with different FrameSinkIds.
218 surface_observer()->OnSurfaceCreated(surface_id1, gfx::Size(1, 1), 1.0f); 236 surface_observer()->OnSurfaceCreated(surface_id1, gfx::Size(1, 1), 1.0f);
219 surface_observer()->OnSurfaceCreated(surface_id2, gfx::Size(1, 1), 1.0f); 237 surface_observer()->OnSurfaceCreated(surface_id2, gfx::Size(1, 1), 1.0f);
220 RunUntilIdle(); 238 RunUntilIdle();
221 239
222 // Temporary reference should be added for both surfaces. 240 // 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()); 241 EXPECT_EQ("Add(0:0:0-2:1:1);Add(0:0:0-3:1:1)", reference_manager_.events());
224 EXPECT_EQ(2u, CountTempReferences()); 242 EXPECT_EQ(2u, CountTempReferences());
225 243
226 display_compositor_->AddSurfaceReference(parent_id, surface_id1); 244 AddSurfaceReference(parent_id, surface_id1);
227 RunUntilIdle(); 245 RunUntilIdle();
228 246
229 // Real reference is added then temporary reference removed for 2:1:1. There 247 // 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 248 // 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)", 249 EXPECT_EQ("Add(1:1:1-2:1:1);Remove(0:0:0-2:1:1)",
232 reference_manager_.events()); 250 reference_manager_.events());
233 EXPECT_EQ(1u, CountTempReferences()); 251 EXPECT_EQ(1u, CountTempReferences());
234 } 252 }
235 253
236 TEST_F(DisplayCompositorTest, AddSurfacesSkipReference) { 254 TEST_F(DisplayCompositorTest, AddSurfacesSkipReference) {
237 const cc::SurfaceId parent_id = MakeSurfaceId(1, 1, 1); 255 const cc::SurfaceId parent_id = MakeSurfaceId(1, 1, 1);
238 const cc::SurfaceId surface_id1 = MakeSurfaceId(2, 1, 1); 256 const cc::SurfaceId surface_id1 = MakeSurfaceId(2, 1, 1);
239 const cc::SurfaceId surface_id2 = MakeSurfaceId(2, 1, 2); 257 const cc::SurfaceId surface_id2 = MakeSurfaceId(2, 1, 2);
240 258
241 // Add two surfaces that have the same FrameSinkId. This would happen when a 259 // Add two surfaces that have the same FrameSinkId. This would happen when a
242 // client submits two CFs before parent submits a new CF. 260 // client submits two CFs before parent submits a new CF.
243 surface_observer()->OnSurfaceCreated(surface_id1, gfx::Size(1, 1), 1.0f); 261 surface_observer()->OnSurfaceCreated(surface_id1, gfx::Size(1, 1), 1.0f);
244 surface_observer()->OnSurfaceCreated(surface_id2, gfx::Size(1, 1), 1.0f); 262 surface_observer()->OnSurfaceCreated(surface_id2, gfx::Size(1, 1), 1.0f);
245 RunUntilIdle(); 263 RunUntilIdle();
246 264
247 // Client should get OnSurfaceCreated call and temporary reference added for 265 // Client should get OnSurfaceCreated call and temporary reference added for
248 // both surfaces. 266 // both surfaces.
249 EXPECT_EQ("OnSurfaceCreated(2:1:1);OnSurfaceCreated(2:1:2)", 267 EXPECT_EQ("OnSurfaceCreated(2:1:1);OnSurfaceCreated(2:1:2)",
250 client_.events()); 268 client_.events());
251 EXPECT_EQ("Add(0:0:0-2:1:1);Add(0:0:0-2:1:2)", reference_manager_.events()); 269 EXPECT_EQ("Add(0:0:0-2:1:1);Add(0:0:0-2:1:2)", reference_manager_.events());
252 EXPECT_EQ(2u, CountTempReferences()); 270 EXPECT_EQ(2u, CountTempReferences());
253 271
254 // Add a reference to the surface with the later LocalFrameId. 272 // Add a reference to the surface with the later LocalFrameId.
255 display_compositor_->AddSurfaceReference(parent_id, surface_id2); 273 AddSurfaceReference(parent_id, surface_id2);
256 RunUntilIdle(); 274 RunUntilIdle();
257 275
258 // The real reference should be added for 2:1:2 and both temporary references 276 // The real reference should be added for 2:1:2 and both temporary references
259 // should be removed. 277 // 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)", 278 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()); 279 reference_manager_.events());
262 EXPECT_EQ(0u, CountTempReferences()); 280 EXPECT_EQ(0u, CountTempReferences());
263 } 281 }
264 282
265 } // namespace test 283 } // namespace test
266 } // namespace ui 284 } // namespace ui
OLDNEW
« no previous file with comments | « services/ui/surfaces/display_compositor.cc ('k') | services/ui/surfaces/gpu_compositor_frame_sink.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698