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), |
(...skipping 21 matching lines...) Expand all Loading... |
249 scoped_refptr<ui::ScanoutBuffer>(new MockScanoutBuffer(kDefaultModeSize)), | 254 scoped_refptr<ui::ScanoutBuffer>(new MockScanoutBuffer(kDefaultModeSize)), |
250 -1, gfx::OVERLAY_TRANSFORM_NONE, gfx::Rect(kDefaultModeSize), | 255 -1, gfx::OVERLAY_TRANSFORM_NONE, gfx::Rect(kDefaultModeSize), |
251 gfx::RectF(kDefaultModeSizeF)); | 256 gfx::RectF(kDefaultModeSizeF)); |
252 | 257 |
253 EXPECT_TRUE(controller_->Modeset(plane1, kDefaultMode)); | 258 EXPECT_TRUE(controller_->Modeset(plane1, kDefaultMode)); |
254 | 259 |
255 std::vector<ui::OverlayPlane> planes; | 260 std::vector<ui::OverlayPlane> planes; |
256 planes.push_back(plane1); | 261 planes.push_back(plane1); |
257 planes.push_back(plane2); | 262 planes.push_back(plane2); |
258 | 263 |
259 EXPECT_FALSE(controller_->SchedulePageFlip( | 264 controller_->SchedulePageFlip( |
260 planes, false /* test_only */, | 265 planes, base::Bind(&HardwareDisplayControllerTest::PageFlipCallback, |
261 base::Bind(&HardwareDisplayControllerTest::PageFlipCallback, | 266 base::Unretained(this))); |
262 base::Unretained(this)))); | 267 EXPECT_EQ(gfx::SwapResult::SWAP_FAILED, last_swap_result_); |
| 268 EXPECT_EQ(1, page_flips_); |
263 } | 269 } |
264 | 270 |
265 TEST_F(HardwareDisplayControllerTest, PageflipMirroredControllers) { | 271 TEST_F(HardwareDisplayControllerTest, PageflipMirroredControllers) { |
266 controller_->AddCrtc(scoped_ptr<ui::CrtcController>( | 272 controller_->AddCrtc(scoped_ptr<ui::CrtcController>( |
267 new ui::CrtcController(drm_.get(), kSecondaryCrtc, kSecondaryConnector))); | 273 new ui::CrtcController(drm_.get(), kSecondaryCrtc, kSecondaryConnector))); |
268 | 274 |
269 ui::OverlayPlane plane1(scoped_refptr<ui::ScanoutBuffer>( | 275 ui::OverlayPlane plane1(scoped_refptr<ui::ScanoutBuffer>( |
270 new MockScanoutBuffer(kDefaultModeSize))); | 276 new MockScanoutBuffer(kDefaultModeSize))); |
271 EXPECT_TRUE(controller_->Modeset(plane1, kDefaultMode)); | 277 EXPECT_TRUE(controller_->Modeset(plane1, kDefaultMode)); |
272 EXPECT_EQ(2, drm_->get_set_crtc_call_count()); | 278 EXPECT_EQ(2, drm_->get_set_crtc_call_count()); |
273 | 279 |
274 ui::OverlayPlane plane2(scoped_refptr<ui::ScanoutBuffer>( | 280 ui::OverlayPlane plane2(scoped_refptr<ui::ScanoutBuffer>( |
275 new MockScanoutBuffer(kDefaultModeSize))); | 281 new MockScanoutBuffer(kDefaultModeSize))); |
276 std::vector<ui::OverlayPlane> planes = | 282 std::vector<ui::OverlayPlane> planes = |
277 std::vector<ui::OverlayPlane>(1, plane2); | 283 std::vector<ui::OverlayPlane>(1, plane2); |
278 EXPECT_TRUE(controller_->SchedulePageFlip( | 284 controller_->SchedulePageFlip( |
279 planes, false /* test_only */, | 285 planes, base::Bind(&HardwareDisplayControllerTest::PageFlipCallback, |
280 base::Bind(&HardwareDisplayControllerTest::PageFlipCallback, | 286 base::Unretained(this))); |
281 base::Unretained(this)))); | |
282 drm_->RunCallbacks(); | 287 drm_->RunCallbacks(); |
| 288 EXPECT_EQ(gfx::SwapResult::SWAP_ACK, last_swap_result_); |
| 289 EXPECT_EQ(1, page_flips_); |
283 EXPECT_EQ(2, drm_->get_page_flip_call_count()); | 290 EXPECT_EQ(2, drm_->get_page_flip_call_count()); |
284 EXPECT_EQ(1, page_flips_); | 291 EXPECT_EQ(1, page_flips_); |
285 } | 292 } |
286 | 293 |
287 TEST_F(HardwareDisplayControllerTest, PlaneStateAfterRemoveCrtc) { | 294 TEST_F(HardwareDisplayControllerTest, PlaneStateAfterRemoveCrtc) { |
288 ui::OverlayPlane plane1(scoped_refptr<ui::ScanoutBuffer>( | 295 ui::OverlayPlane plane1(scoped_refptr<ui::ScanoutBuffer>( |
289 new MockScanoutBuffer(kDefaultModeSize))); | 296 new MockScanoutBuffer(kDefaultModeSize))); |
290 EXPECT_TRUE(controller_->Modeset(plane1, kDefaultMode)); | 297 EXPECT_TRUE(controller_->Modeset(plane1, kDefaultMode)); |
291 std::vector<ui::OverlayPlane> planes = | 298 std::vector<ui::OverlayPlane> planes = |
292 std::vector<ui::OverlayPlane>(1, plane1); | 299 std::vector<ui::OverlayPlane>(1, plane1); |
293 EXPECT_TRUE(controller_->SchedulePageFlip( | 300 controller_->SchedulePageFlip( |
294 planes, false /* test_only */, | 301 planes, base::Bind(&HardwareDisplayControllerTest::PageFlipCallback, |
295 base::Bind(&HardwareDisplayControllerTest::PageFlipCallback, | 302 base::Unretained(this))); |
296 base::Unretained(this)))); | |
297 drm_->RunCallbacks(); | 303 drm_->RunCallbacks(); |
| 304 EXPECT_EQ(gfx::SwapResult::SWAP_ACK, last_swap_result_); |
| 305 EXPECT_EQ(1, page_flips_); |
298 | 306 |
299 const ui::HardwareDisplayPlane* owned_plane = nullptr; | 307 const ui::HardwareDisplayPlane* owned_plane = nullptr; |
300 for (const auto& plane : drm_->plane_manager()->planes()) | 308 for (const auto& plane : drm_->plane_manager()->planes()) { |
301 if (plane->in_use()) | 309 if (plane->in_use()) |
302 owned_plane = plane; | 310 owned_plane = plane; |
| 311 } |
| 312 |
303 ASSERT_TRUE(owned_plane != nullptr); | 313 ASSERT_TRUE(owned_plane != nullptr); |
304 EXPECT_EQ(kPrimaryCrtc, owned_plane->owning_crtc()); | 314 EXPECT_EQ(kPrimaryCrtc, owned_plane->owning_crtc()); |
| 315 |
305 // Removing the crtc should not free the plane or change ownership. | 316 // Removing the crtc should not free the plane or change ownership. |
306 scoped_ptr<ui::CrtcController> crtc = | 317 scoped_ptr<ui::CrtcController> crtc = |
307 controller_->RemoveCrtc(drm_, kPrimaryCrtc); | 318 controller_->RemoveCrtc(drm_, kPrimaryCrtc); |
308 EXPECT_TRUE(owned_plane->in_use()); | 319 EXPECT_TRUE(owned_plane->in_use()); |
309 EXPECT_EQ(kPrimaryCrtc, owned_plane->owning_crtc()); | 320 EXPECT_EQ(kPrimaryCrtc, owned_plane->owning_crtc()); |
310 // Check that controller doesn't effect the state of removed plane in | 321 // Check that controller doesn't affect the state of removed plane in |
311 // subsequent page flip. | 322 // subsequent page flip. |
312 EXPECT_TRUE(controller_->SchedulePageFlip( | 323 controller_->SchedulePageFlip( |
313 planes, false /* test_only */, | 324 planes, base::Bind(&HardwareDisplayControllerTest::PageFlipCallback, |
314 base::Bind(&HardwareDisplayControllerTest::PageFlipCallback, | 325 base::Unretained(this))); |
315 base::Unretained(this)))); | |
316 drm_->RunCallbacks(); | 326 drm_->RunCallbacks(); |
| 327 EXPECT_EQ(gfx::SwapResult::SWAP_ACK, last_swap_result_); |
| 328 EXPECT_EQ(1, page_flips_); |
317 EXPECT_TRUE(owned_plane->in_use()); | 329 EXPECT_TRUE(owned_plane->in_use()); |
318 EXPECT_EQ(kPrimaryCrtc, owned_plane->owning_crtc()); | 330 EXPECT_EQ(kPrimaryCrtc, owned_plane->owning_crtc()); |
319 } | 331 } |
320 | 332 |
321 TEST_F(HardwareDisplayControllerTest, PlaneStateAfterDestroyingCrtc) { | 333 TEST_F(HardwareDisplayControllerTest, PlaneStateAfterDestroyingCrtc) { |
322 ui::OverlayPlane plane1(scoped_refptr<ui::ScanoutBuffer>( | 334 ui::OverlayPlane plane1(scoped_refptr<ui::ScanoutBuffer>( |
323 new MockScanoutBuffer(kDefaultModeSize))); | 335 new MockScanoutBuffer(kDefaultModeSize))); |
324 EXPECT_TRUE(controller_->Modeset(plane1, kDefaultMode)); | 336 EXPECT_TRUE(controller_->Modeset(plane1, kDefaultMode)); |
325 std::vector<ui::OverlayPlane> planes = | 337 std::vector<ui::OverlayPlane> planes = |
326 std::vector<ui::OverlayPlane>(1, plane1); | 338 std::vector<ui::OverlayPlane>(1, plane1); |
327 EXPECT_TRUE(controller_->SchedulePageFlip( | 339 controller_->SchedulePageFlip( |
328 planes, false /* test_only */, | 340 planes, base::Bind(&HardwareDisplayControllerTest::PageFlipCallback, |
329 base::Bind(&HardwareDisplayControllerTest::PageFlipCallback, | 341 base::Unretained(this))); |
330 base::Unretained(this)))); | |
331 drm_->RunCallbacks(); | 342 drm_->RunCallbacks(); |
| 343 EXPECT_EQ(gfx::SwapResult::SWAP_ACK, last_swap_result_); |
| 344 EXPECT_EQ(1, page_flips_); |
332 | 345 |
333 const ui::HardwareDisplayPlane* owned_plane = nullptr; | 346 const ui::HardwareDisplayPlane* owned_plane = nullptr; |
334 for (const auto& plane : drm_->plane_manager()->planes()) | 347 for (const auto& plane : drm_->plane_manager()->planes()) |
335 if (plane->in_use()) | 348 if (plane->in_use()) |
336 owned_plane = plane; | 349 owned_plane = plane; |
337 ASSERT_TRUE(owned_plane != nullptr); | 350 ASSERT_TRUE(owned_plane != nullptr); |
338 EXPECT_EQ(kPrimaryCrtc, owned_plane->owning_crtc()); | 351 EXPECT_EQ(kPrimaryCrtc, owned_plane->owning_crtc()); |
339 scoped_ptr<ui::CrtcController> crtc = | 352 scoped_ptr<ui::CrtcController> crtc = |
340 controller_->RemoveCrtc(drm_, kPrimaryCrtc); | 353 controller_->RemoveCrtc(drm_, kPrimaryCrtc); |
341 // Destroying crtc should free the plane. | 354 // Destroying crtc should free the plane. |
342 crtc.reset(); | 355 crtc.reset(); |
343 uint32_t crtc_nullid = 0; | 356 uint32_t crtc_nullid = 0; |
344 EXPECT_FALSE(owned_plane->in_use()); | 357 EXPECT_FALSE(owned_plane->in_use()); |
345 EXPECT_EQ(crtc_nullid, owned_plane->owning_crtc()); | 358 EXPECT_EQ(crtc_nullid, owned_plane->owning_crtc()); |
346 } | 359 } |
347 | 360 |
348 TEST_F(HardwareDisplayControllerTest, PlaneStateAfterAddCrtc) { | 361 TEST_F(HardwareDisplayControllerTest, PlaneStateAfterAddCrtc) { |
| 362 controller_->AddCrtc(scoped_ptr<ui::CrtcController>( |
| 363 new ui::CrtcController(drm_.get(), kSecondaryCrtc, kSecondaryConnector))); |
| 364 |
349 ui::OverlayPlane plane1(scoped_refptr<ui::ScanoutBuffer>( | 365 ui::OverlayPlane plane1(scoped_refptr<ui::ScanoutBuffer>( |
350 new MockScanoutBuffer(kDefaultModeSize))); | 366 new MockScanoutBuffer(kDefaultModeSize))); |
351 EXPECT_TRUE(controller_->Modeset(plane1, kDefaultMode)); | 367 EXPECT_TRUE(controller_->Modeset(plane1, kDefaultMode)); |
352 std::vector<ui::OverlayPlane> planes = | 368 std::vector<ui::OverlayPlane> planes = |
353 std::vector<ui::OverlayPlane>(1, plane1); | 369 std::vector<ui::OverlayPlane>(1, plane1); |
354 EXPECT_TRUE(controller_->SchedulePageFlip( | 370 controller_->SchedulePageFlip( |
355 planes, false /* test_only */, | 371 planes, base::Bind(&HardwareDisplayControllerTest::PageFlipCallback, |
356 base::Bind(&HardwareDisplayControllerTest::PageFlipCallback, | 372 base::Unretained(this))); |
357 base::Unretained(this)))); | |
358 drm_->RunCallbacks(); | 373 drm_->RunCallbacks(); |
| 374 EXPECT_EQ(gfx::SwapResult::SWAP_ACK, last_swap_result_); |
| 375 EXPECT_EQ(1, page_flips_); |
359 | 376 |
360 ui::HardwareDisplayPlane* primary_crtc_plane = nullptr; | 377 ui::HardwareDisplayPlane* primary_crtc_plane = nullptr; |
361 for (const auto& plane : drm_->plane_manager()->planes()) { | 378 for (const auto& plane : drm_->plane_manager()->planes()) { |
362 if (plane->in_use() && kPrimaryCrtc == plane->owning_crtc()) | 379 if (plane->in_use() && kPrimaryCrtc == plane->owning_crtc()) |
363 primary_crtc_plane = plane; | 380 primary_crtc_plane = plane; |
364 } | 381 } |
365 | 382 |
366 ASSERT_TRUE(primary_crtc_plane != nullptr); | 383 ASSERT_TRUE(primary_crtc_plane != nullptr); |
367 | 384 |
368 scoped_ptr<ui::HardwareDisplayController> hdc_controller; | 385 scoped_ptr<ui::HardwareDisplayController> hdc_controller; |
369 hdc_controller.reset(new ui::HardwareDisplayController( | 386 hdc_controller.reset(new ui::HardwareDisplayController( |
370 controller_->RemoveCrtc(drm_, kPrimaryCrtc), controller_->origin())); | 387 controller_->RemoveCrtc(drm_, kPrimaryCrtc), controller_->origin())); |
371 EXPECT_TRUE(controller_->SchedulePageFlip( | 388 controller_->SchedulePageFlip( |
372 planes, false /* test_only */, | 389 planes, base::Bind(&HardwareDisplayControllerTest::PageFlipCallback, |
373 base::Bind(&HardwareDisplayControllerTest::PageFlipCallback, | 390 base::Unretained(this))); |
374 base::Unretained(this)))); | |
375 drm_->RunCallbacks(); | 391 drm_->RunCallbacks(); |
| 392 EXPECT_EQ(gfx::SwapResult::SWAP_ACK, last_swap_result_); |
| 393 EXPECT_EQ(2, page_flips_); |
376 EXPECT_TRUE(primary_crtc_plane->in_use()); | 394 EXPECT_TRUE(primary_crtc_plane->in_use()); |
377 EXPECT_EQ(kPrimaryCrtc, primary_crtc_plane->owning_crtc()); | 395 EXPECT_EQ(kPrimaryCrtc, primary_crtc_plane->owning_crtc()); |
378 | 396 |
379 // We reset state of plane here to test that the plane was actually added to | 397 // 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 | 398 // hdc_controller. In which case, the right state should be set to plane |
381 // after page flip call is handled by the controller. | 399 // after page flip call is handled by the controller. |
382 primary_crtc_plane->set_in_use(false); | 400 primary_crtc_plane->set_in_use(false); |
383 primary_crtc_plane->set_owning_crtc(0); | 401 primary_crtc_plane->set_owning_crtc(0); |
384 EXPECT_TRUE(hdc_controller->SchedulePageFlip( | 402 hdc_controller->SchedulePageFlip( |
385 planes, false /* test_only */, | 403 planes, base::Bind(&HardwareDisplayControllerTest::PageFlipCallback, |
386 base::Bind(&HardwareDisplayControllerTest::PageFlipCallback, | 404 base::Unretained(this))); |
387 base::Unretained(this)))); | |
388 drm_->RunCallbacks(); | 405 drm_->RunCallbacks(); |
| 406 EXPECT_EQ(gfx::SwapResult::SWAP_ACK, last_swap_result_); |
| 407 EXPECT_EQ(3, page_flips_); |
389 EXPECT_TRUE(primary_crtc_plane->in_use()); | 408 EXPECT_TRUE(primary_crtc_plane->in_use()); |
390 EXPECT_EQ(kPrimaryCrtc, primary_crtc_plane->owning_crtc()); | 409 EXPECT_EQ(kPrimaryCrtc, primary_crtc_plane->owning_crtc()); |
391 } | 410 } |
392 | 411 |
393 TEST_F(HardwareDisplayControllerTest, ModesetWhilePageFlipping) { | 412 TEST_F(HardwareDisplayControllerTest, ModesetWhilePageFlipping) { |
394 ui::OverlayPlane plane1(scoped_refptr<ui::ScanoutBuffer>( | 413 ui::OverlayPlane plane1(scoped_refptr<ui::ScanoutBuffer>( |
395 new MockScanoutBuffer(kDefaultModeSize))); | 414 new MockScanoutBuffer(kDefaultModeSize))); |
396 EXPECT_TRUE(controller_->Modeset(plane1, kDefaultMode)); | 415 EXPECT_TRUE(controller_->Modeset(plane1, kDefaultMode)); |
397 std::vector<ui::OverlayPlane> planes = | 416 std::vector<ui::OverlayPlane> planes = |
398 std::vector<ui::OverlayPlane>(1, plane1); | 417 std::vector<ui::OverlayPlane>(1, plane1); |
399 EXPECT_TRUE(controller_->SchedulePageFlip( | 418 controller_->SchedulePageFlip( |
400 planes, false /* test_only */, | 419 planes, base::Bind(&HardwareDisplayControllerTest::PageFlipCallback, |
401 base::Bind(&HardwareDisplayControllerTest::PageFlipCallback, | 420 base::Unretained(this))); |
402 base::Unretained(this)))); | |
403 | 421 |
404 EXPECT_TRUE(controller_->Modeset(plane1, kDefaultMode)); | 422 EXPECT_TRUE(controller_->Modeset(plane1, kDefaultMode)); |
405 drm_->RunCallbacks(); | 423 drm_->RunCallbacks(); |
| 424 EXPECT_EQ(gfx::SwapResult::SWAP_ACK, last_swap_result_); |
406 EXPECT_EQ(1, page_flips_); | 425 EXPECT_EQ(1, page_flips_); |
407 } | 426 } |
408 | 427 |
409 TEST_F(HardwareDisplayControllerTest, FailPageFlipping) { | 428 TEST_F(HardwareDisplayControllerTest, FailPageFlipping) { |
410 drm_->set_page_flip_expectation(false); | 429 drm_->set_page_flip_expectation(false); |
411 | 430 |
412 ui::OverlayPlane plane1(scoped_refptr<ui::ScanoutBuffer>( | 431 ui::OverlayPlane plane1(scoped_refptr<ui::ScanoutBuffer>( |
413 new MockScanoutBuffer(kDefaultModeSize))); | 432 new MockScanoutBuffer(kDefaultModeSize))); |
414 EXPECT_TRUE(controller_->Modeset(plane1, kDefaultMode)); | 433 EXPECT_TRUE(controller_->Modeset(plane1, kDefaultMode)); |
415 std::vector<ui::OverlayPlane> planes = | 434 std::vector<ui::OverlayPlane> planes = |
416 std::vector<ui::OverlayPlane>(1, plane1); | 435 std::vector<ui::OverlayPlane>(1, plane1); |
417 EXPECT_FALSE(controller_->SchedulePageFlip( | 436 controller_->SchedulePageFlip( |
418 planes, false /* test_only */, | 437 planes, base::Bind(&HardwareDisplayControllerTest::PageFlipCallback, |
419 base::Bind(&HardwareDisplayControllerTest::PageFlipCallback, | 438 base::Unretained(this))); |
420 base::Unretained(this)))); | |
421 | 439 |
422 drm_->RunCallbacks(); | 440 drm_->RunCallbacks(); |
| 441 EXPECT_EQ(gfx::SwapResult::SWAP_FAILED, last_swap_result_); |
423 EXPECT_EQ(1, page_flips_); | 442 EXPECT_EQ(1, page_flips_); |
424 } | 443 } |
425 | 444 |
426 TEST_F(HardwareDisplayControllerTest, FailPageFlippingDueToNoPrimaryPlane) { | 445 TEST_F(HardwareDisplayControllerTest, FailPageFlippingDueToNoPrimaryPlane) { |
427 ui::OverlayPlane plane1( | 446 ui::OverlayPlane plane1( |
428 scoped_refptr<ui::ScanoutBuffer>(new MockScanoutBuffer(kDefaultModeSize)), | 447 scoped_refptr<ui::ScanoutBuffer>(new MockScanoutBuffer(kDefaultModeSize)), |
429 1, gfx::OVERLAY_TRANSFORM_NONE, gfx::Rect(kDefaultModeSize), | 448 1, gfx::OVERLAY_TRANSFORM_NONE, gfx::Rect(kDefaultModeSize), |
430 gfx::RectF(0, 0, 1, 1)); | 449 gfx::RectF(0, 0, 1, 1)); |
431 EXPECT_TRUE(controller_->Modeset(plane1, kDefaultMode)); | 450 EXPECT_TRUE(controller_->Modeset(plane1, kDefaultMode)); |
432 std::vector<ui::OverlayPlane> planes = | 451 std::vector<ui::OverlayPlane> planes = |
433 std::vector<ui::OverlayPlane>(1, plane1); | 452 std::vector<ui::OverlayPlane>(1, plane1); |
434 EXPECT_FALSE(controller_->SchedulePageFlip( | 453 controller_->SchedulePageFlip( |
435 planes, false /* test_only */, | 454 planes, base::Bind(&HardwareDisplayControllerTest::PageFlipCallback, |
436 base::Bind(&HardwareDisplayControllerTest::PageFlipCallback, | 455 base::Unretained(this))); |
437 base::Unretained(this)))); | |
438 | 456 |
439 drm_->RunCallbacks(); | 457 drm_->RunCallbacks(); |
| 458 EXPECT_EQ(gfx::SwapResult::SWAP_FAILED, last_swap_result_); |
440 EXPECT_EQ(1, page_flips_); | 459 EXPECT_EQ(1, page_flips_); |
441 } | 460 } |
442 | 461 |
443 TEST_F(HardwareDisplayControllerTest, AddCrtcMidPageFlip) { | 462 TEST_F(HardwareDisplayControllerTest, AddCrtcMidPageFlip) { |
444 ui::OverlayPlane plane1(scoped_refptr<ui::ScanoutBuffer>( | 463 ui::OverlayPlane plane1(scoped_refptr<ui::ScanoutBuffer>( |
445 new MockScanoutBuffer(kDefaultModeSize))); | 464 new MockScanoutBuffer(kDefaultModeSize))); |
446 EXPECT_TRUE(controller_->Modeset(plane1, kDefaultMode)); | 465 EXPECT_TRUE(controller_->Modeset(plane1, kDefaultMode)); |
447 std::vector<ui::OverlayPlane> planes = | 466 std::vector<ui::OverlayPlane> planes = |
448 std::vector<ui::OverlayPlane>(1, plane1); | 467 std::vector<ui::OverlayPlane>(1, plane1); |
449 EXPECT_TRUE(controller_->SchedulePageFlip( | 468 controller_->SchedulePageFlip( |
450 planes, false /* test_only */, | 469 planes, base::Bind(&HardwareDisplayControllerTest::PageFlipCallback, |
451 base::Bind(&HardwareDisplayControllerTest::PageFlipCallback, | 470 base::Unretained(this))); |
452 base::Unretained(this)))); | |
453 | 471 |
454 controller_->AddCrtc(scoped_ptr<ui::CrtcController>( | 472 controller_->AddCrtc(scoped_ptr<ui::CrtcController>( |
455 new ui::CrtcController(drm_.get(), kSecondaryCrtc, kSecondaryConnector))); | 473 new ui::CrtcController(drm_.get(), kSecondaryCrtc, kSecondaryConnector))); |
456 | 474 |
457 drm_->RunCallbacks(); | 475 drm_->RunCallbacks(); |
| 476 EXPECT_EQ(gfx::SwapResult::SWAP_ACK, last_swap_result_); |
458 EXPECT_EQ(1, page_flips_); | 477 EXPECT_EQ(1, page_flips_); |
459 } | 478 } |
460 | 479 |
461 TEST_F(HardwareDisplayControllerTest, RemoveCrtcMidPageFlip) { | 480 TEST_F(HardwareDisplayControllerTest, RemoveCrtcMidPageFlip) { |
462 ui::OverlayPlane plane1(scoped_refptr<ui::ScanoutBuffer>( | 481 ui::OverlayPlane plane1(scoped_refptr<ui::ScanoutBuffer>( |
463 new MockScanoutBuffer(kDefaultModeSize))); | 482 new MockScanoutBuffer(kDefaultModeSize))); |
464 EXPECT_TRUE(controller_->Modeset(plane1, kDefaultMode)); | 483 EXPECT_TRUE(controller_->Modeset(plane1, kDefaultMode)); |
465 std::vector<ui::OverlayPlane> planes = | 484 std::vector<ui::OverlayPlane> planes = |
466 std::vector<ui::OverlayPlane>(1, plane1); | 485 std::vector<ui::OverlayPlane>(1, plane1); |
467 EXPECT_TRUE(controller_->SchedulePageFlip( | 486 controller_->SchedulePageFlip( |
468 planes, false /* test_only */, | 487 planes, base::Bind(&HardwareDisplayControllerTest::PageFlipCallback, |
469 base::Bind(&HardwareDisplayControllerTest::PageFlipCallback, | 488 base::Unretained(this))); |
470 base::Unretained(this)))); | |
471 | 489 |
472 controller_->RemoveCrtc(drm_, kPrimaryCrtc); | 490 controller_->RemoveCrtc(drm_, kPrimaryCrtc); |
473 | 491 |
474 EXPECT_EQ(1, page_flips_); | 492 EXPECT_EQ(1, page_flips_); |
475 drm_->RunCallbacks(); | 493 drm_->RunCallbacks(); |
| 494 EXPECT_EQ(gfx::SwapResult::SWAP_ACK, last_swap_result_); |
476 EXPECT_EQ(1, page_flips_); | 495 EXPECT_EQ(1, page_flips_); |
477 } | 496 } |
OLD | NEW |