And properly deconstruct it in drm_output_destroy.

Might be useful for finding out which modes are supported
before even setting them, in case we want to extend the
modesetting API.

Signed-off-by: Armin Krezović <[email protected]>
---
 libweston/compositor-drm.c | 63 +++++++++++++++++++++++-----------------------
 1 file changed, 32 insertions(+), 31 deletions(-)

diff --git a/libweston/compositor-drm.c b/libweston/compositor-drm.c
index f61e3d9..795e9f0 100644
--- a/libweston/compositor-drm.c
+++ b/libweston/compositor-drm.c
@@ -2288,29 +2288,19 @@ drm_output_set_mode(struct weston_output *base,
        struct drm_output *output = to_drm_output(base);
        struct drm_backend *b = to_drm_backend(base->compositor);
 
-       struct drm_mode *drm_mode, *next, *current;
+       struct drm_mode *current;
        drmModeModeInfo crtc_mode;
-       int i;
 
        output->base.make = "unknown";
        output->base.model = "unknown";
        output->base.serial_number = "unknown";
-       wl_list_init(&output->base.mode_list);
-
-       output->original_crtc = drmModeGetCrtc(b->drm.fd, output->crtc_id);
 
        if (connector_get_current_mode(output->connector, b->drm.fd, 
&crtc_mode) < 0)
-               goto err_free;
-
-       for (i = 0; i < output->connector->count_modes; i++) {
-               drm_mode = drm_output_add_mode(output, 
&output->connector->modes[i]);
-               if (!drm_mode)
-                       goto err_free;
-       }
+               return -1;
 
        current = drm_output_choose_initial_mode(b, output, mode, modeline, 
&crtc_mode);
        if (!current)
-               goto err_free;
+               return -1;
 
        output->base.current_mode = &current->base;
        output->base.current_mode->flags |= WL_OUTPUT_MODE_CURRENT;
@@ -2323,18 +2313,6 @@ drm_output_set_mode(struct weston_output *base,
        output->base.mm_height = output->connector->mmHeight;
 
        return 0;
-
-err_free:
-       drmModeFreeCrtc(output->original_crtc);
-       output->original_crtc = NULL;
-
-       wl_list_for_each_safe(drm_mode, next, &output->base.mode_list,
-                                                       base.link) {
-               wl_list_remove(&drm_mode->base.link);
-               free(drm_mode);
-       }
-
-       return -1;
 }
 
 static void
@@ -2457,6 +2435,7 @@ drm_output_destroy(struct weston_output *base)
 {
        struct drm_output *output = to_drm_output(base);
        struct drm_backend *b = to_drm_backend(base->compositor);
+       struct drm_mode *drm_mode, *next;
        drmModeCrtcPtr origcrtc = output->original_crtc;
 
        if (output->page_flip_pending) {
@@ -2468,6 +2447,12 @@ drm_output_destroy(struct weston_output *base)
        if (output->base.enabled)
                drm_output_deinit(&output->base);
 
+       wl_list_for_each_safe(drm_mode, next, &output->base.mode_list,
+                             base.link) {
+               wl_list_remove(&drm_mode->base.link);
+               free(drm_mode);
+       }
+
        if (origcrtc) {
                /* Restore original CRTC state */
                drmModeSetCrtc(b->drm.fd, origcrtc->crtc_id, 
origcrtc->buffer_id,
@@ -2532,17 +2517,18 @@ create_output_for_connector(struct drm_backend *b,
                            struct udev_device *drm_device)
 {
        struct drm_output *output;
+       struct drm_mode *drm_mode;
        int i;
 
        i = find_crtc_for_connector(b, resources, connector);
        if (i < 0) {
                weston_log("No usable crtc/encoder pair for connector.\n");
-               return -1;
+               goto err;
        }
 
        output = zalloc(sizeof *output);
        if (output == NULL)
-               return -1;
+               goto err;
 
        output->connector = connector;
        output->crtc_id = resources->crtcs[i];
@@ -2552,6 +2538,8 @@ create_output_for_connector(struct drm_backend *b,
        output->backlight = backlight_init(drm_device,
                                           connector->connector_type);
 
+       output->original_crtc = drmModeGetCrtc(b->drm.fd, output->crtc_id);
+
        output->base.enable = drm_output_enable;
        output->base.destroy = drm_output_destroy;
        output->base.disable = drm_output_disable;
@@ -2559,15 +2547,30 @@ create_output_for_connector(struct drm_backend *b,
 
        output->destroy_pending = 0;
        output->disable_pending = 0;
-       output->original_crtc = NULL;
 
        b->crtc_allocator |= (1 << output->crtc_id);
        b->connector_allocator |= (1 << output->connector_id);
 
        weston_output_init(&output->base, b->compositor);
+
+       wl_list_init(&output->base.mode_list);
+
+       for (i = 0; i < output->connector->count_modes; i++) {
+               drm_mode = drm_output_add_mode(output, 
&output->connector->modes[i]);
+               if (!drm_mode) {
+                       drm_output_destroy(&output->base);
+                       return -1;
+               }
+       }
+
        weston_compositor_add_pending_output(&output->base, b->compositor);
 
        return 0;
+
+err:
+       drmModeFreeConnector(connector);
+
+       return -1;
 }
 
 static void
@@ -2677,10 +2680,8 @@ create_outputs(struct drm_backend *b, uint32_t 
option_connector,
                    (option_connector == 0 ||
                     connector->connector_id == option_connector)) {
                        if (create_output_for_connector(b, resources,
-                                                       connector, drm_device) 
< 0) {
-                               drmModeFreeConnector(connector);
+                                                       connector, drm_device) 
< 0)
                                continue;
-                       }
                } else {
                        drmModeFreeConnector(connector);
                }
-- 
2.10.1

_______________________________________________
wayland-devel mailing list
[email protected]
https://lists.freedesktop.org/mailman/listinfo/wayland-devel

Reply via email to