From 32a68695d44af37408a8a6578821864478421581 Mon Sep 17 00:00:00 2001 From: Ray Strode Date: Mon, 21 Sep 2009 11:33:24 -0400 Subject: [PATCH] [drm] Find unused encoder if none used Apparently, we can end up in situations where an encoder isn't yet assigned to a connector. In those cases, we pick one of the available encoders and use it. --- src/plugins/renderers/drm/plugin.c | 60 ++++++++++++++++++++++++++++++++++- 1 files changed, 58 insertions(+), 2 deletions(-) diff --git a/src/plugins/renderers/drm/plugin.c b/src/plugins/renderers/drm/plugin.c index 7c8520b..6af8f35 100644 --- a/src/plugins/renderers/drm/plugin.c +++ b/src/plugins/renderers/drm/plugin.c @@ -77,6 +77,7 @@ struct _ply_renderer_head drmModeModeInfo *mode; uint32_t controller_id; + uint32_t encoder_id; uint32_t scan_out_buffer_id; }; @@ -116,6 +117,7 @@ ply_renderer_plugin_interface_t *ply_renderer_backend_get_interface (void); static ply_renderer_head_t * ply_renderer_head_new (ply_renderer_backend_t *backend, drmModeConnector *connector, + uint32_t encoder_id, uint32_t controller_id, drmModeModeInfo *mode) { @@ -125,6 +127,7 @@ ply_renderer_head_new (ply_renderer_backend_t *backend, head->backend = backend; head->connector = connector; + head->encoder_id = encoder_id; head->controller_id = controller_id; head->mode = mode; @@ -531,6 +534,54 @@ find_controller_for_encoder (ply_renderer_backend_t *backend, return 0; } +static bool +encoder_is_available (ply_renderer_backend_t *backend, + uint32_t encoder_id) +{ + ply_list_node_t *node; + + node = ply_list_get_first_node (backend->heads); + while (node != NULL) + { + ply_list_node_t *next_node; + ply_renderer_head_t *head; + + head = (ply_renderer_head_t *) ply_list_node_get_data (node); + next_node = ply_list_get_next_node (backend->heads, node); + + if (head->encoder_id == encoder_id) + return false; + + node = next_node; + } + + return true; +} + +static drmModeEncoder * +find_unused_encoder_for_connector (ply_renderer_backend_t *backend, + drmModeConnector *connector) +{ + int i; + drmModeEncoder *encoder; + + for (i = 0; i < connector->count_encoders; i++) + { + encoder = drmModeGetEncoder (backend->device_fd, + connector->encoders[i]); + + if (encoder == NULL) + continue; + + if (encoder_is_available (backend, encoder->encoder_id)) + return encoder; + + drmModeFreeEncoder (encoder); + } + + return NULL; +} + static drmModeEncoder * find_encoder_for_connector (ply_renderer_backend_t *backend, drmModeConnector *connector) @@ -554,7 +605,9 @@ find_encoder_for_connector (ply_renderer_backend_t *backend, drmModeFreeEncoder (encoder); } - return NULL; + /* No encoder yet, pick one + */ + return find_unused_encoder_for_connector (backend, connector); } static bool @@ -568,6 +621,7 @@ create_heads_for_active_connectors (ply_renderer_backend_t *backend) ply_renderer_head_t *head; drmModeEncoder *encoder; uint32_t controller_id; + uint32_t encoder_id; drmModeModeInfo *mode; connector = drmModeGetConnector (backend->device_fd, @@ -596,6 +650,7 @@ create_heads_for_active_connectors (ply_renderer_backend_t *backend) continue; } + encoder_id = encoder->encoder_id; controller_id = find_controller_for_encoder (backend, encoder); drmModeFreeEncoder (encoder); @@ -607,7 +662,8 @@ create_heads_for_active_connectors (ply_renderer_backend_t *backend) mode = get_active_mode_for_connector (backend, connector); - head = ply_renderer_head_new (backend, connector, controller_id, mode); + head = ply_renderer_head_new (backend, connector, encoder_id, + controller_id, mode); ply_list_append_data (backend->heads, head); } -- 1.6.4