From: Hans de Goede Date: Wed, 16 Jan 2019 08:41:42 +0000 (+0100) Subject: drm: Implement handle_change_event X-Git-Tag: 0.9.5~76^2~4 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=15ebdd6d5b0e98d7511815e2dfbe82d2ec86f493;p=thirdparty%2Fplymouth.git drm: Implement handle_change_event Now that we can call create_heads_for_active_connectors multiple times we can implement handle_change_event. Signed-off-by: Hans de Goede --- diff --git a/src/plugins/renderers/drm/plugin.c b/src/plugins/renderers/drm/plugin.c index 0963a84a..b190737e 100644 --- a/src/plugins/renderers/drm/plugin.c +++ b/src/plugins/renderers/drm/plugin.c @@ -1304,7 +1304,7 @@ remove_output (ply_renderer_backend_t *backend, ply_output_t *output) * Returns true if any heads were modified. */ static bool -create_heads_for_active_connectors (ply_renderer_backend_t *backend) +create_heads_for_active_connectors (ply_renderer_backend_t *backend, bool change) { int i, j, number_of_setup_outputs, outputs_len; ply_output_t output, *outputs; @@ -1380,8 +1380,12 @@ create_heads_for_active_connectors (ply_renderer_backend_t *backend) outputs = setup_outputs (backend, outputs, outputs_len); number_of_setup_outputs = count_setup_controllers (outputs, outputs_len); } - if (number_of_setup_outputs != backend->connected_count) { - /* Second try, re-assing controller for all outputs */ + /* Try again if necessary, re-assing controllers for all outputs. + * Note this is skipped when processing change events, as we don't + * want to mess with the controller assignment of already lit monitors + * in that case. + */ + if (!change && number_of_setup_outputs != backend->connected_count) { ply_trace ("Some outputs still don't have controllers, re-assigning controllers for all outputs"); for (i = 0; i < outputs_len; i++) outputs[i].controller_id = 0; @@ -1484,7 +1488,7 @@ query_device (ply_renderer_backend_t *backend) return false; } - if (!create_heads_for_active_connectors (backend)) { + if (!create_heads_for_active_connectors (backend, false)) { ply_trace ("Could not initialize heads"); ret = false; } else if (!has_32bpp_support (backend)) { @@ -1498,6 +1502,25 @@ query_device (ply_renderer_backend_t *backend) return ret; } +static bool +handle_change_event (ply_renderer_backend_t *backend) +{ + bool ret = true; + + backend->resources = drmModeGetResources (backend->device_fd); + if (backend->resources == NULL) { + ply_trace ("Could not get card resources for change event"); + return false; + } + + ret = create_heads_for_active_connectors (backend, true); + + drmModeFreeResources (backend->resources); + backend->resources = NULL; + + return ret; +} + static bool map_to_device (ply_renderer_backend_t *backend) { @@ -1776,6 +1799,7 @@ ply_renderer_backend_get_interface (void) .open_device = open_device, .close_device = close_device, .query_device = query_device, + .handle_change_event = handle_change_event, .map_to_device = map_to_device, .unmap_from_device = unmap_from_device, .activate = activate,