X-Git-Url: http://www.chiark.greenend.org.uk/ucgi/~ianmdlvl/git?a=blobdiff_plain;f=src%2Flibsystemd-terminal%2Fgrdev.c;h=feed579295e17206ee00889c7265559e3905772d;hb=b6e676ce41508e2aeea22202fc8f234126177f52;hp=bbc45afad48a11ede0454c2d7a02e10d7cb7253f;hpb=aec3f44651998211d559b474bb830aad65680a62;p=elogind.git diff --git a/src/libsystemd-terminal/grdev.c b/src/libsystemd-terminal/grdev.c index bbc45afad..feed57929 100644 --- a/src/libsystemd-terminal/grdev.c +++ b/src/libsystemd-terminal/grdev.c @@ -19,19 +19,16 @@ along with systemd; If not, see . ***/ -#include #include #include #include #include #include -#include #include "grdev.h" #include "grdev-internal.h" #include "hashmap.h" #include "login-shared.h" #include "macro.h" -#include "udev-util.h" #include "util.h" static void pipe_enable(grdev_pipe *pipe); @@ -343,7 +340,7 @@ void grdev_display_disable(grdev_display *display) { } } -const grdev_display_target *grdev_display_next_target(grdev_display *display, const grdev_display_target *prev, uint64_t minage) { +const grdev_display_target *grdev_display_next_target(grdev_display *display, const grdev_display_target *prev) { grdev_display_cache *cache; size_t idx; @@ -374,54 +371,38 @@ const grdev_display_target *grdev_display_next_target(grdev_display *display, co if (!pipe->running || !pipe->enabled) continue; - /* if front-buffer is up-to-date, there's nothing to do */ - if (minage > 0 && pipe->front && pipe->front->age >= minage) - continue; - /* find suitable back-buffer */ - if (!(fb = pipe->back)) { - if (!pipe->vtable->target || !(fb = pipe->vtable->target(pipe))) + if (!pipe->back) { + if (!pipe->vtable->target) + continue; + if (!(fb = pipe->vtable->target(pipe))) continue; assert(fb == pipe->back); } - /* if back-buffer is up-to-date, schedule flip */ - if (minage > 0 && fb->age >= minage) { - grdev_display_flip_target(display, target, fb->age); - continue; - } + target->front = pipe->front; + target->back = pipe->back; - /* we have an out-of-date back-buffer; return for redraw */ - target->fb = fb; return target; } return NULL; } -void grdev_display_flip_target(grdev_display *display, const grdev_display_target *target, uint64_t age) { +void grdev_display_flip_target(grdev_display *display, const grdev_display_target *target) { grdev_display_cache *cache; - size_t i; assert(display); assert(!display->modified); assert(display->enabled); assert(target); - assert(target->fb); cache = container_of(target, grdev_display_cache, target); assert(cache->pipe); assert(cache->pipe->tile->display == display); - /* reset age of all FB on overflow */ - if (age < target->fb->age) - for (i = 0; i < cache->pipe->max_fbs; ++i) - if (cache->pipe->fbs[i]) - cache->pipe->fbs[i]->age = 0; - - ((grdev_fb*)target->fb)->age = age; cache->pipe->flip = true; } @@ -593,8 +574,8 @@ static bool display_cache(grdev_display *display) { out: if (r < 0) - log_debug("grdev: %s/%s: cannot cache pipes: %s", - display->session->name, display->name, strerror(-r)); + log_debug_errno(r, "grdev: %s/%s: cannot cache pipes: %m", + display->session->name, display->name); return true; } @@ -724,7 +705,7 @@ void grdev_pipe_ready(grdev_pipe *pipe, bool running) { /* grdev_pipe_ready() is used by backends to notify about pipe state * changed. If a pipe is ready, it can be fully used by us (available, - * enabled and accessable). Backends can disable pipes at any time + * enabled and accessible). Backends can disable pipes at any time * (like for async revocation), but can only enable them from parent * context. Otherwise, we might call user-callbacks recursively. */ @@ -788,8 +769,8 @@ void grdev_pipe_schedule(grdev_pipe *pipe, uint64_t frames) { return; error: - log_debug("grdev: %s/%s/%s: cannot schedule vsync timer: %s", - pipe->card->session->name, pipe->card->name, pipe->name, strerror(-r)); + log_debug_errno(r, "grdev: %s/%s/%s: cannot schedule vsync timer: %m", + pipe->card->session->name, pipe->card->name, pipe->name); } /* @@ -1192,8 +1173,8 @@ void grdev_session_add_drm(grdev_session *session, struct udev_device *ud) { r = grdev_drm_card_new(&card, session, ud); if (r < 0) { - log_debug("grdev: %s: cannot add DRM device for %s: %s", - session->name, udev_device_get_syspath(ud), strerror(-r)); + log_debug_errno(r, "grdev: %s: cannot add DRM device for %s: %m", + session->name, udev_device_get_syspath(ud)); return; } @@ -1285,8 +1266,8 @@ static void session_configure(grdev_session *session) { } else if (!display) { r = grdev_display_new(&display, session, pipe->name); if (r < 0) { - log_debug("grdev: %s/%s: cannot create display for pipe %s: %s", - session->name, card->name, pipe->name, strerror(-r)); + log_debug_errno(r, "grdev: %s/%s: cannot create display for pipe %s: %m", + session->name, card->name, pipe->name); continue; } }