mirror of
https://github.com/hyprwm/wlroots-hyprland.git
synced 2024-11-26 06:35:58 +01:00
backend/drm: extract current mode logic into separate function
Extract the logic to fetch the current mode to a separate function to make it more readable. Stop dying in an assert when get_drm_prop_blob() fails. Always make it so the drmModeModeInfo pointer is allocated so that we can free() it unconditionally.
This commit is contained in:
parent
eeb7a81138
commit
ca432ea539
1 changed files with 32 additions and 20 deletions
|
@ -1157,6 +1157,35 @@ static struct wlr_drm_crtc *connector_get_current_crtc(
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static drmModeModeInfo *connector_get_current_mode(
|
||||||
|
struct wlr_drm_connector *wlr_conn, const drmModeConnector *drm_conn) {
|
||||||
|
struct wlr_drm_backend *drm = wlr_conn->backend;
|
||||||
|
|
||||||
|
if (wlr_conn->crtc == NULL) {
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (wlr_conn->crtc->props.mode_id != 0) {
|
||||||
|
size_t size = 0;
|
||||||
|
drmModeModeInfo *mode = get_drm_prop_blob(drm->fd, wlr_conn->crtc->id,
|
||||||
|
wlr_conn->crtc->props.mode_id, &size);
|
||||||
|
assert(mode == NULL || size == sizeof(*mode));
|
||||||
|
return mode;
|
||||||
|
} else {
|
||||||
|
// Fallback to the legacy API
|
||||||
|
if (!wlr_conn->crtc->legacy_crtc->mode_valid) {
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
drmModeModeInfo *mode = malloc(sizeof(*mode));
|
||||||
|
if (mode == NULL) {
|
||||||
|
wlr_log_errno(WLR_ERROR, "Allocation failed");
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
*mode = wlr_conn->crtc->legacy_crtc->mode;
|
||||||
|
return mode;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
static void connect_drm_connector(struct wlr_drm_connector *wlr_conn,
|
static void connect_drm_connector(struct wlr_drm_connector *wlr_conn,
|
||||||
const drmModeConnector *drm_conn) {
|
const drmModeConnector *drm_conn) {
|
||||||
struct wlr_drm_backend *drm = wlr_conn->backend;
|
struct wlr_drm_backend *drm = wlr_conn->backend;
|
||||||
|
@ -1225,21 +1254,8 @@ static void connect_drm_connector(struct wlr_drm_connector *wlr_conn,
|
||||||
|
|
||||||
// Before iterating on the conn's modes, get the current KMS mode
|
// Before iterating on the conn's modes, get the current KMS mode
|
||||||
// in use from the connector's CRTC.
|
// in use from the connector's CRTC.
|
||||||
drmModeModeInfo *current_modeinfo = NULL;
|
drmModeModeInfo *current_modeinfo =
|
||||||
if (wlr_conn->crtc != NULL) {
|
connector_get_current_mode(wlr_conn, drm_conn);
|
||||||
if (wlr_conn->crtc->props.mode_id == 0) {
|
|
||||||
// Use the legacy drm interface.
|
|
||||||
if (wlr_conn->crtc->legacy_crtc->mode_valid) {
|
|
||||||
current_modeinfo = &wlr_conn->crtc->legacy_crtc->mode;
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
// Use the modern atomic drm interface.
|
|
||||||
size_t modeinfo_size = 0;
|
|
||||||
current_modeinfo = get_drm_prop_blob(drm->fd, wlr_conn->crtc->id,
|
|
||||||
wlr_conn->crtc->props.mode_id, &modeinfo_size);
|
|
||||||
assert(modeinfo_size == sizeof(drmModeModeInfo));
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
wlr_log(WLR_INFO, "Detected modes:");
|
wlr_log(WLR_INFO, "Detected modes:");
|
||||||
|
|
||||||
|
@ -1277,11 +1293,7 @@ static void connect_drm_connector(struct wlr_drm_connector *wlr_conn,
|
||||||
wl_list_insert(wlr_conn->output.modes.prev, &mode->wlr_mode.link);
|
wl_list_insert(wlr_conn->output.modes.prev, &mode->wlr_mode.link);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (wlr_conn->crtc != NULL && wlr_conn->crtc->props.mode_id != 0) {
|
free(current_modeinfo);
|
||||||
// free() the modeinfo pointer, but only
|
|
||||||
// if not using the legacy API.
|
|
||||||
free(current_modeinfo);
|
|
||||||
}
|
|
||||||
|
|
||||||
wlr_conn->possible_crtcs =
|
wlr_conn->possible_crtcs =
|
||||||
drmModeConnectorGetPossibleCrtcs(drm->fd, drm_conn);
|
drmModeConnectorGetPossibleCrtcs(drm->fd, drm_conn);
|
||||||
|
|
Loading…
Reference in a new issue