[PATCH weston v12 11/40] compositor-drm: Don't restore original CRTC mode

Daniel Stone daniels at collabora.com
Tue Sep 26 17:15:44 UTC 2017


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.

Signed-off-by: Daniel Stone <daniels at collabora.com>
---
 libweston/compositor-drm.c | 26 ++++++++------------------
 1 file changed, 8 insertions(+), 18 deletions(-)

diff --git a/libweston/compositor-drm.c b/libweston/compositor-drm.c
index 1781c7df..428205b8 100644
--- a/libweston/compositor-drm.c
+++ b/libweston/compositor-drm.c
@@ -338,7 +338,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;
 
 	/* Holds the properties for the connector */
@@ -1653,8 +1652,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,
@@ -1779,7 +1776,7 @@ drm_output_apply_state(struct drm_output_state *state)
 			weston_log("set mode failed: %m\n");
 			goto err;
 		}
-        }
+	}
 
 	if (drmModePageFlip(backend->drm.fd, output->crtc_id,
 			    scanout_state->fb->fb_id,
@@ -4049,10 +4046,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);
 
 	if (output->connector->connector_type == DRM_MODE_CONNECTOR_LVDS ||
@@ -4112,9 +4106,7 @@ static void
 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;
@@ -4131,14 +4123,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);
-	}
-
 	if (output->pageflip_timer)
 		wl_event_source_remove(output->pageflip_timer);
 
@@ -4256,6 +4240,7 @@ create_output_for_connector(struct drm_backend *b,
 	struct drm_output *output;
 	drmModeObjectPropertiesPtr props;
 	struct drm_mode *drm_mode;
+	drmModeCrtcPtr origcrtc;
 	int i;
 
 	static const struct drm_property_info connector_props[] = {
@@ -4281,12 +4266,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;
@@ -4306,6 +4294,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++) {
-- 
2.14.1



More information about the wayland-devel mailing list