diff --git a/src/lib/ecore_wl2/Ecore_Wl2.h b/src/lib/ecore_wl2/Ecore_Wl2.h index 1f2729e35f..e214894058 100644 --- a/src/lib/ecore_wl2/Ecore_Wl2.h +++ b/src/lib/ecore_wl2/Ecore_Wl2.h @@ -2002,7 +2002,7 @@ EAPI Eina_Bool ecore_wl2_buffer_init(Ecore_Wl2_Display *ewd, Ecore_Wl2_Buffer_Ty EAPI Ecore_Wl2_Buffer *ecore_wl2_buffer_create(Ecore_Wl2_Display *ewd, int w, int h, Eina_Bool alpha); EAPI void ecore_wl2_buffer_destroy(Ecore_Wl2_Buffer *b); EAPI struct wl_buffer *ecore_wl2_buffer_wl_buffer_get(Ecore_Wl2_Display *ewd, Ecore_Wl2_Buffer *buf); -EAPI void *ecore_wl2_buffer_map(Ecore_Wl2_Buffer *buf); +EAPI void *ecore_wl2_buffer_map(Ecore_Wl2_Buffer *buf, int *w, int *h, int *stride); EAPI void ecore_wl2_buffer_unmap(Ecore_Wl2_Buffer *buf); EAPI void ecore_wl2_buffer_discard(Ecore_Wl2_Buffer *buf); EAPI void ecore_wl2_buffer_unlock(Ecore_Wl2_Buffer *b); diff --git a/src/lib/ecore_wl2/ecore_wl2_buffer.c b/src/lib/ecore_wl2/ecore_wl2_buffer.c index 1a9c5c5af9..3bb56748cd 100644 --- a/src/lib/ecore_wl2/ecore_wl2_buffer.c +++ b/src/lib/ecore_wl2/ecore_wl2_buffer.c @@ -622,13 +622,31 @@ ecore_wl2_buffer_wl_buffer_get(Ecore_Wl2_Display *ewd, Ecore_Wl2_Buffer *buf) } EAPI void * -ecore_wl2_buffer_map(Ecore_Wl2_Buffer *buf) +ecore_wl2_buffer_map(Ecore_Wl2_Buffer *buf, int *w, int *h, int *stride) { void *out; - _buffer_manager_ref(); - out = buffer_manager->map(buf); - if (!out) _buffer_manager_deref(); + EINA_SAFETY_ON_NULL_RETURN_VAL(buf, NULL); + + if (buf->locked) + { + out = buf->mapping; + } + else + { + _buffer_manager_ref(); + out = buffer_manager->map(buf); + if (!out) + { + _buffer_manager_deref(); + return NULL; + } + buf->locked = EINA_TRUE; + buf->mapping = out; + } + if (w) *w = buf->w; + if (h) *h = buf->h; + if (stride) *stride = (int)buf->stride; return out; } diff --git a/src/lib/ecore_wl2/ecore_wl2_surface.c b/src/lib/ecore_wl2/ecore_wl2_surface.c index bb0d87c4ae..94804dd0f3 100644 --- a/src/lib/ecore_wl2/ecore_wl2_surface.c +++ b/src/lib/ecore_wl2/ecore_wl2_surface.c @@ -53,24 +53,20 @@ _evas_dmabuf_surface_data_get(Ecore_Wl2_Surface *s, int *w, int *h) { Ecore_Wl2_Buffer *b; void *ptr; + int stride; b = s->current; if (!b) return NULL; + ptr = ecore_wl2_buffer_map(b, NULL, h, &stride); + if (!ptr) return NULL; + /* We return stride/bpp because it may not match the allocated * width. evas will figure out the clipping */ - if (w) *w = b->stride / 4; - if (h) *h = b->h; - if (b->locked) return b->mapping; + if (w) *w = stride / 4; - ptr = ecore_wl2_buffer_map(b); - if (!ptr) - return NULL; - - b->mapping = ptr; - b->locked = EINA_TRUE; - return b->mapping; + return ptr; } static Ecore_Wl2_Buffer *