ee_drm: Improve next buffer selection algorithm
authorDerek Foreman <derekf@osg.samsung.com>
Thu, 8 Sep 2016 02:25:32 +0000 (21:25 -0500)
committerDerek Foreman <derekf@osg.samsung.com>
Thu, 8 Sep 2016 18:55:24 +0000 (13:55 -0500)
When triple buffering it's possible that we'll only need two buffers at
a time for long durations.  When we finally call upon a third buffer it
hasn't been used recently enough to do a partial redraw.

By picking the oldest available buffer when multiple buffers are free we
can increase the likelihood of doing partial redraws.

src/modules/evas/engines/drm/evas_outbuf.c

index 97e4f10..b62d952 100644 (file)
@@ -224,15 +224,23 @@ _outbuf_reconfigure(Outbuf *ob, int w, int h, int rotation, Outbuf_Depth depth)
 static Outbuf_Fb *
 _outbuf_fb_wait(Outbuf *ob)
 {
-   int i = 0;
+   int i = 0, best = -1, best_age = -1;
 
+   /* We pick the oldest available buffer to avoid using the same two
+    * repeatedly and then having the third be stale when we need it
+    */
    for (i = 0; i < ob->priv.num; i++)
      {
         if (&ob->priv.ofb[i] == ob->priv.display) continue;
         if (ecore_drm2_fb_busy_get(ob->priv.ofb[i].fb)) continue;
-        if (ob->priv.ofb[i].valid) return &(ob->priv.ofb[i]);
+        if (ob->priv.ofb[i].valid && (ob->priv.ofb[i].age > best_age))
+          {
+             best = i;
+             best_age = ob->priv.ofb[i].age;
+          }
      }
 
+   if (best >= 0) return &(ob->priv.ofb[best]);
    return NULL;
 }