drm: store connectors in map
We'll need to create/destroy connectors for DP-MST. A vector invalidates pointers/references when new elements are inserted.
This commit is contained in:
parent
d6b6428143
commit
483e2729ec
2 changed files with 18 additions and 16 deletions
30
src/drm.cpp
30
src/drm.cpp
|
@ -328,8 +328,8 @@ static bool refresh_state( drm_t *drm )
|
||||||
{
|
{
|
||||||
// TODO: refresh list of connectors for DP-MST
|
// TODO: refresh list of connectors for DP-MST
|
||||||
|
|
||||||
for (size_t i = 0; i < drm->connectors.size(); i++) {
|
for (auto &kv : drm->connectors) {
|
||||||
struct connector *conn = &drm->connectors[i];
|
struct connector *conn = &kv.second;
|
||||||
if (!get_object_properties(drm, conn->id, DRM_MODE_OBJECT_CONNECTOR, conn->props, conn->initial_prop_values)) {
|
if (!get_object_properties(drm, conn->id, DRM_MODE_OBJECT_CONNECTOR, conn->props, conn->initial_prop_values)) {
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
@ -377,7 +377,7 @@ static bool get_resources(struct drm_t *drm)
|
||||||
|
|
||||||
for (int i = 0; i < resources->count_connectors; i++) {
|
for (int i = 0; i < resources->count_connectors; i++) {
|
||||||
struct connector conn = { .id = resources->connectors[i] };
|
struct connector conn = { .id = resources->connectors[i] };
|
||||||
drm->connectors.push_back(conn);
|
drm->connectors[conn.id] = conn;
|
||||||
}
|
}
|
||||||
|
|
||||||
for (int i = 0; i < resources->count_crtcs; i++) {
|
for (int i = 0; i < resources->count_crtcs; i++) {
|
||||||
|
@ -417,8 +417,8 @@ static bool get_resources(struct drm_t *drm)
|
||||||
if (!refresh_state(drm))
|
if (!refresh_state(drm))
|
||||||
return false;
|
return false;
|
||||||
|
|
||||||
for (size_t i = 0; i < drm->connectors.size(); i++) {
|
for (auto &kv : drm->connectors) {
|
||||||
struct connector *conn = &drm->connectors[i];
|
struct connector *conn = &kv.second;
|
||||||
|
|
||||||
const char *type_str = "Unknown";
|
const char *type_str = "Unknown";
|
||||||
if ( connector_types.count( conn->connector->connector_type ) > 0 )
|
if ( connector_types.count( conn->connector->connector_type ) > 0 )
|
||||||
|
@ -496,8 +496,8 @@ static bool setup_best_connector(struct drm_t *drm)
|
||||||
|
|
||||||
struct connector *best = nullptr;
|
struct connector *best = nullptr;
|
||||||
int best_priority = INT_MAX;
|
int best_priority = INT_MAX;
|
||||||
for (size_t i = 0; i < drm->connectors.size(); i++) {
|
for (auto &kv : drm->connectors) {
|
||||||
struct connector *conn = &drm->connectors[i];
|
struct connector *conn = &kv.second;
|
||||||
|
|
||||||
if (conn->connector->connection != DRM_MODE_CONNECTED)
|
if (conn->connector->connection != DRM_MODE_CONNECTED)
|
||||||
continue;
|
continue;
|
||||||
|
@ -645,8 +645,8 @@ bool init_drm(struct drm_t *drm, int width, int height, int refresh)
|
||||||
return false;
|
return false;
|
||||||
|
|
||||||
drm_log.infof("Connectors:");
|
drm_log.infof("Connectors:");
|
||||||
for (size_t i = 0; i < drm->connectors.size(); i++) {
|
for (const auto &kv : drm->connectors) {
|
||||||
struct connector *conn = &drm->connectors[i];
|
const struct connector *conn = &kv.second;
|
||||||
|
|
||||||
const char *status_str = "disconnected";
|
const char *status_str = "disconnected";
|
||||||
if ( conn->connector->connection == DRM_MODE_CONNECTED )
|
if ( conn->connector->connection == DRM_MODE_CONNECTED )
|
||||||
|
@ -734,8 +734,9 @@ void finish_drm(struct drm_t *drm)
|
||||||
// together.
|
// together.
|
||||||
|
|
||||||
drmModeAtomicReq *req = drmModeAtomicAlloc();
|
drmModeAtomicReq *req = drmModeAtomicAlloc();
|
||||||
for ( size_t i = 0; i < drm->connectors.size(); i++ ) {
|
for ( auto &kv : drm->connectors ) {
|
||||||
add_connector_property(req, &drm->connectors[i], "CRTC_ID", 0);
|
struct connector *conn = &kv.second;
|
||||||
|
add_connector_property(req, conn, "CRTC_ID", 0);
|
||||||
}
|
}
|
||||||
for ( size_t i = 0; i < drm->crtcs.size(); i++ ) {
|
for ( size_t i = 0; i < drm->crtcs.size(); i++ ) {
|
||||||
add_crtc_property(req, &drm->crtcs[i], "MODE_ID", 0);
|
add_crtc_property(req, &drm->crtcs[i], "MODE_ID", 0);
|
||||||
|
@ -1206,8 +1207,9 @@ int drm_prepare( struct drm_t *drm, const struct Composite_t *pComposite, const
|
||||||
|
|
||||||
// Disable all connectors and CRTCs
|
// Disable all connectors and CRTCs
|
||||||
|
|
||||||
for ( size_t i = 0; i < drm->connectors.size(); i++ ) {
|
for ( auto &kv : drm->connectors ) {
|
||||||
if ( add_connector_property( drm->req, &drm->connectors[i], "CRTC_ID", 0 ) < 0 )
|
struct connector *conn = &kv.second;
|
||||||
|
if ( add_connector_property( drm->req, conn, "CRTC_ID", 0 ) < 0 )
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
for ( size_t i = 0; i < drm->crtcs.size(); i++ ) {
|
for ( size_t i = 0; i < drm->crtcs.size(); i++ ) {
|
||||||
|
@ -1621,4 +1623,4 @@ int drm_get_default_refresh(struct drm_t *drm)
|
||||||
}
|
}
|
||||||
|
|
||||||
return 60;
|
return 60;
|
||||||
}
|
}
|
||||||
|
|
|
@ -73,7 +73,7 @@ struct drm_t {
|
||||||
|
|
||||||
std::vector< struct plane > planes;
|
std::vector< struct plane > planes;
|
||||||
std::vector< struct crtc > crtcs;
|
std::vector< struct crtc > crtcs;
|
||||||
std::vector< struct connector > connectors;
|
std::map< uint32_t, struct connector > connectors;
|
||||||
|
|
||||||
std::map< uint32_t, drmModePropertyRes * > props;
|
std::map< uint32_t, drmModePropertyRes * > props;
|
||||||
|
|
||||||
|
@ -162,4 +162,4 @@ bool drm_set_color_gain_blend(struct drm_t *drm, float blend);
|
||||||
bool drm_update_gamma_lut(struct drm_t *drm);
|
bool drm_update_gamma_lut(struct drm_t *drm);
|
||||||
|
|
||||||
char *find_drm_node_by_devid(dev_t devid);
|
char *find_drm_node_by_devid(dev_t devid);
|
||||||
int drm_get_default_refresh(struct drm_t *drm);
|
int drm_get_default_refresh(struct drm_t *drm);
|
||||||
|
|
Loading…
Reference in a new issue