From: Chris Michael Date: Tue, 17 Mar 2015 19:32:29 +0000 (-0400) Subject: evas-wayland-shm: Remove old wayland_shm engine swapper files X-Git-Tag: v1.14.0-alpha1~201^2~2 X-Git-Url: http://review.tizen.org/git/?a=commitdiff_plain;h=5c753a859bfb0b4a49f8d2196a5f33c011ff1a2c;p=platform%2Fupstream%2Fefl.git evas-wayland-shm: Remove old wayland_shm engine swapper files Summary: Part of engine refactor to address resize issue in E wayland compositor Signed-off-by: Chris Michael --- diff --git a/src/modules/evas/engines/wayland_shm/evas_swapbuf.c b/src/modules/evas/engines/wayland_shm/evas_swapbuf.c deleted file mode 100644 index 79101b4..0000000 --- a/src/modules/evas/engines/wayland_shm/evas_swapbuf.c +++ /dev/null @@ -1,537 +0,0 @@ -#ifdef HAVE_CONFIG_H -# include -#endif - -//#include - -#ifdef EVAS_CSERVE2 -# include "evas_cs2_private.h" -#endif - -#include "evas_common_private.h" -#include "evas_macros.h" -#include "evas_engine.h" -#include "evas_swapbuf.h" -#include "evas_swapper.h" - -#define RED_MASK 0x00ff0000 -#define GREEN_MASK 0x0000ff00 -#define BLUE_MASK 0x000000ff - -/* local function prototypes */ - -Outbuf * -evas_swapbuf_setup(Evas_Engine_Info_Wayland_Shm *info, int w, int h, unsigned int rotation, Outbuf_Depth depth, Eina_Bool alpha, struct wl_shm *wl_shm, struct wl_surface *wl_surface) -{ - Outbuf *ob = NULL; - - LOGFN(__FILE__, __LINE__, __FUNCTION__); - - /* try to allocate a new Outbuf */ - if (!(ob = calloc(1, sizeof(Outbuf)))) - return NULL; - - /* set some properties */ - ob->w = w; - ob->h = h; - ob->rotation = rotation; - ob->depth = depth; - ob->priv.destination_alpha = alpha; - ob->priv.wl.shm = wl_shm; - ob->priv.wl.surface = wl_surface; - ob->info = info; - - if ((ob->rotation == 0) || (ob->rotation == 180)) - { - ob->priv.swapper = - evas_swapper_setup(0, 0, w, h, depth, alpha, ob->priv.wl.shm, - ob->priv.wl.surface); - } - else if ((ob->rotation == 90) || (ob->rotation == 270)) - { - ob->priv.swapper = - evas_swapper_setup(0, 0, h, w, depth, alpha, ob->priv.wl.shm, - ob->priv.wl.surface); - } - - /* check that a swapper was created */ - if (!ob->priv.swapper) - { - /* free the Outbuf structure allocation */ - free(ob); - - return NULL; - } - - /* set step size of regions array */ - eina_array_step_set(&ob->priv.onebuf_regions, sizeof(Eina_Array), 8); - - /* return allocated Outbuf */ - return ob; -} - -void -evas_swapbuf_free(Outbuf *ob) -{ - LOGFN(__FILE__, __LINE__, __FUNCTION__); - - /* check for valid output buffer */ - if (!ob) return; - - /* flush the output buffer */ - evas_swapbuf_flush(ob, NULL, MODE_FULL); - evas_swapbuf_idle_flush(ob); - evas_swapper_free(ob->priv.swapper); - eina_array_flush(&ob->priv.onebuf_regions); - - /* free the allocated structure */ - free(ob); -} - -void -evas_swapbuf_reconfigure(Outbuf *ob, int x, int y, int w, int h, int rotation, Outbuf_Depth depth, Eina_Bool alpha) -{ - LOGFN(__FILE__, __LINE__, __FUNCTION__); - - /* check for valid output buffer */ - if (!ob) return; - - if (depth == OUTBUF_DEPTH_INHERIT) depth = ob->depth; - - /* check that something was actually changed */ - if ((ob->w == w) && (ob->h == h) && - (ob->rotation == rotation) && (ob->depth == depth)) - return; - - /* set some properties */ - ob->w = w; - ob->h = h; - ob->rotation = rotation; - ob->depth = depth; - ob->priv.destination_alpha = alpha; - - /* check for valid swapper */ - if (ob->priv.swapper) - { - if ((ob->rotation == 0) || (ob->rotation == 180)) - ob->priv.swapper = evas_swapper_reconfigure(ob->priv.swapper, - x, y, w, h, depth, - alpha); - else if ((ob->rotation == 90) || (ob->rotation == 270)) - ob->priv.swapper = evas_swapper_reconfigure(ob->priv.swapper, - x, y, h, w, depth, - alpha); - return; - } - - /* create new swapper */ - if ((ob->rotation == 0) || (ob->rotation == 180)) - { - ob->priv.swapper = - evas_swapper_setup(x, y, w, h, depth, alpha, ob->priv.wl.shm, - ob->priv.wl.surface); - } - else if ((ob->rotation == 90) || (ob->rotation == 270)) - { - ob->priv.swapper = - evas_swapper_setup(x, y, h, w, depth, alpha, ob->priv.wl.shm, - ob->priv.wl.surface); - } -} - -void * -evas_swapbuf_update_region_new(Outbuf *ob, int x, int y, int w, int h, int *cx, int *cy, int *cw, int *ch) -{ - RGBA_Image *img; - Eina_Rectangle *rect; - - LOGFN(__FILE__, __LINE__, __FUNCTION__); - - RECTS_CLIP_TO_RECT(x, y, w, h, 0, 0, ob->w, ob->h); - if ((w <= 0) || (h <= 0)) return NULL; - - if (ob->rotation == 0) - { - if (!(img = ob->priv.onebuf)) - { - int bpl = 0; - int bw = 0, bh = 0; - void *data; - - data = evas_swapper_buffer_map(ob->priv.swapper, &bw, &bh); - bpl = (bw * sizeof(int)); - -#ifdef EVAS_CSERVE2 - if (evas_cserve2_use_get()) - img = (RGBA_Image *)evas_cache2_image_data(evas_common_image_cache2_get(), - bpl / sizeof(int), bh, - data, - ob->priv.destination_alpha, - EVAS_COLORSPACE_ARGB8888); - else -#endif - img = (RGBA_Image *)evas_cache_image_data(evas_common_image_cache_get(), - bpl / sizeof(int), bh, - data, - ob->priv.destination_alpha, - EVAS_COLORSPACE_ARGB8888); - - ob->priv.onebuf = img; - if (!img) return NULL; - } - - if (!(rect = eina_rectangle_new(x, y, w, h))) - return NULL; - - if (!eina_array_push(&ob->priv.onebuf_regions, rect)) - { -#ifdef EVAS_CSERVE2 - if (evas_cserve2_use_get()) - evas_cache2_image_close(&img->cache_entry); - else -#endif - evas_cache_image_drop(&img->cache_entry); - - eina_rectangle_free(rect); - - return NULL; - } - - /* clip the region to the onebuf region */ - if (cx) *cx = x; - if (cy) *cy = y; - if (cw) *cw = w; - if (ch) *ch = h; - return img; - } - else - { - if (!(rect = eina_rectangle_new(x, y, w, h))) - return NULL; - -#ifdef EVAS_CSERVE2 - if (evas_cserve2_use_get()) - img = (RGBA_Image *)evas_cache2_image_empty(evas_common_image_cache2_get()); - else -#endif - img = (RGBA_Image *)evas_cache_image_empty(evas_common_image_cache_get()); - - if (!img) - { - eina_rectangle_free(rect); - return NULL; - } - - img->cache_entry.flags.alpha |= ob->priv.destination_alpha; - -#ifdef EVAS_CSERVE2 - if (evas_cserve2_use_get()) - evas_cache2_image_surface_alloc(&img->cache_entry, w, h); - else -#endif - evas_cache_image_surface_alloc(&img->cache_entry, w, h); - - img->extended_info = rect; - - ob->priv.pending_writes = - eina_list_append(ob->priv.pending_writes, img); - - if (cx) *cx = 0; - if (cy) *cy = 0; - if (cw) *cw = w; - if (ch) *ch = h; - return img; - } - - return NULL; -} - -void -evas_swapbuf_update_region_push(Outbuf *ob, RGBA_Image *update, int x, int y, int w, int h) -{ - Gfx_Func_Convert func = NULL; - Eina_Rectangle rect = {0, 0, 0, 0}, pr; - DATA32 *src; - DATA8 *dst; - int depth = 32, bpp = 0, bpl = 0, wid = 0; - int ww = 0, hh = 0; - int rx = 0, ry = 0; - - LOGFN(__FILE__, __LINE__, __FUNCTION__); - - /* check for valid output buffer */ - if (!ob) return; - - /* check for pending writes */ - if (!ob->priv.pending_writes) return; - - if ((ob->rotation == 0) || (ob->rotation == 180)) - { - func = - evas_common_convert_func_get(0, w, h, depth, - RED_MASK, GREEN_MASK, BLUE_MASK, - PAL_MODE_NONE, ob->rotation); - } - else if ((ob->rotation == 90) || (ob->rotation == 270)) - { - func = - evas_common_convert_func_get(0, h, w, depth, - RED_MASK, GREEN_MASK, BLUE_MASK, - PAL_MODE_NONE, ob->rotation); - } - - /* make sure we have a valid convert function */ - if (!func) return; - - /* based on rotation, set rectangle position */ - if (ob->rotation == 0) - { - rect.x = x; - rect.y = y; - } - else if (ob->rotation == 90) - { - rect.x = y; - rect.y = (ob->w - x - w); - } - else if (ob->rotation == 180) - { - rect.x = (ob->w - x - w); - rect.y = (ob->h - y - h); - } - else if (ob->rotation == 270) - { - rect.x = (ob->h - y - h); - rect.y = x; - } - - /* based on rotation, set rectangle size */ - if ((ob->rotation == 0) || (ob->rotation == 180)) - { - rect.w = w; - rect.h = h; - } - else if ((ob->rotation == 90) || (ob->rotation == 270)) - { - rect.w = h; - rect.h = w; - } - - /* check for valid update image data */ - if (!(src = update->image.data)) return; - - bpp = depth / 8; - if (bpp <= 0) return; - - /* check for valid desination data */ - if (!(dst = evas_swapper_buffer_map(ob->priv.swapper, &ww, &hh))) return; - - bpl = (ww * sizeof(int)); - - if (ob->rotation == 0) - { - RECTS_CLIP_TO_RECT(rect.x, rect.y, rect.w, rect.h, 0, 0, ww, hh); - dst += (bpl * rect.y) + (rect.x * bpp); - w -= rx; - } - else if (ob->rotation == 180) - { - pr = rect; - RECTS_CLIP_TO_RECT(rect.x, rect.y, rect.w, rect.h, 0, 0, ww, hh); - rx = pr.w - rect.w; - ry = pr.h - rect.h; - src += (update->cache_entry.w * ry) + rx; - w -= rx; - } - else if (ob->rotation == 90) - { - pr = rect; - RECTS_CLIP_TO_RECT(rect.x, rect.y, rect.w, rect.h, 0, 0, ww, hh); - rx = pr.w - rect.w; ry = pr.h - rect.h; - src += ry; - w -= ry; - } - else if (ob->rotation == 270) - { - pr = rect; - RECTS_CLIP_TO_RECT(rect.x, rect.y, rect.w, rect.h, 0, 0, ww, hh); - rx = pr.w - rect.w; ry = pr.h - rect.h; - src += (update->cache_entry.w * rx); - w -= ry; - } - - if ((rect.w <= 0) || (rect.h <= 0)) return; - - wid = bpl / bpp; - - dst += (bpl * rect.y) + (rect.x * bpp); - - func(src, dst, (update->cache_entry.w - w), (wid - rect.w), - rect.w, rect.h, x + rx, y + ry, NULL); -} - -void -evas_swapbuf_update_region_free(Outbuf *ob EINA_UNUSED, RGBA_Image *update EINA_UNUSED) -{ - /* NB: nothing to do, they are cleaned up on flush */ -} - -void -evas_swapbuf_flush(Outbuf *ob, Tilebuf_Rect *rects EINA_UNUSED, Evas_Render_Mode render_mode) -{ - Eina_Rectangle *result; - RGBA_Image *img; - unsigned int n = 0, i = 0; - - LOGFN(__FILE__, __LINE__, __FUNCTION__); - - if (render_mode == EVAS_RENDER_MODE_ASYNC_INIT) return; - - /* check for valid output buffer */ - if (!ob) return; - - /* check for pending writes */ - if (!ob->priv.pending_writes) - { - Eina_Rectangle *rect; - Eina_Array_Iterator it; - - /* get number of buffer regions */ - n = eina_array_count_get(&ob->priv.onebuf_regions); - if (n == 0) return; - - /* allocate rectangles */ - if (!(result = alloca(n * sizeof(Eina_Rectangle)))) return; - - /* loop the buffer regions and assign to result */ - EINA_ARRAY_ITER_NEXT(&ob->priv.onebuf_regions, i, rect, it) - result[i] = *rect; - - /* unmap the buffer */ - evas_swapper_buffer_unmap(ob->priv.swapper); - - /* force a buffer swap */ - evas_swapper_swap(ob->priv.swapper, result, n); - - /* clean array */ - eina_array_clean(&ob->priv.onebuf_regions); - - img = ob->priv.onebuf; - ob->priv.onebuf = NULL; - if (img) - { -#ifdef EVAS_CSERVE2 - if (evas_cserve2_use_get()) - evas_cache2_image_close(&img->cache_entry); - else -#endif - evas_cache_image_drop(&img->cache_entry); - } - } - else - { - /* get number of pending writes */ - n = eina_list_count(ob->priv.pending_writes); - if (n == 0) return; - - /* allocate rectangles */ - if (!(result = alloca(n * sizeof(Eina_Rectangle)))) return; - - /* loop the pending writes */ - EINA_LIST_FREE(ob->priv.pending_writes, img) - { - Eina_Rectangle *rect; - int x = 0, y = 0, w = 0, h = 0; - - if (!(rect = img->extended_info)) continue; - - x = rect->x; y = rect->y; w = rect->w; h = rect->h; - - /* based on rotation, set rectangle position */ - if (ob->rotation == 0) - { - result[i].x = x; - result[i].y = y; - } - else if (ob->rotation == 90) - { - result[i].x = y; - result[i].y = (ob->w - x - w); - } - else if (ob->rotation == 180) - { - result[i].x = (ob->w - x - w); - result[i].y = (ob->h - y - h); - } - else if (ob->rotation == 270) - { - result[i].x = (ob->h - y - h); - result[i].y = x; - } - - /* based on rotation, set rectangle size */ - if ((ob->rotation == 0) || (ob->rotation == 180)) - { - result[i].w = w; - result[i].h = h; - } - else if ((ob->rotation == 90) || (ob->rotation == 270)) - { - result[i].w = h; - result[i].h = w; - } - - eina_rectangle_free(rect); - -#ifdef EVAS_CSERVE2 - if (evas_cserve2_use_get()) - evas_cache2_image_close(&img->cache_entry); - else -#endif - evas_cache_image_drop(&img->cache_entry); - - i++; - } - - /* unmap the buffer */ - evas_swapper_buffer_unmap(ob->priv.swapper); - - /* force a buffer swap */ - evas_swapper_swap(ob->priv.swapper, result, n); - } -} - -void -evas_swapbuf_idle_flush(Outbuf *ob EINA_UNUSED) -{ -// LOGFN(__FILE__, __LINE__, __FUNCTION__); - - /* check for valid output buffer */ - /* if (!ob) return; */ - - /* check for valid swapper */ - /* if (!ob->priv.swapper) return; */ - - /* tell the swapper to release any buffers that have been rendered */ - /* evas_swapper_buffer_idle_flush(ob->priv.swapper); */ -} - -Render_Engine_Swap_Mode -evas_swapbuf_state_get(Outbuf *ob) -{ - int mode = 0; - - LOGFN(__FILE__, __LINE__, __FUNCTION__); - - if (!ob->priv.swapper) return MODE_FULL; - mode = evas_swapper_buffer_state_get(ob->priv.swapper); - return mode; -} - -int -evas_swapbuf_rotation_get(Outbuf *ob) -{ - return ob->rotation; -} - -/* local functions */ diff --git a/src/modules/evas/engines/wayland_shm/evas_swapbuf.h b/src/modules/evas/engines/wayland_shm/evas_swapbuf.h deleted file mode 100644 index 8716a37..0000000 --- a/src/modules/evas/engines/wayland_shm/evas_swapbuf.h +++ /dev/null @@ -1,17 +0,0 @@ -#ifndef _EVAS_SWAPBUF_H -# define _EVAS_SWAPBUF_H - -# include "evas_engine.h" - -Outbuf *evas_swapbuf_setup(Evas_Engine_Info_Wayland_Shm *info, int w, int h, unsigned int rotation, Outbuf_Depth depth, Eina_Bool alpha, struct wl_shm *wl_shm, struct wl_surface *wl_surface); -void evas_swapbuf_free(Outbuf *ob); -void evas_swapbuf_reconfigure(Outbuf *ob, int x, int y, int w, int h, int rotation, Outbuf_Depth depth, Eina_Bool alpha); -void *evas_swapbuf_update_region_new(Outbuf *ob, int x, int y, int w, int h, int *cx, int *cy, int *cw, int *ch); -void evas_swapbuf_update_region_push(Outbuf *ob, RGBA_Image *update, int x, int y, int w, int h); -void evas_swapbuf_update_region_free(Outbuf *ob, RGBA_Image *update); -void evas_swapbuf_flush(Outbuf *ob, Tilebuf_Rect *rects, Evas_Render_Mode render_mode); -void evas_swapbuf_idle_flush(Outbuf *ob EINA_UNUSED); -Render_Engine_Swap_Mode evas_swapbuf_state_get(Outbuf *ob); -int evas_swapbuf_rotation_get(Outbuf *ob); - -#endif diff --git a/src/modules/evas/engines/wayland_shm/evas_swapper.c b/src/modules/evas/engines/wayland_shm/evas_swapper.c deleted file mode 100644 index 3b4d8f0..0000000 --- a/src/modules/evas/engines/wayland_shm/evas_swapper.c +++ /dev/null @@ -1,541 +0,0 @@ -#ifdef HAVE_CONFIG_H -# include -#endif - -#include - -#ifdef EVAS_CSERVE2 -# include "evas_cs2_private.h" -#endif - -#include "evas_common_private.h" -#include "evas_macros.h" -#include "evas_engine.h" -#include "evas_swapper.h" - -/* local structures */ -typedef struct _Wl_Buffer Wl_Buffer; -struct _Wl_Buffer -{ - Wl_Swapper *ws; - int w, h; - struct wl_buffer *buffer; - void *data; - int offset; - size_t size; - Eina_Bool valid : 1; -}; - -struct _Wl_Swapper -{ - Wl_Buffer buff[3]; - Wl_Buffer *buffer_sent; - int in_use; - int dx, dy, w, h, depth; - int buff_cur, buff_num, buff_last; - struct wl_shm *shm; - struct wl_surface *surface; - struct wl_shm_pool *pool; - size_t pool_size; - size_t used_size; - void *data; - Eina_Bool alpha : 1; - Eina_Bool mapped : 1; - Eina_Bool delete_me : 1; -}; - -/* local function prototypes */ -static Eina_Bool _evas_swapper_shm_pool_new(Wl_Swapper *ws); -static void _evas_swapper_shm_pool_free(Wl_Swapper *ws); -static Eina_Bool _evas_swapper_buffer_new(Wl_Swapper *ws, Wl_Buffer *wb); -static void _evas_swapper_buffer_free(Wl_Buffer *wb); -static void _evas_swapper_buffer_put(Wl_Swapper *ws, Wl_Buffer *wb, Eina_Rectangle *rects, unsigned int count); -static void _evas_swapper_buffer_release(void *data, struct wl_buffer *buffer); - -static const struct wl_buffer_listener _evas_swapper_buffer_listener = -{ - _evas_swapper_buffer_release -}; - -/* local variables */ - -Wl_Swapper * -evas_swapper_setup(int dx, int dy, int w, int h, Outbuf_Depth depth, Eina_Bool alpha, struct wl_shm *shm, struct wl_surface *surface) -{ - Wl_Swapper *ws; - int i = 0; - char *num_buffers; - - LOGFN(__FILE__, __LINE__, __FUNCTION__); - - /* try to allocate a new swapper */ - if (!(ws = calloc(1, sizeof(Wl_Swapper)))) - return NULL; - - /* set some properties */ - ws->dx = dx; - ws->dy = dy; - ws->w = w; - ws->h = h; - ws->depth = depth; - ws->alpha = alpha; - ws->shm = shm; - ws->surface = surface; - - /* double buffer by default */ - ws->buff_num = 2; - - /* check for buffer override number */ - if ((num_buffers = getenv("EVAS_WAYLAND_SHM_BUFFERS"))) - { - int num = 0; - - num = atoi(num_buffers); - - if (num <= 0) num = 1; - if (num > 3) num = 3; - - ws->buff_num = num; - } - - /* create the shm pool */ - if (!_evas_swapper_shm_pool_new(ws)) - { - evas_swapper_free(ws); - return NULL; - } - - for (i = 0; i < ws->buff_num; i++) - { - /* try to create new internal Wl_Buffer */ - if (!_evas_swapper_buffer_new(ws, &(ws->buff[i]))) - { - /* failed to create wl_buffer. free the swapper */ - evas_swapper_free(ws); - return NULL; - } - } - - /* return allocated swapper */ - return ws; -} - -Wl_Swapper * -evas_swapper_reconfigure(Wl_Swapper *ws, int dx, int dy, int w, int h, Outbuf_Depth depth, Eina_Bool alpha) -{ - int i = 0; - - LOGFN(__FILE__, __LINE__, __FUNCTION__); - - if (!ws) - { - ERR("No swapper to reconfigure."); - return NULL; - } - - /* loop the swapper's buffers and free them */ - for (i = 0; i < ws->buff_num; i++) - _evas_swapper_buffer_free(&(ws->buff[i])); - - /* free the shm pool */ - _evas_swapper_shm_pool_free(ws); - - ws->dx += dx; - ws->dy += dy; - ws->w = w; - ws->h = h; - ws->depth = depth; - ws->alpha = alpha; - - /* create the shm pool */ - if (!_evas_swapper_shm_pool_new(ws)) - { - ERR("Could not allocate new shm pool."); - evas_swapper_free(ws); - return NULL; - } - - for (i = 0; i < ws->buff_num; i++) - { - /* try to create new internal Wl_Buffer */ - if (!_evas_swapper_buffer_new(ws, &(ws->buff[i]))) - { - ERR("failed to create wl_buffer. free the swapper."); - evas_swapper_free(ws); - return NULL; - } - } - - /* return reconfigured swapper */ - return ws; -} - -void -evas_swapper_swap(Wl_Swapper *ws, Eina_Rectangle *rects, unsigned int count) -{ - int n = 0; - - LOGFN(__FILE__, __LINE__, __FUNCTION__); - - /* check for valid swapper */ - if (!ws) return; - - ws->buff_last = n = ws->buff_cur; - _evas_swapper_buffer_put(ws, &(ws->buff[n]), rects, count); - ws->buff[n].valid = EINA_TRUE; - ws->in_use++; - ws->buff_cur = (ws->buff_cur + 1) % ws->buff_num; -} - -void -evas_swapper_free(Wl_Swapper *ws) -{ - int i = 0; - - LOGFN(__FILE__, __LINE__, __FUNCTION__); - - /* check for valid swapper */ - if (!ws) return; - - /* loop the swapper's buffers and free them */ - for (i = 0; i < ws->buff_num; i++) - _evas_swapper_buffer_free(&(ws->buff[i])); - - if (ws->in_use) - { - ws->delete_me = EINA_TRUE; - return; - } - - /* free the shm pool */ - _evas_swapper_shm_pool_free(ws); - - /* free the allocated structure */ - free(ws); -} - -void * -evas_swapper_buffer_map(Wl_Swapper *ws, int *w, int *h) -{ - LOGFN(__FILE__, __LINE__, __FUNCTION__); - - /* check for valid swapper */ - if (!ws) return NULL; - - /* set mapped property */ - ws->mapped = EINA_TRUE; - if (w) *w = ws->w; - if (h) *h = ws->h; - - /* return wl_buffer data */ - return ws->buff[ws->buff_cur].data; -} - -void -evas_swapper_buffer_unmap(Wl_Swapper *ws) -{ - LOGFN(__FILE__, __LINE__, __FUNCTION__); - - /* check for valid swapper */ - if (!ws) return; - - ws->mapped = EINA_FALSE; -} - -int -evas_swapper_buffer_state_get(Wl_Swapper *ws) -{ - int delta; - - LOGFN(__FILE__, __LINE__, __FUNCTION__); - - delta = (ws->buff_last - ws->buff_cur + - (ws->buff_last > ws->buff_last ? - 0 : ws->buff_num)) % ws->buff_num; - - /* This is the number of frame since last frame */ - switch (delta) - { - case 0: - return MODE_COPY; - case 1: - return MODE_DOUBLE; - case 2: - return MODE_TRIPLE; - default: - return MODE_FULL; - } -} - -void -evas_swapper_buffer_idle_flush(Wl_Swapper *ws) -{ - int i = 0; - - LOGFN(__FILE__, __LINE__, __FUNCTION__); - - /* check for valid swapper */ - if (!ws) return; - - /* loop the swapper's buffers and free them */ - for (i = 0; i < ws->buff_num; i++) - { - Wl_Buffer *wb = NULL; - - /* try to get out Wl_Buffer struct */ - if (!(wb = (&(ws->buff[i])))) continue; - - /* if this buffer is not valid, then unmap data */ - if (!wb->valid) _evas_swapper_buffer_free(wb); - } -} - -/* local functions */ -static Eina_Bool -_evas_swapper_shm_pool_new(Wl_Swapper *ws) -{ - static const char tmp[] = "/evas-wayland_shm-XXXXXX"; - const char *path; - char *name; - size_t size; - int fd = 0; - - LOGFN(__FILE__, __LINE__, __FUNCTION__); - - /* make sure swapper has a shm */ - if (!ws->shm) return EINA_FALSE; - - /* calculate new required size */ - size = (((ws->w * sizeof(int)) * ws->h) * ws->buff_num); - - /* check pool size to see if we need to realloc the pool */ - if (size <= ws->pool_size) return EINA_TRUE; - - /* create tmp file, trying to use XDG_RUNTIME if set */ - if ((path = getenv("XDG_RUNTIME_DIR"))) - { - if ((name = malloc(strlen(path) + sizeof(tmp)))) - strcpy(name, path); - } - else - { - if ((name = malloc(strlen("/tmp") + sizeof(tmp)))) - strcpy(name, "/tmp"); - } - - if (!name) return EINA_FALSE; - - strcat(name, tmp); - - /* try to create the tmp file */ - if ((fd = mkstemp(name)) < 0) - { - ERR("Could not create temporary file."); - free(name); - return EINA_FALSE; - } - - /* unlink the temp file */ - unlink(name); - free(name); - - /* try to truncate the tmp file to requested size */ - if (ftruncate(fd, size) < 0) - { - ERR("Could not truncate temporary file."); - close(fd); - return EINA_FALSE; - } - - /* mem map the file */ - ws->data = mmap(NULL, size, (PROT_READ | PROT_WRITE), MAP_SHARED, fd, 0); - - /* if we failed to mem map the file, return an error */ - if (ws->data == MAP_FAILED) - { - ERR("Could not mmap temporary file."); - close(fd); - return EINA_FALSE; - } - - /* actually create the shm pool */ - ws->pool = wl_shm_create_pool(ws->shm, fd, size); - - ws->pool_size = size; - ws->used_size = 0; - - /* close the file */ - close(fd); - - return EINA_TRUE; -} - -static void -_evas_swapper_shm_pool_free(Wl_Swapper *ws) -{ - LOGFN(__FILE__, __LINE__, __FUNCTION__); - - /* check for valid swapper */ - if (!ws) return; - - /* check for valid pool */ - if (!ws->pool) return; - - /* unmap any existing data */ - if (ws->data) munmap(ws->data, ws->pool_size); - - /* destroy the shm pool */ - wl_shm_pool_destroy(ws->pool); - - ws->pool_size = 0; - ws->used_size = 0; -} - -static Eina_Bool -_evas_swapper_buffer_new(Wl_Swapper *ws, Wl_Buffer *wb) -{ - unsigned int format = WL_SHM_FORMAT_XRGB8888; - size_t size; - - LOGFN(__FILE__, __LINE__, __FUNCTION__); - - /* make sure swapper has a shm */ - if (!ws->shm) return EINA_FALSE; - - wb->w = ws->w; - wb->h = ws->h; - - /* calculate new required size */ - size = ((wb->w * sizeof(int)) * wb->h); - - /* check pool size to see if we need to realloc the pool */ - if (ws->used_size + size > ws->pool_size) - { - size_t newsize; - - /* calculate new required size */ - newsize = (ws->pool_size + size); - - /* resize the shm pool */ - wl_shm_pool_resize(ws->pool, newsize); - - ws->pool_size = newsize; - } - - /* check if this buffer needs argb and set format */ - if (ws->alpha) format = WL_SHM_FORMAT_ARGB8888; - - /* create actual wl_buffer */ - wb->buffer = - wl_shm_pool_create_buffer(ws->pool, ws->used_size, wb->w, wb->h, - (wb->w * sizeof(int)), format); - - /* add wayland buffer listener */ - wl_buffer_add_listener(wb->buffer, &_evas_swapper_buffer_listener, wb); - - wb->data = (char *)ws->data + ws->used_size; - wb->size = size; - - ws->used_size += size; - - wb->ws = ws; - - /* return allocated buffer */ - return EINA_TRUE; -} - -static void -_evas_swapper_buffer_free(Wl_Buffer *wb) -{ - LOGFN(__FILE__, __LINE__, __FUNCTION__); - - /* check for valid buffer */ - if ((!wb) || (wb->valid)) return; - - /* kill the wl_buffer */ - if (wb->buffer) wl_buffer_destroy(wb->buffer); - wb->buffer = NULL; - - /* unmap the buffer data */ - /* if (wb->data) munmap(wb->data, wb->size); */ - wb->data = NULL; -} - -static void -_evas_swapper_buffer_put(Wl_Swapper *ws, Wl_Buffer *wb, Eina_Rectangle *rects, unsigned int count) -{ - Eina_Rectangle *rect; - - LOGFN(__FILE__, __LINE__, __FUNCTION__); - - /* check for valid swapper */ - if (!ws) return; - - /* make sure swapper has a surface */ - if (!ws->surface) return; - - /* check for valid buffer */ - if (!wb) return; - - /* make sure buffer has mapped data */ - if ((!wb->data) || (!wb->buffer)) - { - /* call function to mmap buffer data */ - /* if (!_evas_swapper_buffer_new(ws, wb)) */ - return; - } - - rect = eina_rectangle_new(0, 0, 0, 0); - if ((rects) && (count > 0)) - { - unsigned int i = 0; - - for (i = 0; i < count; i++) - eina_rectangle_union(rect, &rects[i]); - } - else - { - Eina_Rectangle r; - - r.x = 0; r.y = 0; - r.w = wb->w; r.h = wb->h; - - eina_rectangle_union(rect, &r); - } - - /* surface attach */ - if (ws->buffer_sent != wb) - { - wl_surface_attach(ws->surface, wb->buffer, ws->dx, ws->dy); - ws->dx = 0; - ws->dy = 0; - ws->buffer_sent = wb; - } - - wl_surface_damage(ws->surface, rect->x, rect->y, rect->w, rect->h); - - /* surface commit */ - wl_surface_commit(ws->surface); - - eina_rectangle_free(rect); -} - -static void -_evas_swapper_buffer_release(void *data, struct wl_buffer *buffer EINA_UNUSED) -{ - Wl_Buffer *wb = NULL; - Wl_Swapper *ws = NULL; - - LOGFN(__FILE__, __LINE__, __FUNCTION__); - - /* try to get out Wl_Buffer struct */ - if (!(wb = data)) return; - - /* invalidate buffer */ - wb->valid = EINA_FALSE; - - ws = wb->ws; - ws->in_use--; - if (ws->delete_me && (ws->in_use <= 0)) - evas_swapper_free(ws); -} diff --git a/src/modules/evas/engines/wayland_shm/evas_swapper.h b/src/modules/evas/engines/wayland_shm/evas_swapper.h deleted file mode 100644 index f9fc90a..0000000 --- a/src/modules/evas/engines/wayland_shm/evas_swapper.h +++ /dev/null @@ -1,17 +0,0 @@ -#ifndef _EVAS_SWAPPER_H -# define _EVAS_SWAPPER_H - -#include "evas_engine.h" - -typedef struct _Wl_Swapper Wl_Swapper; - -Wl_Swapper *evas_swapper_setup(int dx, int dy, int w, int h, Outbuf_Depth depth, Eina_Bool alpha, struct wl_shm *shm, struct wl_surface *surface); -Wl_Swapper *evas_swapper_reconfigure(Wl_Swapper *ws, int dx, int dy, int w, int h, Outbuf_Depth depth, Eina_Bool alpha); -void evas_swapper_swap(Wl_Swapper *ws, Eina_Rectangle *rects, unsigned int count); -void evas_swapper_free(Wl_Swapper *ws); -void *evas_swapper_buffer_map(Wl_Swapper *ws, int *w, int *h); -void evas_swapper_buffer_unmap(Wl_Swapper *ws); -int evas_swapper_buffer_state_get(Wl_Swapper *ws); -void evas_swapper_buffer_idle_flush(Wl_Swapper *ws); - -#endif