diff options
Diffstat (limited to 'backend/drm')
-rw-r--r-- | backend/drm/backend.c | 54 | ||||
-rw-r--r-- | backend/drm/drm.c | 17 |
2 files changed, 34 insertions, 37 deletions
diff --git a/backend/drm/backend.c b/backend/drm/backend.c index 81a212d2..e5614ae2 100644 --- a/backend/drm/backend.c +++ b/backend/drm/backend.c @@ -40,36 +40,24 @@ static struct wlr_backend_impl backend_impl = { .destroy = wlr_drm_backend_destroy }; -static void device_paused(struct wl_listener *listener, void *data) { - struct wlr_backend_state *drm = wl_container_of(listener, drm, device_paused); - struct device_arg *arg = data; - - // TODO: Actually pause the renderer or something. - // We currently just expect it to fail its next pageflip. - - if (arg->dev == drm->dev) { +static void session_signal(struct wl_listener *listener, void *data) { + struct wlr_backend_state *drm = wl_container_of(listener, drm, session_signal); + struct wlr_session *session = data; + + if (session->active) { + wlr_log(L_INFO, "DRM fd resumed"); + + for (size_t i = 0; i < drm->outputs->length; ++i) { + struct wlr_output_state *output = drm->outputs->items[i]; + wlr_drm_output_start_renderer(output); + } + } else { wlr_log(L_INFO, "DRM fd paused"); - } -} - -static void device_resumed(struct wl_listener *listener, void *data) { - struct wlr_backend_state *drm = wl_container_of(listener, drm, device_resumed); - struct device_arg *arg = data; - - if (arg->dev != drm->dev) { - return; - } - if (dup2(arg->fd, drm->fd) < 0) { - wlr_log(L_ERROR, "dup2 failed: %s", strerror(errno)); - return; - } - - wlr_log(L_INFO, "DRM fd resumed"); - - for (size_t i = 0; i < drm->outputs->length; ++i) { - struct wlr_output_state *output = drm->outputs->items[i]; - wlr_drm_output_start_renderer(output); + for (size_t i = 0; i < drm->outputs->length; ++i) { + struct wlr_output_state *output = drm->outputs->items[i]; + wlr_drm_output_pause_renderer(output); + } } } @@ -139,14 +127,8 @@ struct wlr_backend *wlr_drm_backend_create(struct wl_display *display, goto error_fd; } - wl_list_init(&state->device_paused.link); - wl_list_init(&state->device_paused.link); - - state->device_paused.notify = device_paused; - state->device_resumed.notify = device_resumed; - - wl_signal_add(&session->device_paused, &state->device_paused); - wl_signal_add(&session->device_resumed, &state->device_resumed); + state->session_signal.notify = session_signal; + wl_signal_add(&session->session_signal, &state->session_signal); // TODO: what is the difference between the per-output renderer and this // one? diff --git a/backend/drm/drm.c b/backend/drm/drm.c index 5afdf3c3..ca4f56c3 100644 --- a/backend/drm/drm.c +++ b/backend/drm/drm.c @@ -116,6 +116,21 @@ static void wlr_drm_output_end(struct wlr_output_state *output) { output->bo[0] = bo; } +void wlr_drm_output_pause_renderer(struct wlr_output_state *output) { + if (output->state != DRM_OUTPUT_CONNECTED) { + return; + } + + if (output->bo[1]) { + gbm_surface_release_buffer(output->gbm, output->bo[1]); + output->bo[1] = NULL; + } + if (output->bo[0]) { + gbm_surface_release_buffer(output->gbm, output->bo[0]); + output->bo[0] = NULL; + } +} + void wlr_drm_output_start_renderer(struct wlr_output_state *output) { if (output->state != DRM_OUTPUT_CONNECTED) { return; @@ -608,7 +623,7 @@ static void page_flip_handler(int fd, unsigned seq, } output->pageflip_pending = false; - if (output->state == DRM_OUTPUT_CONNECTED) { + if (output->state == DRM_OUTPUT_CONNECTED && state->session->active) { wlr_drm_output_begin(output); wl_signal_emit(&output->wlr_output->events.frame, output->wlr_output); wlr_drm_output_end(output); |