Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(81)

Unified Diff: chromeos/display/output_configurator_unittest.cc

Issue 120223003: Support failing modeset (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Update based on review feedback Created 6 years, 11 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
Index: chromeos/display/output_configurator_unittest.cc
diff --git a/chromeos/display/output_configurator_unittest.cc b/chromeos/display/output_configurator_unittest.cc
index 571df38f6cd4b3906e95f62bcbc506ea001d615b..bd2267d9d17afcb9b1c93a2f35111dafc339e8e6 100644
--- a/chromeos/display/output_configurator_unittest.cc
+++ b/chromeos/display/output_configurator_unittest.cc
@@ -100,9 +100,11 @@ std::string JoinActions(const char* action, ...) {
class TestDelegate : public OutputConfigurator::Delegate {
public:
static const int kXRandREventBase = 10;
+ static const int kMaxTestWidth = 2560;
+ static const int kMaxTestHeight = 1600;
TestDelegate()
- : configure_crtc_result_(true),
+ : max_configurable_pixels_(kMaxTestWidth * kMaxTestHeight),
Daniel Erat 2014/01/06 17:15:29 please make this default to 0 and document that 0
dsodman 2014/01/08 20:55:36 Done.
dsodman 2014/01/08 20:55:36 Done.
hdcp_state_(HDCP_STATE_UNDESIRED) {}
virtual ~TestDelegate() {}
@@ -114,8 +116,8 @@ class TestDelegate : public OutputConfigurator::Delegate {
outputs_ = outputs;
}
- void set_configure_crtc_result(bool result) {
- configure_crtc_result_ = result;
+ void set_max_configurable_pixels(long pixels) {
Daniel Erat 2014/01/06 17:15:29 why long? int seems like it should be big enough,
dsodman 2014/01/08 20:55:36 Done.
+ max_configurable_pixels_ = pixels;
}
void set_hdcp_state(HDCPState state) { hdcp_state_ = state; }
@@ -154,6 +156,8 @@ class TestDelegate : public OutputConfigurator::Delegate {
}
virtual void AddOutputMode(RROutput output, RRMode mode) OVERRIDE {
AppendAction(GetAddOutputModeAction(output, mode));
+ outputs_[output-1].mode_infos[mode] = OutputConfigurator::ModeInfo(
Daniel Erat 2014/01/06 17:15:29 please don't add an undocumented assumption that o
dsodman 2014/01/08 20:55:36 Done.
+ 0, 0, false, 0.0);
}
virtual bool ConfigureCrtc(RRCrtc crtc,
RRMode mode,
@@ -161,7 +165,13 @@ class TestDelegate : public OutputConfigurator::Delegate {
int x,
int y) OVERRIDE {
AppendAction(GetCrtcAction(crtc, x, y, mode, output));
- return configure_crtc_result_;
+ if (mode == 0)
+ return true;
+
+ const OutputConfigurator::ModeInfo mode_info =
+ outputs_[output-1].mode_infos.find(mode)->second;
+
+ return mode_info.width * mode_info.height <= max_configurable_pixels_;
}
virtual void CreateFrameBuffer(
int width,
@@ -222,8 +232,8 @@ class TestDelegate : public OutputConfigurator::Delegate {
std::string actions_;
- // Return value returned by ConfigureCrtc().
- bool configure_crtc_result_;
+ // Simulate pixel-clk limitations
Daniel Erat 2014/01/06 17:15:29 nit: avoid abbreviations ("pixel clock"?) also de
dsodman 2014/01/08 20:55:36 Done.
+ long max_configurable_pixels_;
// Result value of GetHDCPState().
HDCPState hdcp_state_;
@@ -874,6 +884,9 @@ TEST_F(OutputConfiguratorTest, Headless) {
// Connect an external display and check that it's configured correctly.
outputs_[0] = outputs_[1];
+ // Some of the stub routines use the output field to know which output_
+ // it is dealing with
+ outputs_[0].output = 1;
UpdateOutputs(1, true);
EXPECT_EQ(JoinActions(kUpdateXRandR, kGrab,
GetFramebufferAction(kBigModeWidth, kBigModeHeight,
@@ -1019,9 +1032,9 @@ TEST_F(OutputConfiguratorTest, AvoidUnnecessaryProbes) {
EXPECT_FALSE(test_api_.TriggerConfigureTimeout());
EXPECT_EQ(kNoActions, delegate_->GetActionsAndClear());
- // Tell the delegate to report failure, which should result in the
- // second output sticking with its native mode.
- delegate_->set_configure_crtc_result(false);
+ // Lower the limit for which the delegate will succeed, which should result
+ // in the second output sticking with its native mode.
+ delegate_->set_max_configurable_pixels(0);
UpdateOutputs(2, true);
EXPECT_EQ(JoinActions(kUpdateXRandR, kGrab,
GetFramebufferAction(kSmallModeWidth, kSmallModeHeight,
@@ -1033,9 +1046,10 @@ TEST_F(OutputConfiguratorTest, AvoidUnnecessaryProbes) {
kUngrab, kProjectingOn, NULL),
delegate_->GetActionsAndClear());
- // An change event reporting a mode change on the second output should
+ // A change event reporting a mode change on the second output should
// trigger another reconfigure.
- delegate_->set_configure_crtc_result(true);
+ delegate_->set_max_configurable_pixels(
+ TestDelegate::kMaxTestWidth * TestDelegate::kMaxTestHeight);
test_api_.SendOutputChangeEvent(
outputs_[1].output, outputs_[1].crtc, outputs_[1].mirror_mode, true);
EXPECT_TRUE(test_api_.TriggerConfigureTimeout());
@@ -1072,12 +1086,14 @@ TEST_F(OutputConfiguratorTest, PanelFitting) {
// external display to support only the small mode.
outputs_[0].current_mode = kBigModeId;
outputs_[0].native_mode = kBigModeId;
+ outputs_[0].mirror_mode = kBigModeId;
Daniel Erat 2014/01/06 17:15:29 OutputConfigurator is responsible for choosing the
dsodman 2014/01/08 20:55:36 Thanks for the explanation. This is indeed not ne
outputs_[0].mode_infos.clear();
outputs_[0].mode_infos[kBigModeId] = OutputConfigurator::ModeInfo(
kBigModeWidth, kBigModeHeight, false, 60.0);
outputs_[1].current_mode = kSmallModeId;
outputs_[1].native_mode = kSmallModeId;
+ outputs_[1].mirror_mode = kSmallModeId;
outputs_[1].mode_infos.clear();
outputs_[1].mode_infos[kSmallModeId] = OutputConfigurator::ModeInfo(
kSmallModeWidth, kSmallModeHeight, false, 60.0);
@@ -1263,4 +1279,81 @@ TEST_F(OutputConfiguratorTest, CTMForMultiScreens) {
EXPECT_EQ(0, round((kDualWidth - 1) * ctm2.x_offset));
}
+TEST_F(OutputConfiguratorTest, HandleConfigureCrtcFailure) {
+ OutputConfigurator::OutputSnapshot *output;
Daniel Erat 2014/01/06 17:15:29 nit: '*' goes on left side of space
dsodman 2014/01/08 20:55:36 Done.
+ OutputConfigurator::OutputSnapshot backup_output;
+ InitWithSingleOutput();
+ test_api_.SendScreenChangeEvent();
+ EXPECT_EQ(kUpdateXRandR, delegate_->GetActionsAndClear());
+
Daniel Erat 2014/01/06 17:15:29 nit: delete extra blank line
dsodman 2014/01/08 20:55:36 Done.
+
+ // Save the state of output_[0] so that it can be restored
+ // when the test is done
Daniel Erat 2014/01/06 17:15:29 nit: add trailing period
dsodman 2014/01/08 20:55:36 Done.
+ backup_output = outputs_[0];
+ outputs_[0].mode_infos.clear();
+
+ // Give the mode_info list a few reasonable modes
+ output = &outputs_[0];
+ output->mode_infos[11]=OutputConfigurator::ModeInfo(2560, 1600, false, 60.0);
Daniel Erat 2014/01/06 17:15:29 there should be spaces on either side of the equal
dsodman 2014/01/08 20:55:36 Done.
+ output->mode_infos[12]=OutputConfigurator::ModeInfo(1920, 1080, false, 60.0);
+ output->mode_infos[13]=OutputConfigurator::ModeInfo(1920, 1080, false, 40.0);
+ output->mode_infos[14]=OutputConfigurator::ModeInfo(1024, 768, false, 60.0);
+
+ output = &outputs_[1];
+ output->mode_infos[11]=OutputConfigurator::ModeInfo(2560, 1600, false, 60.0);
+ output->mode_infos[12]=OutputConfigurator::ModeInfo(1920, 1080, false, 60.0);
+ output->mode_infos[13]=OutputConfigurator::ModeInfo(1920, 1080, false, 40.0);
+ output->mode_infos[14]=OutputConfigurator::ModeInfo(1024, 768, false, 60.0);
+
+ // This should cause ConfigureCrtc to fail once and get 1920x1080
+ outputs_[0].selected_mode = 11;
+ outputs_[0].mirror_mode = 11;
+ outputs_[1].selected_mode = 11;
+ delegate_->set_max_configurable_pixels(1920*1080);
+
+ configurator_.Init(false);
Daniel Erat 2014/01/06 17:15:29 don't call Init() multiple times; the later call t
dsodman 2014/01/08 20:55:36 Thanks for the explanation. I've tried to update
+ state_controller_.set_state(STATE_SINGLE);
+ UpdateOutputs(1, true);
+ EXPECT_NE(kNoActions, delegate_->GetActionsAndClear());
+ test_api_.SendOutputChangeEvent(
+ outputs_[0].output, outputs_[0].crtc, outputs_[0].selected_mode, true);
Daniel Erat 2014/01/06 17:15:29 UpdateOutputs() should already do this
+ UpdateOutputs(1, true);
+
+ EXPECT_EQ(JoinActions(kUpdateXRandR, kGrab,
+ GetFramebufferAction(TestDelegate::kMaxTestWidth,
+ TestDelegate::kMaxTestHeight,
+ outputs_[0].crtc, 0).c_str(),
+ GetCrtcAction(outputs_[0].crtc, 0, 0, 11,
+ outputs_[0].output).c_str(),
+ GetCrtcAction(outputs_[0].crtc, 0, 0, 12,
+ outputs_[0].output).c_str(),
+ kUngrab, kProjectingOff, NULL),
+ delegate_->GetActionsAndClear());
+
+ configurator_.Init(false);
Daniel Erat 2014/01/06 17:15:29 remove this too
dsodman 2014/01/08 20:55:36 Done.
+ state_controller_.set_state(STATE_DUAL_MIRROR);
+ UpdateOutputs(2, true);
+ EXPECT_NE(kNoActions, delegate_->GetActionsAndClear());
+ test_api_.SendOutputChangeEvent(
+ outputs_[1].output, outputs_[1].crtc, outputs_[1].selected_mode, true);
+ UpdateOutputs(2, true);
+
+ EXPECT_EQ(JoinActions(kUpdateXRandR, kGrab,
+ GetFramebufferAction(TestDelegate::kMaxTestWidth,
+ TestDelegate::kMaxTestHeight,
+ outputs_[0].crtc, outputs_[1].crtc).c_str(),
+ GetCrtcAction(outputs_[0].crtc, 0, 0, 11,
+ outputs_[0].output).c_str(),
+ GetCrtcAction(outputs_[0].crtc, 0, 0, 12,
+ outputs_[0].output).c_str(),
+ kUngrab, kProjectingOn, NULL),
+ delegate_->GetActionsAndClear());
+
+
+ delegate_->set_max_configurable_pixels(
+ TestDelegate::kMaxTestWidth * TestDelegate::kMaxTestHeight);
+
+ outputs_[0] = backup_output;
Daniel Erat 2014/01/06 17:15:29 you shouldn't need to restore anything at the end
dsodman 2014/01/08 20:55:36 Done.
+}
+
} // namespace chromeos
« chromeos/display/output_configurator.cc ('K') | « chromeos/display/output_configurator.cc ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698