OLD | NEW |
1 // Copyright 2015 The Chromium Authors. All rights reserved. | 1 // Copyright 2015 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 "cc/surfaces/direct_compositor_frame_sink.h" | 5 #include "cc/surfaces/direct_compositor_frame_sink.h" |
6 | 6 |
7 #include <memory> | 7 #include <memory> |
8 | 8 |
9 #include "base/memory/ptr_util.h" | 9 #include "base/memory/ptr_util.h" |
10 #include "cc/output/renderer_settings.h" | 10 #include "cc/output/renderer_settings.h" |
(...skipping 12 matching lines...) Expand all Loading... |
23 #include "cc/test/test_context_provider.h" | 23 #include "cc/test/test_context_provider.h" |
24 #include "cc/test/test_gpu_memory_buffer_manager.h" | 24 #include "cc/test/test_gpu_memory_buffer_manager.h" |
25 #include "cc/test/test_shared_bitmap_manager.h" | 25 #include "cc/test/test_shared_bitmap_manager.h" |
26 #include "testing/gtest/include/gtest/gtest.h" | 26 #include "testing/gtest/include/gtest/gtest.h" |
27 | 27 |
28 namespace cc { | 28 namespace cc { |
29 namespace { | 29 namespace { |
30 | 30 |
31 static constexpr FrameSinkId kArbitraryFrameSinkId(1, 1); | 31 static constexpr FrameSinkId kArbitraryFrameSinkId(1, 1); |
32 | 32 |
33 class ObserverTrackingBeginFrameSource : public BackToBackBeginFrameSource { | |
34 public: | |
35 using BackToBackBeginFrameSource::BackToBackBeginFrameSource; | |
36 | |
37 void DidFinishFrame(BeginFrameObserver* obs, | |
38 const BeginFrameAck& ack) override { | |
39 BackToBackBeginFrameSource::DidFinishFrame(obs, ack); | |
40 if (obs == tracked_observer_) | |
41 last_ack_ = ack; | |
42 } | |
43 | |
44 void set_tracked_observer(BeginFrameObserver* obs) { | |
45 tracked_observer_ = obs; | |
46 } | |
47 | |
48 const BeginFrameAck& last_ack() const { return last_ack_; } | |
49 | |
50 private: | |
51 BeginFrameObserver* tracked_observer_ = nullptr; | |
52 BeginFrameAck last_ack_; | |
53 }; | |
54 | |
55 class TestDirectCompositorFrameSink : public DirectCompositorFrameSink { | 33 class TestDirectCompositorFrameSink : public DirectCompositorFrameSink { |
56 public: | 34 public: |
57 using DirectCompositorFrameSink::DirectCompositorFrameSink; | 35 using DirectCompositorFrameSink::DirectCompositorFrameSink; |
58 | 36 |
59 CompositorFrameSinkSupport* support() const { return support_.get(); } | 37 CompositorFrameSinkSupport* support() const { return support_.get(); } |
60 }; | 38 }; |
61 | 39 |
62 class DirectCompositorFrameSinkTest : public testing::Test { | 40 class DirectCompositorFrameSinkTest : public testing::Test { |
63 public: | 41 public: |
64 DirectCompositorFrameSinkTest() | 42 DirectCompositorFrameSinkTest() |
65 : now_src_(new base::SimpleTestTickClock()), | 43 : now_src_(new base::SimpleTestTickClock()), |
66 task_runner_(new OrderedSimpleTaskRunner(now_src_.get(), true)), | 44 task_runner_(new OrderedSimpleTaskRunner(now_src_.get(), true)), |
67 display_size_(1920, 1080), | 45 display_size_(1920, 1080), |
68 display_rect_(display_size_), | 46 display_rect_(display_size_), |
69 context_provider_(TestContextProvider::Create()) { | 47 context_provider_(TestContextProvider::Create()) { |
70 surface_manager_.RegisterFrameSinkId(kArbitraryFrameSinkId); | 48 surface_manager_.RegisterFrameSinkId(kArbitraryFrameSinkId); |
71 | 49 |
72 std::unique_ptr<FakeOutputSurface> display_output_surface = | 50 std::unique_ptr<FakeOutputSurface> display_output_surface = |
73 FakeOutputSurface::Create3d(); | 51 FakeOutputSurface::Create3d(); |
74 display_output_surface_ = display_output_surface.get(); | 52 display_output_surface_ = display_output_surface.get(); |
75 | 53 |
76 begin_frame_source_.reset(new ObserverTrackingBeginFrameSource( | 54 begin_frame_source_.reset(new BackToBackBeginFrameSource( |
77 base::MakeUnique<DelayBasedTimeSource>(task_runner_.get()))); | 55 base::MakeUnique<DelayBasedTimeSource>(task_runner_.get()))); |
78 | 56 |
79 int max_frames_pending = 2; | 57 int max_frames_pending = 2; |
80 std::unique_ptr<DisplayScheduler> scheduler( | 58 std::unique_ptr<DisplayScheduler> scheduler( |
81 new DisplayScheduler(task_runner_.get(), max_frames_pending)); | 59 new DisplayScheduler(task_runner_.get(), max_frames_pending)); |
82 | 60 |
83 display_.reset(new Display( | 61 display_.reset(new Display( |
84 &bitmap_manager_, &gpu_memory_buffer_manager_, RendererSettings(), | 62 &bitmap_manager_, &gpu_memory_buffer_manager_, RendererSettings(), |
85 kArbitraryFrameSinkId, begin_frame_source_.get(), | 63 kArbitraryFrameSinkId, begin_frame_source_.get(), |
86 std::move(display_output_surface), std::move(scheduler), | 64 std::move(display_output_surface), std::move(scheduler), |
87 base::MakeUnique<TextureMailboxDeleter>(task_runner_.get()))); | 65 base::MakeUnique<TextureMailboxDeleter>(task_runner_.get()))); |
88 compositor_frame_sink_.reset(new TestDirectCompositorFrameSink( | 66 compositor_frame_sink_.reset(new TestDirectCompositorFrameSink( |
89 kArbitraryFrameSinkId, &surface_manager_, display_.get(), | 67 kArbitraryFrameSinkId, &surface_manager_, display_.get(), |
90 context_provider_, nullptr, &gpu_memory_buffer_manager_, | 68 context_provider_, nullptr, &gpu_memory_buffer_manager_, |
91 &bitmap_manager_)); | 69 &bitmap_manager_)); |
92 | 70 |
93 compositor_frame_sink_->BindToClient(&compositor_frame_sink_client_); | 71 compositor_frame_sink_->BindToClient(&compositor_frame_sink_client_); |
94 begin_frame_source_->set_tracked_observer( | |
95 compositor_frame_sink_->support()); | |
96 display_->Resize(display_size_); | 72 display_->Resize(display_size_); |
97 display_->SetVisible(true); | 73 display_->SetVisible(true); |
98 | 74 |
99 EXPECT_FALSE( | 75 EXPECT_FALSE( |
100 compositor_frame_sink_client_.did_lose_compositor_frame_sink_called()); | 76 compositor_frame_sink_client_.did_lose_compositor_frame_sink_called()); |
101 } | 77 } |
102 | 78 |
103 ~DirectCompositorFrameSinkTest() override { | 79 ~DirectCompositorFrameSinkTest() override { |
104 compositor_frame_sink_->DetachFromClient(); | 80 compositor_frame_sink_->DetachFromClient(); |
105 } | 81 } |
(...skipping 23 matching lines...) Expand all Loading... |
129 scoped_refptr<OrderedSimpleTaskRunner> task_runner_; | 105 scoped_refptr<OrderedSimpleTaskRunner> task_runner_; |
130 | 106 |
131 const gfx::Size display_size_; | 107 const gfx::Size display_size_; |
132 const gfx::Rect display_rect_; | 108 const gfx::Rect display_rect_; |
133 SurfaceManager surface_manager_; | 109 SurfaceManager surface_manager_; |
134 TestSharedBitmapManager bitmap_manager_; | 110 TestSharedBitmapManager bitmap_manager_; |
135 TestGpuMemoryBufferManager gpu_memory_buffer_manager_; | 111 TestGpuMemoryBufferManager gpu_memory_buffer_manager_; |
136 | 112 |
137 scoped_refptr<TestContextProvider> context_provider_; | 113 scoped_refptr<TestContextProvider> context_provider_; |
138 FakeOutputSurface* display_output_surface_ = nullptr; | 114 FakeOutputSurface* display_output_surface_ = nullptr; |
139 std::unique_ptr<ObserverTrackingBeginFrameSource> begin_frame_source_; | 115 std::unique_ptr<BackToBackBeginFrameSource> begin_frame_source_; |
140 std::unique_ptr<Display> display_; | 116 std::unique_ptr<Display> display_; |
141 FakeCompositorFrameSinkClient compositor_frame_sink_client_; | 117 FakeCompositorFrameSinkClient compositor_frame_sink_client_; |
142 std::unique_ptr<TestDirectCompositorFrameSink> compositor_frame_sink_; | 118 std::unique_ptr<TestDirectCompositorFrameSink> compositor_frame_sink_; |
143 }; | 119 }; |
144 | 120 |
145 TEST_F(DirectCompositorFrameSinkTest, DamageTriggersSwapBuffers) { | 121 TEST_F(DirectCompositorFrameSinkTest, DamageTriggersSwapBuffers) { |
146 SwapBuffersWithDamage(display_rect_); | 122 SwapBuffersWithDamage(display_rect_); |
147 EXPECT_EQ(1u, display_output_surface_->num_sent_frames()); | 123 EXPECT_EQ(1u, display_output_surface_->num_sent_frames()); |
148 task_runner_->RunUntilIdle(); | 124 task_runner_->RunUntilIdle(); |
149 EXPECT_EQ(2u, display_output_surface_->num_sent_frames()); | 125 EXPECT_EQ(2u, display_output_surface_->num_sent_frames()); |
(...skipping 14 matching lines...) Expand all Loading... |
164 EXPECT_EQ(1u, display_output_surface_->num_sent_frames()); | 140 EXPECT_EQ(1u, display_output_surface_->num_sent_frames()); |
165 SwapBuffersWithDamage(display_rect_); | 141 SwapBuffersWithDamage(display_rect_); |
166 task_runner_->RunUntilIdle(); | 142 task_runner_->RunUntilIdle(); |
167 EXPECT_EQ(1u, display_output_surface_->num_sent_frames()); | 143 EXPECT_EQ(1u, display_output_surface_->num_sent_frames()); |
168 display_output_surface_->set_suspended_for_recycle(false); | 144 display_output_surface_->set_suspended_for_recycle(false); |
169 SwapBuffersWithDamage(display_rect_); | 145 SwapBuffersWithDamage(display_rect_); |
170 task_runner_->RunUntilIdle(); | 146 task_runner_->RunUntilIdle(); |
171 EXPECT_EQ(2u, display_output_surface_->num_sent_frames()); | 147 EXPECT_EQ(2u, display_output_surface_->num_sent_frames()); |
172 } | 148 } |
173 | 149 |
174 class TestBeginFrameObserver : public BeginFrameObserverBase { | 150 // TODO(eseckler): Add back tests for BeginFrameAck forwarding through |
175 public: | 151 // DirectCompositorFrameSink and CompositorFrameSinkSupport when we add plumbing |
176 const BeginFrameAck& ack() const { return ack_; } | 152 // of BeginFrameAcks through SurfaceObservers. |
177 | |
178 private: | |
179 bool OnBeginFrameDerivedImpl(const BeginFrameArgs& args) override { | |
180 ack_ = BeginFrameAck(args.source_id, args.sequence_number, | |
181 args.sequence_number, false); | |
182 return true; | |
183 } | |
184 | |
185 void OnBeginFrameSourcePausedChanged(bool paused) override{}; | |
186 | |
187 BeginFrameAck ack_; | |
188 }; | |
189 | |
190 TEST_F(DirectCompositorFrameSinkTest, AcknowledgesBeginFramesWithDamage) { | |
191 // Verify that the frame sink acknowledged the BeginFrame attached to | |
192 // CompositorFrame submitted during SetUp(). | |
193 EXPECT_EQ(BeginFrameAck(0, 1, 1, true), begin_frame_source_->last_ack()); | |
194 } | |
195 | |
196 TEST_F(DirectCompositorFrameSinkTest, AcknowledgesBeginFramesWithoutDamage) { | |
197 // Request a BeginFrame from the CompositorFrameSinkClient. | |
198 TestBeginFrameObserver observer; | |
199 compositor_frame_sink_client_.begin_frame_source()->AddObserver(&observer); | |
200 task_runner_->RunUntilIdle(); | |
201 EXPECT_LE(BeginFrameArgs::kStartingFrameNumber, | |
202 observer.ack().sequence_number); | |
203 compositor_frame_sink_client_.begin_frame_source()->DidFinishFrame( | |
204 &observer, observer.ack()); | |
205 compositor_frame_sink_->DidNotProduceFrame(observer.ack()); | |
206 compositor_frame_sink_client_.begin_frame_source()->RemoveObserver(&observer); | |
207 | |
208 // Verify that the frame sink acknowledged the last BeginFrame. | |
209 EXPECT_EQ(observer.ack(), begin_frame_source_->last_ack()); | |
210 } | |
211 | 153 |
212 } // namespace | 154 } // namespace |
213 } // namespace cc | 155 } // namespace cc |
OLD | NEW |