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 <hdegoede@redhat.com>
This commit is contained in:
Hans de Goede 2019-01-16 09:41:42 +01:00
parent 475a51d057
commit 15ebdd6d5b

View file

@ -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,