wayland-shm: Introduce buffer ages

Summary:
We now track each shm buffer's time since last draw so evas can tell
what it needs to re-render.

Reviewers: zmike, devilhorns

Reviewed By: devilhorns

Subscribers: cedric

Differential Revision: https://phab.enlightenment.org/D2893
This commit is contained in:
Derek Foreman 2015-07-30 11:45:38 -04:00 committed by Chris Michael
parent 997e84f14e
commit f86e04b14f
3 changed files with 47 additions and 19 deletions

View File

@ -63,11 +63,12 @@ struct _Shm_Data
typedef struct _Shm_Leaf Shm_Leaf; typedef struct _Shm_Leaf Shm_Leaf;
struct _Shm_Leaf struct _Shm_Leaf
{ {
int w, h, busy; int w, h, busy, age;
Shm_Data *data; Shm_Data *data;
Shm_Pool *resize_pool; Shm_Pool *resize_pool;
Eina_Bool valid : 1; Eina_Bool valid : 1;
Eina_Bool reconfigure : 1; Eina_Bool reconfigure : 1;
Eina_Bool drawn : 1;
}; };
typedef struct _Shm_Surface Shm_Surface; typedef struct _Shm_Surface Shm_Surface;

View File

@ -251,26 +251,20 @@ _evas_outbuf_flush(Outbuf *ob, Tilebuf_Rect *rects EINA_UNUSED, Evas_Render_Mode
Render_Engine_Swap_Mode Render_Engine_Swap_Mode
_evas_outbuf_swap_mode_get(Outbuf *ob) _evas_outbuf_swap_mode_get(Outbuf *ob)
{ {
int count = 0, ret = 0; int age;
LOGFN(__FILE__, __LINE__, __FUNCTION__); LOGFN(__FILE__, __LINE__, __FUNCTION__);
if (!_evas_shm_surface_assign(ob->surface)) return MODE_FULL; if (!_evas_shm_surface_assign(ob->surface)) return MODE_FULL;
/* This was broken, for now we just do full redraws */ age = ob->surface->current->age;
if (age > ob->surface->num_buff) return MODE_FULL;
else if (age == 1) return MODE_COPY;
else if (age == 2) return MODE_DOUBLE;
else if (age == 3) return MODE_TRIPLE;
else if (age == 4) return MODE_QUADRUPLE;
return MODE_FULL; return MODE_FULL;
if (count == ob->surface->num_buff) ret = MODE_FULL;
else if (count == 0) ret = MODE_COPY;
else if (count == 1) ret = MODE_DOUBLE;
else if (count == 2) ret = MODE_TRIPLE;
else if (count == 3) ret = MODE_QUADRUPLE;
else ret = MODE_FULL;
/* DBG("SWAPMODE: %d (0=FULL, 1=COPY, 2=DOUBLE, 3=TRIPLE, 4=QUAD", ret); */
/* DBG("\tBusy: %d", count); */
return ret;
} }
int int

View File

@ -290,7 +290,8 @@ _shm_leaf_create(Shm_Surface *surface, Shm_Leaf *leaf, int w, int h)
leaf->w = w; leaf->w = w;
leaf->h = h; leaf->h = h;
leaf->valid = EINA_TRUE; leaf->valid = EINA_TRUE;
leaf->drawn = EINA_FALSE;
leaf->age = 0;
wl_buffer_add_listener(leaf->data->buffer, &_shm_buffer_listener, surface); wl_buffer_add_listener(leaf->data->buffer, &_shm_buffer_listener, surface);
return EINA_TRUE; return EINA_TRUE;
@ -408,6 +409,7 @@ Eina_Bool
_evas_shm_surface_assign(Shm_Surface *surface) _evas_shm_surface_assign(Shm_Surface *surface)
{ {
int i; int i;
surface->current = NULL;
for (i = 0; i < surface->num_buff; i++) for (i = 0; i < surface->num_buff; i++)
{ {
@ -415,10 +417,39 @@ _evas_shm_surface_assign(Shm_Surface *surface)
if (surface->leaf[i].valid) if (surface->leaf[i].valid)
{ {
surface->current = &surface->leaf[i]; surface->current = &surface->leaf[i];
return EINA_TRUE; break;
} }
} }
return EINA_FALSE;
/* If we ran out of buffers we're in trouble, reset all ages */
if (!surface->current)
{
for (i = 0; i < surface->num_buff; i++)
{
if (surface->leaf[i].valid)
{
surface->leaf[i].drawn = EINA_FALSE;
surface->leaf[i].age = 0;
}
}
return EINA_FALSE;
}
/* Increment ages of all valid buffers */
for (i = 0; i < surface->num_buff; i++)
{
if (surface->leaf[i].valid && surface->leaf[i].drawn)
{
surface->leaf[i].age++;
if (surface->leaf[i].age > surface->num_buff)
{
surface->leaf[i].age = 0;
surface->leaf[i].drawn = EINA_FALSE;
}
}
}
return EINA_TRUE;
} }
void * void *
@ -475,6 +506,8 @@ _evas_shm_surface_post(Shm_Surface *surface, Eina_Rectangle *rects, unsigned int
wl_surface_commit(surface->surface); wl_surface_commit(surface->surface);
leaf->busy = 1; leaf->busy = EINA_TRUE;
leaf->drawn = EINA_TRUE;
leaf->age = 0;
surface->current = NULL; surface->current = NULL;
} }