OLD | NEW |
1 // Copyright 2014 The Chromium Authors. All rights reserved. | 1 // Copyright 2014 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 <drm_fourcc.h> | 5 #include <drm_fourcc.h> |
6 | 6 |
7 #include "base/bind.h" | 7 #include "base/bind.h" |
8 #include "testing/gtest/include/gtest/gtest.h" | 8 #include "testing/gtest/include/gtest/gtest.h" |
9 #include "third_party/skia/include/core/SkCanvas.h" | 9 #include "third_party/skia/include/core/SkCanvas.h" |
10 #include "ui/ozone/platform/drm/gpu/crtc_controller.h" | 10 #include "ui/ozone/platform/drm/gpu/crtc_controller.h" |
(...skipping 49 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
60 void SetUp() override; | 60 void SetUp() override; |
61 void TearDown() override; | 61 void TearDown() override; |
62 | 62 |
63 void PageFlipCallback(gfx::SwapResult); | 63 void PageFlipCallback(gfx::SwapResult); |
64 | 64 |
65 protected: | 65 protected: |
66 scoped_ptr<ui::HardwareDisplayController> controller_; | 66 scoped_ptr<ui::HardwareDisplayController> controller_; |
67 scoped_refptr<ui::MockDrmDevice> drm_; | 67 scoped_refptr<ui::MockDrmDevice> drm_; |
68 | 68 |
69 int page_flips_; | 69 int page_flips_; |
| 70 gfx::SwapResult last_swap_result_; |
70 | 71 |
71 private: | 72 private: |
72 DISALLOW_COPY_AND_ASSIGN(HardwareDisplayControllerTest); | 73 DISALLOW_COPY_AND_ASSIGN(HardwareDisplayControllerTest); |
73 }; | 74 }; |
74 | 75 |
75 void HardwareDisplayControllerTest::SetUp() { | 76 void HardwareDisplayControllerTest::SetUp() { |
| 77 page_flips_ = 0; |
| 78 last_swap_result_ = gfx::SwapResult::SWAP_FAILED; |
| 79 |
76 std::vector<uint32_t> crtcs; | 80 std::vector<uint32_t> crtcs; |
77 crtcs.push_back(kPrimaryCrtc); | 81 crtcs.push_back(kPrimaryCrtc); |
78 crtcs.push_back(kSecondaryCrtc); | 82 crtcs.push_back(kSecondaryCrtc); |
79 drm_ = new ui::MockDrmDevice(false, crtcs, kPlanesPerCrtc); | 83 drm_ = new ui::MockDrmDevice(false, crtcs, kPlanesPerCrtc); |
80 controller_.reset(new ui::HardwareDisplayController( | 84 controller_.reset(new ui::HardwareDisplayController( |
81 scoped_ptr<ui::CrtcController>( | 85 scoped_ptr<ui::CrtcController>( |
82 new ui::CrtcController(drm_.get(), kPrimaryCrtc, kPrimaryConnector)), | 86 new ui::CrtcController(drm_.get(), kPrimaryCrtc, kPrimaryConnector)), |
83 gfx::Point())); | 87 gfx::Point())); |
84 } | 88 } |
85 | 89 |
86 void HardwareDisplayControllerTest::TearDown() { | 90 void HardwareDisplayControllerTest::TearDown() { |
87 controller_.reset(); | 91 controller_.reset(); |
88 drm_ = nullptr; | 92 drm_ = nullptr; |
89 } | 93 } |
90 | 94 |
91 void HardwareDisplayControllerTest::PageFlipCallback(gfx::SwapResult) { | 95 void HardwareDisplayControllerTest::PageFlipCallback(gfx::SwapResult result) { |
92 page_flips_++; | 96 page_flips_++; |
| 97 last_swap_result_ = result; |
93 } | 98 } |
94 | 99 |
95 TEST_F(HardwareDisplayControllerTest, CheckModesettingResult) { | 100 TEST_F(HardwareDisplayControllerTest, CheckModesettingResult) { |
96 ui::OverlayPlane plane(scoped_refptr<ui::ScanoutBuffer>( | 101 ui::OverlayPlane plane(scoped_refptr<ui::ScanoutBuffer>( |
97 new MockScanoutBuffer(kDefaultModeSize))); | 102 new MockScanoutBuffer(kDefaultModeSize))); |
98 | 103 |
99 EXPECT_TRUE(controller_->Modeset(plane, kDefaultMode)); | 104 EXPECT_TRUE(controller_->Modeset(plane, kDefaultMode)); |
100 EXPECT_FALSE(plane.buffer->HasOneRef()); | 105 EXPECT_FALSE(plane.buffer->HasOneRef()); |
101 } | 106 } |
102 | 107 |
103 TEST_F(HardwareDisplayControllerTest, CheckStateAfterPageFlip) { | 108 TEST_F(HardwareDisplayControllerTest, CheckStateAfterPageFlip) { |
104 ui::OverlayPlane plane1(scoped_refptr<ui::ScanoutBuffer>( | 109 ui::OverlayPlane plane1(scoped_refptr<ui::ScanoutBuffer>( |
105 new MockScanoutBuffer(kDefaultModeSize))); | 110 new MockScanoutBuffer(kDefaultModeSize))); |
106 | 111 |
107 EXPECT_TRUE(controller_->Modeset(plane1, kDefaultMode)); | 112 EXPECT_TRUE(controller_->Modeset(plane1, kDefaultMode)); |
108 | 113 |
109 ui::OverlayPlane plane2(scoped_refptr<ui::ScanoutBuffer>( | 114 ui::OverlayPlane plane2(scoped_refptr<ui::ScanoutBuffer>( |
110 new MockScanoutBuffer(kDefaultModeSize))); | 115 new MockScanoutBuffer(kDefaultModeSize))); |
111 std::vector<ui::OverlayPlane> planes = | 116 std::vector<ui::OverlayPlane> planes = |
112 std::vector<ui::OverlayPlane>(1, plane2); | 117 std::vector<ui::OverlayPlane>(1, plane2); |
113 EXPECT_TRUE(controller_->SchedulePageFlip( | 118 controller_->SchedulePageFlip( |
114 planes, false /* test_only */, | 119 planes, base::Bind(&HardwareDisplayControllerTest::PageFlipCallback, |
115 base::Bind(&HardwareDisplayControllerTest::PageFlipCallback, | 120 base::Unretained(this))); |
116 base::Unretained(this)))); | |
117 drm_->RunCallbacks(); | 121 drm_->RunCallbacks(); |
118 EXPECT_TRUE(plane1.buffer->HasOneRef()); | 122 EXPECT_TRUE(plane1.buffer->HasOneRef()); |
119 EXPECT_FALSE(plane2.buffer->HasOneRef()); | 123 EXPECT_FALSE(plane2.buffer->HasOneRef()); |
120 | 124 |
| 125 EXPECT_EQ(gfx::SwapResult::SWAP_ACK, last_swap_result_); |
| 126 EXPECT_EQ(1, page_flips_); |
121 EXPECT_EQ(1, drm_->get_page_flip_call_count()); | 127 EXPECT_EQ(1, drm_->get_page_flip_call_count()); |
122 EXPECT_EQ(0, drm_->get_overlay_flip_call_count()); | 128 EXPECT_EQ(0, drm_->get_overlay_flip_call_count()); |
123 } | 129 } |
124 | 130 |
125 TEST_F(HardwareDisplayControllerTest, CheckStateIfModesetFails) { | 131 TEST_F(HardwareDisplayControllerTest, CheckStateIfModesetFails) { |
126 drm_->set_set_crtc_expectation(false); | 132 drm_->set_set_crtc_expectation(false); |
127 | 133 |
128 ui::OverlayPlane plane(scoped_refptr<ui::ScanoutBuffer>( | 134 ui::OverlayPlane plane(scoped_refptr<ui::ScanoutBuffer>( |
129 new MockScanoutBuffer(kDefaultModeSize))); | 135 new MockScanoutBuffer(kDefaultModeSize))); |
130 | 136 |
131 EXPECT_FALSE(controller_->Modeset(plane, kDefaultMode)); | 137 EXPECT_FALSE(controller_->Modeset(plane, kDefaultMode)); |
132 } | 138 } |
133 | 139 |
134 TEST_F(HardwareDisplayControllerTest, CheckStateIfPageFlipFails) { | 140 TEST_F(HardwareDisplayControllerTest, CheckStateIfPageFlipFails) { |
135 drm_->set_page_flip_expectation(false); | 141 drm_->set_page_flip_expectation(false); |
136 | 142 |
137 ui::OverlayPlane plane1(scoped_refptr<ui::ScanoutBuffer>( | 143 ui::OverlayPlane plane1(scoped_refptr<ui::ScanoutBuffer>( |
138 new MockScanoutBuffer(kDefaultModeSize))); | 144 new MockScanoutBuffer(kDefaultModeSize))); |
139 | 145 |
140 EXPECT_TRUE(controller_->Modeset(plane1, kDefaultMode)); | 146 EXPECT_TRUE(controller_->Modeset(plane1, kDefaultMode)); |
141 | 147 |
142 ui::OverlayPlane plane2(scoped_refptr<ui::ScanoutBuffer>( | 148 ui::OverlayPlane plane2(scoped_refptr<ui::ScanoutBuffer>( |
143 new MockScanoutBuffer(kDefaultModeSize))); | 149 new MockScanoutBuffer(kDefaultModeSize))); |
144 std::vector<ui::OverlayPlane> planes = | 150 std::vector<ui::OverlayPlane> planes = |
145 std::vector<ui::OverlayPlane>(1, plane2); | 151 std::vector<ui::OverlayPlane>(1, plane2); |
146 EXPECT_FALSE(controller_->SchedulePageFlip( | 152 controller_->SchedulePageFlip( |
147 planes, false /* test_only */, | 153 planes, base::Bind(&HardwareDisplayControllerTest::PageFlipCallback, |
148 base::Bind(&HardwareDisplayControllerTest::PageFlipCallback, | 154 base::Unretained(this))); |
149 base::Unretained(this)))); | |
150 drm_->RunCallbacks(); | 155 drm_->RunCallbacks(); |
151 planes.clear(); | 156 planes.clear(); |
152 | 157 |
| 158 EXPECT_EQ(gfx::SwapResult::SWAP_FAILED, last_swap_result_); |
| 159 EXPECT_EQ(1, page_flips_); |
153 EXPECT_FALSE(plane1.buffer->HasOneRef()); | 160 EXPECT_FALSE(plane1.buffer->HasOneRef()); |
154 EXPECT_TRUE(plane2.buffer->HasOneRef()); | 161 EXPECT_TRUE(plane2.buffer->HasOneRef()); |
155 } | 162 } |
156 | 163 |
157 TEST_F(HardwareDisplayControllerTest, CheckOverlayPresent) { | 164 TEST_F(HardwareDisplayControllerTest, CheckOverlayPresent) { |
158 ui::OverlayPlane plane1(scoped_refptr<ui::ScanoutBuffer>( | 165 ui::OverlayPlane plane1(scoped_refptr<ui::ScanoutBuffer>( |
159 new MockScanoutBuffer(kDefaultModeSize))); | 166 new MockScanoutBuffer(kDefaultModeSize))); |
160 ui::OverlayPlane plane2( | 167 ui::OverlayPlane plane2( |
161 scoped_refptr<ui::ScanoutBuffer>(new MockScanoutBuffer(kDefaultModeSize)), | 168 scoped_refptr<ui::ScanoutBuffer>(new MockScanoutBuffer(kDefaultModeSize)), |
162 1, gfx::OVERLAY_TRANSFORM_NONE, gfx::Rect(kDefaultModeSize), | 169 1, gfx::OVERLAY_TRANSFORM_NONE, gfx::Rect(kDefaultModeSize), |
163 gfx::RectF(kDefaultModeSizeF)); | 170 gfx::RectF(kDefaultModeSizeF)); |
164 | 171 |
165 EXPECT_TRUE(controller_->Modeset(plane1, kDefaultMode)); | 172 EXPECT_TRUE(controller_->Modeset(plane1, kDefaultMode)); |
166 | 173 |
167 std::vector<ui::OverlayPlane> planes; | 174 std::vector<ui::OverlayPlane> planes; |
168 planes.push_back(plane1); | 175 planes.push_back(plane1); |
169 planes.push_back(plane2); | 176 planes.push_back(plane2); |
170 | 177 |
171 EXPECT_TRUE(controller_->SchedulePageFlip( | 178 controller_->SchedulePageFlip( |
172 planes, false /* test_only */, | 179 planes, base::Bind(&HardwareDisplayControllerTest::PageFlipCallback, |
173 base::Bind(&HardwareDisplayControllerTest::PageFlipCallback, | 180 base::Unretained(this))); |
174 base::Unretained(this)))); | |
175 drm_->RunCallbacks(); | 181 drm_->RunCallbacks(); |
| 182 EXPECT_EQ(gfx::SwapResult::SWAP_ACK, last_swap_result_); |
| 183 EXPECT_EQ(1, page_flips_); |
176 EXPECT_EQ(1, drm_->get_page_flip_call_count()); | 184 EXPECT_EQ(1, drm_->get_page_flip_call_count()); |
177 EXPECT_EQ(1, drm_->get_overlay_flip_call_count()); | 185 EXPECT_EQ(1, drm_->get_overlay_flip_call_count()); |
178 } | 186 } |
179 | 187 |
180 TEST_F(HardwareDisplayControllerTest, CheckOverlayTestMode) { | 188 TEST_F(HardwareDisplayControllerTest, CheckOverlayTestMode) { |
181 ui::OverlayPlane plane1(scoped_refptr<ui::ScanoutBuffer>( | 189 ui::OverlayPlane plane1(scoped_refptr<ui::ScanoutBuffer>( |
182 new MockScanoutBuffer(kDefaultModeSize))); | 190 new MockScanoutBuffer(kDefaultModeSize))); |
183 ui::OverlayPlane plane2( | 191 ui::OverlayPlane plane2( |
184 scoped_refptr<ui::ScanoutBuffer>(new MockScanoutBuffer(kDefaultModeSize)), | 192 scoped_refptr<ui::ScanoutBuffer>(new MockScanoutBuffer(kDefaultModeSize)), |
185 1, gfx::OVERLAY_TRANSFORM_NONE, gfx::Rect(kDefaultModeSize), | 193 1, gfx::OVERLAY_TRANSFORM_NONE, gfx::Rect(kDefaultModeSize), |
186 gfx::RectF(kDefaultModeSizeF)); | 194 gfx::RectF(kDefaultModeSizeF)); |
187 | 195 |
188 EXPECT_TRUE(controller_->Modeset(plane1, kDefaultMode)); | 196 EXPECT_TRUE(controller_->Modeset(plane1, kDefaultMode)); |
189 | 197 |
190 std::vector<ui::OverlayPlane> planes; | 198 std::vector<ui::OverlayPlane> planes; |
191 planes.push_back(plane1); | 199 planes.push_back(plane1); |
192 planes.push_back(plane2); | 200 planes.push_back(plane2); |
193 | 201 |
194 EXPECT_TRUE(controller_->SchedulePageFlip( | 202 controller_->SchedulePageFlip( |
195 planes, false /* test_only */, | 203 planes, base::Bind(&HardwareDisplayControllerTest::PageFlipCallback, |
196 base::Bind(&HardwareDisplayControllerTest::PageFlipCallback, | 204 base::Unretained(this))); |
197 base::Unretained(this)))); | |
198 drm_->RunCallbacks(); | |
199 EXPECT_EQ(1, drm_->get_page_flip_call_count()); | |
200 EXPECT_EQ(1, drm_->get_overlay_flip_call_count()); | |
201 | 205 |
202 // A test call shouldn't cause new flips, but should succeed. | 206 // A test call shouldn't cause new flips, but should succeed. |
203 EXPECT_TRUE(controller_->SchedulePageFlip( | 207 EXPECT_TRUE(controller_->TestPageFlip(planes)); |
204 planes, true, base::Bind(&HardwareDisplayControllerTest::PageFlipCallback, | |
205 base::Unretained(this)))); | |
206 drm_->RunCallbacks(); | 208 drm_->RunCallbacks(); |
| 209 EXPECT_EQ(gfx::SwapResult::SWAP_ACK, last_swap_result_); |
| 210 EXPECT_EQ(1, page_flips_); |
207 EXPECT_EQ(1, drm_->get_page_flip_call_count()); | 211 EXPECT_EQ(1, drm_->get_page_flip_call_count()); |
208 EXPECT_EQ(1, drm_->get_overlay_flip_call_count()); | 212 EXPECT_EQ(1, drm_->get_overlay_flip_call_count()); |
209 | 213 |
210 // Regular flips should continue on normally. | 214 // Regular flips should continue on normally. |
211 EXPECT_TRUE(controller_->SchedulePageFlip( | 215 controller_->SchedulePageFlip( |
212 planes, false /* test_only */, | 216 planes, base::Bind(&HardwareDisplayControllerTest::PageFlipCallback, |
213 base::Bind(&HardwareDisplayControllerTest::PageFlipCallback, | 217 base::Unretained(this))); |
214 base::Unretained(this)))); | |
215 drm_->RunCallbacks(); | 218 drm_->RunCallbacks(); |
| 219 EXPECT_EQ(gfx::SwapResult::SWAP_ACK, last_swap_result_); |
| 220 EXPECT_EQ(2, page_flips_); |
216 EXPECT_EQ(2, drm_->get_page_flip_call_count()); | 221 EXPECT_EQ(2, drm_->get_page_flip_call_count()); |
217 EXPECT_EQ(2, drm_->get_overlay_flip_call_count()); | 222 EXPECT_EQ(2, drm_->get_overlay_flip_call_count()); |
218 } | 223 } |
219 | 224 |
220 TEST_F(HardwareDisplayControllerTest, RejectUnderlays) { | 225 TEST_F(HardwareDisplayControllerTest, RejectUnderlays) { |
221 ui::OverlayPlane plane1(scoped_refptr<ui::ScanoutBuffer>( | 226 ui::OverlayPlane plane1(scoped_refptr<ui::ScanoutBuffer>( |
222 new MockScanoutBuffer(kDefaultModeSize))); | 227 new MockScanoutBuffer(kDefaultModeSize))); |
223 ui::OverlayPlane plane2( | 228 ui::OverlayPlane plane2( |
224 scoped_refptr<ui::ScanoutBuffer>(new MockScanoutBuffer(kDefaultModeSize)), | 229 scoped_refptr<ui::ScanoutBuffer>(new MockScanoutBuffer(kDefaultModeSize)), |
225 -1, gfx::OVERLAY_TRANSFORM_NONE, gfx::Rect(kDefaultModeSize), | 230 -1, gfx::OVERLAY_TRANSFORM_NONE, gfx::Rect(kDefaultModeSize), |
226 gfx::RectF(kDefaultModeSizeF)); | 231 gfx::RectF(kDefaultModeSizeF)); |
227 | 232 |
228 EXPECT_TRUE(controller_->Modeset(plane1, kDefaultMode)); | 233 EXPECT_TRUE(controller_->Modeset(plane1, kDefaultMode)); |
229 | 234 |
230 std::vector<ui::OverlayPlane> planes; | 235 std::vector<ui::OverlayPlane> planes; |
231 planes.push_back(plane1); | 236 planes.push_back(plane1); |
232 planes.push_back(plane2); | 237 planes.push_back(plane2); |
233 | 238 |
234 EXPECT_FALSE(controller_->SchedulePageFlip( | 239 controller_->SchedulePageFlip( |
235 planes, false /* test_only */, | 240 planes, base::Bind(&HardwareDisplayControllerTest::PageFlipCallback, |
236 base::Bind(&HardwareDisplayControllerTest::PageFlipCallback, | 241 base::Unretained(this))); |
237 base::Unretained(this)))); | 242 EXPECT_EQ(gfx::SwapResult::SWAP_FAILED, last_swap_result_); |
| 243 EXPECT_EQ(1, page_flips_); |
238 } | 244 } |
239 | 245 |
240 TEST_F(HardwareDisplayControllerTest, PageflipMirroredControllers) { | 246 TEST_F(HardwareDisplayControllerTest, PageflipMirroredControllers) { |
241 controller_->AddCrtc(scoped_ptr<ui::CrtcController>( | 247 controller_->AddCrtc(scoped_ptr<ui::CrtcController>( |
242 new ui::CrtcController(drm_.get(), kSecondaryCrtc, kSecondaryConnector))); | 248 new ui::CrtcController(drm_.get(), kSecondaryCrtc, kSecondaryConnector))); |
243 | 249 |
244 ui::OverlayPlane plane1(scoped_refptr<ui::ScanoutBuffer>( | 250 ui::OverlayPlane plane1(scoped_refptr<ui::ScanoutBuffer>( |
245 new MockScanoutBuffer(kDefaultModeSize))); | 251 new MockScanoutBuffer(kDefaultModeSize))); |
246 EXPECT_TRUE(controller_->Modeset(plane1, kDefaultMode)); | 252 EXPECT_TRUE(controller_->Modeset(plane1, kDefaultMode)); |
247 EXPECT_EQ(2, drm_->get_set_crtc_call_count()); | 253 EXPECT_EQ(2, drm_->get_set_crtc_call_count()); |
248 | 254 |
249 ui::OverlayPlane plane2(scoped_refptr<ui::ScanoutBuffer>( | 255 ui::OverlayPlane plane2(scoped_refptr<ui::ScanoutBuffer>( |
250 new MockScanoutBuffer(kDefaultModeSize))); | 256 new MockScanoutBuffer(kDefaultModeSize))); |
251 std::vector<ui::OverlayPlane> planes = | 257 std::vector<ui::OverlayPlane> planes = |
252 std::vector<ui::OverlayPlane>(1, plane2); | 258 std::vector<ui::OverlayPlane>(1, plane2); |
253 EXPECT_TRUE(controller_->SchedulePageFlip( | 259 controller_->SchedulePageFlip( |
254 planes, false /* test_only */, | 260 planes, base::Bind(&HardwareDisplayControllerTest::PageFlipCallback, |
255 base::Bind(&HardwareDisplayControllerTest::PageFlipCallback, | 261 base::Unretained(this))); |
256 base::Unretained(this)))); | |
257 drm_->RunCallbacks(); | 262 drm_->RunCallbacks(); |
| 263 EXPECT_EQ(gfx::SwapResult::SWAP_ACK, last_swap_result_); |
| 264 EXPECT_EQ(1, page_flips_); |
258 EXPECT_EQ(2, drm_->get_page_flip_call_count()); | 265 EXPECT_EQ(2, drm_->get_page_flip_call_count()); |
259 EXPECT_EQ(1, page_flips_); | 266 EXPECT_EQ(1, page_flips_); |
260 } | 267 } |
261 | 268 |
262 TEST_F(HardwareDisplayControllerTest, PlaneStateAfterRemoveCrtc) { | 269 TEST_F(HardwareDisplayControllerTest, PlaneStateAfterRemoveCrtc) { |
263 ui::OverlayPlane plane1(scoped_refptr<ui::ScanoutBuffer>( | 270 ui::OverlayPlane plane1(scoped_refptr<ui::ScanoutBuffer>( |
264 new MockScanoutBuffer(kDefaultModeSize))); | 271 new MockScanoutBuffer(kDefaultModeSize))); |
265 EXPECT_TRUE(controller_->Modeset(plane1, kDefaultMode)); | 272 EXPECT_TRUE(controller_->Modeset(plane1, kDefaultMode)); |
266 std::vector<ui::OverlayPlane> planes = | 273 std::vector<ui::OverlayPlane> planes = |
267 std::vector<ui::OverlayPlane>(1, plane1); | 274 std::vector<ui::OverlayPlane>(1, plane1); |
268 EXPECT_TRUE(controller_->SchedulePageFlip( | 275 controller_->SchedulePageFlip( |
269 planes, false /* test_only */, | 276 planes, base::Bind(&HardwareDisplayControllerTest::PageFlipCallback, |
270 base::Bind(&HardwareDisplayControllerTest::PageFlipCallback, | 277 base::Unretained(this))); |
271 base::Unretained(this)))); | |
272 drm_->RunCallbacks(); | 278 drm_->RunCallbacks(); |
| 279 EXPECT_EQ(gfx::SwapResult::SWAP_ACK, last_swap_result_); |
| 280 EXPECT_EQ(1, page_flips_); |
273 | 281 |
274 const ui::HardwareDisplayPlane* owned_plane = nullptr; | 282 const ui::HardwareDisplayPlane* owned_plane = nullptr; |
275 for (const auto& plane : drm_->plane_manager()->planes()) | 283 for (const auto& plane : drm_->plane_manager()->planes()) { |
276 if (plane->in_use()) | 284 if (plane->in_use()) |
277 owned_plane = plane; | 285 owned_plane = plane; |
| 286 } |
| 287 |
278 ASSERT_TRUE(owned_plane != nullptr); | 288 ASSERT_TRUE(owned_plane != nullptr); |
279 EXPECT_EQ(kPrimaryCrtc, owned_plane->owning_crtc()); | 289 EXPECT_EQ(kPrimaryCrtc, owned_plane->owning_crtc()); |
| 290 |
280 // Removing the crtc should not free the plane or change ownership. | 291 // Removing the crtc should not free the plane or change ownership. |
281 scoped_ptr<ui::CrtcController> crtc = | 292 scoped_ptr<ui::CrtcController> crtc = |
282 controller_->RemoveCrtc(drm_, kPrimaryCrtc); | 293 controller_->RemoveCrtc(drm_, kPrimaryCrtc); |
283 EXPECT_TRUE(owned_plane->in_use()); | 294 EXPECT_TRUE(owned_plane->in_use()); |
284 EXPECT_EQ(kPrimaryCrtc, owned_plane->owning_crtc()); | 295 EXPECT_EQ(kPrimaryCrtc, owned_plane->owning_crtc()); |
285 // Check that controller doesn't effect the state of removed plane in | 296 // Check that controller doesn't affect the state of removed plane in |
286 // subsequent page flip. | 297 // subsequent page flip. |
287 EXPECT_TRUE(controller_->SchedulePageFlip( | 298 controller_->SchedulePageFlip( |
288 planes, false /* test_only */, | 299 planes, base::Bind(&HardwareDisplayControllerTest::PageFlipCallback, |
289 base::Bind(&HardwareDisplayControllerTest::PageFlipCallback, | 300 base::Unretained(this))); |
290 base::Unretained(this)))); | |
291 drm_->RunCallbacks(); | 301 drm_->RunCallbacks(); |
| 302 EXPECT_EQ(gfx::SwapResult::SWAP_ACK, last_swap_result_); |
| 303 EXPECT_EQ(1, page_flips_); |
292 EXPECT_TRUE(owned_plane->in_use()); | 304 EXPECT_TRUE(owned_plane->in_use()); |
293 EXPECT_EQ(kPrimaryCrtc, owned_plane->owning_crtc()); | 305 EXPECT_EQ(kPrimaryCrtc, owned_plane->owning_crtc()); |
294 } | 306 } |
295 | 307 |
296 TEST_F(HardwareDisplayControllerTest, PlaneStateAfterDestroyingCrtc) { | 308 TEST_F(HardwareDisplayControllerTest, PlaneStateAfterDestroyingCrtc) { |
297 ui::OverlayPlane plane1(scoped_refptr<ui::ScanoutBuffer>( | 309 ui::OverlayPlane plane1(scoped_refptr<ui::ScanoutBuffer>( |
298 new MockScanoutBuffer(kDefaultModeSize))); | 310 new MockScanoutBuffer(kDefaultModeSize))); |
299 EXPECT_TRUE(controller_->Modeset(plane1, kDefaultMode)); | 311 EXPECT_TRUE(controller_->Modeset(plane1, kDefaultMode)); |
300 std::vector<ui::OverlayPlane> planes = | 312 std::vector<ui::OverlayPlane> planes = |
301 std::vector<ui::OverlayPlane>(1, plane1); | 313 std::vector<ui::OverlayPlane>(1, plane1); |
302 EXPECT_TRUE(controller_->SchedulePageFlip( | 314 controller_->SchedulePageFlip( |
303 planes, false /* test_only */, | 315 planes, base::Bind(&HardwareDisplayControllerTest::PageFlipCallback, |
304 base::Bind(&HardwareDisplayControllerTest::PageFlipCallback, | 316 base::Unretained(this))); |
305 base::Unretained(this)))); | |
306 drm_->RunCallbacks(); | 317 drm_->RunCallbacks(); |
| 318 EXPECT_EQ(gfx::SwapResult::SWAP_ACK, last_swap_result_); |
| 319 EXPECT_EQ(1, page_flips_); |
307 | 320 |
308 const ui::HardwareDisplayPlane* owned_plane = nullptr; | 321 const ui::HardwareDisplayPlane* owned_plane = nullptr; |
309 for (const auto& plane : drm_->plane_manager()->planes()) | 322 for (const auto& plane : drm_->plane_manager()->planes()) |
310 if (plane->in_use()) | 323 if (plane->in_use()) |
311 owned_plane = plane; | 324 owned_plane = plane; |
312 ASSERT_TRUE(owned_plane != nullptr); | 325 ASSERT_TRUE(owned_plane != nullptr); |
313 EXPECT_EQ(kPrimaryCrtc, owned_plane->owning_crtc()); | 326 EXPECT_EQ(kPrimaryCrtc, owned_plane->owning_crtc()); |
314 scoped_ptr<ui::CrtcController> crtc = | 327 scoped_ptr<ui::CrtcController> crtc = |
315 controller_->RemoveCrtc(drm_, kPrimaryCrtc); | 328 controller_->RemoveCrtc(drm_, kPrimaryCrtc); |
316 // Destroying crtc should free the plane. | 329 // Destroying crtc should free the plane. |
317 crtc.reset(); | 330 crtc.reset(); |
318 uint32_t crtc_nullid = 0; | 331 uint32_t crtc_nullid = 0; |
319 EXPECT_FALSE(owned_plane->in_use()); | 332 EXPECT_FALSE(owned_plane->in_use()); |
320 EXPECT_EQ(crtc_nullid, owned_plane->owning_crtc()); | 333 EXPECT_EQ(crtc_nullid, owned_plane->owning_crtc()); |
321 } | 334 } |
322 | 335 |
323 TEST_F(HardwareDisplayControllerTest, PlaneStateAfterAddCrtc) { | 336 TEST_F(HardwareDisplayControllerTest, PlaneStateAfterAddCrtc) { |
| 337 controller_->AddCrtc(scoped_ptr<ui::CrtcController>( |
| 338 new ui::CrtcController(drm_.get(), kSecondaryCrtc, kSecondaryConnector))); |
| 339 |
324 ui::OverlayPlane plane1(scoped_refptr<ui::ScanoutBuffer>( | 340 ui::OverlayPlane plane1(scoped_refptr<ui::ScanoutBuffer>( |
325 new MockScanoutBuffer(kDefaultModeSize))); | 341 new MockScanoutBuffer(kDefaultModeSize))); |
326 EXPECT_TRUE(controller_->Modeset(plane1, kDefaultMode)); | 342 EXPECT_TRUE(controller_->Modeset(plane1, kDefaultMode)); |
327 std::vector<ui::OverlayPlane> planes = | 343 std::vector<ui::OverlayPlane> planes = |
328 std::vector<ui::OverlayPlane>(1, plane1); | 344 std::vector<ui::OverlayPlane>(1, plane1); |
329 EXPECT_TRUE(controller_->SchedulePageFlip( | 345 controller_->SchedulePageFlip( |
330 planes, false /* test_only */, | 346 planes, base::Bind(&HardwareDisplayControllerTest::PageFlipCallback, |
331 base::Bind(&HardwareDisplayControllerTest::PageFlipCallback, | 347 base::Unretained(this))); |
332 base::Unretained(this)))); | |
333 drm_->RunCallbacks(); | 348 drm_->RunCallbacks(); |
| 349 EXPECT_EQ(gfx::SwapResult::SWAP_ACK, last_swap_result_); |
| 350 EXPECT_EQ(1, page_flips_); |
334 | 351 |
335 ui::HardwareDisplayPlane* primary_crtc_plane = nullptr; | 352 ui::HardwareDisplayPlane* primary_crtc_plane = nullptr; |
336 for (const auto& plane : drm_->plane_manager()->planes()) { | 353 for (const auto& plane : drm_->plane_manager()->planes()) { |
337 if (plane->in_use() && kPrimaryCrtc == plane->owning_crtc()) | 354 if (plane->in_use() && kPrimaryCrtc == plane->owning_crtc()) |
338 primary_crtc_plane = plane; | 355 primary_crtc_plane = plane; |
339 } | 356 } |
340 | 357 |
341 ASSERT_TRUE(primary_crtc_plane != nullptr); | 358 ASSERT_TRUE(primary_crtc_plane != nullptr); |
342 | 359 |
343 scoped_ptr<ui::HardwareDisplayController> hdc_controller; | 360 scoped_ptr<ui::HardwareDisplayController> hdc_controller; |
344 hdc_controller.reset(new ui::HardwareDisplayController( | 361 hdc_controller.reset(new ui::HardwareDisplayController( |
345 controller_->RemoveCrtc(drm_, kPrimaryCrtc), controller_->origin())); | 362 controller_->RemoveCrtc(drm_, kPrimaryCrtc), controller_->origin())); |
346 EXPECT_TRUE(controller_->SchedulePageFlip( | 363 controller_->SchedulePageFlip( |
347 planes, false /* test_only */, | 364 planes, base::Bind(&HardwareDisplayControllerTest::PageFlipCallback, |
348 base::Bind(&HardwareDisplayControllerTest::PageFlipCallback, | 365 base::Unretained(this))); |
349 base::Unretained(this)))); | |
350 drm_->RunCallbacks(); | 366 drm_->RunCallbacks(); |
| 367 EXPECT_EQ(gfx::SwapResult::SWAP_ACK, last_swap_result_); |
| 368 EXPECT_EQ(2, page_flips_); |
351 EXPECT_TRUE(primary_crtc_plane->in_use()); | 369 EXPECT_TRUE(primary_crtc_plane->in_use()); |
352 EXPECT_EQ(kPrimaryCrtc, primary_crtc_plane->owning_crtc()); | 370 EXPECT_EQ(kPrimaryCrtc, primary_crtc_plane->owning_crtc()); |
353 | 371 |
354 // We reset state of plane here to test that the plane was actually added to | 372 // We reset state of plane here to test that the plane was actually added to |
355 // hdc_controller. In which case, the right state should be set to plane | 373 // hdc_controller. In which case, the right state should be set to plane |
356 // after page flip call is handled by the controller. | 374 // after page flip call is handled by the controller. |
357 primary_crtc_plane->set_in_use(false); | 375 primary_crtc_plane->set_in_use(false); |
358 primary_crtc_plane->set_owning_crtc(0); | 376 primary_crtc_plane->set_owning_crtc(0); |
359 EXPECT_TRUE(hdc_controller->SchedulePageFlip( | 377 hdc_controller->SchedulePageFlip( |
360 planes, false /* test_only */, | 378 planes, base::Bind(&HardwareDisplayControllerTest::PageFlipCallback, |
361 base::Bind(&HardwareDisplayControllerTest::PageFlipCallback, | 379 base::Unretained(this))); |
362 base::Unretained(this)))); | |
363 drm_->RunCallbacks(); | 380 drm_->RunCallbacks(); |
| 381 EXPECT_EQ(gfx::SwapResult::SWAP_ACK, last_swap_result_); |
| 382 EXPECT_EQ(3, page_flips_); |
364 EXPECT_TRUE(primary_crtc_plane->in_use()); | 383 EXPECT_TRUE(primary_crtc_plane->in_use()); |
365 EXPECT_EQ(kPrimaryCrtc, primary_crtc_plane->owning_crtc()); | 384 EXPECT_EQ(kPrimaryCrtc, primary_crtc_plane->owning_crtc()); |
366 } | 385 } |
367 | 386 |
368 TEST_F(HardwareDisplayControllerTest, ModesetWhilePageFlipping) { | 387 TEST_F(HardwareDisplayControllerTest, ModesetWhilePageFlipping) { |
369 ui::OverlayPlane plane1(scoped_refptr<ui::ScanoutBuffer>( | 388 ui::OverlayPlane plane1(scoped_refptr<ui::ScanoutBuffer>( |
370 new MockScanoutBuffer(kDefaultModeSize))); | 389 new MockScanoutBuffer(kDefaultModeSize))); |
371 EXPECT_TRUE(controller_->Modeset(plane1, kDefaultMode)); | 390 EXPECT_TRUE(controller_->Modeset(plane1, kDefaultMode)); |
372 std::vector<ui::OverlayPlane> planes = | 391 std::vector<ui::OverlayPlane> planes = |
373 std::vector<ui::OverlayPlane>(1, plane1); | 392 std::vector<ui::OverlayPlane>(1, plane1); |
374 EXPECT_TRUE(controller_->SchedulePageFlip( | 393 controller_->SchedulePageFlip( |
375 planes, false /* test_only */, | 394 planes, base::Bind(&HardwareDisplayControllerTest::PageFlipCallback, |
376 base::Bind(&HardwareDisplayControllerTest::PageFlipCallback, | 395 base::Unretained(this))); |
377 base::Unretained(this)))); | |
378 | 396 |
379 EXPECT_TRUE(controller_->Modeset(plane1, kDefaultMode)); | 397 EXPECT_TRUE(controller_->Modeset(plane1, kDefaultMode)); |
380 drm_->RunCallbacks(); | 398 drm_->RunCallbacks(); |
| 399 EXPECT_EQ(gfx::SwapResult::SWAP_ACK, last_swap_result_); |
381 EXPECT_EQ(1, page_flips_); | 400 EXPECT_EQ(1, page_flips_); |
382 } | 401 } |
383 | 402 |
384 TEST_F(HardwareDisplayControllerTest, FailPageFlipping) { | 403 TEST_F(HardwareDisplayControllerTest, FailPageFlipping) { |
385 drm_->set_page_flip_expectation(false); | 404 drm_->set_page_flip_expectation(false); |
386 | 405 |
387 ui::OverlayPlane plane1(scoped_refptr<ui::ScanoutBuffer>( | 406 ui::OverlayPlane plane1(scoped_refptr<ui::ScanoutBuffer>( |
388 new MockScanoutBuffer(kDefaultModeSize))); | 407 new MockScanoutBuffer(kDefaultModeSize))); |
389 EXPECT_TRUE(controller_->Modeset(plane1, kDefaultMode)); | 408 EXPECT_TRUE(controller_->Modeset(plane1, kDefaultMode)); |
390 std::vector<ui::OverlayPlane> planes = | 409 std::vector<ui::OverlayPlane> planes = |
391 std::vector<ui::OverlayPlane>(1, plane1); | 410 std::vector<ui::OverlayPlane>(1, plane1); |
392 EXPECT_FALSE(controller_->SchedulePageFlip( | 411 controller_->SchedulePageFlip( |
393 planes, false /* test_only */, | 412 planes, base::Bind(&HardwareDisplayControllerTest::PageFlipCallback, |
394 base::Bind(&HardwareDisplayControllerTest::PageFlipCallback, | 413 base::Unretained(this))); |
395 base::Unretained(this)))); | |
396 | 414 |
397 drm_->RunCallbacks(); | 415 drm_->RunCallbacks(); |
| 416 EXPECT_EQ(gfx::SwapResult::SWAP_FAILED, last_swap_result_); |
398 EXPECT_EQ(1, page_flips_); | 417 EXPECT_EQ(1, page_flips_); |
399 } | 418 } |
400 | 419 |
401 TEST_F(HardwareDisplayControllerTest, FailPageFlippingDueToNoPrimaryPlane) { | 420 TEST_F(HardwareDisplayControllerTest, FailPageFlippingDueToNoPrimaryPlane) { |
402 ui::OverlayPlane plane1( | 421 ui::OverlayPlane plane1( |
403 scoped_refptr<ui::ScanoutBuffer>(new MockScanoutBuffer(kDefaultModeSize)), | 422 scoped_refptr<ui::ScanoutBuffer>(new MockScanoutBuffer(kDefaultModeSize)), |
404 1, gfx::OVERLAY_TRANSFORM_NONE, gfx::Rect(kDefaultModeSize), | 423 1, gfx::OVERLAY_TRANSFORM_NONE, gfx::Rect(kDefaultModeSize), |
405 gfx::RectF(0, 0, 1, 1)); | 424 gfx::RectF(0, 0, 1, 1)); |
406 EXPECT_TRUE(controller_->Modeset(plane1, kDefaultMode)); | 425 EXPECT_TRUE(controller_->Modeset(plane1, kDefaultMode)); |
407 std::vector<ui::OverlayPlane> planes = | 426 std::vector<ui::OverlayPlane> planes = |
408 std::vector<ui::OverlayPlane>(1, plane1); | 427 std::vector<ui::OverlayPlane>(1, plane1); |
409 EXPECT_FALSE(controller_->SchedulePageFlip( | 428 controller_->SchedulePageFlip( |
410 planes, false /* test_only */, | 429 planes, base::Bind(&HardwareDisplayControllerTest::PageFlipCallback, |
411 base::Bind(&HardwareDisplayControllerTest::PageFlipCallback, | 430 base::Unretained(this))); |
412 base::Unretained(this)))); | |
413 | 431 |
414 drm_->RunCallbacks(); | 432 drm_->RunCallbacks(); |
| 433 EXPECT_EQ(gfx::SwapResult::SWAP_FAILED, last_swap_result_); |
415 EXPECT_EQ(1, page_flips_); | 434 EXPECT_EQ(1, page_flips_); |
416 } | 435 } |
417 | 436 |
418 TEST_F(HardwareDisplayControllerTest, AddCrtcMidPageFlip) { | 437 TEST_F(HardwareDisplayControllerTest, AddCrtcMidPageFlip) { |
419 ui::OverlayPlane plane1(scoped_refptr<ui::ScanoutBuffer>( | 438 ui::OverlayPlane plane1(scoped_refptr<ui::ScanoutBuffer>( |
420 new MockScanoutBuffer(kDefaultModeSize))); | 439 new MockScanoutBuffer(kDefaultModeSize))); |
421 EXPECT_TRUE(controller_->Modeset(plane1, kDefaultMode)); | 440 EXPECT_TRUE(controller_->Modeset(plane1, kDefaultMode)); |
422 std::vector<ui::OverlayPlane> planes = | 441 std::vector<ui::OverlayPlane> planes = |
423 std::vector<ui::OverlayPlane>(1, plane1); | 442 std::vector<ui::OverlayPlane>(1, plane1); |
424 EXPECT_TRUE(controller_->SchedulePageFlip( | 443 controller_->SchedulePageFlip( |
425 planes, false /* test_only */, | 444 planes, base::Bind(&HardwareDisplayControllerTest::PageFlipCallback, |
426 base::Bind(&HardwareDisplayControllerTest::PageFlipCallback, | 445 base::Unretained(this))); |
427 base::Unretained(this)))); | |
428 | 446 |
429 controller_->AddCrtc(scoped_ptr<ui::CrtcController>( | 447 controller_->AddCrtc(scoped_ptr<ui::CrtcController>( |
430 new ui::CrtcController(drm_.get(), kSecondaryCrtc, kSecondaryConnector))); | 448 new ui::CrtcController(drm_.get(), kSecondaryCrtc, kSecondaryConnector))); |
431 | 449 |
432 drm_->RunCallbacks(); | 450 drm_->RunCallbacks(); |
| 451 EXPECT_EQ(gfx::SwapResult::SWAP_ACK, last_swap_result_); |
433 EXPECT_EQ(1, page_flips_); | 452 EXPECT_EQ(1, page_flips_); |
434 } | 453 } |
435 | 454 |
436 TEST_F(HardwareDisplayControllerTest, RemoveCrtcMidPageFlip) { | 455 TEST_F(HardwareDisplayControllerTest, RemoveCrtcMidPageFlip) { |
437 ui::OverlayPlane plane1(scoped_refptr<ui::ScanoutBuffer>( | 456 ui::OverlayPlane plane1(scoped_refptr<ui::ScanoutBuffer>( |
438 new MockScanoutBuffer(kDefaultModeSize))); | 457 new MockScanoutBuffer(kDefaultModeSize))); |
439 EXPECT_TRUE(controller_->Modeset(plane1, kDefaultMode)); | 458 EXPECT_TRUE(controller_->Modeset(plane1, kDefaultMode)); |
440 std::vector<ui::OverlayPlane> planes = | 459 std::vector<ui::OverlayPlane> planes = |
441 std::vector<ui::OverlayPlane>(1, plane1); | 460 std::vector<ui::OverlayPlane>(1, plane1); |
442 EXPECT_TRUE(controller_->SchedulePageFlip( | 461 controller_->SchedulePageFlip( |
443 planes, false /* test_only */, | 462 planes, base::Bind(&HardwareDisplayControllerTest::PageFlipCallback, |
444 base::Bind(&HardwareDisplayControllerTest::PageFlipCallback, | 463 base::Unretained(this))); |
445 base::Unretained(this)))); | |
446 | 464 |
447 controller_->RemoveCrtc(drm_, kPrimaryCrtc); | 465 controller_->RemoveCrtc(drm_, kPrimaryCrtc); |
448 | 466 |
449 EXPECT_EQ(1, page_flips_); | 467 EXPECT_EQ(1, page_flips_); |
450 drm_->RunCallbacks(); | 468 drm_->RunCallbacks(); |
| 469 EXPECT_EQ(gfx::SwapResult::SWAP_ACK, last_swap_result_); |
451 EXPECT_EQ(1, page_flips_); | 470 EXPECT_EQ(1, page_flips_); |
452 } | 471 } |
OLD | NEW |