forked from enlightenment/efl
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:
parent
63a255750b
commit
ed665ee6ee
|
@ -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);
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue