summaryrefslogtreecommitdiffstats
path: root/chromeos/display
diff options
context:
space:
mode:
authoroshima@chromium.org <oshima@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2013-06-08 20:54:18 +0000
committeroshima@chromium.org <oshima@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2013-06-08 20:54:18 +0000
commit57bed4df9a25e069dbab4c8907345b9fd7560484 (patch)
treeb9139276b3f0746d1ba36ac25dae16fe6d5b7e41 /chromeos/display
parentfba6f1e25f47218e40b5791c57d6e0505f03e7d3 (diff)
downloadchromium_src-57bed4df9a25e069dbab4c8907345b9fd7560484.zip
chromium_src-57bed4df9a25e069dbab4c8907345b9fd7560484.tar.gz
chromium_src-57bed4df9a25e069dbab4c8907345b9fd7560484.tar.bz2
Compositor reflector, which copies texture onto another compositor.
- added GL utility functions to create and copy texture for mirroring - made sure we don't create two compositor for the same display. - update the mirroring compositor size when the mirror window size changed. - fix a bug that was using int for display ID. changed the initial value for faked display id so that we can catch such error early in test. BUG=239776 TEST=added new tests, plus manually on daisy (mirroring now works on daisy) Committed: https://src.chromium.org/viewvc/chrome?view=rev&revision=205044 Review URL: https://chromiumcodereview.appspot.com/16232013 git-svn-id: svn://svn.chromium.org/chrome/trunk/src@205084 0039d316-1c4b-4281-b951-d872f2087c98
Diffstat (limited to 'chromeos/display')
-rw-r--r--chromeos/display/output_configurator.cc8
-rw-r--r--chromeos/display/output_configurator_unittest.cc12
-rw-r--r--chromeos/display/real_output_configurator_delegate.cc8
3 files changed, 26 insertions, 2 deletions
diff --git a/chromeos/display/output_configurator.cc b/chromeos/display/output_configurator.cc
index 8214d0c..19b28f5 100644
--- a/chromeos/display/output_configurator.cc
+++ b/chromeos/display/output_configurator.cc
@@ -254,8 +254,14 @@ bool OutputConfigurator::SetDisplayMode(OutputState new_state) {
return false;
VLOG(1) << "SetDisplayMode: state=" << OutputStateToString(new_state);
- if (output_state_ == new_state)
+ if (output_state_ == new_state) {
+ // Cancel software mirroring if the state is moving from
+ // STATE_DUAL_EXTENDED to STATE_DUAL_EXTENDED.
+ if (mirroring_controller_ && new_state == STATE_DUAL_EXTENDED)
+ mirroring_controller_->SetSoftwareMirroring(false);
+ NotifyOnDisplayChanged();
return true;
+ }
delegate_->GrabServer();
std::vector<OutputSnapshot> outputs = delegate_->GetOutputs();
diff --git a/chromeos/display/output_configurator_unittest.cc b/chromeos/display/output_configurator_unittest.cc
index 606180c..6deae54 100644
--- a/chromeos/display/output_configurator_unittest.cc
+++ b/chromeos/display/output_configurator_unittest.cc
@@ -406,6 +406,18 @@ TEST_F(OutputConfiguratorTest, ConnectSecondOutput) {
EXPECT_EQ(STATE_DUAL_EXTENDED, configurator_.output_state());
EXPECT_TRUE(mirroring_controller_.software_mirroring_enabled());
+ // Setting STATE_DUAL_MIRROR should try to reconfigure
+ EXPECT_TRUE(configurator_.SetDisplayMode(STATE_DUAL_EXTENDED));
+ EXPECT_EQ(JoinActions(NULL), delegate_->GetActionsAndClear());
+ EXPECT_FALSE(mirroring_controller_.software_mirroring_enabled());
+
+ // Set back to software mirror mode.
+ EXPECT_TRUE(configurator_.SetDisplayMode(STATE_DUAL_MIRROR));
+ EXPECT_EQ(JoinActions(kGrab, kUngrab, NULL),
+ delegate_->GetActionsAndClear());
+ EXPECT_EQ(STATE_DUAL_EXTENDED, configurator_.output_state());
+ EXPECT_TRUE(mirroring_controller_.software_mirroring_enabled());
+
// Disconnect the second output.
UpdateOutputs(1);
EXPECT_TRUE(test_api_.SendOutputChangeEvents(false));
diff --git a/chromeos/display/real_output_configurator_delegate.cc b/chromeos/display/real_output_configurator_delegate.cc
index 30a8494..a44a41b 100644
--- a/chromeos/display/real_output_configurator_delegate.cc
+++ b/chromeos/display/real_output_configurator_delegate.cc
@@ -123,6 +123,13 @@ RealOutputConfiguratorDelegate::GetOutputs() {
to_populate.output = this_id;
to_populate.has_display_id =
GetDisplayId(this_id, i, &to_populate.display_id);
+ to_populate.is_internal = IsInternalOutput(output_info);
+ // Use the index as a valid display id even if the internal
+ // display doesn't have valid EDID because the index
+ // will never change.
+ if (!to_populate.has_display_id && to_populate.is_internal)
+ to_populate.has_display_id = true;
+
(outputs.empty() ? one_info : two_info) = output_info;
// Now, look up the current CRTC and any related info.
@@ -145,7 +152,6 @@ RealOutputConfiguratorDelegate::GetOutputs() {
}
to_populate.native_mode = GetOutputNativeMode(output_info);
- to_populate.is_internal = IsInternalOutput(output_info);
to_populate.is_aspect_preserving_scaling =
IsOutputAspectPreservingScaling(this_id);
to_populate.touch_device_id = None;