From 5442e5f9032ac98c0b5d7aaee165d61f028d36e0 Mon Sep 17 00:00:00 2001 From: David Herrmann Date: Wed, 28 Nov 2012 22:54:46 +0100 Subject: [PATCH] uterm: clear displays during sleep and wakeup We shouldn't leave the content on the framebuffers when leaving kmscon. This might confuse the user. Furthermore, we shouldn't reload the old framebuffer during wakeup as this frame can be quite old and we see a short flickering during wakeup which isn't wanted, either. Signed-off-by: David Herrmann --- src/uterm_video_drm.c | 23 +++++++++++++++++++++-- src/uterm_video_dumb.c | 8 ++++++-- src/uterm_video_fbdev.c | 1 + 3 files changed, 28 insertions(+), 4 deletions(-) diff --git a/src/uterm_video_drm.c b/src/uterm_video_drm.c index 2725c31..a715953 100644 --- a/src/uterm_video_drm.c +++ b/src/uterm_video_drm.c @@ -876,9 +876,12 @@ static void show_displays(struct uterm_video *video) { int ret; struct uterm_display *iter; + struct drm_rb *rb; if (!video_is_awake(video)) return; + if (video_do_use(video)) + return; for (iter = video->displays; iter; iter = iter->next) { if (!display_is_online(iter)) @@ -886,9 +889,24 @@ static void show_displays(struct uterm_video *video) if (iter->dpms != UTERM_DPMS_ON) continue; + rb = &iter->drm.rb[iter->drm.current_rb]; + + glBindFramebuffer(GL_FRAMEBUFFER, iter->drm.fb); + glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, + GL_RENDERBUFFER, rb->rb); + if (glCheckFramebufferStatus(GL_FRAMEBUFFER) != + GL_FRAMEBUFFER_COMPLETE) { + log_warn("cannot set gl-renderbuffer"); + continue; + } + + glClearColor(0, 0, 0, 1); + glClear(GL_COLOR_BUFFER_BIT); + glFinish(); + ret = drmModeSetCrtc(video->drm.fd, iter->drm.crtc_id, - iter->drm.rb[iter->drm.current_rb].fb, 0, 0, - &iter->drm.conn_id, 1, &iter->current_mode->drm.info); + rb->fb, 0, 0, &iter->drm.conn_id, 1, + &iter->current_mode->drm.info); if (ret) { log_err("cannot set drm-crtc on display %p", iter); continue; @@ -1236,6 +1254,7 @@ static void video_sleep(struct uterm_video *video) if (!video_is_awake(video)) return; + show_displays(video); drmDropMaster(video->drm.fd); video->flags &= ~VIDEO_AWAKE; } diff --git a/src/uterm_video_dumb.c b/src/uterm_video_dumb.c index c95d5aa..4648089 100644 --- a/src/uterm_video_dumb.c +++ b/src/uterm_video_dumb.c @@ -626,6 +626,7 @@ static void show_displays(struct uterm_video *video) { int ret; struct uterm_display *iter; + struct dumb_rb *rb; if (!video_is_awake(video)) return; @@ -636,9 +637,11 @@ static void show_displays(struct uterm_video *video) if (iter->dpms != UTERM_DPMS_ON) continue; + rb = &iter->dumb.rb[iter->dumb.current_rb]; + memset(rb->map, 0, rb->size); ret = drmModeSetCrtc(video->dumb.fd, iter->dumb.crtc_id, - iter->dumb.rb[iter->dumb.current_rb].fb, 0, 0, - &iter->dumb.conn_id, 1, &iter->current_mode->dumb.info); + rb->fb, 0, 0, &iter->dumb.conn_id, 1, + &iter->current_mode->dumb.info); if (ret) { log_err("cannot set drm-crtc on display %p", iter); continue; @@ -896,6 +899,7 @@ static void video_sleep(struct uterm_video *video) if (!video_is_awake(video)) return; + show_displays(video); drmDropMaster(video->dumb.fd); video->flags &= ~VIDEO_AWAKE; } diff --git a/src/uterm_video_fbdev.c b/src/uterm_video_fbdev.c index 36e139c..e64f40b 100644 --- a/src/uterm_video_fbdev.c +++ b/src/uterm_video_fbdev.c @@ -305,6 +305,7 @@ static void display_deactivate_force(struct uterm_display *disp, bool force) uterm_mode_unref(disp->current_mode); disp->modes = NULL; disp->current_mode = NULL; + memset(disp->fbdev.map, 0, disp->fbdev.len); munmap(disp->fbdev.map, disp->fbdev.len); if (!force)