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