Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(504)

Side by Side Diff: cc/surfaces/direct_compositor_frame_sink_unittest.cc

Issue 2727553004: [cc] Forward BeginFrameAcks through DirectCFS and CFSSupport. (Closed)
Patch Set: Created 3 years, 9 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
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"
11 #include "cc/output/texture_mailbox_deleter.h" 11 #include "cc/output/texture_mailbox_deleter.h"
12 #include "cc/scheduler/begin_frame_source.h" 12 #include "cc/scheduler/begin_frame_source.h"
13 #include "cc/scheduler/delay_based_time_source.h" 13 #include "cc/scheduler/delay_based_time_source.h"
14 #include "cc/surfaces/display.h" 14 #include "cc/surfaces/display.h"
15 #include "cc/surfaces/display_scheduler.h" 15 #include "cc/surfaces/display_scheduler.h"
16 #include "cc/surfaces/frame_sink_id.h" 16 #include "cc/surfaces/frame_sink_id.h"
17 #include "cc/surfaces/local_surface_id_allocator.h" 17 #include "cc/surfaces/local_surface_id_allocator.h"
18 #include "cc/surfaces/surface_manager.h" 18 #include "cc/surfaces/surface_manager.h"
19 #include "cc/test/begin_frame_args_test.h"
19 #include "cc/test/fake_compositor_frame_sink_client.h" 20 #include "cc/test/fake_compositor_frame_sink_client.h"
20 #include "cc/test/fake_output_surface.h" 21 #include "cc/test/fake_output_surface.h"
21 #include "cc/test/ordered_simple_task_runner.h" 22 #include "cc/test/ordered_simple_task_runner.h"
22 #include "cc/test/test_context_provider.h" 23 #include "cc/test/test_context_provider.h"
23 #include "cc/test/test_gpu_memory_buffer_manager.h" 24 #include "cc/test/test_gpu_memory_buffer_manager.h"
24 #include "cc/test/test_shared_bitmap_manager.h" 25 #include "cc/test/test_shared_bitmap_manager.h"
25 #include "testing/gtest/include/gtest/gtest.h" 26 #include "testing/gtest/include/gtest/gtest.h"
26 27
27 namespace cc { 28 namespace cc {
28 namespace { 29 namespace {
29 30
30 static constexpr FrameSinkId kArbitraryFrameSinkId(1, 1); 31 static constexpr FrameSinkId kArbitraryFrameSinkId(1, 1);
31 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 {
56 public:
57 using DirectCompositorFrameSink::DirectCompositorFrameSink;
58
59 CompositorFrameSinkSupport* support() const { return support_.get(); }
60 };
61
32 class DirectCompositorFrameSinkTest : public testing::Test { 62 class DirectCompositorFrameSinkTest : public testing::Test {
33 public: 63 public:
34 DirectCompositorFrameSinkTest() 64 DirectCompositorFrameSinkTest()
35 : now_src_(new base::SimpleTestTickClock()), 65 : now_src_(new base::SimpleTestTickClock()),
36 task_runner_(new OrderedSimpleTaskRunner(now_src_.get(), true)), 66 task_runner_(new OrderedSimpleTaskRunner(now_src_.get(), true)),
37 display_size_(1920, 1080), 67 display_size_(1920, 1080),
38 display_rect_(display_size_), 68 display_rect_(display_size_),
39 context_provider_(TestContextProvider::Create()) { 69 context_provider_(TestContextProvider::Create()) {
40 surface_manager_.RegisterFrameSinkId(kArbitraryFrameSinkId); 70 surface_manager_.RegisterFrameSinkId(kArbitraryFrameSinkId);
41 71
42 std::unique_ptr<FakeOutputSurface> display_output_surface = 72 std::unique_ptr<FakeOutputSurface> display_output_surface =
43 FakeOutputSurface::Create3d(); 73 FakeOutputSurface::Create3d();
44 display_output_surface_ = display_output_surface.get(); 74 display_output_surface_ = display_output_surface.get();
45 75
46 begin_frame_source_.reset(new BackToBackBeginFrameSource( 76 begin_frame_source_.reset(new ObserverTrackingBeginFrameSource(
47 base::MakeUnique<DelayBasedTimeSource>(task_runner_.get()))); 77 base::MakeUnique<DelayBasedTimeSource>(task_runner_.get())));
48 78
49 int max_frames_pending = 2; 79 int max_frames_pending = 2;
50 std::unique_ptr<DisplayScheduler> scheduler( 80 std::unique_ptr<DisplayScheduler> scheduler(
51 new DisplayScheduler(task_runner_.get(), max_frames_pending)); 81 new DisplayScheduler(task_runner_.get(), max_frames_pending));
52 82
53 display_.reset(new Display( 83 display_.reset(new Display(
54 &bitmap_manager_, &gpu_memory_buffer_manager_, RendererSettings(), 84 &bitmap_manager_, &gpu_memory_buffer_manager_, RendererSettings(),
55 kArbitraryFrameSinkId, begin_frame_source_.get(), 85 kArbitraryFrameSinkId, begin_frame_source_.get(),
56 std::move(display_output_surface), std::move(scheduler), 86 std::move(display_output_surface), std::move(scheduler),
57 base::MakeUnique<TextureMailboxDeleter>(task_runner_.get()))); 87 base::MakeUnique<TextureMailboxDeleter>(task_runner_.get())));
58 compositor_frame_sink_.reset(new DirectCompositorFrameSink( 88 compositor_frame_sink_.reset(new TestDirectCompositorFrameSink(
59 kArbitraryFrameSinkId, &surface_manager_, display_.get(), 89 kArbitraryFrameSinkId, &surface_manager_, display_.get(),
60 context_provider_, nullptr, &gpu_memory_buffer_manager_, 90 context_provider_, nullptr, &gpu_memory_buffer_manager_,
61 &bitmap_manager_)); 91 &bitmap_manager_));
62 92
63 compositor_frame_sink_->BindToClient(&compositor_frame_sink_client_); 93 compositor_frame_sink_->BindToClient(&compositor_frame_sink_client_);
94 begin_frame_source_->set_tracked_observer(
95 compositor_frame_sink_->support());
64 display_->Resize(display_size_); 96 display_->Resize(display_size_);
65 display_->SetVisible(true); 97 display_->SetVisible(true);
66 98
67 EXPECT_FALSE( 99 EXPECT_FALSE(
68 compositor_frame_sink_client_.did_lose_compositor_frame_sink_called()); 100 compositor_frame_sink_client_.did_lose_compositor_frame_sink_called());
69 } 101 }
70 102
71 ~DirectCompositorFrameSinkTest() override { 103 ~DirectCompositorFrameSinkTest() override {
72 compositor_frame_sink_->DetachFromClient(); 104 compositor_frame_sink_->DetachFromClient();
73 } 105 }
(...skipping 22 matching lines...) Expand all
96 scoped_refptr<OrderedSimpleTaskRunner> task_runner_; 128 scoped_refptr<OrderedSimpleTaskRunner> task_runner_;
97 129
98 const gfx::Size display_size_; 130 const gfx::Size display_size_;
99 const gfx::Rect display_rect_; 131 const gfx::Rect display_rect_;
100 SurfaceManager surface_manager_; 132 SurfaceManager surface_manager_;
101 TestSharedBitmapManager bitmap_manager_; 133 TestSharedBitmapManager bitmap_manager_;
102 TestGpuMemoryBufferManager gpu_memory_buffer_manager_; 134 TestGpuMemoryBufferManager gpu_memory_buffer_manager_;
103 135
104 scoped_refptr<TestContextProvider> context_provider_; 136 scoped_refptr<TestContextProvider> context_provider_;
105 FakeOutputSurface* display_output_surface_ = nullptr; 137 FakeOutputSurface* display_output_surface_ = nullptr;
106 std::unique_ptr<BeginFrameSource> begin_frame_source_; 138 std::unique_ptr<ObserverTrackingBeginFrameSource> begin_frame_source_;
107 std::unique_ptr<Display> display_; 139 std::unique_ptr<Display> display_;
108 FakeCompositorFrameSinkClient compositor_frame_sink_client_; 140 FakeCompositorFrameSinkClient compositor_frame_sink_client_;
109 std::unique_ptr<DirectCompositorFrameSink> compositor_frame_sink_; 141 std::unique_ptr<TestDirectCompositorFrameSink> compositor_frame_sink_;
110 }; 142 };
111 143
112 TEST_F(DirectCompositorFrameSinkTest, DamageTriggersSwapBuffers) { 144 TEST_F(DirectCompositorFrameSinkTest, DamageTriggersSwapBuffers) {
113 SwapBuffersWithDamage(display_rect_); 145 SwapBuffersWithDamage(display_rect_);
114 EXPECT_EQ(1u, display_output_surface_->num_sent_frames()); 146 EXPECT_EQ(1u, display_output_surface_->num_sent_frames());
115 task_runner_->RunUntilIdle(); 147 task_runner_->RunUntilIdle();
116 EXPECT_EQ(2u, display_output_surface_->num_sent_frames()); 148 EXPECT_EQ(2u, display_output_surface_->num_sent_frames());
117 } 149 }
118 150
119 TEST_F(DirectCompositorFrameSinkTest, NoDamageDoesNotTriggerSwapBuffers) { 151 TEST_F(DirectCompositorFrameSinkTest, NoDamageDoesNotTriggerSwapBuffers) {
(...skipping 24 matching lines...) Expand all
144 EXPECT_EQ(1u, display_output_surface_->num_sent_frames()); 176 EXPECT_EQ(1u, display_output_surface_->num_sent_frames());
145 task_runner_->RunPendingTasks(); 177 task_runner_->RunPendingTasks();
146 EXPECT_EQ(1u, display_output_surface_->num_sent_frames()); 178 EXPECT_EQ(1u, display_output_surface_->num_sent_frames());
147 179
148 SwapBuffersWithDamage(gfx::Rect()); 180 SwapBuffersWithDamage(gfx::Rect());
149 EXPECT_EQ(1u, display_output_surface_->num_sent_frames()); 181 EXPECT_EQ(1u, display_output_surface_->num_sent_frames());
150 task_runner_->RunUntilIdle(); 182 task_runner_->RunUntilIdle();
151 EXPECT_EQ(1u, display_output_surface_->num_sent_frames()); 183 EXPECT_EQ(1u, display_output_surface_->num_sent_frames());
152 } 184 }
153 185
186 class TestBeginFrameObserver : public BeginFrameObserverBase {
187 public:
188 explicit TestBeginFrameObserver(BeginFrameSource* source) : source_(source) {}
189
190 void FinishFrame() { source_->DidFinishFrame(this, ack()); }
191
192 const BeginFrameAck& ack() const { return ack_; }
193
194 private:
195 bool OnBeginFrameDerivedImpl(const BeginFrameArgs& args) override {
196 ack_ = BeginFrameAck(args.source_id, args.sequence_number,
197 args.sequence_number, 0, true);
198 return true;
199 }
200
201 void OnBeginFrameSourcePausedChanged(bool paused) override{};
202
203 BeginFrameSource* source_;
204 BeginFrameAck ack_;
205 };
206
207 TEST_F(DirectCompositorFrameSinkTest, AcknowledgesBeginFrames) {
208 // Request a BeginFrame from the CompositorFrameSinkClient.
209 TestBeginFrameObserver observer(begin_frame_source_.get());
210 compositor_frame_sink_client_.begin_frame_source()->AddObserver(&observer);
211 observer.FinishFrame();
212 compositor_frame_sink_client_.begin_frame_source()->RemoveObserver(&observer);
213
214 // Verify that the frame sink acknowledged the last BeginFrame.
215 EXPECT_EQ(observer.ack(), begin_frame_source_->last_ack());
216 }
217
154 } // namespace 218 } // namespace
155 } // namespace cc 219 } // namespace cc
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698