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