X-Git-Url: https://www.chiark.greenend.org.uk/ucgi/~ianmdlvl/git?a=blobdiff_plain;f=src%2Flibsystemd-terminal%2Fgrdev-drm.c;h=48f8e9ce9643be80a2d91ac941032c9a97afe407;hb=31938a8560a664c32a9d72f1fc2d4347b232e6e9;hp=232321c0e25b2792a46d6c4c862af67848aefee8;hpb=1bfa594cf26a9880c489cdcb5911bfb3440aa566;p=elogind.git diff --git a/src/libsystemd-terminal/grdev-drm.c b/src/libsystemd-terminal/grdev-drm.c index 232321c0e..48f8e9ce9 100644 --- a/src/libsystemd-terminal/grdev-drm.c +++ b/src/libsystemd-terminal/grdev-drm.c @@ -1158,8 +1158,21 @@ static int grdrm_crtc_commit_flip(grdrm_crtc *crtc, grdev_fb *basefb) { assert(basefb); assert(pipe); - if (!crtc->applied && !grdrm_modes_compatible(&crtc->kern.mode, &crtc->set.mode)) + if (!crtc->applied) { + if (!grdrm_modes_compatible(&crtc->kern.mode, &crtc->set.mode)) + return 0; + + /* TODO: Theoretically, we should be able to page-flip to our + * framebuffer here. We didn't perform any deep modeset, but the + * DRM driver is really supposed to reject our page-flip in case + * the FB is not compatible. We then properly fall back to a + * deep modeset. + * As it turns out, drivers don't to this. Therefore, we need to + * perform a full modeset on enter now. We might avoid this in + * the future with fixed drivers.. */ + return 0; + } fb = fb_from_base(basefb); @@ -1380,7 +1393,7 @@ static int grdrm_fb_new(grdrm_fb **out, grdrm_card *card, const struct drm_mode_ r = ioctl(card->fd, DRM_IOCTL_MODE_CREATE_DUMB, &create_dumb); if (r < 0) { - r = -errno; + r = negative_errno(); log_debug("grdrm: %s: cannot create dumb buffer %" PRIu32 "x%" PRIu32": %m", card->base.name, fb->base.width, fb->base.height); return r; @@ -1394,7 +1407,7 @@ static int grdrm_fb_new(grdrm_fb **out, grdrm_card *card, const struct drm_mode_ r = ioctl(card->fd, DRM_IOCTL_MODE_MAP_DUMB, &map_dumb); if (r < 0) { - r = -errno; + r = negative_errno(); log_debug("grdrm: %s: cannot map dumb buffer %" PRIu32 "x%" PRIu32": %m", card->base.name, fb->base.width, fb->base.height); return r; @@ -1402,7 +1415,7 @@ static int grdrm_fb_new(grdrm_fb **out, grdrm_card *card, const struct drm_mode_ fb->base.maps[0] = mmap(0, fb->sizes[0], PROT_WRITE, MAP_SHARED, card->fd, map_dumb.offset); if (fb->base.maps[0] == MAP_FAILED) { - r = -errno; + r = negative_errno(); log_debug("grdrm: %s: cannot memory-map dumb buffer %" PRIu32 "x%" PRIu32": %m", card->base.name, fb->base.width, fb->base.height); return r; @@ -1420,7 +1433,7 @@ static int grdrm_fb_new(grdrm_fb **out, grdrm_card *card, const struct drm_mode_ r = ioctl(card->fd, DRM_IOCTL_MODE_ADDFB2, &add_fb); if (r < 0) { - r = -errno; + r = negative_errno(); log_debug("grdrm: %s: cannot add framebuffer %" PRIu32 "x%" PRIu32": %m", card->base.name, fb->base.width, fb->base.height); return r;