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