wayland_shm: Abstract the actual shm operations

Make the Surface carry function pointers and the shm surface create
function set them.  This refactor makes implementing dmabuf operations
simpler.
This commit is contained in:
Derek Foreman 2016-04-11 15:39:09 -05:00 committed by Mike Blumenkrantz
parent 63a255750b
commit ed665ee6ee
3 changed files with 64 additions and 55 deletions

View File

@ -85,6 +85,14 @@ struct _Surface
union {
Shm_Surface *shm;
} surf;
struct
{
void (*destroy)(Surface *surface);
void (*reconfigure)(Surface *surface, int w, int h, int num_buff, uint32_t flags);
void *(*data_get)(Surface *surface, int *w, int *h);
int (*assign)(Surface *surface);
void (*post)(Surface *surface, Eina_Rectangle *rects, unsigned int count);
} funcs;
};
struct _Outbuf
@ -117,11 +125,6 @@ struct _Outbuf
};
Surface *_evas_shm_surface_create(struct wl_display *disp, struct wl_shm *shm, struct wl_surface *surface, int w, int h, int num_buff, Eina_Bool alpha, int compositor_version);
void _evas_shm_surface_destroy(Surface *surface);
void _evas_shm_surface_reconfigure(Surface *surface, int w, int h, int num_buff, uint32_t flags);
void *_evas_shm_surface_data_get(Surface *surface, int *w, int *h);
int _evas_shm_surface_assign(Surface *surface);
void _evas_shm_surface_post(Surface *surface, Eina_Rectangle *rects, unsigned int count);
Outbuf *_evas_outbuf_setup(int w, int h, int rot, Outbuf_Depth depth, Eina_Bool alpha, struct wl_shm *shm, struct wl_surface *surface, struct wl_display *disp, int compositor_version);
void _evas_outbuf_free(Outbuf *ob);

View File

@ -96,7 +96,7 @@ _evas_outbuf_free(Outbuf *ob)
_evas_outbuf_flush(ob, NULL, EVAS_RENDER_MODE_UNDEF);
_evas_outbuf_idle_flush(ob);
if (ob->surface) _evas_shm_surface_destroy(ob->surface);
if (ob->surface) ob->surface->funcs.destroy(ob->surface);
eina_array_flush(&ob->priv.onebuf_regions);
@ -176,7 +176,7 @@ _evas_outbuf_flush(Outbuf *ob, Tilebuf_Rect *rects EINA_UNUSED, Evas_Render_Mode
eina_rectangle_free(rect);
}
_evas_shm_surface_post(ob->surface, result, n);
ob->surface->funcs.post(ob->surface, result, n);
/* clean array */
eina_array_clean(&ob->priv.onebuf_regions);
@ -258,7 +258,7 @@ _evas_outbuf_flush(Outbuf *ob, Tilebuf_Rect *rects EINA_UNUSED, Evas_Render_Mode
i++;
}
_evas_shm_surface_post(ob->surface, result, n);
ob->surface->funcs.post(ob->surface, result, n);
}
}
@ -269,7 +269,7 @@ _evas_outbuf_swap_mode_get(Outbuf *ob)
LOGFN(__FILE__, __LINE__, __FUNCTION__);
age = _evas_shm_surface_assign(ob->surface);
age = ob->surface->funcs.assign(ob->surface);
if (age == 1) return MODE_COPY;
else if (age == 2) return MODE_DOUBLE;
else if (age == 3) return MODE_TRIPLE;
@ -308,13 +308,13 @@ _evas_outbuf_reconfigure(Outbuf *ob, int w, int h, int rot, Outbuf_Depth depth,
if ((ob->rotation == 0) || (ob->rotation == 180))
{
_evas_shm_surface_reconfigure(ob->surface, w, h,
ob->num_buff, resize);
ob->surface->funcs.reconfigure(ob->surface, w, h,
ob->num_buff, resize);
}
else if ((ob->rotation == 90) || (ob->rotation == 270))
{
_evas_shm_surface_reconfigure(ob->surface, h, w,
ob->num_buff, resize);
ob->surface->funcs.reconfigure(ob->surface, h, w,
ob->num_buff, resize);
}
_evas_outbuf_idle_flush(ob);
@ -338,7 +338,7 @@ _evas_outbuf_update_region_new(Outbuf *ob, int x, int y, int w, int h, int *cx,
int bw = 0, bh = 0;
void *data;
if (!(data = _evas_shm_surface_data_get(ob->surface, &bw, &bh)))
if (!(data = ob->surface->funcs.data_get(ob->surface, &bw, &bh)))
{
/* ERR("Could not get surface data"); */
return NULL;
@ -515,7 +515,7 @@ _evas_outbuf_update_region_push(Outbuf *ob, RGBA_Image *update, int x, int y, in
if (bpp <= 0) return;
/* check for valid desination data */
if (!(dst = _evas_shm_surface_data_get(ob->surface, &ww, &hh)))
if (!(dst = ob->surface->funcs.data_get(ob->surface, &ww, &hh)))
{
/* ERR("Could not get surface data"); */
return;

View File

@ -394,46 +394,6 @@ _shm_leaf_destroy(Shm_Leaf *leaf)
leaf->resize_pool = NULL;
}
Surface *
_evas_shm_surface_create(struct wl_display *disp, struct wl_shm *shm, struct wl_surface *surface, int w, int h, int num_buff, Eina_Bool alpha, int compositor_version)
{
Surface *s;
Shm_Surface *surf;
int i = 0;
LOGFN(__FILE__, __LINE__, __FUNCTION__);
if (!(s = calloc(1, sizeof(Surface)))) return NULL;
if (!(s->surf.shm = calloc(1, sizeof(Shm_Surface)))) goto err;
s->type = SURFACE_SHM;
surf = s->surf.shm;
surf->w = w;
surf->h = h;
surf->disp = disp;
surf->shm = shm;
surf->surface = surface;
surf->num_buff = num_buff;
surf->alpha = alpha;
surf->compositor_version = compositor_version;
/* create surface buffers */
for (; i < surf->num_buff; i++)
{
if (!_shm_leaf_create(surf, &(surf->leaf[i]), w, h))
{
ERR("Could not create surface leaf");
goto err;
}
}
return s;
err:
_evas_shm_surface_destroy(s);
return NULL;
}
void
_evas_shm_surface_destroy(Surface *surface)
{
@ -626,3 +586,49 @@ _evas_shm_surface_post(Surface *s, Eina_Rectangle *rects, unsigned int count)
leaf->age = 0;
surface->current = NULL;
}
Surface *
_evas_shm_surface_create(struct wl_display *disp, struct wl_shm *shm, struct wl_surface *surface, int w, int h, int num_buff, Eina_Bool alpha, int compositor_version)
{
Surface *s;
Shm_Surface *surf;
int i = 0;
LOGFN(__FILE__, __LINE__, __FUNCTION__);
if (!(s = calloc(1, sizeof(Surface)))) return NULL;
if (!(s->surf.shm = calloc(1, sizeof(Shm_Surface)))) goto err;
s->type = SURFACE_SHM;
surf = s->surf.shm;
surf->w = w;
surf->h = h;
surf->disp = disp;
surf->shm = shm;
surf->surface = surface;
surf->num_buff = num_buff;
surf->alpha = alpha;
surf->compositor_version = compositor_version;
/* create surface buffers */
for (; i < surf->num_buff; i++)
{
if (!_shm_leaf_create(surf, &(surf->leaf[i]), w, h))
{
ERR("Could not create surface leaf");
goto err;
}
}
s->funcs.destroy = _evas_shm_surface_destroy;
s->funcs.reconfigure = _evas_shm_surface_reconfigure;
s->funcs.data_get = _evas_shm_surface_data_get;
s->funcs.assign = _evas_shm_surface_assign;
s->funcs.post = _evas_shm_surface_post;
return s;
err:
_evas_shm_surface_destroy(s);
return NULL;
}