Commit ad7dbe97 authored by Daniele Castagna's avatar Daniele Castagna Committed by Commit Bot

ozone/drm: Cache connector drm_display

There is some stuttering when viewing protected content with a DP MST
dongle attached.

Looking at a trace it looks like we spend a lot of time (200ms)
in DrmDisplay::GetHDCPState, in particular in drm_->GetConnector.

This patch caches the connector used to check if HDCP is available.

It additionally downgrades log severity when the HDCP properties
is not found to INFO, since it can happen every 2 seconds.

Bug: 1001211
Change-Id: I77eb86b2e55f0fd4640560ae2e38d64d5e2b2174
Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/1864354Reviewed-by: default avatarDaniel Nicoara <dnicoara@chromium.org>
Commit-Queue: Daniele Castagna <dcastagna@chromium.org>
Cr-Commit-Position: refs/heads/master@{#707065}
parent 9f8e95c9
......@@ -88,13 +88,24 @@ DrmDisplay::DrmDisplay(ScreenManager* screen_manager,
DrmDisplay::~DrmDisplay() {
}
uint32_t DrmDisplay::connector() const {
return connector_->connector_id;
}
std::unique_ptr<display::DisplaySnapshot> DrmDisplay::Update(
HardwareDisplayControllerInfo* info,
size_t device_index) {
std::unique_ptr<display::DisplaySnapshot> params = CreateDisplaySnapshot(
info, drm_->get_fd(), drm_->device_path(), device_index, origin_);
crtc_ = info->crtc()->crtc_id;
connector_ = info->connector()->connector_id;
// TODO(dcastagna): consider taking ownership of |info->connector()|
connector_ = ScopedDrmConnectorPtr(
drm_->GetConnector(info->connector()->connector_id));
if (!connector_) {
PLOG(ERROR) << "Failed to get connector "
<< info->connector()->connector_id;
}
display_id_ = params->display_id();
modes_ = GetDrmModeVector(info->connector());
return params;
......@@ -108,8 +119,8 @@ bool DrmDisplay::Configure(const drmModeModeInfo* mode,
<< " size=" << (mode ? GetDrmModeSize(*mode).ToString() : "0x0");
if (mode) {
if (!screen_manager_->ConfigureDisplayController(drm_, crtc_, connector_,
origin, *mode)) {
if (!screen_manager_->ConfigureDisplayController(
drm_, crtc_, connector_->connector_id, origin, *mode)) {
VLOG(1) << "Failed to configure: device=" << drm_->device_path().value()
<< " crtc=" << crtc_ << " connector=" << connector_;
return false;
......@@ -127,21 +138,18 @@ bool DrmDisplay::Configure(const drmModeModeInfo* mode,
}
bool DrmDisplay::GetHDCPState(display::HDCPState* state) {
ScopedDrmConnectorPtr connector(drm_->GetConnector(connector_));
if (!connector) {
PLOG(ERROR) << "Failed to get connector " << connector_;
if (!connector_)
return false;
}
ScopedDrmPropertyPtr hdcp_property(
drm_->GetProperty(connector.get(), kContentProtection));
drm_->GetProperty(connector_.get(), kContentProtection));
if (!hdcp_property) {
PLOG(ERROR) << "'" << kContentProtection << "' property doesn't exist.";
PLOG(INFO) << "'" << kContentProtection << "' property doesn't exist.";
return false;
}
std::string name =
GetEnumNameForProperty(connector.get(), hdcp_property.get());
GetEnumNameForProperty(connector_.get(), hdcp_property.get());
for (size_t i = 0; i < base::size(kContentProtectionStates); ++i) {
if (name == kContentProtectionStates[i].name) {
*state = kContentProtectionStates[i].state;
......@@ -155,21 +163,20 @@ bool DrmDisplay::GetHDCPState(display::HDCPState* state) {
}
bool DrmDisplay::SetHDCPState(display::HDCPState state) {
ScopedDrmConnectorPtr connector(drm_->GetConnector(connector_));
if (!connector) {
PLOG(ERROR) << "Failed to get connector " << connector_;
if (!connector_) {
return false;
}
ScopedDrmPropertyPtr hdcp_property(
drm_->GetProperty(connector.get(), kContentProtection));
drm_->GetProperty(connector_.get(), kContentProtection));
if (!hdcp_property) {
LOG(ERROR) << "'" << kContentProtection << "' property doesn't exist.";
PLOG(INFO) << "'" << kContentProtection << "' property doesn't exist.";
return false;
}
return drm_->SetProperty(
connector_, hdcp_property->prop_id,
connector_->connector_id, hdcp_property->prop_id,
GetContentProtectionValue(hdcp_property.get(), state));
}
......
......@@ -15,6 +15,7 @@
#include "ui/display/types/display_constants.h"
#include "ui/gfx/geometry/point.h"
#include "ui/ozone/common/gpu/ozone_gpu_message_params.h"
#include "ui/ozone/platform/drm/common/scoped_drm_types.h"
typedef struct _drmModeModeInfo drmModeModeInfo;
......@@ -38,7 +39,7 @@ class DrmDisplay {
int64_t display_id() const { return display_id_; }
scoped_refptr<DrmDevice> drm() const { return drm_; }
uint32_t crtc() const { return crtc_; }
uint32_t connector() const { return connector_; }
uint32_t connector() const;
const std::vector<drmModeModeInfo>& modes() const { return modes_; }
std::unique_ptr<display::DisplaySnapshot> Update(
......@@ -60,7 +61,7 @@ class DrmDisplay {
int64_t display_id_ = -1;
const scoped_refptr<DrmDevice> drm_;
uint32_t crtc_ = 0;
uint32_t connector_ = 0;
ScopedDrmConnectorPtr connector_;
std::vector<drmModeModeInfo> modes_;
gfx::Point origin_;
......
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