Zbigniew Jędrzejewski-Szmek 62fe94
From 66695cc343647dcbf654fbb4b3f38bd1ee092a0d 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:47:01 +0200
Zbigniew Jędrzejewski-Szmek 62fe94
Subject: [PATCH] terminal/grdev: allow arbitrary fb-age contexts
Zbigniew Jędrzejewski-Szmek 62fe94
Zbigniew Jędrzejewski-Szmek 62fe94
Instead of limiting fb-aging to 64bit integers, allow any arbitrary
Zbigniew Jędrzejewski-Szmek 62fe94
context together with a release function to free it once the FB is
Zbigniew Jędrzejewski-Szmek 62fe94
destroyed.
Zbigniew Jędrzejewski-Szmek 62fe94
---
Zbigniew Jędrzejewski-Szmek 62fe94
 src/libsystemd-terminal/grdev-drm.c |  3 +++
Zbigniew Jędrzejewski-Szmek 62fe94
 src/libsystemd-terminal/grdev.c     | 11 +----------
Zbigniew Jędrzejewski-Szmek 62fe94
 src/libsystemd-terminal/grdev.h     | 14 ++++++++++----
Zbigniew Jędrzejewski-Szmek 62fe94
 src/libsystemd-terminal/modeset.c   |  2 +-
Zbigniew Jędrzejewski-Szmek 62fe94
 4 files changed, 15 insertions(+), 15 deletions(-)
Zbigniew Jędrzejewski-Szmek 62fe94
Zbigniew Jędrzejewski-Szmek 62fe94
diff --git a/src/libsystemd-terminal/grdev-drm.c b/src/libsystemd-terminal/grdev-drm.c
Zbigniew Jędrzejewski-Szmek 62fe94
index 57b930bc0f..f01df1dae2 100644
Zbigniew Jędrzejewski-Szmek 62fe94
--- a/src/libsystemd-terminal/grdev-drm.c
Zbigniew Jędrzejewski-Szmek 62fe94
+++ b/src/libsystemd-terminal/grdev-drm.c
Zbigniew Jędrzejewski-Szmek 62fe94
@@ -1442,6 +1442,9 @@ grdrm_fb *grdrm_fb_free(grdrm_fb *fb) {
Zbigniew Jędrzejewski-Szmek 62fe94
 
Zbigniew Jędrzejewski-Szmek 62fe94
         assert(fb->card);
Zbigniew Jędrzejewski-Szmek 62fe94
 
Zbigniew Jędrzejewski-Szmek 62fe94
+        if (fb->base.free_fn)
Zbigniew Jędrzejewski-Szmek 62fe94
+                fb->base.free_fn(fb->base.data.ptr);
Zbigniew Jędrzejewski-Szmek 62fe94
+
Zbigniew Jędrzejewski-Szmek 62fe94
         if (fb->id > 0 && fb->card->fd >= 0) {
Zbigniew Jędrzejewski-Szmek 62fe94
                 r = ioctl(fb->card->fd, DRM_IOCTL_MODE_RMFB, fb->id);
Zbigniew Jędrzejewski-Szmek 62fe94
                 if (r < 0)
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 a700a7316b..0c21eac551 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
@@ -393,28 +393,19 @@ const grdev_display_target *grdev_display_next_target(grdev_display *display, co
Zbigniew Jędrzejewski-Szmek 62fe94
         return NULL;
Zbigniew Jędrzejewski-Szmek 62fe94
 }
Zbigniew Jędrzejewski-Szmek 62fe94
 
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
+void grdev_display_flip_target(grdev_display *display, const grdev_display_target *target) {
Zbigniew Jędrzejewski-Szmek 62fe94
         grdev_display_cache *cache;
Zbigniew Jędrzejewski-Szmek 62fe94
-        size_t i;
Zbigniew Jędrzejewski-Szmek 62fe94
 
Zbigniew Jędrzejewski-Szmek 62fe94
         assert(display);
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->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
         assert(cache->pipe);
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->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->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 ca0373ed29..35d6eb2abf 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
@@ -93,9 +93,15 @@ struct grdev_fb {
Zbigniew Jędrzejewski-Szmek 62fe94
         uint32_t width;
Zbigniew Jędrzejewski-Szmek 62fe94
         uint32_t height;
Zbigniew Jędrzejewski-Szmek 62fe94
         uint32_t format;
Zbigniew Jędrzejewski-Szmek 62fe94
-        uint64_t age;
Zbigniew Jędrzejewski-Szmek 62fe94
         int32_t strides[4];
Zbigniew Jędrzejewski-Szmek 62fe94
         void *maps[4];
Zbigniew Jędrzejewski-Szmek 62fe94
+
Zbigniew Jędrzejewski-Szmek 62fe94
+        union {
Zbigniew Jędrzejewski-Szmek 62fe94
+                void *ptr;
Zbigniew Jędrzejewski-Szmek 62fe94
+                uint64_t u64;
Zbigniew Jędrzejewski-Szmek 62fe94
+        } data;
Zbigniew Jędrzejewski-Szmek 62fe94
+
Zbigniew Jędrzejewski-Szmek 62fe94
+        void (*free_fn) (void *ptr);
Zbigniew Jędrzejewski-Szmek 62fe94
 };
Zbigniew Jędrzejewski-Szmek 62fe94
 
Zbigniew Jędrzejewski-Szmek 62fe94
 struct grdev_display_target {
Zbigniew Jędrzejewski-Szmek 62fe94
@@ -105,8 +111,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 *front;
Zbigniew Jędrzejewski-Szmek 62fe94
-        const grdev_fb *back;
Zbigniew Jędrzejewski-Szmek 62fe94
+        grdev_fb *front;
Zbigniew Jędrzejewski-Szmek 62fe94
+        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
@@ -121,7 +127,7 @@ 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);
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
+void grdev_display_flip_target(grdev_display *display, const grdev_display_target *target);
Zbigniew Jędrzejewski-Szmek 62fe94
 
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
diff --git a/src/libsystemd-terminal/modeset.c b/src/libsystemd-terminal/modeset.c
Zbigniew Jędrzejewski-Szmek 62fe94
index 2f8860dd5f..f5be38e4fa 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
@@ -258,7 +258,7 @@ static void modeset_render(Modeset *m, grdev_display *d) {
Zbigniew Jędrzejewski-Szmek 62fe94
 
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
+                grdev_display_flip_target(d, t);
Zbigniew Jędrzejewski-Szmek 62fe94
         }
Zbigniew Jędrzejewski-Szmek 62fe94
 
Zbigniew Jędrzejewski-Szmek 62fe94
         grdev_session_commit(m->grdev_session);