Rather than a more piecemeal approach at backend creation, explicitly
track connectors and CRTCs we do not intend to use, so we can ensure
they are disabled where appropriate.

Signed-off-by: Daniel Stone <dani...@collabora.com>
Reviewed-by: Pekka Paalanen <pekka.paala...@collabora.co.uk>
---
 libweston/compositor-drm.c | 53 ++++++++++++++++++++++++++++++++++++++++++++++
 1 file changed, 53 insertions(+)

diff --git a/libweston/compositor-drm.c b/libweston/compositor-drm.c
index f732d20d..d2ed8343 100644
--- a/libweston/compositor-drm.c
+++ b/libweston/compositor-drm.c
@@ -185,6 +185,9 @@ struct drm_backend {
 
        void *repaint_data;
 
+       struct wl_array unused_connectors;
+       struct wl_array unused_crtcs;
+
        int cursors_are_broken;
 
        bool universal_planes;
@@ -4011,6 +4014,47 @@ drm_output_disable(struct weston_output *base)
        return 0;
 }
 
+/**
+ * Update the list of unused connectors and CRTCs
+ *
+ * This keeps the unused_connectors and unused_crtcs arrays up to date.
+ *
+ * @param b Weston backend structure
+ * @param resources DRM resources for this device
+ */
+static void
+drm_backend_update_unused_outputs(struct drm_backend *b, drmModeRes *resources)
+{
+       int i;
+
+       wl_array_release(&b->unused_connectors);
+       wl_array_init(&b->unused_connectors);
+
+       for (i = 0; i < resources->count_connectors; i++) {
+               uint32_t *connector_id;
+
+               if (drm_output_find_by_connector(b, resources->connectors[i]))
+                       continue;
+
+               connector_id = wl_array_add(&b->unused_connectors,
+                                           sizeof(*connector_id));
+               *connector_id = resources->connectors[i];
+       }
+
+       wl_array_release(&b->unused_crtcs);
+       wl_array_init(&b->unused_crtcs);
+
+       for (i = 0; i < resources->count_crtcs; i++) {
+               uint32_t *crtc_id;
+
+               if (drm_output_find_by_crtc(b, resources->crtcs[i]))
+                       continue;
+
+               crtc_id = wl_array_add(&b->unused_crtcs, sizeof(*crtc_id));
+               *crtc_id = resources->crtcs[i];
+       }
+}
+
 /**
  * Create a Weston output structure
  *
@@ -4155,6 +4199,8 @@ create_outputs(struct drm_backend *b, struct udev_device 
*drm_device)
                }
        }
 
+       drm_backend_update_unused_outputs(b, resources);
+
        if (wl_list_empty(&b->compositor->output_list) &&
            wl_list_empty(&b->compositor->pending_output_list))
                weston_log("No currently active connector found.\n");
@@ -4246,6 +4292,8 @@ update_outputs(struct drm_backend *b, struct udev_device 
*drm_device)
                drm_output_destroy(&output->base);
        }
 
+       drm_backend_update_unused_outputs(b, resources);
+
        free(connected);
        drmModeFreeResources(resources);
 }
@@ -4310,6 +4358,9 @@ drm_destroy(struct weston_compositor *ec)
 
        weston_launcher_destroy(ec->launcher);
 
+       wl_array_release(&b->unused_crtcs);
+       wl_array_release(&b->unused_connectors);
+
        close(b->drm.fd);
        free(b);
 }
@@ -4718,6 +4769,8 @@ drm_backend_create(struct weston_compositor *compositor,
                return NULL;
 
        b->drm.fd = -1;
+       wl_array_init(&b->unused_crtcs);
+       wl_array_init(&b->unused_connectors);
 
        /*
         * KMS support for hardware planes cannot properly synchronize
-- 
2.14.1

_______________________________________________
wayland-devel mailing list
wayland-devel@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/wayland-devel

Reply via email to