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.
This commit is contained in:
Derek Foreman 2016-09-07 21:25:32 -05:00
parent 5eec34812e
commit 79409757c6
1 changed files with 10 additions and 2 deletions

View 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;
}