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

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

Issue 2763143002: Remove FrameGenerator::root_window_ (Closed)
Patch Set: Addressed 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') | services/ui/ws/platform_display_default.h » ('j') | 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 136 matching lines...) Expand 10 before | Expand all | Expand 10 after
147 std::unique_ptr<FakeCompositorFrameSink> compositor_frame_sink = 147 std::unique_ptr<FakeCompositorFrameSink> compositor_frame_sink =
148 base::MakeUnique<FakeCompositorFrameSink>(); 148 base::MakeUnique<FakeCompositorFrameSink>();
149 compositor_frame_sink_ = compositor_frame_sink.get(); 149 compositor_frame_sink_ = compositor_frame_sink.get();
150 150
151 constexpr float kRefreshRate = 0.f; 151 constexpr float kRefreshRate = 0.f;
152 constexpr bool kTickAutomatically = false; 152 constexpr bool kTickAutomatically = false;
153 begin_frame_source_ = base::MakeUnique<cc::FakeExternalBeginFrameSource>( 153 begin_frame_source_ = base::MakeUnique<cc::FakeExternalBeginFrameSource>(
154 kRefreshRate, kTickAutomatically); 154 kRefreshRate, kTickAutomatically);
155 compositor_frame_sink_->SetBeginFrameSource(begin_frame_source_.get()); 155 compositor_frame_sink_->SetBeginFrameSource(begin_frame_source_.get());
156 server_window_delegate_ = base::MakeUnique<TestServerWindowDelegate>(); 156 server_window_delegate_ = base::MakeUnique<TestServerWindowDelegate>();
157 root_window_ = base::MakeUnique<ServerWindow>(server_window_delegate_.get(), 157 frame_generator_ =
158 WindowId()); 158 base::MakeUnique<FrameGenerator>(std::move(compositor_frame_sink));
159 root_window_->SetVisible(true); 159 frame_generator_->OnWindowSizeChanged(gfx::Size(1, 2));
160 frame_generator_ = base::MakeUnique<FrameGenerator>(
161 root_window_.get(), std::move(compositor_frame_sink));
162 }; 160 };
163 161
162 void InitWithSurfaceInfo() {
163 // FrameGenerator requires a valid SurfaceInfo before generating
164 // CompositorFrames.
165 const cc::SurfaceId kArbitrarySurfaceId(
166 cc::FrameSinkId(1, 1),
167 cc::LocalSurfaceId(1, base::UnguessableToken::Create()));
168 const cc::SurfaceInfo kArbitrarySurfaceInfo(kArbitrarySurfaceId, 1.0f,
169 gfx::Size(100, 100));
170
171 frame_generator()->OnSurfaceCreated(kArbitrarySurfaceInfo);
172 IssueBeginFrame();
173 EXPECT_EQ(1, NumberOfFramesReceived());
174 }
175
164 int NumberOfFramesReceived() { 176 int NumberOfFramesReceived() {
165 return compositor_frame_sink_->number_frames_received(); 177 return compositor_frame_sink_->number_frames_received();
166 } 178 }
167 179
168 void IssueBeginFrame() { 180 void IssueBeginFrame() {
169 begin_frame_source_->TestOnBeginFrame(cc::CreateBeginFrameArgsForTesting( 181 begin_frame_source_->TestOnBeginFrame(cc::CreateBeginFrameArgsForTesting(
170 BEGINFRAME_FROM_HERE, 0, next_sequence_number_)); 182 BEGINFRAME_FROM_HERE, 0, next_sequence_number_));
171 ++next_sequence_number_; 183 ++next_sequence_number_;
172 } 184 }
173 185
174 FrameGenerator* frame_generator() { return frame_generator_.get(); } 186 FrameGenerator* frame_generator() { return frame_generator_.get(); }
175 187
176 const cc::CompositorFrameMetadata& LastMetadata() const { 188 const cc::CompositorFrameMetadata& LastMetadata() const {
177 return compositor_frame_sink_->last_metadata(); 189 return compositor_frame_sink_->last_metadata();
178 } 190 }
179 191
180 const cc::RenderPassList& LastRenderPassList() const { 192 const cc::RenderPassList& LastRenderPassList() const {
181 return compositor_frame_sink_->last_render_pass_list(); 193 return compositor_frame_sink_->last_render_pass_list();
182 } 194 }
183 195
184 const cc::BeginFrameAck& LastBeginFrameAck() { 196 const cc::BeginFrameAck& LastBeginFrameAck() {
185 return begin_frame_source_->LastAckForObserver(compositor_frame_sink_); 197 return begin_frame_source_->LastAckForObserver(compositor_frame_sink_);
186 } 198 }
187 199
188 ServerWindow* root_window() { return root_window_.get(); }
189
190 private: 200 private:
191 FakeCompositorFrameSink* compositor_frame_sink_ = nullptr; 201 FakeCompositorFrameSink* compositor_frame_sink_ = nullptr;
192 std::unique_ptr<cc::FakeExternalBeginFrameSource> begin_frame_source_; 202 std::unique_ptr<cc::FakeExternalBeginFrameSource> begin_frame_source_;
193 std::unique_ptr<TestServerWindowDelegate> server_window_delegate_; 203 std::unique_ptr<TestServerWindowDelegate> server_window_delegate_;
194 std::unique_ptr<ServerWindow> root_window_;
195 std::unique_ptr<FrameGenerator> frame_generator_; 204 std::unique_ptr<FrameGenerator> frame_generator_;
196 int next_sequence_number_ = 1; 205 int next_sequence_number_ = 1;
197 206
198 DISALLOW_COPY_AND_ASSIGN(FrameGeneratorTest); 207 DISALLOW_COPY_AND_ASSIGN(FrameGeneratorTest);
199 }; 208 };
200 209
210 TEST_F(FrameGeneratorTest, InvalidSurfaceInfo) {
211 // After SetUP(), frame_generator() has its |is_window_visible_| set to true
212 // and |bounds_| to an arbitrary non-empty gfx::Rect but not a valid
213 // SurfaceInfo. frame_generator() should not request BeginFrames in this
214 // state.
215 IssueBeginFrame();
216 EXPECT_EQ(0, NumberOfFramesReceived());
217 }
218
201 TEST_F(FrameGeneratorTest, OnSurfaceCreated) { 219 TEST_F(FrameGeneratorTest, OnSurfaceCreated) {
202 EXPECT_EQ(0, NumberOfFramesReceived()); 220 EXPECT_EQ(0, NumberOfFramesReceived());
203 221
204 // FrameGenerator does not request BeginFrames upon creation. 222 // FrameGenerator does not request BeginFrames upon creation.
205 IssueBeginFrame(); 223 IssueBeginFrame();
206 EXPECT_EQ(0, NumberOfFramesReceived()); 224 EXPECT_EQ(0, NumberOfFramesReceived());
207 EXPECT_EQ(cc::BeginFrameAck(), LastBeginFrameAck()); 225 EXPECT_EQ(cc::BeginFrameAck(), LastBeginFrameAck());
208 226
209 const cc::SurfaceId kArbitrarySurfaceId( 227 const cc::SurfaceId kArbitrarySurfaceId(
210 cc::FrameSinkId(1, 1), 228 cc::FrameSinkId(1, 1),
(...skipping 18 matching lines...) Expand all
229 EXPECT_EQ(expected_ack, LastBeginFrameAck()); 247 EXPECT_EQ(expected_ack, LastBeginFrameAck());
230 EXPECT_EQ(expected_ack, last_metadata.begin_frame_ack); 248 EXPECT_EQ(expected_ack, last_metadata.begin_frame_ack);
231 249
232 // FrameGenerator stops requesting BeginFrames after submitting a 250 // FrameGenerator stops requesting BeginFrames after submitting a
233 // CompositorFrame. 251 // CompositorFrame.
234 IssueBeginFrame(); 252 IssueBeginFrame();
235 EXPECT_EQ(1, NumberOfFramesReceived()); 253 EXPECT_EQ(1, NumberOfFramesReceived());
236 EXPECT_EQ(expected_ack, LastBeginFrameAck()); 254 EXPECT_EQ(expected_ack, LastBeginFrameAck());
237 } 255 }
238 256
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);
264 }
265
266 TEST_F(FrameGeneratorTest, SetDeviceScaleFactor) { 257 TEST_F(FrameGeneratorTest, SetDeviceScaleFactor) {
267 EXPECT_EQ(0, NumberOfFramesReceived()); 258 EXPECT_EQ(0, NumberOfFramesReceived());
268 const cc::SurfaceId kArbitrarySurfaceId( 259 const cc::SurfaceId kArbitrarySurfaceId(
269 cc::FrameSinkId(1, 1), 260 cc::FrameSinkId(1, 1),
270 cc::LocalSurfaceId(1, base::UnguessableToken::Create())); 261 cc::LocalSurfaceId(1, base::UnguessableToken::Create()));
271 const cc::SurfaceInfo kArbitrarySurfaceInfo(kArbitrarySurfaceId, 1.0f, 262 const cc::SurfaceInfo kArbitrarySurfaceInfo(kArbitrarySurfaceId, 1.0f,
272 gfx::Size(100, 100)); 263 gfx::Size(100, 100));
273 constexpr float kDefaultScaleFactor = 1.0f; 264 constexpr float kDefaultScaleFactor = 1.0f;
274 constexpr float kArbitraryScaleFactor = 0.5f; 265 constexpr float kArbitraryScaleFactor = 0.5f;
275 266
(...skipping 15 matching lines...) Expand all
291 EXPECT_EQ(kDefaultScaleFactor, last_metadata.device_scale_factor); 282 EXPECT_EQ(kDefaultScaleFactor, last_metadata.device_scale_factor);
292 283
293 frame_generator()->SetDeviceScaleFactor(kArbitraryScaleFactor); 284 frame_generator()->SetDeviceScaleFactor(kArbitraryScaleFactor);
294 IssueBeginFrame(); 285 IssueBeginFrame();
295 EXPECT_EQ(2, NumberOfFramesReceived()); 286 EXPECT_EQ(2, NumberOfFramesReceived());
296 const cc::CompositorFrameMetadata& second_last_metadata = LastMetadata(); 287 const cc::CompositorFrameMetadata& second_last_metadata = LastMetadata();
297 EXPECT_EQ(kArbitraryScaleFactor, second_last_metadata.device_scale_factor); 288 EXPECT_EQ(kArbitraryScaleFactor, second_last_metadata.device_scale_factor);
298 } 289 }
299 290
300 TEST_F(FrameGeneratorTest, SetHighContrastMode) { 291 TEST_F(FrameGeneratorTest, SetHighContrastMode) {
301 // FrameGenerator requires a valid SurfaceInfo before generating 292 InitWithSurfaceInfo();
302 // CompositorFrames.
303 const cc::SurfaceId kArbitrarySurfaceId(
304 cc::FrameSinkId(1, 1),
305 cc::LocalSurfaceId(1, base::UnguessableToken::Create()));
306 const cc::SurfaceInfo kArbitrarySurfaceInfo(kArbitrarySurfaceId, 1.0f,
307 gfx::Size(100, 100));
308 frame_generator()->OnSurfaceCreated(kArbitrarySurfaceInfo);
309 IssueBeginFrame();
310 EXPECT_EQ(1, NumberOfFramesReceived());
311 293
312 // Changing high contrast mode should trigger a BeginFrame. 294 // Changing high contrast mode should trigger a BeginFrame.
313 frame_generator()->SetHighContrastMode(true); 295 frame_generator()->SetHighContrastMode(true);
314 IssueBeginFrame(); 296 IssueBeginFrame();
315 EXPECT_EQ(2, NumberOfFramesReceived()); 297 EXPECT_EQ(2, NumberOfFramesReceived());
316 298
317 // Verify that the last frame has an invert filter. 299 // Verify that the last frame has an invert filter.
318 const cc::RenderPassList& render_pass_list = LastRenderPassList(); 300 const cc::RenderPassList& render_pass_list = LastRenderPassList();
319 const cc::FilterOperations expected_filters( 301 const cc::FilterOperations expected_filters(
320 {cc::FilterOperation::CreateInvertFilter(1.f)}); 302 {cc::FilterOperation::CreateInvertFilter(1.f)});
321 EXPECT_EQ(expected_filters, render_pass_list.front()->filters); 303 EXPECT_EQ(expected_filters, render_pass_list.front()->filters);
322 } 304 }
323 305
306 TEST_F(FrameGeneratorTest, WindowBoundsChanged) {
307 InitWithSurfaceInfo();
308
309 // Window bounds change triggers a BeginFrame.
310 constexpr int expected_render_pass_id = 1;
311 const gfx::Size kArbitrarySize(3, 4);
312 frame_generator()->OnWindowSizeChanged(kArbitrarySize);
313 IssueBeginFrame();
314 EXPECT_EQ(2, NumberOfFramesReceived());
315 cc::RenderPass* received_render_pass = LastRenderPassList().front().get();
316 EXPECT_EQ(expected_render_pass_id, received_render_pass->id);
317 EXPECT_EQ(kArbitrarySize, received_render_pass->output_rect.size());
318 EXPECT_EQ(kArbitrarySize, received_render_pass->damage_rect.size());
319 EXPECT_EQ(gfx::Transform(), received_render_pass->transform_to_root_target);
320 }
321
322 // Change window bounds twice before issuing a BeginFrame. The CompositorFrame
323 // submitted by frame_generator() should only has the second bounds.
324 TEST_F(FrameGeneratorTest, WindowBoundsChangedTwice) {
325 InitWithSurfaceInfo();
326
327 const gfx::Size kArbitrarySize(3, 4);
328 const gfx::Size kAnotherArbitrarySize(5, 6);
329 frame_generator()->OnWindowSizeChanged(kArbitrarySize);
330 frame_generator()->OnWindowSizeChanged(kAnotherArbitrarySize);
331 IssueBeginFrame();
332 EXPECT_EQ(2, NumberOfFramesReceived());
333 cc::RenderPass* received_render_pass = LastRenderPassList().front().get();
334 EXPECT_EQ(kAnotherArbitrarySize, received_render_pass->output_rect.size());
335 EXPECT_EQ(kAnotherArbitrarySize, received_render_pass->damage_rect.size());
336
337 // frame_generator() stops requesting BeginFrames after getting one.
338 IssueBeginFrame();
339 EXPECT_EQ(2, NumberOfFramesReceived());
340 }
341
342 TEST_F(FrameGeneratorTest, WindowDamaged) {
343 InitWithSurfaceInfo();
344
345 frame_generator()->OnWindowDamaged();
346 IssueBeginFrame();
347 EXPECT_EQ(2, NumberOfFramesReceived());
348 }
349
324 } // namespace test 350 } // namespace test
325 } // namespace ws 351 } // namespace ws
326 } // namespace ui 352 } // namespace ui
OLDNEW
« no previous file with comments | « services/ui/ws/frame_generator.cc ('k') | services/ui/ws/platform_display_default.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698