derekf pushed a commit to branch master.

http://git.enlightenment.org/core/efl.git/commit/?id=e11bb10a4e14ec661f69a4acb2988f4b9de1d323

commit e11bb10a4e14ec661f69a4acb2988f4b9de1d323
Author: Derek Foreman <[email protected]>
Date:   Fri Jan 26 10:13:25 2018 -0600

    ecore_wl2: Move smarts from surface_map to buffer_map
    
    This simplifies the surface code so that it no longer needs access to
    buffer structure members.
---
 src/lib/ecore_wl2/Ecore_Wl2.h         |  2 +-
 src/lib/ecore_wl2/ecore_wl2_buffer.c  | 26 ++++++++++++++++++++++----
 src/lib/ecore_wl2/ecore_wl2_surface.c | 16 ++++++----------
 3 files changed, 29 insertions(+), 15 deletions(-)

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;
-
-   ptr = ecore_wl2_buffer_map(b);
-   if (!ptr)
-     return NULL;
+   if (w) *w = stride / 4;
 
-   b->mapping = ptr;
-   b->locked = EINA_TRUE;
-   return b->mapping;
+   return ptr;
 }
 
 static Ecore_Wl2_Buffer *

-- 


Reply via email to