Commit 351c90f7 authored by Mark Yacoub's avatar Mark Yacoub Committed by Commit Bot

Do not create a display snapshot with invalid connector.

When getting displays, if an update for a Drm Display has an invalid connector, do not create a Display Snapshot for it.
This prevents attempts to use displays with invalid connectors.

Bug: 1105427
Change-Id: Id3422686b019942e924d3e98172394f6caa23eed
Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/2362442
Commit-Queue: Mark Yacoub <markyacoub@google.com>
Reviewed-by: default avatarDaniel Nicoara <dnicoara@chromium.org>
Cr-Commit-Position: refs/heads/master@{#799864}
parent 9f52c7e4
...@@ -105,10 +105,10 @@ DrmDisplay::DrmDisplay(ScreenManager* screen_manager, ...@@ -105,10 +105,10 @@ DrmDisplay::DrmDisplay(ScreenManager* screen_manager,
drm_(drm), drm_(drm),
current_color_space_(gfx::ColorSpace::CreateSRGB()) {} current_color_space_(gfx::ColorSpace::CreateSRGB()) {}
DrmDisplay::~DrmDisplay() { DrmDisplay::~DrmDisplay() = default;
}
uint32_t DrmDisplay::connector() const { uint32_t DrmDisplay::connector() const {
DCHECK(connector_);
return connector_->connector_id; return connector_->connector_id;
} }
...@@ -118,12 +118,13 @@ std::unique_ptr<display::DisplaySnapshot> DrmDisplay::Update( ...@@ -118,12 +118,13 @@ std::unique_ptr<display::DisplaySnapshot> DrmDisplay::Update(
std::unique_ptr<display::DisplaySnapshot> params = CreateDisplaySnapshot( std::unique_ptr<display::DisplaySnapshot> params = CreateDisplaySnapshot(
info, drm_->get_fd(), drm_->device_path(), device_index, origin_); info, drm_->get_fd(), drm_->device_path(), device_index, origin_);
crtc_ = info->crtc()->crtc_id; crtc_ = info->crtc()->crtc_id;
// TODO(dcastagna): consider taking ownership of |info->connector()| // TODO(crbug.com/1119499): consider taking ownership of |info->connector()|
connector_ = ScopedDrmConnectorPtr( connector_ = ScopedDrmConnectorPtr(
drm_->GetConnector(info->connector()->connector_id)); drm_->GetConnector(info->connector()->connector_id));
if (!connector_) { if (!connector_) {
PLOG(ERROR) << "Failed to get connector " PLOG(ERROR) << "Failed to get connector "
<< info->connector()->connector_id; << info->connector()->connector_id;
return nullptr;
} }
display_id_ = params->display_id(); display_id_ = params->display_id();
...@@ -229,7 +230,8 @@ void DrmDisplay::SetGammaCorrection( ...@@ -229,7 +230,8 @@ void DrmDisplay::SetGammaCorrection(
// When both |degamma_lut| and |gamma_lut| are empty they are interpreted as // When both |degamma_lut| and |gamma_lut| are empty they are interpreted as
// "linear/pass-thru" [1]. If the display |is_hdr_capable_| we have to make // "linear/pass-thru" [1]. If the display |is_hdr_capable_| we have to make
// sure the |current_color_space_| is considered properly. // sure the |current_color_space_| is considered properly.
// [1] https://www.kernel.org/doc/html/v4.19/gpu/drm-kms.html#color-management-properties // [1]
// https://www.kernel.org/doc/html/v4.19/gpu/drm-kms.html#color-management-properties
if (degamma_lut.empty() && gamma_lut.empty() && is_hdr_capable_) if (degamma_lut.empty() && gamma_lut.empty() && is_hdr_capable_)
SetColorSpace(current_color_space_); SetColorSpace(current_color_space_);
else else
......
...@@ -102,8 +102,14 @@ MovableDisplaySnapshots DrmGpuDisplayManager::GetDisplays() { ...@@ -102,8 +102,14 @@ MovableDisplaySnapshots DrmGpuDisplayManager::GetDisplays() {
} else { } else {
displays_.push_back(std::make_unique<DrmDisplay>(screen_manager_, drm)); displays_.push_back(std::make_unique<DrmDisplay>(screen_manager_, drm));
} }
params_list.push_back(
displays_.back()->Update(display_info.get(), device_index)); auto display_snapshot =
displays_.back()->Update(display_info.get(), device_index);
if (display_snapshot) {
params_list.push_back(std::move(display_snapshot));
} else {
displays_.pop_back();
}
} }
device_index++; device_index++;
} }
......
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