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

Side by Side Diff: chromeos/display/output_configurator.cc

Issue 120223003: Support failing modeset (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Update unittest and response to code review 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 unified diff | Download patch | Annotate | Revision Log
OLDNEW
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 <X11/Xlib.h> 7 #include <X11/Xlib.h>
8 #include <X11/extensions/Xrandr.h> 8 #include <X11/extensions/Xrandr.h>
9 #include <X11/extensions/XInput2.h> 9 #include <X11/extensions/XInput2.h>
10 10
(...skipping 794 matching lines...) Expand 10 before | Expand all | Expand 10 after
805 } 805 }
806 mirroring_controller_->SetSoftwareMirroring(enable_software_mirroring); 806 mirroring_controller_->SetSoftwareMirroring(enable_software_mirroring);
807 } 807 }
808 return success; 808 return success;
809 } 809 }
810 810
811 bool OutputConfigurator::EnterState( 811 bool OutputConfigurator::EnterState(
812 OutputState output_state, 812 OutputState output_state,
813 DisplayPowerState power_state) { 813 DisplayPowerState power_state) {
814 std::vector<bool> output_power; 814 std::vector<bool> output_power;
815 bool status;
Daniel Erat 2014/01/08 21:40:28 move this down to the point where you need it, and
dsodman 2014/01/09 00:26:28 Done.
815 int num_on_outputs = GetOutputPower( 816 int num_on_outputs = GetOutputPower(
816 cached_outputs_, power_state, &output_power); 817 cached_outputs_, power_state, &output_power);
817 VLOG(1) << "EnterState: output=" << OutputStateToString(output_state) 818 VLOG(1) << "EnterState: output=" << OutputStateToString(output_state)
818 << " power=" << DisplayPowerStateToString(power_state); 819 << " power=" << DisplayPowerStateToString(power_state);
819 820
820 // Framebuffer dimensions. 821 // Framebuffer dimensions.
821 int width = 0, height = 0; 822 int width = 0, height = 0;
822 std::vector<OutputSnapshot> updated_outputs = cached_outputs_; 823 std::vector<OutputSnapshot> updated_outputs = cached_outputs_;
823 824
824 switch (output_state) { 825 switch (output_state) {
(...skipping 109 matching lines...) Expand 10 before | Expand all | Expand 10 after
934 OutputSnapshot* output = &updated_outputs[i]; 935 OutputSnapshot* output = &updated_outputs[i];
935 if (output->touch_device_id) 936 if (output->touch_device_id)
936 output->transform = GetExtendedModeCTM(*output, width, height); 937 output->transform = GetExtendedModeCTM(*output, width, height);
937 } 938 }
938 break; 939 break;
939 } 940 }
940 } 941 }
941 942
942 // Finally, apply the desired changes. 943 // Finally, apply the desired changes.
943 DCHECK_EQ(cached_outputs_.size(), updated_outputs.size()); 944 DCHECK_EQ(cached_outputs_.size(), updated_outputs.size());
945 status = true;
944 if (!updated_outputs.empty()) { 946 if (!updated_outputs.empty()) {
945 delegate_->CreateFrameBuffer(width, height, updated_outputs); 947 delegate_->CreateFrameBuffer(width, height, updated_outputs);
946 for (size_t i = 0; i < updated_outputs.size(); ++i) { 948 for (size_t i = 0; i < updated_outputs.size(); ++i) {
947 const OutputSnapshot& output = updated_outputs[i]; 949 const OutputSnapshot& output = updated_outputs[i];
948 if (delegate_->ConfigureCrtc(output.crtc, output.current_mode, 950 while (!delegate_->ConfigureCrtc(output.crtc, output.current_mode,
949 output.output, output.x, output.y)) { 951 output.output, output.x, output.y)) {
950 if (output.touch_device_id)
951 delegate_->ConfigureCTM(output.touch_device_id, output.transform);
952 cached_outputs_[i] = updated_outputs[i];
953 } else {
954 LOG(WARNING) << "Unable to configure CRTC " << output.crtc << ":" 952 LOG(WARNING) << "Unable to configure CRTC " << output.crtc << ":"
955 << " mode=" << output.current_mode 953 << " mode=" << output.current_mode
956 << " output=" << output.output 954 << " output=" << output.output
957 << " x=" << output.x 955 << " x=" << output.x
958 << " y=" << output.y; 956 << " y=" << output.y;
957
958 // Find the mode with the next-best resolution and see if that can
959 // be set.
960 int best_mode_pixels = 0;
961 const ModeInfo* mode_info = GetModeInfo(output, output.current_mode);
962 if (!mode_info)
963 break;
964
965 int current_mode_pixels = mode_info->width * mode_info->height;
966 for (ModeInfoMap::const_iterator it = output.mode_infos.begin();
967 it != output.mode_infos.end(); it++) {
Daniel Erat 2014/01/08 21:40:28 nit: indent one more space
dsodman 2014/01/09 00:26:28 Done.
968 int pixel_count = it->second.width * it->second.height;
969 if ((pixel_count < current_mode_pixels) &&
970 (pixel_count > best_mode_pixels)) {
971 updated_outputs[i].current_mode = it->first;
972 best_mode_pixels = pixel_count;
973 }
974 }
975
976 if (best_mode_pixels == 0)
977 break;
959 } 978 }
979
980 // If we are trying to set mirror mode and one of the modeset's fails,
Daniel Erat 2014/01/08 21:40:28 nit: s/modeset's/modesets/
dsodman 2014/01/09 00:26:28 Done.
981 // then the two monitors will be mis-matched. In this case, return
982 // false to let the observers be aware.
983 if (output_state == STATE_DUAL_MIRROR &&
984 output_power[i] &&
985 output.current_mode != output.mirror_mode) {
986 status = false;
987 }
988
989 if (output.touch_device_id)
990 delegate_->ConfigureCTM(output.touch_device_id, output.transform);
991 cached_outputs_[i] = updated_outputs[i];
Daniel Erat 2014/01/08 21:40:28 ConfigureCTM() should only be run and cached_outpu
dsodman 2014/01/09 00:26:28 To be honest, I am not entirely sure what is the i
Daniel Erat 2014/01/09 00:40:34 i'm not an expert on the touch code, but i believe
960 } 992 }
961 } 993 }
962 994
963 output_state_ = output_state; 995 output_state_ = output_state;
964 power_state_ = power_state; 996 power_state_ = power_state;
965 return true; 997 return status;
Daniel Erat 2014/01/08 21:40:28 i'm also not sure whether output_state_ and power_
dsodman 2014/01/09 00:26:28 Done.
966 } 998 }
967 999
968 OutputState OutputConfigurator::ChooseOutputState( 1000 OutputState OutputConfigurator::ChooseOutputState(
969 DisplayPowerState power_state) const { 1001 DisplayPowerState power_state) const {
970 int num_on_outputs = GetOutputPower(cached_outputs_, power_state, NULL); 1002 int num_on_outputs = GetOutputPower(cached_outputs_, power_state, NULL);
971 switch (cached_outputs_.size()) { 1003 switch (cached_outputs_.size()) {
972 case 0: 1004 case 0:
973 return STATE_HEADLESS; 1005 return STATE_HEADLESS;
974 case 1: 1006 case 1:
975 return STATE_SINGLE; 1007 return STATE_SINGLE;
(...skipping 109 matching lines...) Expand 10 before | Expand all | Expand 10 after
1085 float width_ratio = static_cast<float>(mirror_mode_info->width) / 1117 float width_ratio = static_cast<float>(mirror_mode_info->width) /
1086 static_cast<float>(native_mode_info->width); 1118 static_cast<float>(native_mode_info->width);
1087 float height_ratio = static_cast<float>(mirror_mode_info->height) / 1119 float height_ratio = static_cast<float>(mirror_mode_info->height) /
1088 static_cast<float>(native_mode_info->height); 1120 static_cast<float>(native_mode_info->height);
1089 1121
1090 area_ratio = width_ratio * height_ratio; 1122 area_ratio = width_ratio * height_ratio;
1091 return area_ratio; 1123 return area_ratio;
1092 } 1124 }
1093 1125
1094 } // namespace chromeos 1126 } // namespace chromeos
OLDNEW
« no previous file with comments | « no previous file | chromeos/display/output_configurator_unittest.cc » ('j') | chromeos/display/output_configurator_unittest.cc » ('J')

Powered by Google App Engine
This is Rietveld 408576698