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. Signed-off-by: Daniel Stone <daniels@collabora.com> Reviewed-by: Pekka Paalanen <pekka.paalanen@collabora.co.uk>
This commit is contained in:
@@ -234,6 +234,7 @@ struct drm_backend {
|
|||||||
struct drm_mode {
|
struct drm_mode {
|
||||||
struct weston_mode base;
|
struct weston_mode base;
|
||||||
drmModeModeInfo mode_info;
|
drmModeModeInfo mode_info;
|
||||||
|
uint32_t blob_id;
|
||||||
};
|
};
|
||||||
|
|
||||||
enum drm_fb_type {
|
enum drm_fb_type {
|
||||||
@@ -3368,6 +3369,7 @@ drm_output_add_mode(struct drm_output *output, const drmModeModeInfo *info)
|
|||||||
|
|
||||||
mode->base.refresh = refresh;
|
mode->base.refresh = refresh;
|
||||||
mode->mode_info = *info;
|
mode->mode_info = *info;
|
||||||
|
mode->blob_id = 0;
|
||||||
|
|
||||||
if (info->type & DRM_MODE_TYPE_PREFERRED)
|
if (info->type & DRM_MODE_TYPE_PREFERRED)
|
||||||
mode->base.flags |= WL_OUTPUT_MODE_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;
|
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
|
static int
|
||||||
drm_subpixel_to_wayland(int drm_value)
|
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,
|
wl_list_for_each_safe(drm_mode, next, &output->base.mode_list,
|
||||||
base.link) {
|
base.link)
|
||||||
wl_list_remove(&drm_mode->base.link);
|
drm_output_destroy_mode(b, drm_mode);
|
||||||
free(drm_mode);
|
|
||||||
}
|
|
||||||
|
|
||||||
if (output->pageflip_timer)
|
if (output->pageflip_timer)
|
||||||
wl_event_source_remove(output->pageflip_timer);
|
wl_event_source_remove(output->pageflip_timer);
|
||||||
|
|||||||
Reference in New Issue
Block a user