summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDaniel Stone <daniels@collabora.com>2017-01-27 15:11:33 +0000
committerDaniel Stone <daniels@collabora.com>2017-02-07 19:16:32 +0000
commita8c15b17989f0b663eff3f214fc19ccef268688d (patch)
tree2ca55451d15fe0e592d3bcacc917fb2a7fff0cb9
parent797a4b1a845d9dee3fc3b39c8fb3e119045930eb (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.c23
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++) {