diff options
author | Simon Ser <contact@emersion.fr> | 2021-08-10 18:47:14 +0200 |
---|---|---|
committer | Simon Ser <contact@emersion.fr> | 2021-09-07 11:18:18 +0200 |
commit | 3c74bd0c915e7ddd1b5dcc05d14f5555de10e980 (patch) | |
tree | 505a22f40ab0fc4379961d668129c73dba9b5786 /backend/drm/legacy.c | |
parent | 3fbf6e02a35e66abb52ca9c79527f3d07e8d9e4a (diff) |
backend/drm: introduce wlr_drm_connector_state
Previously, we were copying wlr_output_state on the stack and
patching it up to be guaranteed to have a proper drmModeModeInfo
stored in it (and not a custom mode). Also, we had a bunch of
helpers deriving DRM-specific information from the generic
wlr_output_state.
Copying the wlr_output_state worked fine so far, but with output
layers we'll be getting a wl_list in there. An empty wl_list stores
two pointers to itself, copying it on the stack blindly results in
infinite loops in wl_list_for_each.
To fix this, rework our DRM backend to stop copying wlr_output_state,
instead add a new struct wlr_drm_connector_state which holds both
the wlr_output_state and additional DRM-specific information.
Diffstat (limited to 'backend/drm/legacy.c')
-rw-r--r-- | backend/drm/legacy.c | 34 |
1 files changed, 15 insertions, 19 deletions
diff --git a/backend/drm/legacy.c b/backend/drm/legacy.c index 5a9fbe24..37d8147a 100644 --- a/backend/drm/legacy.c +++ b/backend/drm/legacy.c @@ -34,11 +34,10 @@ static bool legacy_fb_props_match(struct wlr_drm_fb *fb1, } static bool legacy_crtc_test(struct wlr_drm_connector *conn, - const struct wlr_output_state *state) { + const struct wlr_drm_connector_state *state) { struct wlr_drm_crtc *crtc = conn->crtc; - if ((state->committed & WLR_OUTPUT_STATE_BUFFER) && - !drm_connector_state_is_modeset(state)) { + if ((state->base->committed & WLR_OUTPUT_STATE_BUFFER) && !state->modeset) { struct wlr_drm_fb *pending_fb = crtc->primary->pending_fb; struct wlr_drm_fb *prev_fb = crtc->primary->queued_fb; @@ -59,7 +58,8 @@ static bool legacy_crtc_test(struct wlr_drm_connector *conn, } static bool legacy_crtc_commit(struct wlr_drm_connector *conn, - const struct wlr_output_state *state, uint32_t flags, bool test_only) { + const struct wlr_drm_connector_state *state, + uint32_t flags, bool test_only) { if (!legacy_crtc_test(conn, state)) { return false; } @@ -72,10 +72,8 @@ static bool legacy_crtc_commit(struct wlr_drm_connector *conn, struct wlr_drm_crtc *crtc = conn->crtc; struct wlr_drm_plane *cursor = crtc->cursor; - bool active = drm_connector_state_active(conn, state); - uint32_t fb_id = 0; - if (active) { + if (state->active) { struct wlr_drm_fb *fb = plane_get_next_fb(crtc->primary); if (fb == NULL) { wlr_log(WLR_ERROR, "%s: failed to acquire primary FB", @@ -85,19 +83,17 @@ static bool legacy_crtc_commit(struct wlr_drm_connector *conn, fb_id = fb->id; } - if (drm_connector_state_is_modeset(state)) { + if (state->modeset) { uint32_t *conns = NULL; size_t conns_len = 0; drmModeModeInfo *mode = NULL; - drmModeModeInfo mode_info = {0}; - if (active) { + if (state->active) { conns = &conn->id; conns_len = 1; - drm_connector_state_mode(conn, state, &mode_info); - mode = &mode_info; + mode = (drmModeModeInfo *)&state->mode; } - uint32_t dpms = active ? DRM_MODE_DPMS_ON : DRM_MODE_DPMS_OFF; + uint32_t dpms = state->active ? DRM_MODE_DPMS_ON : DRM_MODE_DPMS_OFF; if (drmModeConnectorSetProperty(drm->fd, conn->id, conn->props.dpms, dpms) != 0) { wlr_drm_conn_log_errno(conn, WLR_ERROR, @@ -112,27 +108,27 @@ static bool legacy_crtc_commit(struct wlr_drm_connector *conn, } } - if (state->committed & WLR_OUTPUT_STATE_GAMMA_LUT) { + if (state->base->committed & WLR_OUTPUT_STATE_GAMMA_LUT) { if (!drm_legacy_crtc_set_gamma(drm, crtc, - state->gamma_lut_size, state->gamma_lut)) { + state->base->gamma_lut_size, state->base->gamma_lut)) { return false; } } - if ((state->committed & WLR_OUTPUT_STATE_ADAPTIVE_SYNC_ENABLED) && + if ((state->base->committed & WLR_OUTPUT_STATE_ADAPTIVE_SYNC_ENABLED) && drm_connector_supports_vrr(conn)) { if (drmModeObjectSetProperty(drm->fd, crtc->id, DRM_MODE_OBJECT_CRTC, crtc->props.vrr_enabled, - state->adaptive_sync_enabled) != 0) { + state->base->adaptive_sync_enabled) != 0) { wlr_drm_conn_log_errno(conn, WLR_ERROR, "drmModeObjectSetProperty(VRR_ENABLED) failed"); return false; } - output->adaptive_sync_status = state->adaptive_sync_enabled ? + output->adaptive_sync_status = state->base->adaptive_sync_enabled ? WLR_OUTPUT_ADAPTIVE_SYNC_ENABLED : WLR_OUTPUT_ADAPTIVE_SYNC_DISABLED; wlr_drm_conn_log(conn, WLR_DEBUG, "VRR %s", - state->adaptive_sync_enabled ? "enabled" : "disabled"); + state->base->adaptive_sync_enabled ? "enabled" : "disabled"); } if (cursor != NULL && drm_connector_is_cursor_visible(conn)) { |