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/surface_display_output_surface.h" | 5 #include "cc/surfaces/surface_display_output_surface.h" |
6 | 6 |
7 #include <memory> | 7 #include <memory> |
8 | 8 |
9 #include "cc/surfaces/onscreen_display_client.h" | 9 #include "cc/output/renderer_settings.h" |
| 10 #include "cc/scheduler/begin_frame_source.h" |
| 11 #include "cc/surfaces/display.h" |
10 #include "cc/surfaces/surface_id_allocator.h" | 12 #include "cc/surfaces/surface_id_allocator.h" |
11 #include "cc/surfaces/surface_manager.h" | 13 #include "cc/surfaces/surface_manager.h" |
12 #include "cc/test/fake_output_surface.h" | 14 #include "cc/test/fake_output_surface.h" |
13 #include "cc/test/fake_output_surface_client.h" | 15 #include "cc/test/fake_output_surface_client.h" |
14 #include "cc/test/ordered_simple_task_runner.h" | 16 #include "cc/test/ordered_simple_task_runner.h" |
15 #include "cc/test/test_context_provider.h" | 17 #include "cc/test/test_context_provider.h" |
16 #include "cc/test/test_gpu_memory_buffer_manager.h" | 18 #include "cc/test/test_gpu_memory_buffer_manager.h" |
17 #include "cc/test/test_shared_bitmap_manager.h" | 19 #include "cc/test/test_shared_bitmap_manager.h" |
18 #include "testing/gtest/include/gtest/gtest.h" | 20 #include "testing/gtest/include/gtest/gtest.h" |
19 | 21 |
20 namespace cc { | 22 namespace cc { |
21 namespace { | 23 namespace { |
22 | 24 |
23 class FakeOnscreenDisplayClient : public OnscreenDisplayClient { | |
24 public: | |
25 FakeOnscreenDisplayClient( | |
26 SurfaceManager* manager, | |
27 SharedBitmapManager* bitmap_manager, | |
28 gpu::GpuMemoryBufferManager* gpu_memory_buffer_manager, | |
29 const RendererSettings& settings, | |
30 scoped_refptr<base::SingleThreadTaskRunner> task_runner, | |
31 uint32_t compositor_surface_namespace) | |
32 : OnscreenDisplayClient(FakeOutputSurface::Create3d(), | |
33 manager, | |
34 bitmap_manager, | |
35 gpu_memory_buffer_manager, | |
36 settings, | |
37 task_runner, | |
38 compositor_surface_namespace) { | |
39 // Ownership is passed to another object later, store a pointer | |
40 // to it now for future reference. | |
41 fake_output_surface_ = | |
42 static_cast<FakeOutputSurface*>(output_surface_.get()); | |
43 fake_output_surface_->set_max_frames_pending(2); | |
44 } | |
45 | |
46 FakeOutputSurface* output_surface() { return fake_output_surface_; } | |
47 | |
48 protected: | |
49 FakeOutputSurface* fake_output_surface_; | |
50 }; | |
51 | |
52 class SurfaceDisplayOutputSurfaceTest : public testing::Test { | 25 class SurfaceDisplayOutputSurfaceTest : public testing::Test { |
53 public: | 26 public: |
54 SurfaceDisplayOutputSurfaceTest() | 27 SurfaceDisplayOutputSurfaceTest() |
55 : now_src_(new base::SimpleTestTickClock()), | 28 : now_src_(new base::SimpleTestTickClock()), |
56 task_runner_(new OrderedSimpleTaskRunner(now_src_.get(), true)), | 29 task_runner_(new OrderedSimpleTaskRunner(now_src_.get(), true)), |
| 30 begin_frame_source_(new BackToBackBeginFrameSource(task_runner_.get())), |
57 allocator_(0), | 31 allocator_(0), |
58 display_size_(1920, 1080), | 32 display_size_(1920, 1080), |
59 display_rect_(display_size_), | 33 display_rect_(display_size_), |
60 display_client_(&surface_manager_, | 34 context_provider_(TestContextProvider::Create()) { |
61 &bitmap_manager_, | |
62 &gpu_memory_buffer_manager_, | |
63 renderer_settings_, | |
64 task_runner_, | |
65 allocator_.id_namespace()), | |
66 context_provider_(TestContextProvider::Create()), | |
67 surface_display_output_surface_(&surface_manager_, | |
68 &allocator_, | |
69 context_provider_, | |
70 nullptr) { | |
71 surface_manager_.RegisterSurfaceIdNamespace(allocator_.id_namespace()); | 35 surface_manager_.RegisterSurfaceIdNamespace(allocator_.id_namespace()); |
72 output_surface_ = display_client_.output_surface(); | 36 |
73 display_client_.set_surface_output_surface( | 37 std::unique_ptr<FakeOutputSurface> display_output_surface = |
74 &surface_display_output_surface_); | 38 FakeOutputSurface::Create3d(); |
75 surface_display_output_surface_.set_display_client(&display_client_); | 39 display_output_surface_ = display_output_surface.get(); |
| 40 display_output_surface_->set_max_frames_pending(2); |
| 41 |
| 42 display_.reset(new Display(&surface_manager_, &bitmap_manager_, |
| 43 &gpu_memory_buffer_manager_, renderer_settings_, |
| 44 allocator_.id_namespace(), task_runner_.get(), |
| 45 std::move(display_output_surface))); |
| 46 delegated_output_surface_.reset(new SurfaceDisplayOutputSurface( |
| 47 &surface_manager_, &allocator_, display_.get(), context_provider_, |
| 48 nullptr)); |
76 | 49 |
77 // Set the Display's begin frame source like a real browser compositor | 50 // Set the Display's begin frame source like a real browser compositor |
78 // output surface would. | 51 // output surface would. |
79 begin_frame_source_.reset( | 52 display_->SetBeginFrameSource(begin_frame_source_.get()); |
80 new BackToBackBeginFrameSource(task_runner_.get())); | 53 delegated_output_surface_->BindToClient(&delegated_output_surface_client_); |
81 display_client_.display()->SetBeginFrameSource(begin_frame_source_.get()); | 54 display_->Resize(display_size_); |
82 | 55 |
83 surface_display_output_surface_.BindToClient( | 56 EXPECT_FALSE( |
84 &surface_display_output_surface_client_); | 57 delegated_output_surface_client_.did_lose_output_surface_called()); |
85 | |
86 display_client_.display()->Resize(display_size_); | |
87 | |
88 EXPECT_FALSE(surface_display_output_surface_client_ | |
89 .did_lose_output_surface_called()); | |
90 } | 58 } |
91 | 59 |
92 ~SurfaceDisplayOutputSurfaceTest() override {} | 60 ~SurfaceDisplayOutputSurfaceTest() override {} |
93 | 61 |
94 void SwapBuffersWithDamage(const gfx::Rect& damage_rect_) { | 62 void SwapBuffersWithDamage(const gfx::Rect& damage_rect) { |
95 std::unique_ptr<RenderPass> render_pass(RenderPass::Create()); | 63 std::unique_ptr<RenderPass> render_pass(RenderPass::Create()); |
96 render_pass->SetNew(RenderPassId(1, 1), display_rect_, damage_rect_, | 64 render_pass->SetNew(RenderPassId(1, 1), display_rect_, damage_rect, |
97 gfx::Transform()); | 65 gfx::Transform()); |
98 | 66 |
99 std::unique_ptr<DelegatedFrameData> frame_data(new DelegatedFrameData); | 67 std::unique_ptr<DelegatedFrameData> frame_data(new DelegatedFrameData); |
100 frame_data->render_pass_list.push_back(std::move(render_pass)); | 68 frame_data->render_pass_list.push_back(std::move(render_pass)); |
101 | 69 |
102 CompositorFrame frame; | 70 CompositorFrame frame; |
103 frame.delegated_frame_data = std::move(frame_data); | 71 frame.delegated_frame_data = std::move(frame_data); |
104 | 72 |
105 surface_display_output_surface_.SwapBuffers(&frame); | 73 delegated_output_surface_->SwapBuffers(&frame); |
106 } | 74 } |
107 | 75 |
108 void SetUp() override { | 76 void SetUp() override { |
109 // Draw the first frame to start in an "unlocked" state. | 77 // Draw the first frame to start in an "unlocked" state. |
110 SwapBuffersWithDamage(display_rect_); | 78 SwapBuffersWithDamage(display_rect_); |
111 | 79 |
112 EXPECT_EQ(0u, output_surface_->num_sent_frames()); | 80 EXPECT_EQ(0u, display_output_surface_->num_sent_frames()); |
113 task_runner_->RunUntilIdle(); | 81 task_runner_->RunUntilIdle(); |
114 EXPECT_EQ(1u, output_surface_->num_sent_frames()); | 82 EXPECT_EQ(1u, display_output_surface_->num_sent_frames()); |
115 } | 83 } |
116 | 84 |
117 protected: | 85 protected: |
118 std::unique_ptr<base::SimpleTestTickClock> now_src_; | 86 std::unique_ptr<base::SimpleTestTickClock> now_src_; |
119 scoped_refptr<OrderedSimpleTaskRunner> task_runner_; | 87 scoped_refptr<OrderedSimpleTaskRunner> task_runner_; |
120 std::unique_ptr<BackToBackBeginFrameSource> begin_frame_source_; | 88 std::unique_ptr<BackToBackBeginFrameSource> begin_frame_source_; |
121 SurfaceIdAllocator allocator_; | 89 SurfaceIdAllocator allocator_; |
122 | 90 |
123 const gfx::Size display_size_; | 91 const gfx::Size display_size_; |
124 const gfx::Rect display_rect_; | 92 const gfx::Rect display_rect_; |
125 FakeOutputSurface* output_surface_; | |
126 SurfaceManager surface_manager_; | 93 SurfaceManager surface_manager_; |
127 TestSharedBitmapManager bitmap_manager_; | 94 TestSharedBitmapManager bitmap_manager_; |
128 TestGpuMemoryBufferManager gpu_memory_buffer_manager_; | 95 TestGpuMemoryBufferManager gpu_memory_buffer_manager_; |
129 RendererSettings renderer_settings_; | 96 RendererSettings renderer_settings_; |
130 FakeOnscreenDisplayClient display_client_; | |
131 | 97 |
132 scoped_refptr<TestContextProvider> context_provider_; | 98 scoped_refptr<TestContextProvider> context_provider_; |
133 | 99 FakeOutputSurface* display_output_surface_ = nullptr; |
134 FakeOutputSurfaceClient surface_display_output_surface_client_; | 100 std::unique_ptr<Display> display_; |
135 SurfaceDisplayOutputSurface surface_display_output_surface_; | 101 FakeOutputSurfaceClient delegated_output_surface_client_; |
| 102 std::unique_ptr<SurfaceDisplayOutputSurface> delegated_output_surface_; |
136 }; | 103 }; |
137 | 104 |
138 TEST_F(SurfaceDisplayOutputSurfaceTest, DamageTriggersSwapBuffers) { | 105 TEST_F(SurfaceDisplayOutputSurfaceTest, DamageTriggersSwapBuffers) { |
139 SwapBuffersWithDamage(display_rect_); | 106 SwapBuffersWithDamage(display_rect_); |
140 EXPECT_EQ(1u, output_surface_->num_sent_frames()); | 107 EXPECT_EQ(1u, display_output_surface_->num_sent_frames()); |
141 task_runner_->RunUntilIdle(); | 108 task_runner_->RunUntilIdle(); |
142 EXPECT_EQ(2u, output_surface_->num_sent_frames()); | 109 EXPECT_EQ(2u, display_output_surface_->num_sent_frames()); |
143 } | 110 } |
144 | 111 |
145 TEST_F(SurfaceDisplayOutputSurfaceTest, NoDamageDoesNotTriggerSwapBuffers) { | 112 TEST_F(SurfaceDisplayOutputSurfaceTest, NoDamageDoesNotTriggerSwapBuffers) { |
146 SwapBuffersWithDamage(gfx::Rect()); | 113 SwapBuffersWithDamage(gfx::Rect()); |
147 EXPECT_EQ(1u, output_surface_->num_sent_frames()); | 114 EXPECT_EQ(1u, display_output_surface_->num_sent_frames()); |
148 task_runner_->RunUntilIdle(); | 115 task_runner_->RunUntilIdle(); |
149 EXPECT_EQ(1u, output_surface_->num_sent_frames()); | 116 EXPECT_EQ(1u, display_output_surface_->num_sent_frames()); |
150 } | 117 } |
151 | 118 |
152 TEST_F(SurfaceDisplayOutputSurfaceTest, SuspendedDoesNotTriggerSwapBuffers) { | 119 TEST_F(SurfaceDisplayOutputSurfaceTest, SuspendedDoesNotTriggerSwapBuffers) { |
153 SwapBuffersWithDamage(display_rect_); | 120 SwapBuffersWithDamage(display_rect_); |
154 EXPECT_EQ(1u, output_surface_->num_sent_frames()); | 121 EXPECT_EQ(1u, display_output_surface_->num_sent_frames()); |
155 output_surface_->set_suspended_for_recycle(true); | 122 display_output_surface_->set_suspended_for_recycle(true); |
156 task_runner_->RunUntilIdle(); | 123 task_runner_->RunUntilIdle(); |
157 EXPECT_EQ(1u, output_surface_->num_sent_frames()); | 124 EXPECT_EQ(1u, display_output_surface_->num_sent_frames()); |
158 SwapBuffersWithDamage(display_rect_); | 125 SwapBuffersWithDamage(display_rect_); |
159 task_runner_->RunUntilIdle(); | 126 task_runner_->RunUntilIdle(); |
160 EXPECT_EQ(1u, output_surface_->num_sent_frames()); | 127 EXPECT_EQ(1u, display_output_surface_->num_sent_frames()); |
161 output_surface_->set_suspended_for_recycle(false); | 128 display_output_surface_->set_suspended_for_recycle(false); |
162 SwapBuffersWithDamage(display_rect_); | 129 SwapBuffersWithDamage(display_rect_); |
163 task_runner_->RunUntilIdle(); | 130 task_runner_->RunUntilIdle(); |
164 EXPECT_EQ(2u, output_surface_->num_sent_frames()); | 131 EXPECT_EQ(2u, display_output_surface_->num_sent_frames()); |
165 } | 132 } |
166 | 133 |
167 TEST_F(SurfaceDisplayOutputSurfaceTest, | 134 TEST_F(SurfaceDisplayOutputSurfaceTest, |
168 LockingResourcesDoesNotIndirectlyCauseDamage) { | 135 LockingResourcesDoesNotIndirectlyCauseDamage) { |
169 surface_display_output_surface_.ForceReclaimResources(); | 136 delegated_output_surface_->ForceReclaimResources(); |
170 EXPECT_EQ(1u, output_surface_->num_sent_frames()); | 137 EXPECT_EQ(1u, display_output_surface_->num_sent_frames()); |
171 task_runner_->RunPendingTasks(); | 138 task_runner_->RunPendingTasks(); |
172 EXPECT_EQ(1u, output_surface_->num_sent_frames()); | 139 EXPECT_EQ(1u, display_output_surface_->num_sent_frames()); |
173 | 140 |
174 SwapBuffersWithDamage(gfx::Rect()); | 141 SwapBuffersWithDamage(gfx::Rect()); |
175 EXPECT_EQ(1u, output_surface_->num_sent_frames()); | 142 EXPECT_EQ(1u, display_output_surface_->num_sent_frames()); |
176 task_runner_->RunUntilIdle(); | 143 task_runner_->RunUntilIdle(); |
177 EXPECT_EQ(1u, output_surface_->num_sent_frames()); | 144 EXPECT_EQ(1u, display_output_surface_->num_sent_frames()); |
178 } | 145 } |
179 | 146 |
180 } // namespace | 147 } // namespace |
181 } // namespace cc | 148 } // namespace cc |
OLD | NEW |