compositor-drm: Add blob_id member to drm_mode
authorDaniel Stone <daniels@collabora.com>
Wed, 16 Nov 2016 10:54:10 +0000 (10:54 +0000)
committerDaniel Stone <daniels@collabora.com>
Tue, 6 Feb 2018 13:55:13 +0000 (13:55 +0000)
For atomic modesetting support, the mode is identified by a blob
property ID, rather than being passed inline. Add a blob_id member to
drm_mode to handle this, including refactoring mode destruction into a
helper function.

Signed-off-by: Daniel Stone <daniels@collabora.com>
Reviewed-by: Pekka Paalanen <pekka.paalanen@collabora.co.uk>
libweston/compositor-drm.c

index 7545bad..282ab68 100644 (file)
@@ -234,6 +234,7 @@ struct drm_backend {
 struct drm_mode {
        struct weston_mode base;
        drmModeModeInfo mode_info;
+       uint32_t blob_id;
 };
 
 enum drm_fb_type {
@@ -3368,6 +3369,7 @@ drm_output_add_mode(struct drm_output *output, const drmModeModeInfo *info)
 
        mode->base.refresh = refresh;
        mode->mode_info = *info;
+       mode->blob_id = 0;
 
        if (info->type & DRM_MODE_TYPE_PREFERRED)
                mode->base.flags |= WL_OUTPUT_MODE_PREFERRED;
@@ -3377,6 +3379,18 @@ drm_output_add_mode(struct drm_output *output, const drmModeModeInfo *info)
        return mode;
 }
 
+/**
+ * Destroys a mode, and removes it from the list.
+ */
+static void
+drm_output_destroy_mode(struct drm_backend *backend, struct drm_mode *mode)
+{
+       if (mode->blob_id)
+               drmModeDestroyPropertyBlob(backend->drm.fd, mode->blob_id);
+       wl_list_remove(&mode->base.link);
+       free(mode);
+}
+
 static int
 drm_subpixel_to_wayland(int drm_value)
 {
@@ -4332,10 +4346,8 @@ drm_output_destroy(struct weston_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);
-       }
+                             base.link)
+               drm_output_destroy_mode(b, drm_mode);
 
        if (output->pageflip_timer)
                wl_event_source_remove(output->pageflip_timer);