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( ...@@ -219,7 +219,11 @@ void DrmOverlayValidatorTest::InitializeDrmState(
crtc_plane_properties.end()); 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); /* use_atomic= */ true);
} }
......
...@@ -27,8 +27,8 @@ ...@@ -27,8 +27,8 @@
namespace { namespace {
// Create a basic mode for a 6x4 screen. // Create a basic mode for a 6x4 screen.
const drmModeModeInfo kDefaultMode = const drmModeModeInfo kDefaultMode = {0, 6, 0, 0, 0, 0, 4, 0,
{0, 6, 0, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, {'\0'}}; 0, 0, 0, 0, 0, 0, {'\0'}};
constexpr uint32_t kCrtcIdBase = 1; constexpr uint32_t kCrtcIdBase = 1;
constexpr uint32_t kPrimaryCrtc = kCrtcIdBase; constexpr uint32_t kPrimaryCrtc = kCrtcIdBase;
...@@ -163,8 +163,12 @@ void HardwareDisplayControllerTest::InitializeDrmDevice(bool use_atomic) { ...@@ -163,8 +163,12 @@ void HardwareDisplayControllerTest::InitializeDrmDevice(bool use_atomic) {
} }
} }
drm_->InitializeState(crtc_properties, plane_properties, property_names, std::vector<ui::MockDrmDevice::ConnectorProperties> connector_properties(2);
use_atomic); 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( void HardwareDisplayControllerTest::SchedulePageFlip(
......
...@@ -101,6 +101,15 @@ int HardwareDisplayPlaneManager::LookupCrtcIndex(uint32_t crtc_id) const { ...@@ -101,6 +101,15 @@ int HardwareDisplayPlaneManager::LookupCrtcIndex(uint32_t crtc_id) const {
return -1; 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, bool HardwareDisplayPlaneManager::IsCompatible(HardwareDisplayPlane* plane,
const DrmOverlayPlane& overlay, const DrmOverlayPlane& overlay,
uint32_t crtc_index) const { uint32_t crtc_index) const {
...@@ -314,6 +323,23 @@ bool HardwareDisplayPlaneManager::InitializeCrtcState() { ...@@ -314,6 +323,23 @@ bool HardwareDisplayPlaneManager::InitializeCrtcState() {
return false; 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; unsigned int num_crtcs_with_out_fence_ptr = 0;
for (int i = 0; i < resources->count_crtcs; ++i) { for (int i = 0; i < resources->count_crtcs; ++i) {
...@@ -328,6 +354,12 @@ bool HardwareDisplayPlaneManager::InitializeCrtcState() { ...@@ -328,6 +354,12 @@ bool HardwareDisplayPlaneManager::InitializeCrtcState() {
continue; 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 // These properties are optional. If they don't exist we can tell by the
// invalid ID. // invalid ID.
GetDrmPropertyForName(drm_, props.get(), "CTM", &state.properties.ctm); GetDrmPropertyForName(drm_, props.get(), "CTM", &state.properties.ctm);
......
...@@ -133,10 +133,16 @@ class HardwareDisplayPlaneManager { ...@@ -133,10 +133,16 @@ class HardwareDisplayPlaneManager {
uint32_t format) const; uint32_t format) const;
protected: protected:
struct ConnectorProperties {
uint32_t id;
DrmDevice::Property crtc_id;
};
struct CrtcProperties { struct CrtcProperties {
// Unique identifier for the CRTC. This must be greater than 0 to be valid. // Unique identifier for the CRTC. This must be greater than 0 to be valid.
uint32_t id; uint32_t id;
DrmDevice::Property active;
DrmDevice::Property mode_id;
// Optional properties. // Optional properties.
DrmDevice::Property ctm; DrmDevice::Property ctm;
DrmDevice::Property gamma_lut; DrmDevice::Property gamma_lut;
...@@ -182,8 +188,10 @@ class HardwareDisplayPlaneManager { ...@@ -182,8 +188,10 @@ class HardwareDisplayPlaneManager {
uint32_t crtc_index, uint32_t crtc_index,
const DrmOverlayPlane& overlay) const; 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 LookupCrtcIndex(uint32_t crtc_id) const;
int LookupConnectorIndex(uint32_t connector_idx) const;
// Returns true if |plane| can support |overlay| and compatible with // Returns true if |plane| can support |overlay| and compatible with
// |crtc_index|. // |crtc_index|.
...@@ -208,6 +216,7 @@ class HardwareDisplayPlaneManager { ...@@ -208,6 +216,7 @@ class HardwareDisplayPlaneManager {
std::vector<std::unique_ptr<HardwareDisplayPlane>> planes_; std::vector<std::unique_ptr<HardwareDisplayPlane>> planes_;
std::vector<CrtcState> crtc_state_; std::vector<CrtcState> crtc_state_;
std::vector<ConnectorProperties> connectors_props_;
std::vector<uint32_t> supported_formats_; std::vector<uint32_t> supported_formats_;
DISALLOW_COPY_AND_ASSIGN(HardwareDisplayPlaneManager); DISALLOW_COPY_AND_ASSIGN(HardwareDisplayPlaneManager);
......
...@@ -70,6 +70,11 @@ MockDrmDevice::CrtcProperties::CrtcProperties() = default; ...@@ -70,6 +70,11 @@ MockDrmDevice::CrtcProperties::CrtcProperties() = default;
MockDrmDevice::CrtcProperties::CrtcProperties(const CrtcProperties&) = default; MockDrmDevice::CrtcProperties::CrtcProperties(const CrtcProperties&) = default;
MockDrmDevice::CrtcProperties::~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() = default;
MockDrmDevice::PlaneProperties::PlaneProperties(const PlaneProperties&) = MockDrmDevice::PlaneProperties::PlaneProperties(const PlaneProperties&) =
default; default;
...@@ -125,15 +130,18 @@ ScopedDrmPropertyBlobPtr MockDrmDevice::AllocateInFormatsBlob( ...@@ -125,15 +130,18 @@ ScopedDrmPropertyBlobPtr MockDrmDevice::AllocateInFormatsBlob(
void MockDrmDevice::InitializeState( void MockDrmDevice::InitializeState(
const std::vector<CrtcProperties>& crtc_properties, const std::vector<CrtcProperties>& crtc_properties,
const std::vector<ConnectorProperties>& connector_properties,
const std::vector<PlaneProperties>& plane_properties, const std::vector<PlaneProperties>& plane_properties,
const std::map<uint32_t, std::string>& property_names, const std::map<uint32_t, std::string>& property_names,
bool use_atomic) { bool use_atomic) {
CHECK(InitializeStateWithResult(crtc_properties, plane_properties, CHECK(InitializeStateWithResult(crtc_properties, connector_properties,
property_names, use_atomic)); plane_properties, property_names,
use_atomic));
} }
bool MockDrmDevice::InitializeStateWithResult( bool MockDrmDevice::InitializeStateWithResult(
const std::vector<CrtcProperties>& crtc_properties, const std::vector<CrtcProperties>& crtc_properties,
const std::vector<ConnectorProperties>& connector_properties,
const std::vector<PlaneProperties>& plane_properties, const std::vector<PlaneProperties>& plane_properties,
const std::map<uint32_t, std::string>& property_names, const std::map<uint32_t, std::string>& property_names,
bool use_atomic) { bool use_atomic) {
......
...@@ -34,6 +34,16 @@ class MockDrmDevice : public DrmDevice { ...@@ -34,6 +34,16 @@ class MockDrmDevice : public DrmDevice {
std::vector<DrmDevice::Property> properties; std::vector<DrmDevice::Property> properties;
}; };
struct ConnectorProperties {
ConnectorProperties();
ConnectorProperties(const ConnectorProperties&);
~ConnectorProperties();
uint32_t id;
std::vector<DrmDevice::Property> properties;
};
struct PlaneProperties { struct PlaneProperties {
PlaneProperties(); PlaneProperties();
PlaneProperties(const PlaneProperties&); PlaneProperties(const PlaneProperties&);
...@@ -90,12 +100,15 @@ class MockDrmDevice : public DrmDevice { ...@@ -90,12 +100,15 @@ class MockDrmDevice : public DrmDevice {
void set_connector_type(uint32_t type) { connector_type_ = type; } void set_connector_type(uint32_t type) { connector_type_ = type; }
void InitializeState(const std::vector<CrtcProperties>& crtc_properties, void InitializeState(
const std::vector<PlaneProperties>& plane_properties, const std::vector<CrtcProperties>& crtc_properties,
const std::map<uint32_t, std::string>& property_names, const std::vector<ConnectorProperties>& connector_properties,
bool use_atomic); const std::vector<PlaneProperties>& plane_properties,
const std::map<uint32_t, std::string>& property_names,
bool use_atomic);
bool InitializeStateWithResult( bool InitializeStateWithResult(
const std::vector<CrtcProperties>& crtc_properties, const std::vector<CrtcProperties>& crtc_properties,
const std::vector<ConnectorProperties>& connector_properties,
const std::vector<PlaneProperties>& plane_properties, const std::vector<PlaneProperties>& plane_properties,
const std::map<uint32_t, std::string>& property_names, const std::map<uint32_t, std::string>& property_names,
bool use_atomic); bool use_atomic);
...@@ -212,7 +225,7 @@ class MockDrmDevice : public DrmDevice { ...@@ -212,7 +225,7 @@ class MockDrmDevice : public DrmDevice {
base::queue<PageFlipCallback> callbacks_; base::queue<PageFlipCallback> callbacks_;
std::vector<CrtcProperties> crtc_properties_; std::vector<CrtcProperties> crtc_properties_;
std::vector<ConnectorProperties> connector_properties_;
std::vector<PlaneProperties> plane_properties_; std::vector<PlaneProperties> plane_properties_;
std::map<uint32_t, std::string> property_names_; 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