| 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.h" | 10 #include "cc/test/begin_frame_args_test.h" |
| (...skipping 28 matching lines...) Expand all Loading... |
| 39 explicit TestClientBinding( | 39 explicit TestClientBinding( |
| 40 cc::mojom::MojoCompositorFrameSinkClient* sink_client) | 40 cc::mojom::MojoCompositorFrameSinkClient* sink_client) |
| 41 : sink_client_(sink_client) {} | 41 : sink_client_(sink_client) {} |
| 42 ~TestClientBinding() override = default; | 42 ~TestClientBinding() override = default; |
| 43 | 43 |
| 44 // cc::mojom::MojoCompositorFrameSink implementation: | 44 // cc::mojom::MojoCompositorFrameSink implementation: |
| 45 void SubmitCompositorFrame(const cc::LocalSurfaceId& local_surface_id, | 45 void SubmitCompositorFrame(const cc::LocalSurfaceId& local_surface_id, |
| 46 cc::CompositorFrame frame) override { | 46 cc::CompositorFrame frame) override { |
| 47 ++frames_submitted_; | 47 ++frames_submitted_; |
| 48 last_frame_ = std::move(frame); | 48 last_frame_ = std::move(frame); |
| 49 begin_frame_source_->DidFinishFrame(this, | 49 last_begin_frame_ack_ = last_frame_.metadata.begin_frame_ack; |
| 50 last_frame_.metadata.begin_frame_ack); | 50 } |
| 51 |
| 52 void DidNotProduceFrame(const cc::BeginFrameAck& ack) override { |
| 53 last_begin_frame_ack_ = ack; |
| 51 } | 54 } |
| 52 | 55 |
| 53 void SetNeedsBeginFrame(bool needs_begin_frame) override { | 56 void SetNeedsBeginFrame(bool needs_begin_frame) override { |
| 54 if (needs_begin_frame == observing_begin_frames_) | 57 if (needs_begin_frame == observing_begin_frames_) |
| 55 return; | 58 return; |
| 56 | 59 |
| 57 observing_begin_frames_ = needs_begin_frame; | 60 observing_begin_frames_ = needs_begin_frame; |
| 58 if (needs_begin_frame) { | 61 if (needs_begin_frame) { |
| 59 begin_frame_source_->AddObserver(this); | 62 begin_frame_source_->AddObserver(this); |
| 60 } else | 63 } else |
| 61 begin_frame_source_->RemoveObserver(this); | 64 begin_frame_source_->RemoveObserver(this); |
| 62 } | 65 } |
| 63 | 66 |
| 64 void BeginFrameDidNotSwap(const cc::BeginFrameAck& ack) override { | |
| 65 if (observing_begin_frames_) | |
| 66 begin_frame_source_->DidFinishFrame(this, ack); | |
| 67 } | |
| 68 | |
| 69 void EvictCurrentSurface() override {} | 67 void EvictCurrentSurface() override {} |
| 70 | 68 |
| 71 // cc::BeginFrameObserver implementation. | 69 // cc::BeginFrameObserver implementation. |
| 72 void OnBeginFrame(const cc::BeginFrameArgs& args) override { | 70 void OnBeginFrame(const cc::BeginFrameArgs& args) override { |
| 73 sink_client_->OnBeginFrame(args); | 71 sink_client_->OnBeginFrame(args); |
| 74 last_begin_frame_args_ = args; | 72 last_begin_frame_args_ = args; |
| 75 } | 73 } |
| 76 | 74 |
| 77 const cc::BeginFrameArgs& LastUsedBeginFrameArgs() const override { | 75 const cc::BeginFrameArgs& LastUsedBeginFrameArgs() const override { |
| 78 return last_begin_frame_args_; | 76 return last_begin_frame_args_; |
| 79 } | 77 } |
| 80 | 78 |
| 81 void OnBeginFrameSourcePausedChanged(bool paused) override {} | 79 void OnBeginFrameSourcePausedChanged(bool paused) override {} |
| 82 | 80 |
| 83 void SetBeginFrameSource(cc::BeginFrameSource* begin_frame_source) { | 81 void SetBeginFrameSource(cc::BeginFrameSource* begin_frame_source) { |
| 84 begin_frame_source_ = begin_frame_source; | 82 begin_frame_source_ = begin_frame_source; |
| 85 } | 83 } |
| 86 | 84 |
| 87 const cc::RenderPassList& last_render_pass_list() const { | 85 const cc::RenderPassList& last_render_pass_list() const { |
| 88 return last_frame_.render_pass_list; | 86 return last_frame_.render_pass_list; |
| 89 } | 87 } |
| 90 | 88 |
| 91 const cc::CompositorFrameMetadata& last_metadata() const { | 89 const cc::CompositorFrameMetadata& last_metadata() const { |
| 92 return last_frame_.metadata; | 90 return last_frame_.metadata; |
| 93 } | 91 } |
| 94 | 92 |
| 95 int frames_submitted() const { return frames_submitted_; } | 93 int frames_submitted() const { return frames_submitted_; } |
| 96 | 94 |
| 95 const cc::BeginFrameAck& last_begin_frame_ack() const { |
| 96 return last_begin_frame_ack_; |
| 97 } |
| 98 |
| 97 private: | 99 private: |
| 98 cc::mojom::MojoCompositorFrameSinkClient* sink_client_; | 100 cc::mojom::MojoCompositorFrameSinkClient* sink_client_; |
| 99 cc::BeginFrameArgs last_begin_frame_args_; | 101 cc::BeginFrameArgs last_begin_frame_args_; |
| 100 cc::CompositorFrame last_frame_; | 102 cc::CompositorFrame last_frame_; |
| 101 cc::BeginFrameSource* begin_frame_source_ = nullptr; | 103 cc::BeginFrameSource* begin_frame_source_ = nullptr; |
| 102 bool observing_begin_frames_ = false; | 104 bool observing_begin_frames_ = false; |
| 103 int frames_submitted_ = 0; | 105 int frames_submitted_ = 0; |
| 106 cc::BeginFrameAck last_begin_frame_ack_; |
| 104 }; | 107 }; |
| 105 | 108 |
| 106 class FrameGeneratorTest : public testing::Test { | 109 class FrameGeneratorTest : public testing::Test { |
| 107 public: | 110 public: |
| 108 FrameGeneratorTest() = default; | 111 FrameGeneratorTest() = default; |
| 109 ~FrameGeneratorTest() override = default; | 112 ~FrameGeneratorTest() override = default; |
| 110 | 113 |
| 111 // testing::Test overrides: | 114 // testing::Test overrides: |
| 112 void SetUp() override { | 115 void SetUp() override { |
| 113 testing::Test::SetUp(); | 116 testing::Test::SetUp(); |
| (...skipping 28 matching lines...) Expand all Loading... |
| 142 } | 145 } |
| 143 | 146 |
| 144 void IssueBeginFrame() { | 147 void IssueBeginFrame() { |
| 145 begin_frame_source_->TestOnBeginFrame(cc::CreateBeginFrameArgsForTesting( | 148 begin_frame_source_->TestOnBeginFrame(cc::CreateBeginFrameArgsForTesting( |
| 146 BEGINFRAME_FROM_HERE, 0, next_sequence_number_)); | 149 BEGINFRAME_FROM_HERE, 0, next_sequence_number_)); |
| 147 ++next_sequence_number_; | 150 ++next_sequence_number_; |
| 148 } | 151 } |
| 149 | 152 |
| 150 int NumberOfFramesReceived() const { return binding_->frames_submitted(); } | 153 int NumberOfFramesReceived() const { return binding_->frames_submitted(); } |
| 151 | 154 |
| 152 const cc::BeginFrameAck& LastBeginFrameAck() { | 155 const cc::BeginFrameAck& LastBeginFrameAck() const { |
| 153 return begin_frame_source_->LastAckForObserver(binding_); | 156 return binding_->last_begin_frame_ack(); |
| 154 } | 157 } |
| 155 | 158 |
| 156 const cc::CompositorFrameMetadata& LastMetadata() const { | 159 const cc::CompositorFrameMetadata& LastMetadata() const { |
| 157 return binding_->last_metadata(); | 160 return binding_->last_metadata(); |
| 158 } | 161 } |
| 159 | 162 |
| 160 const cc::RenderPassList& LastRenderPassList() const { | 163 const cc::RenderPassList& LastRenderPassList() const { |
| 161 return binding_->last_render_pass_list(); | 164 return binding_->last_render_pass_list(); |
| 162 } | 165 } |
| 163 | 166 |
| (...skipping 112 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 276 InitWithSurfaceInfo(); | 279 InitWithSurfaceInfo(); |
| 277 | 280 |
| 278 frame_generator()->OnWindowDamaged(); | 281 frame_generator()->OnWindowDamaged(); |
| 279 IssueBeginFrame(); | 282 IssueBeginFrame(); |
| 280 EXPECT_EQ(2, NumberOfFramesReceived()); | 283 EXPECT_EQ(2, NumberOfFramesReceived()); |
| 281 } | 284 } |
| 282 | 285 |
| 283 } // namespace test | 286 } // namespace test |
| 284 } // namespace ws | 287 } // namespace ws |
| 285 } // namespace ui | 288 } // namespace ui |
| OLD | NEW |