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 |