Commit 214f0dd0 authored by Mark Yacoub's avatar Mark Yacoub Committed by Commit Bot

Ozone: Combine all display configuration requests together.

Put all config requests into a vector and move them together.
Change the callbacks to handle all displays configured together rather than one display at a time.

BUG=1082882
TEST=no changes enabling and disabling displays, display_unittests.

Change-Id: I36859414e1e31e8411f67bac0c3609696cabeece
Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/2237653Reviewed-by: default avatarRobert Sesek <rsesek@chromium.org>
Reviewed-by: default avatarAvi Drissman <avi@chromium.org>
Reviewed-by: default avatarDaniel Nicoara <dnicoara@chromium.org>
Commit-Queue: Robert Sesek <rsesek@chromium.org>
Commit-Queue: Mark Yacoub <markyacoub@google.com>
Auto-Submit: Mark Yacoub <markyacoub@google.com>
Cr-Commit-Position: refs/heads/master@{#789275}
parent 9decd40d
...@@ -133,7 +133,10 @@ void CastDisplayConfigurator::EnableDisplay( ...@@ -133,7 +133,10 @@ void CastDisplayConfigurator::EnableDisplay(
display::DisplayConfigurationParams display_config_params( display::DisplayConfigurationParams display_config_params(
display_->display_id(), gfx::Point(), display_->native_mode()); display_->display_id(), gfx::Point(), display_->native_mode());
delegate_->Configure(display_config_params, std::move(callback)); std::vector<display::DisplayConfigurationParams> config_request;
config_request.push_back(std::move(display_config_params));
delegate_->Configure(config_request, std::move(callback));
} }
void CastDisplayConfigurator::DisableDisplay( void CastDisplayConfigurator::DisableDisplay(
...@@ -143,7 +146,10 @@ void CastDisplayConfigurator::DisableDisplay( ...@@ -143,7 +146,10 @@ void CastDisplayConfigurator::DisableDisplay(
display::DisplayConfigurationParams display_config_params( display::DisplayConfigurationParams display_config_params(
display_->display_id(), gfx::Point(), nullptr); display_->display_id(), gfx::Point(), nullptr);
delegate_->Configure(display_config_params, std::move(callback)); std::vector<display::DisplayConfigurationParams> config_request;
config_request.push_back(std::move(display_config_params));
delegate_->Configure(config_request, std::move(callback));
} }
void CastDisplayConfigurator::ConfigureDisplayFromCommandLine() { void CastDisplayConfigurator::ConfigureDisplayFromCommandLine() {
...@@ -210,8 +216,11 @@ void CastDisplayConfigurator::OnDisplaysAcquired( ...@@ -210,8 +216,11 @@ void CastDisplayConfigurator::OnDisplaysAcquired(
display::DisplayConfigurationParams display_config_params( display::DisplayConfigurationParams display_config_params(
display_->display_id(), origin, display_->native_mode()); display_->display_id(), origin, display_->native_mode());
std::vector<display::DisplayConfigurationParams> config_request;
config_request.push_back(std::move(display_config_params));
delegate_->Configure( delegate_->Configure(
display_config_params, config_request,
base::BindRepeating(&CastDisplayConfigurator::OnDisplayConfigured, base::BindRepeating(&CastDisplayConfigurator::OnDisplayConfigured,
weak_factory_.GetWeakPtr(), display_, weak_factory_.GetWeakPtr(), display_,
display_->native_mode(), origin)); display_->native_mode(), origin));
...@@ -221,12 +230,14 @@ void CastDisplayConfigurator::OnDisplayConfigured( ...@@ -221,12 +230,14 @@ void CastDisplayConfigurator::OnDisplayConfigured(
display::DisplaySnapshot* display, display::DisplaySnapshot* display,
const display::DisplayMode* mode, const display::DisplayMode* mode,
const gfx::Point& origin, const gfx::Point& origin,
bool success) { const base::flat_map<int64_t, bool>& statuses) {
DCHECK(display); DCHECK(display);
DCHECK(mode); DCHECK(mode);
DCHECK_EQ(display, display_); DCHECK_EQ(display, display_);
DCHECK_EQ(statuses.size(), 1UL);
const gfx::Rect bounds(origin, mode->size()); const gfx::Rect bounds(origin, mode->size());
bool success = statuses.at(display_->display_id());
DVLOG(1) << __func__ << " success=" << success DVLOG(1) << __func__ << " success=" << success
<< " bounds=" << bounds.ToString(); << " bounds=" << bounds.ToString();
if (success) { if (success) {
......
...@@ -8,9 +8,11 @@ ...@@ -8,9 +8,11 @@
#include <memory> #include <memory>
#include <vector> #include <vector>
#include "base/containers/flat_map.h"
#include "base/macros.h" #include "base/macros.h"
#include "base/memory/weak_ptr.h" #include "base/memory/weak_ptr.h"
#include "ui/display/display.h" #include "ui/display/display.h"
#include "ui/display/types/display_configuration_params.h"
#include "ui/display/types/native_display_delegate.h" #include "ui/display/types/native_display_delegate.h"
#include "ui/display/types/native_display_observer.h" #include "ui/display/types/native_display_observer.h"
...@@ -62,7 +64,7 @@ class CastDisplayConfigurator : public display::NativeDisplayObserver { ...@@ -62,7 +64,7 @@ class CastDisplayConfigurator : public display::NativeDisplayObserver {
void OnDisplayConfigured(display::DisplaySnapshot* display, void OnDisplayConfigured(display::DisplaySnapshot* display,
const display::DisplayMode* mode, const display::DisplayMode* mode,
const gfx::Point& origin, const gfx::Point& origin,
bool success); const base::flat_map<int64_t, bool>& statuses);
void UpdateScreen(int64_t display_id, void UpdateScreen(int64_t display_id,
const gfx::Rect& bounds, const gfx::Rect& bounds,
float device_scale_factor, float device_scale_factor,
......
...@@ -130,34 +130,36 @@ void FakeDisplayDelegate::GetDisplays(GetDisplaysCallback callback) { ...@@ -130,34 +130,36 @@ void FakeDisplayDelegate::GetDisplays(GetDisplaysCallback callback) {
} }
void FakeDisplayDelegate::Configure( void FakeDisplayDelegate::Configure(
const display::DisplayConfigurationParams& display_config_params, const std::vector<display::DisplayConfigurationParams>& config_requests,
ConfigureCallback callback) { ConfigureCallback callback) {
bool configure_success = false; base::flat_map<int64_t, bool> statuses;
for (const auto& config : config_requests) {
if (display_config_params.mode.has_value()) { bool configure_success = false;
// Find display snapshot of display ID.
auto snapshot = find_if( if (config.mode.has_value()) {
displays_.begin(), displays_.end(), // Find display snapshot of display ID.
[&display_config_params](std::unique_ptr<DisplaySnapshot>& snapshot) { auto snapshot =
return snapshot->display_id() == display_config_params.id; find_if(displays_.begin(), displays_.end(),
}); [&config](std::unique_ptr<DisplaySnapshot>& snapshot) {
if (snapshot != displays_.end()) { return snapshot->display_id() == config.id;
// Check that config mode is appropriate for the display snapshot. });
for (const auto& existing_mode : snapshot->get()->modes()) { if (snapshot != displays_.end()) {
if (AreModesEqual(*existing_mode.get(), // Check that config mode is appropriate for the display snapshot.
*display_config_params.mode.value().get())) { for (const auto& existing_mode : snapshot->get()->modes()) {
configure_success = true; if (AreModesEqual(*existing_mode.get(), *config.mode.value().get())) {
break; configure_success = true;
break;
}
} }
} }
} else {
// This is a request to turn off the display.
configure_success = true;
} }
} else { statuses.insert(std::make_pair(config.id, configure_success));
// This is a request to turn off the display.
configure_success = true;
} }
configure_callbacks_.push( configure_callbacks_.push(base::BindOnce(std::move(callback), statuses));
base::BindOnce(std::move(callback), configure_success));
// Start the timer if it's not already running. If there are multiple queued // Start the timer if it's not already running. If there are multiple queued
// configuration requests then ConfigureDone() will handle starting the // configuration requests then ConfigureDone() will handle starting the
......
...@@ -84,7 +84,7 @@ class FAKE_DISPLAY_EXPORT FakeDisplayDelegate : public NativeDisplayDelegate, ...@@ -84,7 +84,7 @@ class FAKE_DISPLAY_EXPORT FakeDisplayDelegate : public NativeDisplayDelegate,
void RelinquishDisplayControl(DisplayControlCallback callback) override; void RelinquishDisplayControl(DisplayControlCallback callback) override;
void GetDisplays(GetDisplaysCallback callback) override; void GetDisplays(GetDisplaysCallback callback) override;
void Configure( void Configure(
const display::DisplayConfigurationParams& display_config_params, const std::vector<display::DisplayConfigurationParams>& config_requests,
ConfigureCallback callback) override; ConfigureCallback callback) override;
void GetHDCPState(const DisplaySnapshot& output, void GetHDCPState(const DisplaySnapshot& output,
GetHDCPStateCallback callback) override; GetHDCPStateCallback callback) override;
......
...@@ -73,6 +73,15 @@ int ComputeDisplayResolutionEnum(const DisplayMode* mode) { ...@@ -73,6 +73,15 @@ int ComputeDisplayResolutionEnum(const DisplayMode* mode) {
return width_idx * base::size(kDisplayResolutionSamples) + height_idx + 1; return width_idx * base::size(kDisplayResolutionSamples) + height_idx + 1;
} }
std::__wrap_iter<const DisplayConfigureRequest*> GetRequestForDisplayId(
int64_t display_id,
const std::vector<DisplayConfigureRequest>& requests) {
return find_if(requests.begin(), requests.end(),
[display_id](const DisplayConfigureRequest& request) {
return request.display->display_id() == display_id;
});
}
} // namespace } // namespace
DisplayConfigureRequest::DisplayConfigureRequest(DisplaySnapshot* display, DisplayConfigureRequest::DisplayConfigureRequest(DisplaySnapshot* display,
...@@ -110,32 +119,40 @@ void ConfigureDisplaysTask::Run() { ...@@ -110,32 +119,40 @@ void ConfigureDisplaysTask::Run() {
{ {
base::AutoReset<bool> recursivity_guard(&is_configuring_, true); base::AutoReset<bool> recursivity_guard(&is_configuring_, true);
while (!pending_request_indexes_.empty()) { while (!pending_request_indexes_.empty()) {
size_t index = pending_request_indexes_.front(); // Loop over all the current requests, then it will loop again making sure
DisplayConfigureRequest* request = &requests_[index]; // no new requests were added and are pending.
pending_request_indexes_.pop(); std::vector<display::DisplayConfigurationParams> config_requests;
const bool internal = for (size_t i = 0; i < pending_request_indexes_.size(); ++i) {
request->display->type() == DISPLAY_CONNECTION_TYPE_INTERNAL; size_t index = pending_request_indexes_.front();
base::UmaHistogramExactLinear( DisplayConfigureRequest* request = &requests_[index];
internal ? "ConfigureDisplays.Internal.Modeset.Resolution" pending_request_indexes_.pop();
: "ConfigureDisplays.External.Modeset.Resolution",
ComputeDisplayResolutionEnum(request->mode), const bool internal =
base::size(kDisplayResolutionSamples) * request->display->type() == DISPLAY_CONNECTION_TYPE_INTERNAL;
base::size(kDisplayResolutionSamples) + base::UmaHistogramExactLinear(
2); internal ? "ConfigureDisplays.Internal.Modeset.Resolution"
: "ConfigureDisplays.External.Modeset.Resolution",
base::HistogramBase* histogram = base::LinearHistogram::FactoryGet( ComputeDisplayResolutionEnum(request->mode),
internal ? "ConfigureDisplays.Internal.Modeset.RefreshRate" base::size(kDisplayResolutionSamples) *
: "ConfigureDisplays.External.Modeset.RefreshRate", base::size(kDisplayResolutionSamples) +
1, 240, 18, base::HistogramBase::kUmaTargetedHistogramFlag); 2);
histogram->Add(request->mode ? std::round(request->mode->refresh_rate()) base::HistogramBase* histogram = base::LinearHistogram::FactoryGet(
: 0); internal ? "ConfigureDisplays.Internal.Modeset.RefreshRate"
: "ConfigureDisplays.External.Modeset.RefreshRate",
display::DisplayConfigurationParams display_config_params( 1, 240, 18, base::HistogramBase::kUmaTargetedHistogramFlag);
request->display->display_id(), request->origin, request->mode); histogram->Add(request->mode ? std::round(request->mode->refresh_rate())
delegate_->Configure( : 0);
display_config_params,
base::BindOnce(&ConfigureDisplaysTask::OnConfigured, display::DisplayConfigurationParams display_config_params(
weak_ptr_factory_.GetWeakPtr(), index)); request->display->display_id(), request->origin, request->mode);
config_requests.push_back(std::move(display_config_params));
}
if (!config_requests.empty()) {
delegate_->Configure(
config_requests,
base::BindOnce(&ConfigureDisplaysTask::OnConfigured,
weak_ptr_factory_.GetWeakPtr()));
}
} }
} }
...@@ -156,44 +173,83 @@ void ConfigureDisplaysTask::OnDisplaySnapshotsInvalidated() { ...@@ -156,44 +173,83 @@ void ConfigureDisplaysTask::OnDisplaySnapshotsInvalidated() {
Run(); Run();
} }
void ConfigureDisplaysTask::OnConfigured(size_t index, bool success) { void ConfigureDisplaysTask::OnConfigured(
DisplayConfigureRequest* request = &requests_[index]; const base::flat_map<int64_t, bool>& statuses) {
VLOG(2) << "Configured status=" << success bool config_success = true;
<< " display=" << request->display->display_id()
<< " origin=" << request->origin.ToString() // Check if all displays are successfully configured.
<< " mode=" << (request->mode ? request->mode->ToString() : "null"); for (const auto& status : statuses) {
int64_t display_id = status.first;
const bool internal = bool display_success = status.second;
request->display->type() == DISPLAY_CONNECTION_TYPE_INTERNAL; config_success &= display_success;
base::UmaHistogramBoolean(
internal ? "ConfigureDisplays.Internal.Modeset.AttemptSucceeded" auto request = GetRequestForDisplayId(display_id, requests_);
: "ConfigureDisplays.External.Modeset.AttemptSucceeded", DCHECK(request != requests_.end());
success);
VLOG(2) << "Configured status=" << display_success
if (!success) { << " display=" << request->display->display_id()
request->mode = FindNextMode(*request->display, request->mode); << " origin=" << request->origin.ToString()
if (request->mode) { << " mode=" << (request->mode ? request->mode->ToString() : "null");
pending_request_indexes_.push(index);
bool internal =
request->display->type() == DISPLAY_CONNECTION_TYPE_INTERNAL;
base::UmaHistogramBoolean(
internal ? "ConfigureDisplays.Internal.Modeset.AttemptSucceeded"
: "ConfigureDisplays.External.Modeset.AttemptSucceeded",
display_success);
}
if (config_success) {
for (const auto& status : statuses) {
auto request = GetRequestForDisplayId(status.first, requests_);
request->display->set_current_mode(request->mode);
request->display->set_origin(request->origin);
}
} else {
bool should_reconfigure = false;
// For the failing config, check if there is another mode to be requested.
// If there is one, attempt to reconfigure everything again.
for (const auto& status : statuses) {
int64_t display_id = status.first;
bool display_success = status.second;
if (!display_success) {
const DisplayConfigureRequest* request =
GetRequestForDisplayId(display_id, requests_).base();
const_cast<DisplayConfigureRequest*>(request)->mode =
FindNextMode(*request->display, request->mode);
should_reconfigure = !!request->mode;
}
}
// When reconfiguring, reconfigure all displays, not only the failing ones
// as they could potentially depend on each other.
if (should_reconfigure) {
for (const auto& status : statuses) {
auto const_iterator = GetRequestForDisplayId(status.first, requests_);
auto request = requests_.erase(const_iterator, const_iterator);
size_t index = std::distance(requests_.begin(), request);
pending_request_indexes_.push(index);
}
if (task_status_ == SUCCESS) if (task_status_ == SUCCESS)
task_status_ = PARTIAL_SUCCESS; task_status_ = PARTIAL_SUCCESS;
Run(); Run();
return; return;
} }
} else {
request->display->set_current_mode(request->mode);
request->display->set_origin(request->origin);
} }
num_displays_configured_++; // If no reconfigurations are happening, update the final state.
for (const auto& status : statuses) {
auto request = GetRequestForDisplayId(status.first, requests_);
bool internal =
request->display->type() == DISPLAY_CONNECTION_TYPE_INTERNAL;
base::UmaHistogramBoolean(
internal ? "ConfigureDisplays.Internal.Modeset.FinalStatus"
: "ConfigureDisplays.External.Modeset.FinalStatus",
config_success);
}
base::UmaHistogramBoolean( num_displays_configured_ += statuses.size();
internal ? "ConfigureDisplays.Internal.Modeset.FinalStatus" if (!config_success)
: "ConfigureDisplays.External.Modeset.FinalStatus",
success);
if (!success)
task_status_ = ERROR; task_status_ = ERROR;
Run(); Run();
} }
......
...@@ -11,6 +11,7 @@ ...@@ -11,6 +11,7 @@
#include <vector> #include <vector>
#include "base/callback.h" #include "base/callback.h"
#include "base/containers/flat_map.h"
#include "base/containers/queue.h" #include "base/containers/queue.h"
#include "base/macros.h" #include "base/macros.h"
#include "base/memory/weak_ptr.h" #include "base/memory/weak_ptr.h"
...@@ -65,7 +66,7 @@ class DISPLAY_MANAGER_EXPORT ConfigureDisplaysTask ...@@ -65,7 +66,7 @@ class DISPLAY_MANAGER_EXPORT ConfigureDisplaysTask
void OnDisplaySnapshotsInvalidated() override; void OnDisplaySnapshotsInvalidated() override;
private: private:
void OnConfigured(size_t index, bool success); void OnConfigured(const base::flat_map<int64_t, bool>& statuses);
NativeDisplayDelegate* delegate_; // Not owned. NativeDisplayDelegate* delegate_; // Not owned.
......
...@@ -70,14 +70,17 @@ bool TestNativeDisplayDelegate::Configure( ...@@ -70,14 +70,17 @@ bool TestNativeDisplayDelegate::Configure(
} }
void TestNativeDisplayDelegate::Configure( void TestNativeDisplayDelegate::Configure(
const display::DisplayConfigurationParams& display_config_params, const std::vector<display::DisplayConfigurationParams>& config_requests,
ConfigureCallback callback) { ConfigureCallback callback) {
bool result = Configure(display_config_params); base::flat_map<int64_t, bool> statuses;
for (const auto& config : config_requests)
statuses.insert(std::make_pair(config.id, Configure(config)));
if (run_async_) { if (run_async_) {
base::ThreadTaskRunnerHandle::Get()->PostTask( base::ThreadTaskRunnerHandle::Get()->PostTask(
FROM_HERE, base::BindOnce(std::move(callback), result)); FROM_HERE, base::BindOnce(std::move(callback), statuses));
} else { } else {
std::move(callback).Run(result); std::move(callback).Run(statuses);
} }
} }
......
...@@ -58,7 +58,7 @@ class TestNativeDisplayDelegate : public NativeDisplayDelegate { ...@@ -58,7 +58,7 @@ class TestNativeDisplayDelegate : public NativeDisplayDelegate {
void RelinquishDisplayControl(DisplayControlCallback callback) override; void RelinquishDisplayControl(DisplayControlCallback callback) override;
void GetDisplays(GetDisplaysCallback callback) override; void GetDisplays(GetDisplaysCallback callback) override;
void Configure( void Configure(
const display::DisplayConfigurationParams& display_config_params, const std::vector<display::DisplayConfigurationParams>& config_requests,
ConfigureCallback callback) override; ConfigureCallback callback) override;
void GetHDCPState(const DisplaySnapshot& output, void GetHDCPState(const DisplaySnapshot& output,
GetHDCPStateCallback callback) override; GetHDCPStateCallback callback) override;
......
...@@ -7,6 +7,20 @@ ...@@ -7,6 +7,20 @@
namespace display { namespace display {
DisplayConfigurationParams::DisplayConfigurationParams() = default; DisplayConfigurationParams::DisplayConfigurationParams() = default;
DisplayConfigurationParams::DisplayConfigurationParams(
DisplayConfigurationParams& other)
: id(other.id), origin(other.origin) {
if (other.mode)
mode = other.mode->get()->Clone();
}
DisplayConfigurationParams::DisplayConfigurationParams(
DisplayConfigurationParams&& other)
: id(other.id), origin(other.origin) {
if (other.mode)
mode = other.mode->get()->Clone();
}
DisplayConfigurationParams::DisplayConfigurationParams( DisplayConfigurationParams::DisplayConfigurationParams(
int64_t id, int64_t id,
const gfx::Point& origin, const gfx::Point& origin,
......
...@@ -16,6 +16,8 @@ namespace display { ...@@ -16,6 +16,8 @@ namespace display {
struct DISPLAY_TYPES_EXPORT DisplayConfigurationParams { struct DISPLAY_TYPES_EXPORT DisplayConfigurationParams {
DisplayConfigurationParams(); DisplayConfigurationParams();
DisplayConfigurationParams(DisplayConfigurationParams& other);
DisplayConfigurationParams(DisplayConfigurationParams&& other);
DisplayConfigurationParams(int64_t id, DisplayConfigurationParams(int64_t id,
const gfx::Point& origin, const gfx::Point& origin,
const display::DisplayMode* pmode); const display::DisplayMode* pmode);
......
...@@ -10,6 +10,7 @@ ...@@ -10,6 +10,7 @@
#include <vector> #include <vector>
#include "base/callback.h" #include "base/callback.h"
#include "base/containers/flat_map.h"
#include "ui/display/types/display_configuration_params.h" #include "ui/display/types/display_configuration_params.h"
#include "ui/display/types/display_constants.h" #include "ui/display/types/display_constants.h"
#include "ui/display/types/display_types_export.h" #include "ui/display/types/display_types_export.h"
...@@ -24,7 +25,8 @@ struct DisplayConfigurationParams; ...@@ -24,7 +25,8 @@ struct DisplayConfigurationParams;
using GetDisplaysCallback = using GetDisplaysCallback =
base::OnceCallback<void(const std::vector<DisplaySnapshot*>&)>; base::OnceCallback<void(const std::vector<DisplaySnapshot*>&)>;
using ConfigureCallback = base::OnceCallback<void(bool)>; using ConfigureCallback =
base::OnceCallback<void(const base::flat_map<int64_t, bool>&)>;
using GetHDCPStateCallback = base::OnceCallback<void(bool, HDCPState)>; using GetHDCPStateCallback = base::OnceCallback<void(bool, HDCPState)>;
using SetHDCPStateCallback = base::OnceCallback<void(bool)>; using SetHDCPStateCallback = base::OnceCallback<void(bool)>;
using DisplayControlCallback = base::OnceCallback<void(bool)>; using DisplayControlCallback = base::OnceCallback<void(bool)>;
...@@ -56,7 +58,7 @@ class DISPLAY_TYPES_EXPORT NativeDisplayDelegate { ...@@ -56,7 +58,7 @@ class DISPLAY_TYPES_EXPORT NativeDisplayDelegate {
// represents disabling the display. The callback will return the status of // represents disabling the display. The callback will return the status of
// the operation. // the operation.
virtual void Configure( virtual void Configure(
const display::DisplayConfigurationParams& display_config_params, const std::vector<display::DisplayConfigurationParams>& config_requests,
ConfigureCallback callback) = 0; ConfigureCallback callback) = 0;
// Gets HDCP state of output. // Gets HDCP state of output.
......
...@@ -89,10 +89,12 @@ void WindowManager::OnDisplaysAcquired( ...@@ -89,10 +89,12 @@ void WindowManager::OnDisplaysAcquired(
display::DisplayConfigurationParams display_config_params( display::DisplayConfigurationParams display_config_params(
display->display_id(), origin, display->native_mode()); display->display_id(), origin, display->native_mode());
std::vector<display::DisplayConfigurationParams> config_request;
config_request.push_back(std::move(display_config_params));
delegate_->Configure( delegate_->Configure(
display_config_params, config_request,
base::BindOnce(&WindowManager::OnDisplayConfigured, base::BindOnce(&WindowManager::OnDisplayConfigured,
base::Unretained(this), base::Unretained(this), display->display_id(),
gfx::Rect(origin, display->native_mode()->size()))); gfx::Rect(origin, display->native_mode()->size())));
origin.Offset(display->native_mode()->size().width(), 0); origin.Offset(display->native_mode()->size().width(), 0);
} }
...@@ -106,8 +108,13 @@ void WindowManager::OnDisplaysAcquired( ...@@ -106,8 +108,13 @@ void WindowManager::OnDisplaysAcquired(
} }
} }
void WindowManager::OnDisplayConfigured(const gfx::Rect& bounds, bool success) { void WindowManager::OnDisplayConfigured(
if (success) { const int64_t display_id,
const gfx::Rect& bounds,
const base::flat_map<int64_t, bool>& statuses) {
DCHECK_EQ(statuses.size(), 1UL);
if (statuses.at(display_id)) {
std::unique_ptr<DemoWindow> window( std::unique_ptr<DemoWindow> window(
new DemoWindow(this, renderer_factory_.get(), bounds)); new DemoWindow(this, renderer_factory_.get(), bounds));
window->Start(); window->Start();
......
...@@ -9,6 +9,7 @@ ...@@ -9,6 +9,7 @@
#include <vector> #include <vector>
#include "base/callback.h" #include "base/callback.h"
#include "base/containers/flat_map.h"
#include "ui/display/types/native_display_observer.h" #include "ui/display/types/native_display_observer.h"
#include "ui/gfx/geometry/rect.h" #include "ui/gfx/geometry/rect.h"
#include "ui/ozone/demo/renderer_factory.h" #include "ui/ozone/demo/renderer_factory.h"
...@@ -38,7 +39,9 @@ class WindowManager : public display::NativeDisplayObserver { ...@@ -38,7 +39,9 @@ class WindowManager : public display::NativeDisplayObserver {
private: private:
void OnDisplaysAcquired( void OnDisplaysAcquired(
const std::vector<display::DisplaySnapshot*>& displays); const std::vector<display::DisplaySnapshot*>& displays);
void OnDisplayConfigured(const gfx::Rect& bounds, bool success); void OnDisplayConfigured(const int64_t display_id,
const gfx::Rect& bounds,
const base::flat_map<int64_t, bool>& statuses);
// display::NativeDisplayDelegate: // display::NativeDisplayDelegate:
void OnConfigurationChanged() override; void OnConfigurationChanged() override;
......
...@@ -325,19 +325,23 @@ void DrmThread::RefreshNativeDisplays( ...@@ -325,19 +325,23 @@ void DrmThread::RefreshNativeDisplays(
std::move(callback).Run(display_manager_->GetDisplays()); std::move(callback).Run(display_manager_->GetDisplays());
} }
void DrmThread::ConfigureNativeDisplay( void DrmThread::ConfigureNativeDisplays(
const display::DisplayConfigurationParams& display_config_params, const std::vector<display::DisplayConfigurationParams>& config_requests,
base::OnceCallback<void(bool)> callback) { base::OnceCallback<void(const base::flat_map<int64_t, bool>&)> callback) {
TRACE_EVENT0("drm", "DrmThread::ConfigureNativeDisplay"); TRACE_EVENT0("drm", "DrmThread::ConfigureNativeDisplays");
if (display_config_params.mode) { base::flat_map<int64_t, bool> statuses;
std::move(callback).Run(display_manager_->ConfigureDisplay( for (const auto& config : config_requests) {
display_config_params.id, *display_config_params.mode.value(), bool status = false;
display_config_params.origin)); if (config.mode) {
} else { status = display_manager_->ConfigureDisplay(
std::move(callback).Run( config.id, *config.mode.value(), config.origin);
display_manager_->DisableDisplay(display_config_params.id)); } else {
status = display_manager_->DisableDisplay(config.id);
}
statuses.insert(std::make_pair(config.id, status));
} }
std::move(callback).Run(statuses);
} }
void DrmThread::TakeDisplayControl(base::OnceCallback<void(bool)> callback) { void DrmThread::TakeDisplayControl(base::OnceCallback<void(bool)> callback) {
......
...@@ -147,9 +147,9 @@ class DrmThread : public base::Thread, ...@@ -147,9 +147,9 @@ class DrmThread : public base::Thread,
base::OnceCallback<void(MovableDisplaySnapshots)> callback) override; base::OnceCallback<void(MovableDisplaySnapshots)> callback) override;
void AddGraphicsDevice(const base::FilePath& path, base::File file) override; void AddGraphicsDevice(const base::FilePath& path, base::File file) override;
void RemoveGraphicsDevice(const base::FilePath& path) override; void RemoveGraphicsDevice(const base::FilePath& path) override;
void ConfigureNativeDisplay( void ConfigureNativeDisplays(
const display::DisplayConfigurationParams& display_config_params, const std::vector<display::DisplayConfigurationParams>& config_requests,
base::OnceCallback<void(bool)> callback) override; ConfigureNativeDisplaysCallback callback) override;
void GetHDCPState(int64_t display_id, void GetHDCPState(int64_t display_id,
base::OnceCallback<void(int64_t, bool, display::HDCPState)> base::OnceCallback<void(int64_t, bool, display::HDCPState)>
callback) override; callback) override;
......
...@@ -35,18 +35,6 @@ void DrmDisplayHost::UpdateDisplaySnapshot( ...@@ -35,18 +35,6 @@ void DrmDisplayHost::UpdateDisplaySnapshot(
snapshot_ = std::move(params); snapshot_ = std::move(params);
} }
void DrmDisplayHost::Configure(
const display::DisplayConfigurationParams& display_config_params,
display::ConfigureCallback callback) {
if (is_dummy_) {
std::move(callback).Run(true);
return;
}
sender_->GpuConfigureNativeDisplay(display_config_params,
std::move(callback));
}
void DrmDisplayHost::GetHDCPState(display::GetHDCPStateCallback callback) { void DrmDisplayHost::GetHDCPState(display::GetHDCPStateCallback callback) {
get_hdcp_callback_ = std::move(callback); get_hdcp_callback_ = std::move(callback);
if (!sender_->GpuGetHDCPState(snapshot_->display_id())) if (!sender_->GpuGetHDCPState(snapshot_->display_id()))
......
...@@ -29,11 +29,9 @@ class DrmDisplayHost : public GpuThreadObserver { ...@@ -29,11 +29,9 @@ class DrmDisplayHost : public GpuThreadObserver {
~DrmDisplayHost() override; ~DrmDisplayHost() override;
display::DisplaySnapshot* snapshot() const { return snapshot_.get(); } display::DisplaySnapshot* snapshot() const { return snapshot_.get(); }
bool is_dummy() const { return is_dummy_; }
void UpdateDisplaySnapshot(std::unique_ptr<display::DisplaySnapshot> params); void UpdateDisplaySnapshot(std::unique_ptr<display::DisplaySnapshot> params);
void Configure(
const display::DisplayConfigurationParams& display_config_params,
display::ConfigureCallback callback);
void GetHDCPState(display::GetHDCPStateCallback callback); void GetHDCPState(display::GetHDCPStateCallback callback);
void SetHDCPState(display::HDCPState state, void SetHDCPState(display::HDCPState state,
display::SetHDCPStateCallback callback); display::SetHDCPStateCallback callback);
......
...@@ -234,6 +234,23 @@ void DrmDisplayHostManager::UpdateDisplays( ...@@ -234,6 +234,23 @@ void DrmDisplayHostManager::UpdateDisplays(
} }
} }
void DrmDisplayHostManager::ConfigureDisplays(
const std::vector<display::DisplayConfigurationParams>& config_requests,
display::ConfigureCallback callback) {
base::flat_map<int64_t, bool> dummy_statuses;
bool is_any_dummy = false;
for (auto& config : config_requests) {
is_any_dummy |= GetDisplay(config.id)->is_dummy();
dummy_statuses.insert(std::make_pair(config.id, true));
}
if (is_any_dummy) {
std::move(callback).Run(dummy_statuses);
return;
}
proxy_->GpuConfigureNativeDisplays(config_requests, std::move(callback));
}
void DrmDisplayHostManager::OnDeviceEvent(const DeviceEvent& event) { void DrmDisplayHostManager::OnDeviceEvent(const DeviceEvent& event) {
if (event.device_type() != DeviceEvent::DISPLAY) if (event.device_type() != DeviceEvent::DISPLAY)
return; return;
......
...@@ -51,6 +51,9 @@ class DrmDisplayHostManager : public DeviceEventObserver, GpuThreadObserver { ...@@ -51,6 +51,9 @@ class DrmDisplayHostManager : public DeviceEventObserver, GpuThreadObserver {
void TakeDisplayControl(display::DisplayControlCallback callback); void TakeDisplayControl(display::DisplayControlCallback callback);
void RelinquishDisplayControl(display::DisplayControlCallback callback); void RelinquishDisplayControl(display::DisplayControlCallback callback);
void UpdateDisplays(display::GetDisplaysCallback callback); void UpdateDisplays(display::GetDisplaysCallback callback);
void ConfigureDisplays(
const std::vector<display::DisplayConfigurationParams>& config_requests,
display::ConfigureCallback callback);
// DeviceEventObserver overrides: // DeviceEventObserver overrides:
void OnDeviceEvent(const DeviceEvent& event) override; void OnDeviceEvent(const DeviceEvent& event) override;
......
...@@ -51,11 +51,9 @@ void DrmNativeDisplayDelegate::GetDisplays( ...@@ -51,11 +51,9 @@ void DrmNativeDisplayDelegate::GetDisplays(
} }
void DrmNativeDisplayDelegate::Configure( void DrmNativeDisplayDelegate::Configure(
const display::DisplayConfigurationParams& display_config_params, const std::vector<display::DisplayConfigurationParams>& config_requests,
display::ConfigureCallback callback) { display::ConfigureCallback callback) {
DrmDisplayHost* display = display_manager_->ConfigureDisplays(config_requests, std::move(callback));
display_manager_->GetDisplay(display_config_params.id);
display->Configure(display_config_params, std::move(callback));
} }
void DrmNativeDisplayDelegate::GetHDCPState( void DrmNativeDisplayDelegate::GetHDCPState(
......
...@@ -30,7 +30,7 @@ class DrmNativeDisplayDelegate : public display::NativeDisplayDelegate { ...@@ -30,7 +30,7 @@ class DrmNativeDisplayDelegate : public display::NativeDisplayDelegate {
display::DisplayControlCallback callback) override; display::DisplayControlCallback callback) override;
void GetDisplays(display::GetDisplaysCallback callback) override; void GetDisplays(display::GetDisplaysCallback callback) override;
void Configure( void Configure(
const display::DisplayConfigurationParams& display_config_params, const std::vector<display::DisplayConfigurationParams>& config_requests,
display::ConfigureCallback callback) override; display::ConfigureCallback callback) override;
void GetHDCPState(const display::DisplaySnapshot& output, void GetHDCPState(const display::DisplaySnapshot& output,
display::GetHDCPStateCallback callback) override; display::GetHDCPStateCallback callback) override;
......
...@@ -44,8 +44,8 @@ class GpuThreadAdapter { ...@@ -44,8 +44,8 @@ class GpuThreadAdapter {
virtual bool GpuRemoveGraphicsDevice(const base::FilePath& path) = 0; virtual bool GpuRemoveGraphicsDevice(const base::FilePath& path) = 0;
// Services needed by DrmDisplayHost // Services needed by DrmDisplayHost
virtual void GpuConfigureNativeDisplay( virtual void GpuConfigureNativeDisplays(
const display::DisplayConfigurationParams& display_config_params, const std::vector<display::DisplayConfigurationParams>& config_requests,
display::ConfigureCallback callback) = 0; display::ConfigureCallback callback) = 0;
virtual bool GpuGetHDCPState(int64_t display_id) = 0; virtual bool GpuGetHDCPState(int64_t display_id) = 0;
virtual bool GpuSetHDCPState(int64_t display_id, virtual bool GpuSetHDCPState(int64_t display_id,
......
...@@ -128,15 +128,18 @@ bool HostDrmDevice::GpuRefreshNativeDisplays() { ...@@ -128,15 +128,18 @@ bool HostDrmDevice::GpuRefreshNativeDisplays() {
return true; return true;
} }
void HostDrmDevice::GpuConfigureNativeDisplay( void HostDrmDevice::GpuConfigureNativeDisplays(
const display::DisplayConfigurationParams& display_config_params, const std::vector<display::DisplayConfigurationParams>& config_requests,
display::ConfigureCallback callback) { display::ConfigureCallback callback) {
DCHECK_CALLED_ON_VALID_THREAD(on_ui_thread_); DCHECK_CALLED_ON_VALID_THREAD(on_ui_thread_);
if (IsConnected()) { if (IsConnected()) {
drm_device_->ConfigureNativeDisplay(display_config_params, drm_device_->ConfigureNativeDisplays(config_requests, std::move(callback));
std::move(callback));
} else { } else {
std::move(callback).Run(false); // If not connected, report failure to config.
base::flat_map<int64_t, bool> dummy_statuses;
for (const auto& config : config_requests)
dummy_statuses.insert(std::make_pair(config.id, false));
std::move(callback).Run(dummy_statuses);
} }
} }
......
...@@ -65,8 +65,8 @@ class HostDrmDevice : public base::RefCountedThreadSafe<HostDrmDevice>, ...@@ -65,8 +65,8 @@ class HostDrmDevice : public base::RefCountedThreadSafe<HostDrmDevice>,
bool GpuRemoveGraphicsDevice(const base::FilePath& path) override; bool GpuRemoveGraphicsDevice(const base::FilePath& path) override;
// Services needed by DrmDisplayHost // Services needed by DrmDisplayHost
void GpuConfigureNativeDisplay( void GpuConfigureNativeDisplays(
const display::DisplayConfigurationParams& display_config_params, const std::vector<display::DisplayConfigurationParams>& config_requests,
display::ConfigureCallback callback) override; display::ConfigureCallback callback) override;
bool GpuGetHDCPState(int64_t display_id) override; bool GpuGetHDCPState(int64_t display_id) override;
bool GpuSetHDCPState(int64_t display_id, display::HDCPState state) override; bool GpuSetHDCPState(int64_t display_id, display::HDCPState state) override;
......
...@@ -51,10 +51,11 @@ interface DrmDevice { ...@@ -51,10 +51,11 @@ interface DrmDevice {
// Instructs the GPU to abandon a DRM device. // Instructs the GPU to abandon a DRM device.
RemoveGraphicsDevice(mojo_base.mojom.FilePath path); RemoveGraphicsDevice(mojo_base.mojom.FilePath path);
// Configures (Enables/Disables) a DRM display, returning true on success. // Configures (Enables/Disables) DRM displays, returns a map: each configured
ConfigureNativeDisplay( // display ID to its status, true on success.
display.mojom.DisplayConfigurationParams display_config_params) => ConfigureNativeDisplays(
(bool success); array<display.mojom.DisplayConfigurationParams> config_requests) =>
(map<int64, bool> statuses);
// Gets or sets high-definition content protection (HDCP) (DRM as in // Gets or sets high-definition content protection (HDCP) (DRM as in
// digital rights management) state. // digital rights management) state.
......
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