From 79409757c6493738c21015708a1ba5178942ad94 Mon Sep 17 00:00:00 2001 From: Derek Foreman Date: Wed, 7 Sep 2016 21:25:32 -0500 Subject: [PATCH] ee_drm: Improve next buffer selection algorithm 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 | 12 ++++++++++-- 1 file changed, 10 insertions(+), 2 deletions(-) diff --git a/src/modules/evas/engines/drm/evas_outbuf.c b/src/modules/evas/engines/drm/evas_outbuf.c index 97e4f10..b62d952 100644 --- a/src/modules/evas/engines/drm/evas_outbuf.c +++ b/src/modules/evas/engines/drm/evas_outbuf.c @@ -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; } -- 2.7.4