| 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 68 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 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 Loading... |
| 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 Loading... |
| 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 |
| OLD | NEW |