From 51cff8bdedbc283b2403ab4a688903d8b1f2fab5 Mon Sep 17 00:00:00 2001 From: David Herrmann Date: Thu, 2 Oct 2014 18:26:06 +0200 Subject: [PATCH] terminal/grdev: provide front and back buffer to renderers We really want more sophisticated aging than just 64bit integers. So always provide front *and* back buffers to renderers so they can compare arbitrary aging information and decide whether to re-render. --- src/libsystemd-terminal/grdev.c | 27 ++++++++++----------------- src/libsystemd-terminal/grdev.h | 13 +++++++------ src/libsystemd-terminal/modeset.c | 8 ++++---- 3 files changed, 21 insertions(+), 27 deletions(-) diff --git a/src/libsystemd-terminal/grdev.c b/src/libsystemd-terminal/grdev.c index bbc45afad4..a700a7316b 100644 --- a/src/libsystemd-terminal/grdev.c +++ b/src/libsystemd-terminal/grdev.c @@ -343,7 +343,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,26 +374,19 @@ 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; } @@ -408,7 +401,7 @@ void grdev_display_flip_target(grdev_display *display, const grdev_display_targe assert(!display->modified); assert(display->enabled); assert(target); - assert(target->fb); + assert(target->back); cache = container_of(target, grdev_display_cache, target); @@ -416,12 +409,12 @@ void grdev_display_flip_target(grdev_display *display, const grdev_display_targe assert(cache->pipe->tile->display == display); /* reset age of all FB on overflow */ - if (age < target->fb->age) + if (age < target->back->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; + ((grdev_fb*)target->back)->age = age; cache->pipe->flip = true; } diff --git a/src/libsystemd-terminal/grdev.h b/src/libsystemd-terminal/grdev.h index 6ca8a767c4..ca0373ed29 100644 --- a/src/libsystemd-terminal/grdev.h +++ b/src/libsystemd-terminal/grdev.h @@ -105,7 +105,8 @@ struct grdev_display_target { uint32_t height; unsigned int rotate; unsigned int flip; - const grdev_fb *fb; + const grdev_fb *front; + const grdev_fb *back; }; void grdev_display_set_userdata(grdev_display *display, void *userdata); @@ -119,13 +120,13 @@ bool grdev_display_is_enabled(grdev_display *display); void grdev_display_enable(grdev_display *display); 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); void grdev_display_flip_target(grdev_display *display, const grdev_display_target *target, uint64_t age); -#define GRDEV_DISPLAY_FOREACH_TARGET(_display, _t, _minage) \ - for ((_t) = grdev_display_next_target((_display), NULL, (_minage)); \ - (_t); \ - (_t) = grdev_display_next_target((_display), (_t), (_minage))) +#define GRDEV_DISPLAY_FOREACH_TARGET(_display, _t) \ + for ((_t) = grdev_display_next_target((_display), NULL); \ + (_t); \ + (_t) = grdev_display_next_target((_display), (_t))) /* * Events diff --git a/src/libsystemd-terminal/modeset.c b/src/libsystemd-terminal/modeset.c index f564fa0f65..2f8860dd5f 100644 --- a/src/libsystemd-terminal/modeset.c +++ b/src/libsystemd-terminal/modeset.c @@ -234,18 +234,18 @@ static void modeset_draw(Modeset *m, const grdev_display_target *t) { uint32_t j, k, *b; uint8_t *l; - assert(t->fb->format == DRM_FORMAT_XRGB8888 || t->fb->format == DRM_FORMAT_ARGB8888); + assert(t->back->format == DRM_FORMAT_XRGB8888 || t->back->format == DRM_FORMAT_ARGB8888); assert(!t->rotate); assert(!t->flip); - l = t->fb->maps[0]; + l = t->back->maps[0]; for (j = 0; j < t->height; ++j) { for (k = 0; k < t->width; ++k) { b = (uint32_t*)l; b[k] = (0xff << 24) | (m->r << 16) | (m->g << 8) | m->b; } - l += t->fb->strides[0]; + l += t->back->strides[0]; } } @@ -256,7 +256,7 @@ static void modeset_render(Modeset *m, grdev_display *d) { m->g = next_color(&m->g_up, m->g, 3); m->b = next_color(&m->b_up, m->b, 2); - GRDEV_DISPLAY_FOREACH_TARGET(d, t, 0) { + GRDEV_DISPLAY_FOREACH_TARGET(d, t) { modeset_draw(m, t); grdev_display_flip_target(d, t, 1); }