Chromium Code Reviews| OLD | NEW |
|---|---|
| 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 Loading... | |
| 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 Loading... | |
| 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 Loading... | |
| 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 |
| OLD | NEW |