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

Side by Side Diff: services/ui/ws/frame_generator_unittest.cc

Issue 2763623002: [ui/ws] Acknowledge BeginFrames in FrameGenerator + add tests. (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
« no previous file with comments | « services/ui/ws/frame_generator.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 "services/ui/ws/frame_generator.h" 5 #include "services/ui/ws/frame_generator.h"
6 6
7 #include "base/macros.h" 7 #include "base/macros.h"
8 #include "cc/output/compositor_frame_sink.h" 8 #include "cc/output/compositor_frame_sink.h"
9 #include "cc/scheduler/begin_frame_source.h" 9 #include "cc/scheduler/begin_frame_source.h"
10 #include "cc/test/begin_frame_args_test.cc" 10 #include "cc/test/begin_frame_args_test.cc"
(...skipping 69 matching lines...) Expand 10 before | Expand all | Expand 10 after
80 80
81 void OnBeginFrameSourcePausedChanged(bool paused) override {} 81 void OnBeginFrameSourcePausedChanged(bool paused) override {}
82 82
83 // cc::ExternalBeginFrameSourceClient implementation: 83 // cc::ExternalBeginFrameSourceClient implementation:
84 void OnNeedsBeginFrames(bool needs_begin_frames) override { 84 void OnNeedsBeginFrames(bool needs_begin_frames) override {
85 needs_begin_frames_ = needs_begin_frames; 85 needs_begin_frames_ = needs_begin_frames;
86 UpdateNeedsBeginFramesInternal(); 86 UpdateNeedsBeginFramesInternal();
87 } 87 }
88 88
89 void OnDidFinishFrame(const cc::BeginFrameAck& ack) override { 89 void OnDidFinishFrame(const cc::BeginFrameAck& ack) override {
90 external_begin_frame_source_->DidFinishFrame(this, ack); 90 begin_frame_source_->DidFinishFrame(this, ack);
91 } 91 }
92 92
93 void SetBeginFrameSource(cc::BeginFrameSource* source) { 93 void SetBeginFrameSource(cc::BeginFrameSource* source) {
94 if (begin_frame_source_ && observing_begin_frames_) { 94 if (begin_frame_source_ && observing_begin_frames_) {
95 begin_frame_source_->RemoveObserver(this); 95 begin_frame_source_->RemoveObserver(this);
96 observing_begin_frames_ = false; 96 observing_begin_frames_ = false;
97 } 97 }
98 begin_frame_source_ = source; 98 begin_frame_source_ = source;
99 UpdateNeedsBeginFramesInternal(); 99 UpdateNeedsBeginFramesInternal();
100 } 100 }
(...skipping 67 matching lines...) Expand 10 before | Expand all | Expand 10 after
168 BEGINFRAME_FROM_HERE, 0, next_sequence_number_)); 168 BEGINFRAME_FROM_HERE, 0, next_sequence_number_));
169 ++next_sequence_number_; 169 ++next_sequence_number_;
170 } 170 }
171 171
172 FrameGenerator* frame_generator() { return frame_generator_.get(); } 172 FrameGenerator* frame_generator() { return frame_generator_.get(); }
173 173
174 const cc::CompositorFrameMetadata& LastMetadata() { 174 const cc::CompositorFrameMetadata& LastMetadata() {
175 return compositor_frame_sink_->last_metadata(); 175 return compositor_frame_sink_->last_metadata();
176 } 176 }
177 177
178 const cc::BeginFrameAck& LastBeginFrameAckFromFrameGenerator() {
Fady Samuel 2017/03/20 18:33:13 nit: FromFrameGenerator is a bit redundant given t
Eric Seckler 2017/03/21 16:26:04 Done.
179 return begin_frame_source_->LastAckForObserver(compositor_frame_sink_);
180 }
181
182 ServerWindow* root_window() { return root_window_.get(); }
183
178 private: 184 private:
179 FakeCompositorFrameSink* compositor_frame_sink_ = nullptr; 185 FakeCompositorFrameSink* compositor_frame_sink_ = nullptr;
180 std::unique_ptr<cc::FakeExternalBeginFrameSource> begin_frame_source_; 186 std::unique_ptr<cc::FakeExternalBeginFrameSource> begin_frame_source_;
181 std::unique_ptr<TestFrameGeneratorDelegate> delegate_; 187 std::unique_ptr<TestFrameGeneratorDelegate> delegate_;
182 std::unique_ptr<TestServerWindowDelegate> server_window_delegate_; 188 std::unique_ptr<TestServerWindowDelegate> server_window_delegate_;
183 std::unique_ptr<ServerWindow> root_window_; 189 std::unique_ptr<ServerWindow> root_window_;
184 std::unique_ptr<FrameGenerator> frame_generator_; 190 std::unique_ptr<FrameGenerator> frame_generator_;
185 int next_sequence_number_ = 1; 191 int next_sequence_number_ = 1;
186 192
187 DISALLOW_COPY_AND_ASSIGN(FrameGeneratorTest); 193 DISALLOW_COPY_AND_ASSIGN(FrameGeneratorTest);
188 }; 194 };
189 195
190 TEST_F(FrameGeneratorTest, OnSurfaceCreated) { 196 TEST_F(FrameGeneratorTest, OnSurfaceCreated) {
191 EXPECT_EQ(0, NumberOfFramesReceived()); 197 EXPECT_EQ(0, NumberOfFramesReceived());
192 198
193 // FrameGenerator does not request BeginFrames upon creation. 199 // FrameGenerator does not request BeginFrames upon creation.
194 IssueBeginFrame(); 200 IssueBeginFrame();
195 EXPECT_EQ(0, NumberOfFramesReceived()); 201 EXPECT_EQ(0, NumberOfFramesReceived());
202 EXPECT_EQ(cc::BeginFrameAck(), LastBeginFrameAckFromFrameGenerator());
196 203
197 const cc::SurfaceId kArbitrarySurfaceId( 204 const cc::SurfaceId kArbitrarySurfaceId(
198 cc::FrameSinkId(1, 1), 205 cc::FrameSinkId(1, 1),
199 cc::LocalSurfaceId(1, base::UnguessableToken::Create())); 206 cc::LocalSurfaceId(1, base::UnguessableToken::Create()));
200 const cc::SurfaceInfo kArbitrarySurfaceInfo(kArbitrarySurfaceId, 1.0f, 207 const cc::SurfaceInfo kArbitrarySurfaceInfo(kArbitrarySurfaceId, 1.0f,
201 gfx::Size(100, 100)); 208 gfx::Size(100, 100));
202 frame_generator()->OnSurfaceCreated(kArbitrarySurfaceInfo); 209 frame_generator()->OnSurfaceCreated(kArbitrarySurfaceInfo);
203 EXPECT_EQ(0, NumberOfFramesReceived()); 210 EXPECT_EQ(0, NumberOfFramesReceived());
204 211
205 IssueBeginFrame(); 212 IssueBeginFrame();
206 EXPECT_EQ(1, NumberOfFramesReceived()); 213 EXPECT_EQ(1, NumberOfFramesReceived());
207 214
208 // Verify that the CompositorFrame refers to the window manager's surface via 215 // Verify that the CompositorFrame refers to the window manager's surface via
209 // referenced_surfaces. 216 // referenced_surfaces.
210 const cc::CompositorFrameMetadata& last_metadata = LastMetadata(); 217 const cc::CompositorFrameMetadata& last_metadata = LastMetadata();
211 const std::vector<cc::SurfaceId>& referenced_surfaces = 218 const std::vector<cc::SurfaceId>& referenced_surfaces =
212 last_metadata.referenced_surfaces; 219 last_metadata.referenced_surfaces;
213 EXPECT_EQ(1lu, referenced_surfaces.size()); 220 EXPECT_EQ(1lu, referenced_surfaces.size());
214 EXPECT_EQ(kArbitrarySurfaceId, referenced_surfaces.front()); 221 EXPECT_EQ(kArbitrarySurfaceId, referenced_surfaces.front());
215 222
223 cc::BeginFrameAck expected_ack(0, 2, 2, 0, true);
224 EXPECT_EQ(expected_ack, LastBeginFrameAckFromFrameGenerator());
225 EXPECT_EQ(expected_ack, last_metadata.begin_frame_ack);
226
216 // FrameGenerator stops requesting BeginFrames after submitting a 227 // FrameGenerator stops requesting BeginFrames after submitting a
217 // CompositorFrame. 228 // CompositorFrame.
218 IssueBeginFrame(); 229 IssueBeginFrame();
219 EXPECT_EQ(1, NumberOfFramesReceived()); 230 EXPECT_EQ(1, NumberOfFramesReceived());
231 EXPECT_EQ(cc::BeginFrameAck(0, 2, 2, 0, true),
232 LastBeginFrameAckFromFrameGenerator());
233 }
234
235 TEST_F(FrameGeneratorTest, BeginFrameWhileInvisible) {
236 EXPECT_EQ(0, NumberOfFramesReceived());
237
238 // A valid SurfaceInfo is required for BeginFrame processing.
239 const cc::SurfaceId kArbitrarySurfaceId(
240 cc::FrameSinkId(1, 1),
241 cc::LocalSurfaceId(1, base::UnguessableToken::Create()));
242 const cc::SurfaceInfo kArbitrarySurfaceInfo(kArbitrarySurfaceId, 1.0f,
243 gfx::Size(100, 100));
244 frame_generator()->OnSurfaceCreated(kArbitrarySurfaceInfo);
245 EXPECT_EQ(0, NumberOfFramesReceived());
246
247 // No frames are produced while invisible but in need of BeginFrames.
248 root_window()->SetVisible(false);
249 IssueBeginFrame();
250 EXPECT_EQ(0, NumberOfFramesReceived());
251 EXPECT_EQ(cc::BeginFrameAck(0, 1, 1, 0, false),
252 LastBeginFrameAckFromFrameGenerator());
253
254 // When visible again, frame is produced.
255 root_window()->SetVisible(true);
256 IssueBeginFrame();
257 EXPECT_EQ(1, NumberOfFramesReceived());
258 cc::BeginFrameAck expected_ack(0, 2, 2, 0, true);
259 EXPECT_EQ(expected_ack, LastBeginFrameAckFromFrameGenerator());
260 EXPECT_EQ(expected_ack, LastMetadata().begin_frame_ack);
220 } 261 }
221 262
222 TEST_F(FrameGeneratorTest, SetDeviceScaleFactor) { 263 TEST_F(FrameGeneratorTest, SetDeviceScaleFactor) {
223 EXPECT_EQ(0, NumberOfFramesReceived()); 264 EXPECT_EQ(0, NumberOfFramesReceived());
224 const cc::SurfaceId kArbitrarySurfaceId( 265 const cc::SurfaceId kArbitrarySurfaceId(
225 cc::FrameSinkId(1, 1), 266 cc::FrameSinkId(1, 1),
226 cc::LocalSurfaceId(1, base::UnguessableToken::Create())); 267 cc::LocalSurfaceId(1, base::UnguessableToken::Create()));
227 const cc::SurfaceInfo kArbitrarySurfaceInfo(kArbitrarySurfaceId, 1.0f, 268 const cc::SurfaceInfo kArbitrarySurfaceInfo(kArbitrarySurfaceId, 1.0f,
228 gfx::Size(100, 100)); 269 gfx::Size(100, 100));
229 constexpr float kDefaultScaleFactor = 1.0f; 270 constexpr float kDefaultScaleFactor = 1.0f;
(...skipping 19 matching lines...) Expand all
249 frame_generator()->SetDeviceScaleFactor(kArbitraryScaleFactor); 290 frame_generator()->SetDeviceScaleFactor(kArbitraryScaleFactor);
250 IssueBeginFrame(); 291 IssueBeginFrame();
251 EXPECT_EQ(2, NumberOfFramesReceived()); 292 EXPECT_EQ(2, NumberOfFramesReceived());
252 const cc::CompositorFrameMetadata& second_last_metadata = LastMetadata(); 293 const cc::CompositorFrameMetadata& second_last_metadata = LastMetadata();
253 EXPECT_EQ(kArbitraryScaleFactor, second_last_metadata.device_scale_factor); 294 EXPECT_EQ(kArbitraryScaleFactor, second_last_metadata.device_scale_factor);
254 } 295 }
255 296
256 } // namespace test 297 } // namespace test
257 } // namespace ws 298 } // namespace ws
258 } // namespace ui 299 } // namespace ui
OLDNEW
« no previous file with comments | « services/ui/ws/frame_generator.cc ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698