summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDaniel Stone <daniels@collabora.com>2016-11-16 10:54:10 +0000
committerDaniel Stone <daniels@collabora.com>2017-02-07 19:16:32 +0000
commit6b2ca983eb876d3011540b35a269b63e05cf28e5 (patch)
tree3302302a477e323a034ff1a505d41ff4103c1365
parentf1676789e9bb10d0b663f2d90015090ff3e3d733 (diff)
compositor-drm: Add blob_id member to drm_mode
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. Differential Revision: https://phabricator.freedesktop.org/D1504 Signed-off-by: Daniel Stone <daniels@collabora.com>
-rw-r--r--libweston/compositor-drm.c20
1 files changed, 16 insertions, 4 deletions
diff --git a/libweston/compositor-drm.c b/libweston/compositor-drm.c
index bff4ca50..f2796cb2 100644
--- a/libweston/compositor-drm.c
+++ b/libweston/compositor-drm.c
@@ -227,6 +227,7 @@ struct drm_backend {
struct drm_mode {
struct weston_mode base;
drmModeModeInfo mode_info;
+ uint32_t blob_id;
};
enum drm_fb_type {
@@ -3039,6 +3040,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;
@@ -3048,6 +3050,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)
{
@@ -3939,10 +3953,8 @@ drm_output_destroy(struct weston_output *base)
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);
- }
+ base.link)
+ drm_output_destroy_mode(b, drm_mode);
weston_output_destroy(&output->base);