diff options
author | Daniel Stone <daniels@collabora.com> | 2017-01-27 15:11:33 +0000 |
---|---|---|
committer | Daniel Stone <daniels@collabora.com> | 2017-02-07 19:16:32 +0000 |
commit | a8c15b17989f0b663eff3f214fc19ccef268688d (patch) | |
tree | 2ca55451d15fe0e592d3bcacc917fb2a7fff0cb9 | |
parent | 797a4b1a845d9dee3fc3b39c8fb3e119045930eb (diff) |
compositor-drm: Don't restore original CRTC mode
When leaving Weston, don't attempt to restore the previous CRTC
settings. The framebuffer may well have disappeared, and in every
likelihood, whoever gets the KMS device afterwards will be repainting
anyway.
Differential Revision: https://phabricator.freedesktop.org/D1502
Signed-off-by: Daniel Stone <daniels@collabora.com>
-rw-r--r-- | libweston/compositor-drm.c | 23 |
1 files changed, 7 insertions, 16 deletions
diff --git a/libweston/compositor-drm.c b/libweston/compositor-drm.c index 085d51e5..89848bb6 100644 --- a/libweston/compositor-drm.c +++ b/libweston/compositor-drm.c @@ -296,7 +296,6 @@ struct drm_output { uint32_t crtc_id; /* object ID to pass to DRM functions */ int pipe; /* index of CRTC in resource array / bitmasks */ uint32_t connector_id; - drmModeCrtcPtr original_crtc; struct drm_edid edid; drmModePropertyPtr dpms_prop; uint32_t gbm_format; @@ -1512,8 +1511,6 @@ drm_output_set_gamma(struct weston_output *output_base, /* check */ if (output_base->gamma_size != size) return; - if (!output->original_crtc) - return; rc = drmModeCrtcSetGamma(backend->drm.fd, output->crtc_id, @@ -3728,10 +3725,7 @@ drm_output_enable(struct weston_output *base) output->base.assign_planes = drm_assign_planes; output->base.set_dpms = drm_set_dpms; output->base.switch_mode = drm_output_switch_mode; - - output->base.gamma_size = output->original_crtc->gamma_size; output->base.set_gamma = drm_output_set_gamma; - output->base.subpixel = drm_subpixel_to_wayland(output->connector->subpixel); find_and_parse_output_edid(b, output, output->connector); @@ -3794,7 +3788,6 @@ 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 || output->vblank_pending) { output->destroy_pending = 1; @@ -3811,14 +3804,6 @@ drm_output_destroy(struct weston_output *base) free(drm_mode); } - if (origcrtc) { - /* Restore original CRTC state */ - drmModeSetCrtc(b->drm.fd, origcrtc->crtc_id, origcrtc->buffer_id, - origcrtc->x, origcrtc->y, - &output->connector_id, 1, &origcrtc->mode); - drmModeFreeCrtc(origcrtc); - } - weston_output_destroy(&output->base); drmModeFreeConnector(output->connector); @@ -3883,6 +3868,7 @@ create_output_for_connector(struct drm_backend *b, { struct drm_output *output; struct drm_mode *drm_mode; + drmModeCrtcPtr origcrtc; int i; i = find_crtc_for_connector(b, resources, connector); @@ -3903,12 +3889,15 @@ 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); + origcrtc = drmModeGetCrtc(b->drm.fd, output->crtc_id); + if (origcrtc == NULL) + goto err; output->base.enable = drm_output_enable; output->base.destroy = drm_output_destroy; output->base.disable = drm_output_disable; output->base.name = make_connector_name(connector); + output->base.gamma_size = origcrtc->gamma_size; output->destroy_pending = 0; output->disable_pending = 0; @@ -3920,6 +3909,8 @@ create_output_for_connector(struct drm_backend *b, weston_output_init(&output->base, b->compositor); + drmModeFreeCrtc(origcrtc); + wl_list_init(&output->base.mode_list); for (i = 0; i < output->connector->count_modes; i++) { |