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

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

Issue 2763623002: [ui/ws] Acknowledge BeginFrames in FrameGenerator + add tests. (Closed)
Patch Set: address comments 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 68 matching lines...) Expand 10 before | Expand all | Expand 10 after
79 79
80 void OnBeginFrameSourcePausedChanged(bool paused) override {} 80 void OnBeginFrameSourcePausedChanged(bool paused) override {}
81 81
82 // cc::ExternalBeginFrameSourceClient implementation: 82 // cc::ExternalBeginFrameSourceClient implementation:
83 void OnNeedsBeginFrames(bool needs_begin_frames) override { 83 void OnNeedsBeginFrames(bool needs_begin_frames) override {
84 needs_begin_frames_ = needs_begin_frames; 84 needs_begin_frames_ = needs_begin_frames;
85 UpdateNeedsBeginFramesInternal(); 85 UpdateNeedsBeginFramesInternal();
86 } 86 }
87 87
88 void OnDidFinishFrame(const cc::BeginFrameAck& ack) override { 88 void OnDidFinishFrame(const cc::BeginFrameAck& ack) override {
89 external_begin_frame_source_->DidFinishFrame(this, ack); 89 begin_frame_source_->DidFinishFrame(this, ack);
90 } 90 }
91 91
92 void SetBeginFrameSource(cc::BeginFrameSource* source) { 92 void SetBeginFrameSource(cc::BeginFrameSource* source) {
93 if (begin_frame_source_ && observing_begin_frames_) { 93 if (begin_frame_source_ && observing_begin_frames_) {
94 begin_frame_source_->RemoveObserver(this); 94 begin_frame_source_->RemoveObserver(this);
95 observing_begin_frames_ = false; 95 observing_begin_frames_ = false;
96 } 96 }
97 begin_frame_source_ = source; 97 begin_frame_source_ = source;
98 UpdateNeedsBeginFramesInternal(); 98 UpdateNeedsBeginFramesInternal();
99 } 99 }
(...skipping 74 matching lines...) Expand 10 before | Expand all | Expand 10 after
174 FrameGenerator* frame_generator() { return frame_generator_.get(); } 174 FrameGenerator* frame_generator() { return frame_generator_.get(); }
175 175
176 const cc::CompositorFrameMetadata& LastMetadata() const { 176 const cc::CompositorFrameMetadata& LastMetadata() const {
177 return compositor_frame_sink_->last_metadata(); 177 return compositor_frame_sink_->last_metadata();
178 } 178 }
179 179
180 const cc::RenderPassList& LastRenderPassList() const { 180 const cc::RenderPassList& LastRenderPassList() const {
181 return compositor_frame_sink_->last_render_pass_list(); 181 return compositor_frame_sink_->last_render_pass_list();
182 } 182 }
183 183
184 const cc::BeginFrameAck& LastBeginFrameAck() {
185 return begin_frame_source_->LastAckForObserver(compositor_frame_sink_);
186 }
187
188 ServerWindow* root_window() { return root_window_.get(); }
189
184 private: 190 private:
185 FakeCompositorFrameSink* compositor_frame_sink_ = nullptr; 191 FakeCompositorFrameSink* compositor_frame_sink_ = nullptr;
186 std::unique_ptr<cc::FakeExternalBeginFrameSource> begin_frame_source_; 192 std::unique_ptr<cc::FakeExternalBeginFrameSource> begin_frame_source_;
187 std::unique_ptr<TestServerWindowDelegate> server_window_delegate_; 193 std::unique_ptr<TestServerWindowDelegate> server_window_delegate_;
188 std::unique_ptr<ServerWindow> root_window_; 194 std::unique_ptr<ServerWindow> root_window_;
189 std::unique_ptr<FrameGenerator> frame_generator_; 195 std::unique_ptr<FrameGenerator> frame_generator_;
190 int next_sequence_number_ = 1; 196 int next_sequence_number_ = 1;
191 197
192 DISALLOW_COPY_AND_ASSIGN(FrameGeneratorTest); 198 DISALLOW_COPY_AND_ASSIGN(FrameGeneratorTest);
193 }; 199 };
194 200
195 TEST_F(FrameGeneratorTest, OnSurfaceCreated) { 201 TEST_F(FrameGeneratorTest, OnSurfaceCreated) {
196 EXPECT_EQ(0, NumberOfFramesReceived()); 202 EXPECT_EQ(0, NumberOfFramesReceived());
197 203
198 // FrameGenerator does not request BeginFrames upon creation. 204 // FrameGenerator does not request BeginFrames upon creation.
199 IssueBeginFrame(); 205 IssueBeginFrame();
200 EXPECT_EQ(0, NumberOfFramesReceived()); 206 EXPECT_EQ(0, NumberOfFramesReceived());
207 EXPECT_EQ(cc::BeginFrameAck(), LastBeginFrameAck());
201 208
202 const cc::SurfaceId kArbitrarySurfaceId( 209 const cc::SurfaceId kArbitrarySurfaceId(
203 cc::FrameSinkId(1, 1), 210 cc::FrameSinkId(1, 1),
204 cc::LocalSurfaceId(1, base::UnguessableToken::Create())); 211 cc::LocalSurfaceId(1, base::UnguessableToken::Create()));
205 const cc::SurfaceInfo kArbitrarySurfaceInfo(kArbitrarySurfaceId, 1.0f, 212 const cc::SurfaceInfo kArbitrarySurfaceInfo(kArbitrarySurfaceId, 1.0f,
206 gfx::Size(100, 100)); 213 gfx::Size(100, 100));
207 frame_generator()->OnSurfaceCreated(kArbitrarySurfaceInfo); 214 frame_generator()->OnSurfaceCreated(kArbitrarySurfaceInfo);
208 EXPECT_EQ(0, NumberOfFramesReceived()); 215 EXPECT_EQ(0, NumberOfFramesReceived());
209 216
210 IssueBeginFrame(); 217 IssueBeginFrame();
211 EXPECT_EQ(1, NumberOfFramesReceived()); 218 EXPECT_EQ(1, NumberOfFramesReceived());
212 219
213 // Verify that the CompositorFrame refers to the window manager's surface via 220 // Verify that the CompositorFrame refers to the window manager's surface via
214 // referenced_surfaces. 221 // referenced_surfaces.
215 const cc::CompositorFrameMetadata& last_metadata = LastMetadata(); 222 const cc::CompositorFrameMetadata& last_metadata = LastMetadata();
216 const std::vector<cc::SurfaceId>& referenced_surfaces = 223 const std::vector<cc::SurfaceId>& referenced_surfaces =
217 last_metadata.referenced_surfaces; 224 last_metadata.referenced_surfaces;
218 EXPECT_EQ(1lu, referenced_surfaces.size()); 225 EXPECT_EQ(1lu, referenced_surfaces.size());
219 EXPECT_EQ(kArbitrarySurfaceId, referenced_surfaces.front()); 226 EXPECT_EQ(kArbitrarySurfaceId, referenced_surfaces.front());
220 227
228 cc::BeginFrameAck expected_ack(0, 2, 2, 0, true);
229 EXPECT_EQ(expected_ack, LastBeginFrameAck());
230 EXPECT_EQ(expected_ack, last_metadata.begin_frame_ack);
231
221 // FrameGenerator stops requesting BeginFrames after submitting a 232 // FrameGenerator stops requesting BeginFrames after submitting a
222 // CompositorFrame. 233 // CompositorFrame.
223 IssueBeginFrame(); 234 IssueBeginFrame();
224 EXPECT_EQ(1, NumberOfFramesReceived()); 235 EXPECT_EQ(1, NumberOfFramesReceived());
236 EXPECT_EQ(expected_ack, LastBeginFrameAck());
237 }
238
239 TEST_F(FrameGeneratorTest, BeginFrameWhileInvisible) {
240 EXPECT_EQ(0, NumberOfFramesReceived());
241
242 // A valid SurfaceInfo is required for BeginFrame processing.
243 const cc::SurfaceId kArbitrarySurfaceId(
244 cc::FrameSinkId(1, 1),
245 cc::LocalSurfaceId(1, base::UnguessableToken::Create()));
246 const cc::SurfaceInfo kArbitrarySurfaceInfo(kArbitrarySurfaceId, 1.0f,
247 gfx::Size(100, 100));
248 frame_generator()->OnSurfaceCreated(kArbitrarySurfaceInfo);
249 EXPECT_EQ(0, NumberOfFramesReceived());
250
251 // No frames are produced while invisible but in need of BeginFrames.
252 root_window()->SetVisible(false);
253 IssueBeginFrame();
254 EXPECT_EQ(0, NumberOfFramesReceived());
255 EXPECT_EQ(cc::BeginFrameAck(0, 1, 1, 0, false), LastBeginFrameAck());
256
257 // When visible again, a frame is produced.
258 root_window()->SetVisible(true);
259 IssueBeginFrame();
260 EXPECT_EQ(1, NumberOfFramesReceived());
261 cc::BeginFrameAck expected_ack(0, 2, 2, 0, true);
262 EXPECT_EQ(expected_ack, LastBeginFrameAck());
263 EXPECT_EQ(expected_ack, LastMetadata().begin_frame_ack);
225 } 264 }
226 265
227 TEST_F(FrameGeneratorTest, SetDeviceScaleFactor) { 266 TEST_F(FrameGeneratorTest, SetDeviceScaleFactor) {
228 EXPECT_EQ(0, NumberOfFramesReceived()); 267 EXPECT_EQ(0, NumberOfFramesReceived());
229 const cc::SurfaceId kArbitrarySurfaceId( 268 const cc::SurfaceId kArbitrarySurfaceId(
230 cc::FrameSinkId(1, 1), 269 cc::FrameSinkId(1, 1),
231 cc::LocalSurfaceId(1, base::UnguessableToken::Create())); 270 cc::LocalSurfaceId(1, base::UnguessableToken::Create()));
232 const cc::SurfaceInfo kArbitrarySurfaceInfo(kArbitrarySurfaceId, 1.0f, 271 const cc::SurfaceInfo kArbitrarySurfaceInfo(kArbitrarySurfaceId, 1.0f,
233 gfx::Size(100, 100)); 272 gfx::Size(100, 100));
234 constexpr float kDefaultScaleFactor = 1.0f; 273 constexpr float kDefaultScaleFactor = 1.0f;
(...skipping 43 matching lines...) Expand 10 before | Expand all | Expand 10 after
278 // Verify that the last frame has an invert filter. 317 // Verify that the last frame has an invert filter.
279 const cc::RenderPassList& render_pass_list = LastRenderPassList(); 318 const cc::RenderPassList& render_pass_list = LastRenderPassList();
280 const cc::FilterOperations expected_filters( 319 const cc::FilterOperations expected_filters(
281 {cc::FilterOperation::CreateInvertFilter(1.f)}); 320 {cc::FilterOperation::CreateInvertFilter(1.f)});
282 EXPECT_EQ(expected_filters, render_pass_list.front()->filters); 321 EXPECT_EQ(expected_filters, render_pass_list.front()->filters);
283 } 322 }
284 323
285 } // namespace test 324 } // namespace test
286 } // namespace ws 325 } // namespace ws
287 } // namespace ui 326 } // 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