From fd2c68dbf25ce0cbbc0d7baf668b2b5456f26a39 Mon Sep 17 00:00:00 2001 From: Christopher Michael Date: Thu, 24 Jan 2013 09:21:18 +0000 Subject: [PATCH] Add a swapper_buffer_idle_flush function to loop the Wl_Buffer structures inside the swapper and release memory of any invalid ones. Signed-off-by: Christopher Michael SVN revision: 83283 --- .../evas/engines/wayland_shm/evas_swapper.c | 40 ++++++++++++++++++- 1 file changed, 38 insertions(+), 2 deletions(-) diff --git a/src/modules/evas/engines/wayland_shm/evas_swapper.c b/src/modules/evas/engines/wayland_shm/evas_swapper.c index 445f2c12e2..e1bcd5449b 100644 --- a/src/modules/evas/engines/wayland_shm/evas_swapper.c +++ b/src/modules/evas/engines/wayland_shm/evas_swapper.c @@ -172,6 +172,27 @@ evas_swapper_buffer_state_get(Wl_Swapper *ws) return MODE_FULL; } +void +evas_swapper_buffer_idle_flush(Wl_Swapper *ws) +{ + int i = 0; + + /* 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_buffer_new(Wl_Swapper *ws, Wl_Buffer *wb) @@ -184,7 +205,7 @@ _evas_swapper_buffer_new(Wl_Swapper *ws, Wl_Buffer *wb) size_t size; /* make sure swapper has a shm */ - if (!ws->shm) return; + if (!ws->shm) return EINA_FALSE; wb->w = ws->w; wb->h = ws->h; @@ -265,9 +286,11 @@ _evas_swapper_buffer_free(Wl_Buffer *wb) /* kill the wl_buffer */ if (wb->buffer) wl_buffer_destroy(wb->buffer); + wb->buffer = NULL; /* unmap the buffer data */ - munmap(wb->data, wb->size); + if (wb->data) munmap(wb->data, wb->size); + wb->data = NULL; } static void @@ -281,6 +304,17 @@ _evas_swapper_buffer_put(Wl_Swapper *ws, Wl_Buffer *wb, Eina_Rectangle *rects, u /* 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) + { + /* call function to mmap buffer data */ + if (!_evas_swapper_buffer_new(ws, wb)) + return; + } + rect = eina_rectangle_new(0, 0, 0, 0); if (rects) { @@ -307,6 +341,8 @@ _evas_swapper_buffer_put(Wl_Swapper *ws, Wl_Buffer *wb, Eina_Rectangle *rects, u /* surface commit */ wl_surface_commit(ws->surface); + + wb->valid = EINA_TRUE; } static void -- 2.34.1