Commit 263d080a authored by Mark Yacoub's avatar Mark Yacoub Committed by Commit Bot

Cache DRM Props for Connector and CRTC

1. Get "CRTC_ID" DRM property for Connector.
2. Get "ACTIVE" and "MODE_ID" DRM props for CRTC.
3. Add Connector Props are part of MockDrmDevice.

BUG=987274
TEST=HardwareDisplayPlaneManagerTest, HardwareDisplayControllerTest,
DrmOverlayValidatorTest

Change-Id: I9b500ade01ad9179e1417a6bc0471b3d9b412cad
Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/2031741Reviewed-by: default avatarDaniel Nicoara <dnicoara@chromium.org>
Commit-Queue: Mark Yacoub <markyacoub@google.com>
Auto-Submit: Mark Yacoub <markyacoub@google.com>
Cr-Commit-Position: refs/heads/master@{#737385}
parent db21f388
......@@ -219,7 +219,11 @@ void DrmOverlayValidatorTest::InitializeDrmState(
crtc_plane_properties.end());
}
drm_->InitializeState(crtc_properties, plane_properties, property_names,
std::vector<ui::MockDrmDevice::ConnectorProperties> connector_properties(1);
connector_properties[0].id = kConnectorIdBase;
drm_->InitializeState(crtc_properties, connector_properties, plane_properties,
property_names,
/* use_atomic= */ true);
}
......
......@@ -27,8 +27,8 @@
namespace {
// Create a basic mode for a 6x4 screen.
const drmModeModeInfo kDefaultMode =
{0, 6, 0, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, {'\0'}};
const drmModeModeInfo kDefaultMode = {0, 6, 0, 0, 0, 0, 4, 0,
0, 0, 0, 0, 0, 0, {'\0'}};
constexpr uint32_t kCrtcIdBase = 1;
constexpr uint32_t kPrimaryCrtc = kCrtcIdBase;
......@@ -163,8 +163,12 @@ void HardwareDisplayControllerTest::InitializeDrmDevice(bool use_atomic) {
}
}
drm_->InitializeState(crtc_properties, plane_properties, property_names,
use_atomic);
std::vector<ui::MockDrmDevice::ConnectorProperties> connector_properties(2);
connector_properties[0].id = kPrimaryConnector;
connector_properties[1].id = kSecondaryConnector;
drm_->InitializeState(crtc_properties, connector_properties, plane_properties,
property_names, use_atomic);
}
void HardwareDisplayControllerTest::SchedulePageFlip(
......
......@@ -101,6 +101,15 @@ int HardwareDisplayPlaneManager::LookupCrtcIndex(uint32_t crtc_id) const {
return -1;
}
int HardwareDisplayPlaneManager::LookupConnectorIndex(
uint32_t connector_id) const {
for (size_t i = 0; i < connectors_props_.size(); ++i) {
if (connectors_props_[i].id == connector_id)
return i;
}
return -1;
}
bool HardwareDisplayPlaneManager::IsCompatible(HardwareDisplayPlane* plane,
const DrmOverlayPlane& overlay,
uint32_t crtc_index) const {
......@@ -314,6 +323,23 @@ bool HardwareDisplayPlaneManager::InitializeCrtcState() {
return false;
}
for (int i = 0; i < resources->count_connectors; ++i) {
ConnectorProperties state_props;
state_props.id = resources->connectors[i];
ScopedDrmObjectPropertyPtr props(drm_->GetObjectProperties(
resources->connectors[i], DRM_MODE_OBJECT_CONNECTOR));
if (!props) {
PLOG(ERROR) << "Failed to get Connector properties for connector="
<< state_props.id;
continue;
}
GetDrmPropertyForName(drm_, props.get(), "CRTC_ID", &state_props.crtc_id);
DCHECK(!drm_->is_atomic() || state_props.crtc_id.id);
connectors_props_.emplace_back(std::move(state_props));
}
unsigned int num_crtcs_with_out_fence_ptr = 0;
for (int i = 0; i < resources->count_crtcs; ++i) {
......@@ -328,6 +354,12 @@ bool HardwareDisplayPlaneManager::InitializeCrtcState() {
continue;
}
GetDrmPropertyForName(drm_, props.get(), "ACTIVE",
&state.properties.active);
DCHECK(!drm_->is_atomic() || state.properties.active.id);
GetDrmPropertyForName(drm_, props.get(), "MODE_ID",
&state.properties.mode_id);
DCHECK(!drm_->is_atomic() || state.properties.mode_id.id);
// These properties are optional. If they don't exist we can tell by the
// invalid ID.
GetDrmPropertyForName(drm_, props.get(), "CTM", &state.properties.ctm);
......
......@@ -133,10 +133,16 @@ class HardwareDisplayPlaneManager {
uint32_t format) const;
protected:
struct ConnectorProperties {
uint32_t id;
DrmDevice::Property crtc_id;
};
struct CrtcProperties {
// Unique identifier for the CRTC. This must be greater than 0 to be valid.
uint32_t id;
DrmDevice::Property active;
DrmDevice::Property mode_id;
// Optional properties.
DrmDevice::Property ctm;
DrmDevice::Property gamma_lut;
......@@ -182,8 +188,10 @@ class HardwareDisplayPlaneManager {
uint32_t crtc_index,
const DrmOverlayPlane& overlay) const;
// Convert |crtc_id| into an index, returning -1 if the ID couldn't be found.
// Convert |crtc/connector_id| into an index, returning -1 if the ID couldn't
// be found.
int LookupCrtcIndex(uint32_t crtc_id) const;
int LookupConnectorIndex(uint32_t connector_idx) const;
// Returns true if |plane| can support |overlay| and compatible with
// |crtc_index|.
......@@ -208,6 +216,7 @@ class HardwareDisplayPlaneManager {
std::vector<std::unique_ptr<HardwareDisplayPlane>> planes_;
std::vector<CrtcState> crtc_state_;
std::vector<ConnectorProperties> connectors_props_;
std::vector<uint32_t> supported_formats_;
DISALLOW_COPY_AND_ASSIGN(HardwareDisplayPlaneManager);
......
......@@ -70,6 +70,11 @@ MockDrmDevice::CrtcProperties::CrtcProperties() = default;
MockDrmDevice::CrtcProperties::CrtcProperties(const CrtcProperties&) = default;
MockDrmDevice::CrtcProperties::~CrtcProperties() = default;
MockDrmDevice::ConnectorProperties::ConnectorProperties() = default;
MockDrmDevice::ConnectorProperties::ConnectorProperties(
const ConnectorProperties&) = default;
MockDrmDevice::ConnectorProperties::~ConnectorProperties() = default;
MockDrmDevice::PlaneProperties::PlaneProperties() = default;
MockDrmDevice::PlaneProperties::PlaneProperties(const PlaneProperties&) =
default;
......@@ -125,15 +130,18 @@ ScopedDrmPropertyBlobPtr MockDrmDevice::AllocateInFormatsBlob(
void MockDrmDevice::InitializeState(
const std::vector<CrtcProperties>& crtc_properties,
const std::vector<ConnectorProperties>& connector_properties,
const std::vector<PlaneProperties>& plane_properties,
const std::map<uint32_t, std::string>& property_names,
bool use_atomic) {
CHECK(InitializeStateWithResult(crtc_properties, plane_properties,
property_names, use_atomic));
CHECK(InitializeStateWithResult(crtc_properties, connector_properties,
plane_properties, property_names,
use_atomic));
}
bool MockDrmDevice::InitializeStateWithResult(
const std::vector<CrtcProperties>& crtc_properties,
const std::vector<ConnectorProperties>& connector_properties,
const std::vector<PlaneProperties>& plane_properties,
const std::map<uint32_t, std::string>& property_names,
bool use_atomic) {
......
......@@ -34,6 +34,16 @@ class MockDrmDevice : public DrmDevice {
std::vector<DrmDevice::Property> properties;
};
struct ConnectorProperties {
ConnectorProperties();
ConnectorProperties(const ConnectorProperties&);
~ConnectorProperties();
uint32_t id;
std::vector<DrmDevice::Property> properties;
};
struct PlaneProperties {
PlaneProperties();
PlaneProperties(const PlaneProperties&);
......@@ -90,12 +100,15 @@ class MockDrmDevice : public DrmDevice {
void set_connector_type(uint32_t type) { connector_type_ = type; }
void InitializeState(const std::vector<CrtcProperties>& crtc_properties,
const std::vector<PlaneProperties>& plane_properties,
const std::map<uint32_t, std::string>& property_names,
bool use_atomic);
void InitializeState(
const std::vector<CrtcProperties>& crtc_properties,
const std::vector<ConnectorProperties>& connector_properties,
const std::vector<PlaneProperties>& plane_properties,
const std::map<uint32_t, std::string>& property_names,
bool use_atomic);
bool InitializeStateWithResult(
const std::vector<CrtcProperties>& crtc_properties,
const std::vector<ConnectorProperties>& connector_properties,
const std::vector<PlaneProperties>& plane_properties,
const std::map<uint32_t, std::string>& property_names,
bool use_atomic);
......@@ -212,7 +225,7 @@ class MockDrmDevice : public DrmDevice {
base::queue<PageFlipCallback> callbacks_;
std::vector<CrtcProperties> crtc_properties_;
std::vector<ConnectorProperties> connector_properties_;
std::vector<PlaneProperties> plane_properties_;
std::map<uint32_t, std::string> property_names_;
......
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