| 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 |