Chromium Code Reviews| OLD | NEW |
|---|---|
| 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2012 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 "chromeos/display/output_configurator.h" | 5 #include "chromeos/display/output_configurator.h" |
| 6 | 6 |
| 7 #include <cstdarg> | 7 #include <cstdarg> |
| 8 #include <map> | 8 #include <map> |
| 9 #include <string> | 9 #include <string> |
| 10 #include <vector> | 10 #include <vector> |
| (...skipping 174 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 185 std::vector<OutputConfigurator::OutputSnapshot> outputs_; | 185 std::vector<OutputConfigurator::OutputSnapshot> outputs_; |
| 186 | 186 |
| 187 std::string actions_; | 187 std::string actions_; |
| 188 | 188 |
| 189 // Return value returned by ConfigureCrtc(). | 189 // Return value returned by ConfigureCrtc(). |
| 190 bool configure_crtc_result_; | 190 bool configure_crtc_result_; |
| 191 | 191 |
| 192 DISALLOW_COPY_AND_ASSIGN(TestDelegate); | 192 DISALLOW_COPY_AND_ASSIGN(TestDelegate); |
| 193 }; | 193 }; |
| 194 | 194 |
| 195 class TestObserver : public OutputConfigurator::Observer { | |
| 196 public: | |
| 197 explicit TestObserver(OutputConfigurator* configurator) | |
| 198 : configurator_(configurator) { | |
| 199 Reset(); | |
| 200 configurator_->AddObserver(this); | |
| 201 } | |
| 202 ~TestObserver() { | |
|
oshima
2013/08/16 16:19:14
virtual
Daniel Erat
2013/08/16 16:42:16
Done.
| |
| 203 configurator_->RemoveObserver(this); | |
| 204 } | |
| 205 | |
| 206 int num_changes() const { return num_changes_; } | |
| 207 int num_failures() const { return num_failures_; } | |
| 208 std::vector<OutputConfigurator::OutputSnapshot> latest_outputs() const { | |
| 209 return latest_outputs_; | |
| 210 } | |
| 211 OutputState latest_failed_state() const { return latest_failed_state_; } | |
| 212 | |
| 213 void Reset() { | |
| 214 num_changes_ = 0; | |
| 215 num_failures_ = 0; | |
| 216 latest_outputs_.clear(); | |
| 217 latest_failed_state_ = STATE_INVALID; | |
| 218 } | |
| 219 | |
| 220 // OutputConfigurator::Observer overrides: | |
| 221 virtual void OnDisplayModeChanged( | |
| 222 const std::vector<OutputConfigurator::OutputSnapshot>& outputs) OVERRIDE { | |
| 223 num_changes_++; | |
| 224 latest_outputs_ = outputs; | |
| 225 } | |
| 226 | |
| 227 virtual void OnDisplayModeChangeFailed(OutputState failed_new_state) { | |
|
oshima
2013/08/16 16:19:14
OVERRIDE
Daniel Erat
2013/08/16 16:42:16
Done.
| |
| 228 num_failures_++; | |
| 229 latest_failed_state_ = failed_new_state; | |
| 230 } | |
| 231 | |
| 232 private: | |
| 233 OutputConfigurator* configurator_; // Not owned. | |
| 234 | |
| 235 // Number of times that OnDisplayMode*() has been called. | |
| 236 int num_changes_; | |
| 237 int num_failures_; | |
| 238 | |
| 239 // Parameters most recently passed to OnDisplayMode*(). | |
| 240 std::vector<OutputConfigurator::OutputSnapshot> latest_outputs_; | |
| 241 OutputState latest_failed_state_; | |
| 242 | |
| 243 DISALLOW_COPY_AND_ASSIGN(TestObserver); | |
| 244 }; | |
| 245 | |
| 195 class TestStateController : public OutputConfigurator::StateController { | 246 class TestStateController : public OutputConfigurator::StateController { |
| 196 public: | 247 public: |
| 197 TestStateController() : state_(STATE_DUAL_EXTENDED) {} | 248 TestStateController() : state_(STATE_DUAL_EXTENDED) {} |
| 198 virtual ~TestStateController() {} | 249 virtual ~TestStateController() {} |
| 199 | 250 |
| 200 void set_state(OutputState state) { state_ = state; } | 251 void set_state(OutputState state) { state_ = state; } |
| 201 | 252 |
| 202 // OutputConfigurator::StateController overrides: | 253 // OutputConfigurator::StateController overrides: |
| 203 virtual OutputState GetStateForDisplayIds( | 254 virtual OutputState GetStateForDisplayIds( |
| 204 const std::vector<int64>& outputs) const OVERRIDE { return state_; } | 255 const std::vector<int64>& outputs) const OVERRIDE { return state_; } |
| (...skipping 26 matching lines...) Expand all Loading... | |
| 231 | 282 |
| 232 private: | 283 private: |
| 233 bool software_mirroring_enabled_; | 284 bool software_mirroring_enabled_; |
| 234 | 285 |
| 235 DISALLOW_COPY_AND_ASSIGN(TestMirroringController); | 286 DISALLOW_COPY_AND_ASSIGN(TestMirroringController); |
| 236 }; | 287 }; |
| 237 | 288 |
| 238 class OutputConfiguratorTest : public testing::Test { | 289 class OutputConfiguratorTest : public testing::Test { |
| 239 public: | 290 public: |
| 240 OutputConfiguratorTest() | 291 OutputConfiguratorTest() |
| 241 : test_api_(&configurator_, TestDelegate::kXRandREventBase) {} | 292 : observer_(&configurator_), |
| 293 test_api_(&configurator_, TestDelegate::kXRandREventBase) {} | |
| 242 virtual ~OutputConfiguratorTest() {} | 294 virtual ~OutputConfiguratorTest() {} |
| 243 | 295 |
| 244 virtual void SetUp() OVERRIDE { | 296 virtual void SetUp() OVERRIDE { |
| 245 delegate_ = new TestDelegate(); | 297 delegate_ = new TestDelegate(); |
| 246 configurator_.SetDelegateForTesting( | 298 configurator_.SetDelegateForTesting( |
| 247 scoped_ptr<OutputConfigurator::Delegate>(delegate_)); | 299 scoped_ptr<OutputConfigurator::Delegate>(delegate_)); |
| 248 configurator_.set_state_controller(&state_controller_); | 300 configurator_.set_state_controller(&state_controller_); |
| 249 configurator_.set_mirroring_controller(&mirroring_controller_); | 301 configurator_.set_mirroring_controller(&mirroring_controller_); |
| 250 | 302 |
| 251 OutputConfigurator::ModeInfo small_mode_info; | 303 OutputConfigurator::ModeInfo small_mode_info; |
| (...skipping 88 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 340 GetCrtcAction(outputs_[0].crtc, 0, 0, kSmallModeId, | 392 GetCrtcAction(outputs_[0].crtc, 0, 0, kSmallModeId, |
| 341 outputs_[0].output).c_str(), | 393 outputs_[0].output).c_str(), |
| 342 kForceDPMS, kUngrab, kProjectingOff, NULL), | 394 kForceDPMS, kUngrab, kProjectingOff, NULL), |
| 343 delegate_->GetActionsAndClear()); | 395 delegate_->GetActionsAndClear()); |
| 344 } | 396 } |
| 345 | 397 |
| 346 base::MessageLoop message_loop_; | 398 base::MessageLoop message_loop_; |
| 347 TestStateController state_controller_; | 399 TestStateController state_controller_; |
| 348 TestMirroringController mirroring_controller_; | 400 TestMirroringController mirroring_controller_; |
| 349 OutputConfigurator configurator_; | 401 OutputConfigurator configurator_; |
| 402 TestObserver observer_; | |
| 350 TestDelegate* delegate_; // not owned | 403 TestDelegate* delegate_; // not owned |
| 351 OutputConfigurator::TestApi test_api_; | 404 OutputConfigurator::TestApi test_api_; |
| 352 | 405 |
| 353 OutputConfigurator::OutputSnapshot outputs_[2]; | 406 OutputConfigurator::OutputSnapshot outputs_[2]; |
| 354 | 407 |
| 355 private: | 408 private: |
| 356 DISALLOW_COPY_AND_ASSIGN(OutputConfiguratorTest); | 409 DISALLOW_COPY_AND_ASSIGN(OutputConfiguratorTest); |
| 357 }; | 410 }; |
| 358 | 411 |
| 359 } // namespace | 412 } // namespace |
| 360 | 413 |
| 361 TEST_F(OutputConfiguratorTest, ConnectSecondOutput) { | 414 TEST_F(OutputConfiguratorTest, ConnectSecondOutput) { |
| 362 InitWithSingleOutput(); | 415 InitWithSingleOutput(); |
| 363 | 416 |
| 364 // Connect a second output and check that the configurator enters | 417 // Connect a second output and check that the configurator enters |
| 365 // extended mode. | 418 // extended mode. |
| 419 observer_.Reset(); | |
| 366 state_controller_.set_state(STATE_DUAL_EXTENDED); | 420 state_controller_.set_state(STATE_DUAL_EXTENDED); |
| 367 UpdateOutputs(2, true); | 421 UpdateOutputs(2, true); |
| 368 const int kDualHeight = | 422 const int kDualHeight = |
| 369 kSmallModeHeight + OutputConfigurator::kVerticalGap + kBigModeHeight; | 423 kSmallModeHeight + OutputConfigurator::kVerticalGap + kBigModeHeight; |
| 370 EXPECT_EQ(JoinActions(kUpdateXRandR, kGrab, | 424 EXPECT_EQ(JoinActions(kUpdateXRandR, kGrab, |
| 371 GetFramebufferAction(kBigModeWidth, kDualHeight, | 425 GetFramebufferAction(kBigModeWidth, kDualHeight, |
| 372 outputs_[0].crtc, outputs_[1].crtc).c_str(), | 426 outputs_[0].crtc, outputs_[1].crtc).c_str(), |
| 373 GetCrtcAction(outputs_[0].crtc, 0, 0, kSmallModeId, | 427 GetCrtcAction(outputs_[0].crtc, 0, 0, kSmallModeId, |
| 374 outputs_[0].output).c_str(), | 428 outputs_[0].output).c_str(), |
| 375 GetCrtcAction(outputs_[1].crtc, 0, | 429 GetCrtcAction(outputs_[1].crtc, 0, |
| 376 kSmallModeHeight + OutputConfigurator::kVerticalGap, | 430 kSmallModeHeight + OutputConfigurator::kVerticalGap, |
| 377 kBigModeId, outputs_[1].output).c_str(), | 431 kBigModeId, outputs_[1].output).c_str(), |
| 378 kUngrab, kProjectingOn, NULL), | 432 kUngrab, kProjectingOn, NULL), |
| 379 delegate_->GetActionsAndClear()); | 433 delegate_->GetActionsAndClear()); |
| 380 EXPECT_FALSE(mirroring_controller_.software_mirroring_enabled()); | 434 EXPECT_FALSE(mirroring_controller_.software_mirroring_enabled()); |
| 435 EXPECT_EQ(1, observer_.num_changes()); | |
| 381 | 436 |
| 437 observer_.Reset(); | |
| 382 EXPECT_TRUE(configurator_.SetDisplayMode(STATE_DUAL_MIRROR)); | 438 EXPECT_TRUE(configurator_.SetDisplayMode(STATE_DUAL_MIRROR)); |
| 383 EXPECT_EQ(JoinActions(kGrab, | 439 EXPECT_EQ(JoinActions(kGrab, |
| 384 GetFramebufferAction(kSmallModeWidth, kSmallModeHeight, | 440 GetFramebufferAction(kSmallModeWidth, kSmallModeHeight, |
| 385 outputs_[0].crtc, outputs_[1].crtc).c_str(), | 441 outputs_[0].crtc, outputs_[1].crtc).c_str(), |
| 386 GetCrtcAction(outputs_[0].crtc, 0, 0, kSmallModeId, | 442 GetCrtcAction(outputs_[0].crtc, 0, 0, kSmallModeId, |
| 387 outputs_[0].output).c_str(), | 443 outputs_[0].output).c_str(), |
| 388 GetCrtcAction(outputs_[1].crtc, 0, 0, kSmallModeId, | 444 GetCrtcAction(outputs_[1].crtc, 0, 0, kSmallModeId, |
| 389 outputs_[1].output).c_str(), | 445 outputs_[1].output).c_str(), |
| 390 kUngrab, NULL), | 446 kUngrab, NULL), |
| 391 delegate_->GetActionsAndClear()); | 447 delegate_->GetActionsAndClear()); |
| 392 EXPECT_FALSE(mirroring_controller_.software_mirroring_enabled()); | 448 EXPECT_FALSE(mirroring_controller_.software_mirroring_enabled()); |
| 449 EXPECT_EQ(1, observer_.num_changes()); | |
| 393 | 450 |
| 394 // Disconnect the second output. | 451 // Disconnect the second output. |
| 452 observer_.Reset(); | |
| 395 UpdateOutputs(1, true); | 453 UpdateOutputs(1, true); |
| 396 EXPECT_EQ(JoinActions(kUpdateXRandR, kGrab, | 454 EXPECT_EQ(JoinActions(kUpdateXRandR, kGrab, |
| 397 GetFramebufferAction(kSmallModeWidth, kSmallModeHeight, | 455 GetFramebufferAction(kSmallModeWidth, kSmallModeHeight, |
| 398 outputs_[0].crtc, 0).c_str(), | 456 outputs_[0].crtc, 0).c_str(), |
| 399 GetCrtcAction(outputs_[0].crtc, 0, 0, kSmallModeId, | 457 GetCrtcAction(outputs_[0].crtc, 0, 0, kSmallModeId, |
| 400 outputs_[0].output).c_str(), | 458 outputs_[0].output).c_str(), |
| 401 kUngrab, kProjectingOff, NULL), | 459 kUngrab, kProjectingOff, NULL), |
| 402 delegate_->GetActionsAndClear()); | 460 delegate_->GetActionsAndClear()); |
| 403 EXPECT_FALSE(mirroring_controller_.software_mirroring_enabled()); | 461 EXPECT_FALSE(mirroring_controller_.software_mirroring_enabled()); |
| 462 EXPECT_EQ(1, observer_.num_changes()); | |
| 404 | 463 |
| 405 // Software Mirroring | 464 // Software Mirroring |
| 406 DisableNativeMirroring(); | 465 DisableNativeMirroring(); |
| 407 state_controller_.set_state(STATE_DUAL_EXTENDED); | 466 state_controller_.set_state(STATE_DUAL_EXTENDED); |
| 408 UpdateOutputs(2, true); | 467 UpdateOutputs(2, true); |
| 409 EXPECT_EQ(JoinActions(kUpdateXRandR, kGrab, | 468 EXPECT_EQ(JoinActions(kUpdateXRandR, kGrab, |
| 410 GetFramebufferAction(kBigModeWidth, kDualHeight, | 469 GetFramebufferAction(kBigModeWidth, kDualHeight, |
| 411 outputs_[0].crtc, outputs_[1].crtc).c_str(), | 470 outputs_[0].crtc, outputs_[1].crtc).c_str(), |
| 412 GetCrtcAction(outputs_[0].crtc, 0, 0, kSmallModeId, | 471 GetCrtcAction(outputs_[0].crtc, 0, 0, kSmallModeId, |
| 413 outputs_[0].output).c_str(), | 472 outputs_[0].output).c_str(), |
| 414 GetCrtcAction(outputs_[1].crtc, 0, | 473 GetCrtcAction(outputs_[1].crtc, 0, |
| 415 kSmallModeHeight + OutputConfigurator::kVerticalGap, | 474 kSmallModeHeight + OutputConfigurator::kVerticalGap, |
| 416 kBigModeId, outputs_[1].output).c_str(), | 475 kBigModeId, outputs_[1].output).c_str(), |
| 417 kUngrab, kProjectingOn, NULL), | 476 kUngrab, kProjectingOn, NULL), |
| 418 delegate_->GetActionsAndClear()); | 477 delegate_->GetActionsAndClear()); |
| 419 EXPECT_FALSE(mirroring_controller_.software_mirroring_enabled()); | 478 EXPECT_FALSE(mirroring_controller_.software_mirroring_enabled()); |
| 420 | 479 |
| 480 observer_.Reset(); | |
| 481 EXPECT_TRUE(configurator_.SetDisplayMode(STATE_DUAL_MIRROR)); | |
| 482 EXPECT_EQ(JoinActions(kGrab, kUngrab, NULL), delegate_->GetActionsAndClear()); | |
| 483 EXPECT_EQ(STATE_DUAL_EXTENDED, configurator_.output_state()); | |
| 484 EXPECT_TRUE(mirroring_controller_.software_mirroring_enabled()); | |
| 485 EXPECT_EQ(1, observer_.num_changes()); | |
| 486 | |
| 487 // Setting STATE_DUAL_MIRROR should try to reconfigure. | |
| 488 observer_.Reset(); | |
| 489 EXPECT_TRUE(configurator_.SetDisplayMode(STATE_DUAL_EXTENDED)); | |
| 490 EXPECT_EQ(JoinActions(NULL), delegate_->GetActionsAndClear()); | |
| 491 EXPECT_FALSE(mirroring_controller_.software_mirroring_enabled()); | |
| 492 EXPECT_EQ(1, observer_.num_changes()); | |
| 493 | |
| 494 // Set back to software mirror mode. | |
| 495 observer_.Reset(); | |
| 421 EXPECT_TRUE(configurator_.SetDisplayMode(STATE_DUAL_MIRROR)); | 496 EXPECT_TRUE(configurator_.SetDisplayMode(STATE_DUAL_MIRROR)); |
| 422 EXPECT_EQ(JoinActions(kGrab, kUngrab, NULL), | 497 EXPECT_EQ(JoinActions(kGrab, kUngrab, NULL), |
| 423 delegate_->GetActionsAndClear()); | 498 delegate_->GetActionsAndClear()); |
| 424 EXPECT_EQ(STATE_DUAL_EXTENDED, configurator_.output_state()); | 499 EXPECT_EQ(STATE_DUAL_EXTENDED, configurator_.output_state()); |
| 425 EXPECT_TRUE(mirroring_controller_.software_mirroring_enabled()); | 500 EXPECT_TRUE(mirroring_controller_.software_mirroring_enabled()); |
| 426 | 501 EXPECT_EQ(1, observer_.num_changes()); |
| 427 // Setting STATE_DUAL_MIRROR should try to reconfigure | |
| 428 EXPECT_TRUE(configurator_.SetDisplayMode(STATE_DUAL_EXTENDED)); | |
| 429 EXPECT_EQ(JoinActions(NULL), delegate_->GetActionsAndClear()); | |
| 430 EXPECT_FALSE(mirroring_controller_.software_mirroring_enabled()); | |
| 431 | |
| 432 // Set back to software mirror mode. | |
| 433 EXPECT_TRUE(configurator_.SetDisplayMode(STATE_DUAL_MIRROR)); | |
| 434 EXPECT_EQ(JoinActions(kGrab, kUngrab, NULL), | |
| 435 delegate_->GetActionsAndClear()); | |
| 436 EXPECT_EQ(STATE_DUAL_EXTENDED, configurator_.output_state()); | |
| 437 EXPECT_TRUE(mirroring_controller_.software_mirroring_enabled()); | |
| 438 | 502 |
| 439 // Disconnect the second output. | 503 // Disconnect the second output. |
| 504 observer_.Reset(); | |
| 440 UpdateOutputs(1, true); | 505 UpdateOutputs(1, true); |
| 441 EXPECT_EQ(JoinActions(kUpdateXRandR, kGrab, | 506 EXPECT_EQ(JoinActions(kUpdateXRandR, kGrab, |
| 442 GetFramebufferAction(kSmallModeWidth, kSmallModeHeight, | 507 GetFramebufferAction(kSmallModeWidth, kSmallModeHeight, |
| 443 outputs_[0].crtc, 0).c_str(), | 508 outputs_[0].crtc, 0).c_str(), |
| 444 GetCrtcAction(outputs_[0].crtc, 0, 0, kSmallModeId, | 509 GetCrtcAction(outputs_[0].crtc, 0, 0, kSmallModeId, |
| 445 outputs_[0].output).c_str(), | 510 outputs_[0].output).c_str(), |
| 446 kUngrab, kProjectingOff, NULL), | 511 kUngrab, kProjectingOff, NULL), |
| 447 delegate_->GetActionsAndClear()); | 512 delegate_->GetActionsAndClear()); |
| 448 EXPECT_FALSE(mirroring_controller_.software_mirroring_enabled()); | 513 EXPECT_FALSE(mirroring_controller_.software_mirroring_enabled()); |
| 514 EXPECT_EQ(1, observer_.num_changes()); | |
| 449 } | 515 } |
| 450 | 516 |
| 451 TEST_F(OutputConfiguratorTest, SetDisplayPower) { | 517 TEST_F(OutputConfiguratorTest, SetDisplayPower) { |
| 452 InitWithSingleOutput(); | 518 InitWithSingleOutput(); |
| 453 | 519 |
| 454 state_controller_.set_state(STATE_DUAL_MIRROR); | 520 state_controller_.set_state(STATE_DUAL_MIRROR); |
| 521 observer_.Reset(); | |
| 455 UpdateOutputs(2, true); | 522 UpdateOutputs(2, true); |
| 456 EXPECT_EQ(JoinActions(kUpdateXRandR, kGrab, | 523 EXPECT_EQ(JoinActions(kUpdateXRandR, kGrab, |
| 457 GetFramebufferAction(kSmallModeWidth, kSmallModeHeight, | 524 GetFramebufferAction(kSmallModeWidth, kSmallModeHeight, |
| 458 outputs_[0].crtc, outputs_[1].crtc).c_str(), | 525 outputs_[0].crtc, outputs_[1].crtc).c_str(), |
| 459 GetCrtcAction(outputs_[0].crtc, 0, 0, kSmallModeId, | 526 GetCrtcAction(outputs_[0].crtc, 0, 0, kSmallModeId, |
| 460 outputs_[0].output).c_str(), | 527 outputs_[0].output).c_str(), |
| 461 GetCrtcAction(outputs_[1].crtc, 0, 0, kSmallModeId, | 528 GetCrtcAction(outputs_[1].crtc, 0, 0, kSmallModeId, |
| 462 outputs_[1].output).c_str(), | 529 outputs_[1].output).c_str(), |
| 463 kUngrab, kProjectingOn, NULL), | 530 kUngrab, kProjectingOn, NULL), |
| 464 delegate_->GetActionsAndClear()); | 531 delegate_->GetActionsAndClear()); |
| 465 EXPECT_FALSE(mirroring_controller_.software_mirroring_enabled()); | 532 EXPECT_FALSE(mirroring_controller_.software_mirroring_enabled()); |
| 533 EXPECT_EQ(1, observer_.num_changes()); | |
| 466 | 534 |
| 467 // Turning off the internal display should switch the external display to | 535 // Turning off the internal display should switch the external display to |
| 468 // its native mode. | 536 // its native mode. |
| 537 observer_.Reset(); | |
| 469 configurator_.SetDisplayPower(DISPLAY_POWER_INTERNAL_OFF_EXTERNAL_ON, | 538 configurator_.SetDisplayPower(DISPLAY_POWER_INTERNAL_OFF_EXTERNAL_ON, |
| 470 OutputConfigurator::kSetDisplayPowerNoFlags); | 539 OutputConfigurator::kSetDisplayPowerNoFlags); |
| 471 EXPECT_EQ(JoinActions(kGrab, | 540 EXPECT_EQ(JoinActions(kGrab, |
| 472 GetFramebufferAction(kBigModeWidth, kBigModeHeight, | 541 GetFramebufferAction(kBigModeWidth, kBigModeHeight, |
| 473 outputs_[0].crtc, outputs_[1].crtc).c_str(), | 542 outputs_[0].crtc, outputs_[1].crtc).c_str(), |
| 474 GetCrtcAction(outputs_[0].crtc, 0, 0, 0, | 543 GetCrtcAction(outputs_[0].crtc, 0, 0, 0, |
| 475 outputs_[0].output).c_str(), | 544 outputs_[0].output).c_str(), |
| 476 GetCrtcAction(outputs_[1].crtc, 0, 0, kBigModeId, | 545 GetCrtcAction(outputs_[1].crtc, 0, 0, kBigModeId, |
| 477 outputs_[1].output).c_str(), | 546 outputs_[1].output).c_str(), |
| 478 kForceDPMS, kUngrab, NULL), | 547 kForceDPMS, kUngrab, NULL), |
| 479 delegate_->GetActionsAndClear()); | 548 delegate_->GetActionsAndClear()); |
| 480 EXPECT_EQ(STATE_SINGLE, configurator_.output_state()); | 549 EXPECT_EQ(STATE_SINGLE, configurator_.output_state()); |
| 550 EXPECT_EQ(1, observer_.num_changes()); | |
| 481 | 551 |
| 482 // When all displays are turned off, the framebuffer should switch back | 552 // When all displays are turned off, the framebuffer should switch back |
| 483 // to the mirrored size. | 553 // to the mirrored size. |
| 554 observer_.Reset(); | |
| 484 configurator_.SetDisplayPower(DISPLAY_POWER_ALL_OFF, | 555 configurator_.SetDisplayPower(DISPLAY_POWER_ALL_OFF, |
| 485 OutputConfigurator::kSetDisplayPowerNoFlags); | 556 OutputConfigurator::kSetDisplayPowerNoFlags); |
| 486 EXPECT_EQ(JoinActions(kGrab, | 557 EXPECT_EQ(JoinActions(kGrab, |
| 487 GetFramebufferAction(kSmallModeWidth, kSmallModeHeight, | 558 GetFramebufferAction(kSmallModeWidth, kSmallModeHeight, |
| 488 outputs_[0].crtc, outputs_[1].crtc).c_str(), | 559 outputs_[0].crtc, outputs_[1].crtc).c_str(), |
| 489 GetCrtcAction(outputs_[0].crtc, 0, 0, 0, | 560 GetCrtcAction(outputs_[0].crtc, 0, 0, 0, |
| 490 outputs_[0].output).c_str(), | 561 outputs_[0].output).c_str(), |
| 491 GetCrtcAction(outputs_[1].crtc, 0, 0, 0, | 562 GetCrtcAction(outputs_[1].crtc, 0, 0, 0, |
| 492 outputs_[1].output).c_str(), | 563 outputs_[1].output).c_str(), |
| 493 kUngrab, NULL), | 564 kUngrab, NULL), |
| 494 delegate_->GetActionsAndClear()); | 565 delegate_->GetActionsAndClear()); |
| 495 EXPECT_EQ(STATE_DUAL_MIRROR, configurator_.output_state()); | 566 EXPECT_EQ(STATE_DUAL_MIRROR, configurator_.output_state()); |
| 496 EXPECT_FALSE(mirroring_controller_.software_mirroring_enabled()); | 567 EXPECT_FALSE(mirroring_controller_.software_mirroring_enabled()); |
| 568 EXPECT_EQ(1, observer_.num_changes()); | |
| 497 | 569 |
| 498 // Turn all displays on and check that mirroring is still used. | 570 // Turn all displays on and check that mirroring is still used. |
| 571 observer_.Reset(); | |
| 499 configurator_.SetDisplayPower(DISPLAY_POWER_ALL_ON, | 572 configurator_.SetDisplayPower(DISPLAY_POWER_ALL_ON, |
| 500 OutputConfigurator::kSetDisplayPowerNoFlags); | 573 OutputConfigurator::kSetDisplayPowerNoFlags); |
| 501 EXPECT_EQ(JoinActions(kGrab, | 574 EXPECT_EQ(JoinActions(kGrab, |
| 502 GetFramebufferAction(kSmallModeWidth, kSmallModeHeight, | 575 GetFramebufferAction(kSmallModeWidth, kSmallModeHeight, |
| 503 outputs_[0].crtc, outputs_[1].crtc).c_str(), | 576 outputs_[0].crtc, outputs_[1].crtc).c_str(), |
| 504 GetCrtcAction(outputs_[0].crtc, 0, 0, kSmallModeId, | 577 GetCrtcAction(outputs_[0].crtc, 0, 0, kSmallModeId, |
| 505 outputs_[0].output).c_str(), | 578 outputs_[0].output).c_str(), |
| 506 GetCrtcAction(outputs_[1].crtc, 0, 0, kSmallModeId, | 579 GetCrtcAction(outputs_[1].crtc, 0, 0, kSmallModeId, |
| 507 outputs_[1].output).c_str(), | 580 outputs_[1].output).c_str(), |
| 508 kForceDPMS, kUngrab, NULL), | 581 kForceDPMS, kUngrab, NULL), |
| 509 delegate_->GetActionsAndClear()); | 582 delegate_->GetActionsAndClear()); |
| 510 EXPECT_EQ(STATE_DUAL_MIRROR, configurator_.output_state()); | 583 EXPECT_EQ(STATE_DUAL_MIRROR, configurator_.output_state()); |
| 511 EXPECT_FALSE(mirroring_controller_.software_mirroring_enabled()); | 584 EXPECT_FALSE(mirroring_controller_.software_mirroring_enabled()); |
| 585 EXPECT_EQ(1, observer_.num_changes()); | |
| 512 | 586 |
| 513 // Software Mirroring | 587 // Software Mirroring |
| 514 DisableNativeMirroring(); | 588 DisableNativeMirroring(); |
| 515 state_controller_.set_state(STATE_DUAL_MIRROR); | 589 state_controller_.set_state(STATE_DUAL_MIRROR); |
| 590 observer_.Reset(); | |
| 516 UpdateOutputs(2, true); | 591 UpdateOutputs(2, true); |
| 517 const int kDualHeight = | 592 const int kDualHeight = |
| 518 kSmallModeHeight + OutputConfigurator::kVerticalGap + kBigModeHeight; | 593 kSmallModeHeight + OutputConfigurator::kVerticalGap + kBigModeHeight; |
| 519 EXPECT_EQ(JoinActions(kUpdateXRandR, kGrab, | 594 EXPECT_EQ(JoinActions(kUpdateXRandR, kGrab, |
| 520 GetFramebufferAction(kBigModeWidth, kDualHeight, | 595 GetFramebufferAction(kBigModeWidth, kDualHeight, |
| 521 outputs_[0].crtc, outputs_[1].crtc).c_str(), | 596 outputs_[0].crtc, outputs_[1].crtc).c_str(), |
| 522 GetCrtcAction(outputs_[0].crtc, 0, 0, kSmallModeId, | 597 GetCrtcAction(outputs_[0].crtc, 0, 0, kSmallModeId, |
| 523 outputs_[0].output).c_str(), | 598 outputs_[0].output).c_str(), |
| 524 GetCrtcAction(outputs_[1].crtc, 0, | 599 GetCrtcAction(outputs_[1].crtc, 0, |
| 525 kSmallModeHeight + OutputConfigurator::kVerticalGap, | 600 kSmallModeHeight + OutputConfigurator::kVerticalGap, |
| 526 kBigModeId, outputs_[1].output).c_str(), | 601 kBigModeId, outputs_[1].output).c_str(), |
| 527 kUngrab, kProjectingOn, NULL), | 602 kUngrab, kProjectingOn, NULL), |
| 528 delegate_->GetActionsAndClear()); | 603 delegate_->GetActionsAndClear()); |
| 529 EXPECT_EQ(STATE_DUAL_EXTENDED, configurator_.output_state()); | 604 EXPECT_EQ(STATE_DUAL_EXTENDED, configurator_.output_state()); |
| 530 EXPECT_TRUE(mirroring_controller_.software_mirroring_enabled()); | 605 EXPECT_TRUE(mirroring_controller_.software_mirroring_enabled()); |
| 606 EXPECT_EQ(1, observer_.num_changes()); | |
| 531 | 607 |
| 532 // Turning off the internal display should switch the external display to | 608 // Turning off the internal display should switch the external display to |
| 533 // its native mode. | 609 // its native mode. |
| 610 observer_.Reset(); | |
| 534 configurator_.SetDisplayPower(DISPLAY_POWER_INTERNAL_OFF_EXTERNAL_ON, | 611 configurator_.SetDisplayPower(DISPLAY_POWER_INTERNAL_OFF_EXTERNAL_ON, |
| 535 OutputConfigurator::kSetDisplayPowerNoFlags); | 612 OutputConfigurator::kSetDisplayPowerNoFlags); |
| 536 EXPECT_EQ(JoinActions(kGrab, | 613 EXPECT_EQ(JoinActions(kGrab, |
| 537 GetFramebufferAction(kBigModeWidth, kBigModeHeight, | 614 GetFramebufferAction(kBigModeWidth, kBigModeHeight, |
| 538 outputs_[0].crtc, outputs_[1].crtc).c_str(), | 615 outputs_[0].crtc, outputs_[1].crtc).c_str(), |
| 539 GetCrtcAction(outputs_[0].crtc, 0, 0, 0, | 616 GetCrtcAction(outputs_[0].crtc, 0, 0, 0, |
| 540 outputs_[0].output).c_str(), | 617 outputs_[0].output).c_str(), |
| 541 GetCrtcAction(outputs_[1].crtc, 0, 0, kBigModeId, | 618 GetCrtcAction(outputs_[1].crtc, 0, 0, kBigModeId, |
| 542 outputs_[1].output).c_str(), | 619 outputs_[1].output).c_str(), |
| 543 kForceDPMS, kUngrab, NULL), | 620 kForceDPMS, kUngrab, NULL), |
| 544 delegate_->GetActionsAndClear()); | 621 delegate_->GetActionsAndClear()); |
| 545 EXPECT_EQ(STATE_SINGLE, configurator_.output_state()); | 622 EXPECT_EQ(STATE_SINGLE, configurator_.output_state()); |
| 546 EXPECT_FALSE(mirroring_controller_.software_mirroring_enabled()); | 623 EXPECT_FALSE(mirroring_controller_.software_mirroring_enabled()); |
| 624 EXPECT_EQ(1, observer_.num_changes()); | |
| 547 | 625 |
| 548 // When all displays are turned off, the framebuffer should switch back | 626 // When all displays are turned off, the framebuffer should switch back |
| 549 // to the extended + software mirroring. | 627 // to the extended + software mirroring. |
| 628 observer_.Reset(); | |
| 550 configurator_.SetDisplayPower(DISPLAY_POWER_ALL_OFF, | 629 configurator_.SetDisplayPower(DISPLAY_POWER_ALL_OFF, |
| 551 OutputConfigurator::kSetDisplayPowerNoFlags); | 630 OutputConfigurator::kSetDisplayPowerNoFlags); |
| 552 EXPECT_EQ(JoinActions(kGrab, | 631 EXPECT_EQ(JoinActions(kGrab, |
| 553 GetFramebufferAction(kBigModeWidth, kDualHeight, | 632 GetFramebufferAction(kBigModeWidth, kDualHeight, |
| 554 outputs_[0].crtc, outputs_[1].crtc).c_str(), | 633 outputs_[0].crtc, outputs_[1].crtc).c_str(), |
| 555 GetCrtcAction(outputs_[0].crtc, 0, 0, 0, | 634 GetCrtcAction(outputs_[0].crtc, 0, 0, 0, |
| 556 outputs_[0].output).c_str(), | 635 outputs_[0].output).c_str(), |
| 557 GetCrtcAction(outputs_[1].crtc, 0, | 636 GetCrtcAction(outputs_[1].crtc, 0, |
| 558 kSmallModeHeight + OutputConfigurator::kVerticalGap, | 637 kSmallModeHeight + OutputConfigurator::kVerticalGap, |
| 559 0, outputs_[1].output).c_str(), | 638 0, outputs_[1].output).c_str(), |
| 560 kUngrab, NULL), | 639 kUngrab, NULL), |
| 561 delegate_->GetActionsAndClear()); | 640 delegate_->GetActionsAndClear()); |
| 562 EXPECT_EQ(STATE_DUAL_EXTENDED, configurator_.output_state()); | 641 EXPECT_EQ(STATE_DUAL_EXTENDED, configurator_.output_state()); |
| 563 EXPECT_TRUE(mirroring_controller_.software_mirroring_enabled()); | 642 EXPECT_TRUE(mirroring_controller_.software_mirroring_enabled()); |
| 643 EXPECT_EQ(1, observer_.num_changes()); | |
| 564 | 644 |
| 565 // Turn all displays on and check that mirroring is still used. | 645 // Turn all displays on and check that mirroring is still used. |
| 646 observer_.Reset(); | |
| 566 configurator_.SetDisplayPower(DISPLAY_POWER_ALL_ON, | 647 configurator_.SetDisplayPower(DISPLAY_POWER_ALL_ON, |
| 567 OutputConfigurator::kSetDisplayPowerNoFlags); | 648 OutputConfigurator::kSetDisplayPowerNoFlags); |
| 568 EXPECT_EQ(JoinActions(kGrab, | 649 EXPECT_EQ(JoinActions(kGrab, |
| 569 GetFramebufferAction(kBigModeWidth, kDualHeight, | 650 GetFramebufferAction(kBigModeWidth, kDualHeight, |
| 570 outputs_[0].crtc, outputs_[1].crtc).c_str(), | 651 outputs_[0].crtc, outputs_[1].crtc).c_str(), |
| 571 GetCrtcAction(outputs_[0].crtc, 0, 0, kSmallModeId, | 652 GetCrtcAction(outputs_[0].crtc, 0, 0, kSmallModeId, |
| 572 outputs_[0].output).c_str(), | 653 outputs_[0].output).c_str(), |
| 573 GetCrtcAction(outputs_[1].crtc, 0, | 654 GetCrtcAction(outputs_[1].crtc, 0, |
| 574 kSmallModeHeight + OutputConfigurator::kVerticalGap, | 655 kSmallModeHeight + OutputConfigurator::kVerticalGap, |
| 575 kBigModeId, outputs_[1].output).c_str(), | 656 kBigModeId, outputs_[1].output).c_str(), |
| 576 kForceDPMS, kUngrab, NULL), | 657 kForceDPMS, kUngrab, NULL), |
| 577 delegate_->GetActionsAndClear()); | 658 delegate_->GetActionsAndClear()); |
| 578 EXPECT_EQ(STATE_DUAL_EXTENDED, configurator_.output_state()); | 659 EXPECT_EQ(STATE_DUAL_EXTENDED, configurator_.output_state()); |
| 579 EXPECT_TRUE(mirroring_controller_.software_mirroring_enabled()); | 660 EXPECT_TRUE(mirroring_controller_.software_mirroring_enabled()); |
| 580 | 661 EXPECT_EQ(1, observer_.num_changes()); |
| 581 } | 662 } |
| 582 | 663 |
| 583 TEST_F(OutputConfiguratorTest, SuspendAndResume) { | 664 TEST_F(OutputConfiguratorTest, SuspendAndResume) { |
| 584 InitWithSingleOutput(); | 665 InitWithSingleOutput(); |
| 585 | 666 |
| 586 // No preparation is needed before suspending when the display is already | 667 // No preparation is needed before suspending when the display is already |
| 587 // on. The configurator should still reprobe on resume in case a display | 668 // on. The configurator should still reprobe on resume in case a display |
| 588 // was connected while suspended. | 669 // was connected while suspended. |
| 589 configurator_.SuspendDisplays(); | 670 configurator_.SuspendDisplays(); |
| 590 EXPECT_EQ(kNoActions, delegate_->GetActionsAndClear()); | 671 EXPECT_EQ(kNoActions, delegate_->GetActionsAndClear()); |
| (...skipping 128 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 719 outputs_[1].output).c_str(), | 800 outputs_[1].output).c_str(), |
| 720 kForceDPMS, kUngrab, kProjectingOn, NULL), | 801 kForceDPMS, kUngrab, kProjectingOn, NULL), |
| 721 delegate_->GetActionsAndClear()); | 802 delegate_->GetActionsAndClear()); |
| 722 } | 803 } |
| 723 | 804 |
| 724 TEST_F(OutputConfiguratorTest, InvalidOutputStates) { | 805 TEST_F(OutputConfiguratorTest, InvalidOutputStates) { |
| 725 UpdateOutputs(0, false); | 806 UpdateOutputs(0, false); |
| 726 EXPECT_EQ(kNoActions, delegate_->GetActionsAndClear()); | 807 EXPECT_EQ(kNoActions, delegate_->GetActionsAndClear()); |
| 727 configurator_.Init(false); | 808 configurator_.Init(false); |
| 728 configurator_.Start(0); | 809 configurator_.Start(0); |
| 810 observer_.Reset(); | |
| 729 EXPECT_TRUE(configurator_.SetDisplayMode(STATE_HEADLESS)); | 811 EXPECT_TRUE(configurator_.SetDisplayMode(STATE_HEADLESS)); |
| 730 EXPECT_FALSE(configurator_.SetDisplayMode(STATE_SINGLE)); | 812 EXPECT_FALSE(configurator_.SetDisplayMode(STATE_SINGLE)); |
| 731 EXPECT_FALSE(configurator_.SetDisplayMode(STATE_DUAL_MIRROR)); | 813 EXPECT_FALSE(configurator_.SetDisplayMode(STATE_DUAL_MIRROR)); |
| 732 EXPECT_FALSE(configurator_.SetDisplayMode(STATE_DUAL_EXTENDED)); | 814 EXPECT_FALSE(configurator_.SetDisplayMode(STATE_DUAL_EXTENDED)); |
| 815 EXPECT_EQ(1, observer_.num_changes()); | |
| 816 EXPECT_EQ(3, observer_.num_failures()); | |
| 733 | 817 |
| 734 UpdateOutputs(1, true); | 818 UpdateOutputs(1, true); |
| 819 observer_.Reset(); | |
| 735 EXPECT_FALSE(configurator_.SetDisplayMode(STATE_HEADLESS)); | 820 EXPECT_FALSE(configurator_.SetDisplayMode(STATE_HEADLESS)); |
| 736 EXPECT_TRUE(configurator_.SetDisplayMode(STATE_SINGLE)); | 821 EXPECT_TRUE(configurator_.SetDisplayMode(STATE_SINGLE)); |
| 737 EXPECT_FALSE(configurator_.SetDisplayMode(STATE_DUAL_MIRROR)); | 822 EXPECT_FALSE(configurator_.SetDisplayMode(STATE_DUAL_MIRROR)); |
| 738 EXPECT_FALSE(configurator_.SetDisplayMode(STATE_DUAL_EXTENDED)); | 823 EXPECT_FALSE(configurator_.SetDisplayMode(STATE_DUAL_EXTENDED)); |
| 824 EXPECT_EQ(1, observer_.num_changes()); | |
| 825 EXPECT_EQ(3, observer_.num_failures()); | |
| 739 | 826 |
| 740 state_controller_.set_state(STATE_DUAL_EXTENDED); | 827 state_controller_.set_state(STATE_DUAL_EXTENDED); |
| 741 UpdateOutputs(2, true); | 828 UpdateOutputs(2, true); |
| 829 observer_.Reset(); | |
| 742 EXPECT_FALSE(configurator_.SetDisplayMode(STATE_HEADLESS)); | 830 EXPECT_FALSE(configurator_.SetDisplayMode(STATE_HEADLESS)); |
| 743 EXPECT_FALSE(configurator_.SetDisplayMode(STATE_SINGLE)); | 831 EXPECT_FALSE(configurator_.SetDisplayMode(STATE_SINGLE)); |
| 744 EXPECT_TRUE(configurator_.SetDisplayMode(STATE_DUAL_MIRROR)); | 832 EXPECT_TRUE(configurator_.SetDisplayMode(STATE_DUAL_MIRROR)); |
| 745 EXPECT_TRUE(configurator_.SetDisplayMode(STATE_DUAL_EXTENDED)); | 833 EXPECT_TRUE(configurator_.SetDisplayMode(STATE_DUAL_EXTENDED)); |
| 834 EXPECT_EQ(2, observer_.num_changes()); | |
| 835 EXPECT_EQ(2, observer_.num_failures()); | |
| 746 } | 836 } |
| 747 | 837 |
| 748 TEST_F(OutputConfiguratorTest, GetOutputStateForDisplaysWithoutId) { | 838 TEST_F(OutputConfiguratorTest, GetOutputStateForDisplaysWithoutId) { |
| 749 outputs_[0].has_display_id = false; | 839 outputs_[0].has_display_id = false; |
| 750 UpdateOutputs(2, false); | 840 UpdateOutputs(2, false); |
| 751 configurator_.Init(false); | 841 configurator_.Init(false); |
| 752 state_controller_.set_state(STATE_DUAL_MIRROR); | 842 state_controller_.set_state(STATE_DUAL_MIRROR); |
| 753 configurator_.Start(0); | 843 configurator_.Start(0); |
| 754 EXPECT_EQ(STATE_DUAL_EXTENDED, configurator_.output_state()); | 844 EXPECT_EQ(STATE_DUAL_EXTENDED, configurator_.output_state()); |
| 755 } | 845 } |
| (...skipping 97 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 853 outputs_[0].crtc, outputs_[1].crtc).c_str(), | 943 outputs_[0].crtc, outputs_[1].crtc).c_str(), |
| 854 GetCrtcAction(outputs_[0].crtc, 0, 0, kSmallModeId, | 944 GetCrtcAction(outputs_[0].crtc, 0, 0, kSmallModeId, |
| 855 outputs_[0].output).c_str(), | 945 outputs_[0].output).c_str(), |
| 856 GetCrtcAction(outputs_[1].crtc, 0, 0, kSmallModeId, | 946 GetCrtcAction(outputs_[1].crtc, 0, 0, kSmallModeId, |
| 857 outputs_[1].output).c_str(), | 947 outputs_[1].output).c_str(), |
| 858 kUngrab, kProjectingOn, NULL), | 948 kUngrab, kProjectingOn, NULL), |
| 859 delegate_->GetActionsAndClear()); | 949 delegate_->GetActionsAndClear()); |
| 860 } | 950 } |
| 861 | 951 |
| 862 } // namespace chromeos | 952 } // namespace chromeos |
| OLD | NEW |