Commit 95e122b4 authored by Michael Spang's avatar Michael Spang Committed by Commit Bot

chromecast: Provide display information to display::Screen earlier

Chrome makes synchronous queries of screen geometry during startup. To
satisfy these requests, assume the the first call to configure the
primary display will succeed, and set this geometry in CastScreen
synchronously in the startup case.

DRM platform goes to great lengths to make this strategy work, by
querying display information synchronously in the browser process prior
to GPU process startup. It will also work for FakeDisplayDelegate. Cast
platform is not affected by this change.

BUG=b/74138444
TEST=chromecast browser tests

Change-Id: I68f88b78c151f938f99ed393fe630ecfa5b86dbc
Reviewed-on: https://chromium-review.googlesource.com/952099
Commit-Queue: Michael Spang <spang@chromium.org>
Reviewed-by: default avatarSergey Volk <servolk@chromium.org>
Reviewed-by: default avatarDaniel Nicoara <dnicoara@chromium.org>
Cr-Commit-Position: refs/heads/master@{#541264}
parent 4a8fc9da
...@@ -81,7 +81,7 @@ CastDisplayConfigurator::CastDisplayConfigurator(CastScreen* screen) ...@@ -81,7 +81,7 @@ CastDisplayConfigurator::CastDisplayConfigurator(CastScreen* screen)
if (delegate_) { if (delegate_) {
delegate_->AddObserver(this); delegate_->AddObserver(this);
delegate_->Initialize(); delegate_->Initialize();
OnConfigurationChanged(); ForceInitialConfigure();
} else { } else {
ConfigureDisplayFromCommandLine(); ConfigureDisplayFromCommandLine();
} }
...@@ -95,9 +95,9 @@ CastDisplayConfigurator::~CastDisplayConfigurator() { ...@@ -95,9 +95,9 @@ CastDisplayConfigurator::~CastDisplayConfigurator() {
// display::NativeDisplayObserver interface // display::NativeDisplayObserver interface
void CastDisplayConfigurator::OnConfigurationChanged() { void CastDisplayConfigurator::OnConfigurationChanged() {
DCHECK(delegate_); DCHECK(delegate_);
delegate_->GetDisplays( delegate_->GetDisplays(base::Bind(
base::Bind(&CastDisplayConfigurator::OnDisplaysAcquired, &CastDisplayConfigurator::OnDisplaysAcquired, weak_factory_.GetWeakPtr(),
weak_factory_.GetWeakPtr())); false /* force_initial_configure */));
} }
void CastDisplayConfigurator::ConfigureDisplayFromCommandLine() { void CastDisplayConfigurator::ConfigureDisplayFromCommandLine() {
...@@ -106,7 +106,14 @@ void CastDisplayConfigurator::ConfigureDisplayFromCommandLine() { ...@@ -106,7 +106,14 @@ void CastDisplayConfigurator::ConfigureDisplayFromCommandLine() {
GetRotationFromCommandLine()); GetRotationFromCommandLine());
} }
void CastDisplayConfigurator::ForceInitialConfigure() {
delegate_->GetDisplays(base::Bind(
&CastDisplayConfigurator::OnDisplaysAcquired, weak_factory_.GetWeakPtr(),
true /* force_initial_configure */));
}
void CastDisplayConfigurator::OnDisplaysAcquired( void CastDisplayConfigurator::OnDisplaysAcquired(
bool force_initial_configure,
const std::vector<display::DisplaySnapshot*>& displays) { const std::vector<display::DisplaySnapshot*>& displays) {
DCHECK(delegate_); DCHECK(delegate_);
if (displays.empty()) { if (displays.empty()) {
...@@ -126,6 +133,17 @@ void CastDisplayConfigurator::OnDisplaysAcquired( ...@@ -126,6 +133,17 @@ void CastDisplayConfigurator::OnDisplaysAcquired(
} }
gfx::Point origin; gfx::Point origin;
gfx::Size native_size(display->native_mode()->size());
if (force_initial_configure) {
// For initial configuration, pass the native geometry to gfx::Screen
// before calling Configure(), so that this information is available
// to chrome during startup. Otherwise we will not have a valid display
// during the first queries to display::Screen.
UpdateScreen(display->display_id(), gfx::Rect(origin, native_size),
GetDeviceScaleFactor(native_size),
GetRotationFromCommandLine());
}
delegate_->Configure( delegate_->Configure(
*display, display->native_mode(), origin, *display, display->native_mode(), origin,
base::BindRepeating(&CastDisplayConfigurator::OnDisplayConfigured, base::BindRepeating(&CastDisplayConfigurator::OnDisplayConfigured,
......
...@@ -47,7 +47,9 @@ class CastDisplayConfigurator : public display::NativeDisplayObserver { ...@@ -47,7 +47,9 @@ class CastDisplayConfigurator : public display::NativeDisplayObserver {
void ConfigureDisplayFromCommandLine(); void ConfigureDisplayFromCommandLine();
private: private:
void ForceInitialConfigure();
void OnDisplaysAcquired( void OnDisplaysAcquired(
bool force_initial_configure,
const std::vector<display::DisplaySnapshot*>& displays); const std::vector<display::DisplaySnapshot*>& displays);
void OnDisplayConfigured(display::DisplaySnapshot* display, void OnDisplayConfigured(display::DisplaySnapshot* display,
const display::DisplayMode* mode, const display::DisplayMode* mode,
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment