diff --git a/backend/drm/backend.c b/backend/drm/backend.c index c494898e..17387423 100644 --- a/backend/drm/backend.c +++ b/backend/drm/backend.c @@ -128,7 +128,7 @@ static void handle_session_active(struct wl_listener *listener, void *data) { .mode_type = WLR_OUTPUT_STATE_MODE_FIXED, .mode = mode, }; - drm_connector_set_mode(conn, &state); + drm_connector_commit_state(conn, &state); } } else { wlr_log(WLR_INFO, "DRM fd paused"); diff --git a/backend/drm/drm.c b/backend/drm/drm.c index 94f4d3bc..d97f753f 100644 --- a/backend/drm/drm.c +++ b/backend/drm/drm.c @@ -487,29 +487,26 @@ bool drm_connector_supports_vrr(struct wlr_drm_connector *conn) { return true; } -static bool drm_connector_commit(struct wlr_output *output) { - struct wlr_drm_connector *conn = get_drm_connector_from_output(output); - struct wlr_drm_backend *drm = conn->backend; +static bool drm_connector_set_mode(struct wlr_drm_connector *conn, + const struct wlr_output_state *state); - if (!drm_connector_test(output)) { - return false; - } +bool drm_connector_commit_state(struct wlr_drm_connector *conn, + const struct wlr_output_state *pending) { + struct wlr_drm_backend *drm = conn->backend; + struct wlr_output_state state = *pending; if (!drm->session->active) { return false; } - if (output->pending.committed & - (WLR_OUTPUT_STATE_MODE | WLR_OUTPUT_STATE_ENABLED)) { - struct wlr_output_state state = output->pending; - + if (state.committed & (WLR_OUTPUT_STATE_MODE | WLR_OUTPUT_STATE_ENABLED)) { if ((state.committed & WLR_OUTPUT_STATE_MODE) && state.mode_type == WLR_OUTPUT_STATE_MODE_CUSTOM) { drmModeModeInfo mode = {0}; - drm_connector_state_mode(conn, &output->pending, &mode); + drm_connector_state_mode(conn, &state, &mode); state.mode_type = WLR_OUTPUT_STATE_MODE_FIXED; - state.mode = wlr_drm_connector_add_mode(output, &mode); + state.mode = wlr_drm_connector_add_mode(&conn->output, &mode); if (state.mode == NULL) { return false; } @@ -518,17 +515,16 @@ static bool drm_connector_commit(struct wlr_output *output) { if (!drm_connector_set_mode(conn, &state)) { return false; } - } else if (output->pending.committed & WLR_OUTPUT_STATE_BUFFER) { + } else if (state.committed & WLR_OUTPUT_STATE_BUFFER) { // TODO: support modesetting with a buffer - if (!drm_connector_commit_buffer(conn, &output->pending)) { + if (!drm_connector_commit_buffer(conn, &state)) { return false; } - } else if (output->pending.committed & - (WLR_OUTPUT_STATE_ADAPTIVE_SYNC_ENABLED | + } else if (state.committed & (WLR_OUTPUT_STATE_ADAPTIVE_SYNC_ENABLED | WLR_OUTPUT_STATE_GAMMA_LUT)) { assert(conn->crtc != NULL); // TODO: maybe request a page-flip event here? - if (!drm_crtc_commit(conn, &output->pending, 0)) { + if (!drm_crtc_commit(conn, &state, 0)) { return false; } } @@ -536,6 +532,16 @@ static bool drm_connector_commit(struct wlr_output *output) { return true; } +static bool drm_connector_commit(struct wlr_output *output) { + struct wlr_drm_connector *conn = get_drm_connector_from_output(output); + + if (!drm_connector_test(output)) { + return false; + } + + return drm_connector_commit_state(conn, &output->pending); +} + static void drm_connector_rollback_render(struct wlr_output *output) { struct wlr_drm_connector *conn = get_drm_connector_from_output(output); return drm_surface_unset_current(&conn->crtc->primary->surf); @@ -712,12 +718,12 @@ static void attempt_enable_needs_modeset(struct wlr_drm_backend *drm) { .mode_type = WLR_OUTPUT_STATE_MODE_FIXED, .mode = conn->desired_mode, }; - drm_connector_set_mode(conn, &state); + drm_connector_commit_state(conn, &state); } } } -bool drm_connector_set_mode(struct wlr_drm_connector *conn, +static bool drm_connector_set_mode(struct wlr_drm_connector *conn, const struct wlr_output_state *state) { struct wlr_drm_backend *drm = conn->backend; diff --git a/include/backend/drm/drm.h b/include/backend/drm/drm.h index 6201a328..13ccd672 100644 --- a/include/backend/drm/drm.h +++ b/include/backend/drm/drm.h @@ -143,7 +143,7 @@ void restore_drm_outputs(struct wlr_drm_backend *drm); void scan_drm_connectors(struct wlr_drm_backend *state); int handle_drm_event(int fd, uint32_t mask, void *data); void destroy_drm_connector(struct wlr_drm_connector *conn); -bool drm_connector_set_mode(struct wlr_drm_connector *conn, +bool drm_connector_commit_state(struct wlr_drm_connector *conn, const struct wlr_output_state *state); bool drm_connector_is_cursor_visible(struct wlr_drm_connector *conn); bool drm_connector_supports_vrr(struct wlr_drm_connector *conn);