derekf pushed a commit to branch master.

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

commit 3d39c1e9b8647aebb12d4edfe426ec88e361c70d
Author: Derek Foreman <der...@osg.samsung.com>
Date:   Fri Sep 2 13:59:12 2016 -0500

    ecore_drm2: Add a function to set the pageflip callback data once
    
    Instead of passing the user data for the page flip callback every time,
    set it just once.
    
    This will make it easier to push tick logic into ecore_evas_drm, as there
    will be a transitional period where page flips are driven in two places
    that don't have access to the same pointers.
---
 src/lib/ecore_drm2/Ecore_Drm2.h               | 14 ++++++++++++--
 src/lib/ecore_drm2/ecore_drm2_fb.c            |  4 ++--
 src/lib/ecore_drm2/ecore_drm2_outputs.c       |  6 ++++++
 src/lib/ecore_drm2/ecore_drm2_private.h       |  2 ++
 src/modules/evas/engines/drm/evas_outbuf.c    |  6 ++++--
 src/modules/evas/engines/gl_drm/evas_outbuf.c |  5 +++--
 6 files changed, 29 insertions(+), 8 deletions(-)

diff --git a/src/lib/ecore_drm2/Ecore_Drm2.h b/src/lib/ecore_drm2/Ecore_Drm2.h
index ce9340f..0a8411f 100644
--- a/src/lib/ecore_drm2/Ecore_Drm2.h
+++ b/src/lib/ecore_drm2/Ecore_Drm2.h
@@ -770,14 +770,13 @@ EAPI void ecore_drm2_fb_dirty(Ecore_Drm2_Fb *fb, 
Eina_Rectangle *rects, unsigned
  *
  * @param fb
  * @param output
- * @param data
  *
  * @return The result of drmModePageFlip function call
  *
  * @ingroup Ecore_Drm2_Fb_Group
  * @since 1.18
  */
-EAPI int ecore_drm2_fb_flip(Ecore_Drm2_Fb *fb, Ecore_Drm2_Output *output, void 
*data);
+EAPI int ecore_drm2_fb_flip(Ecore_Drm2_Fb *fb, Ecore_Drm2_Output *output);
 
 /**
  * Return the Ecore_Drm2_Fb's busy status
@@ -802,6 +801,17 @@ EAPI Eina_Bool ecore_drm2_fb_busy_get(Ecore_Drm2_Fb *fb);
  */
 EAPI void ecore_drm2_fb_busy_set(Ecore_Drm2_Fb *fb, Eina_Bool busy);
 
+/**
+ * Set the user data for the output's page flip handler
+ *
+ * @param output The output to update user data for
+ * @param data The new user data pointer
+ *
+ * @ingroup Ecore_Drm2_Output_Group
+ * @since 1.19
+ */
+EAPI void ecore_drm2_output_user_data_set(Ecore_Drm2_Output *o, void *data);
+
 # endif
 
 #endif
diff --git a/src/lib/ecore_drm2/ecore_drm2_fb.c 
b/src/lib/ecore_drm2/ecore_drm2_fb.c
index 6ac0dde..3160e5c 100644
--- a/src/lib/ecore_drm2/ecore_drm2_fb.c
+++ b/src/lib/ecore_drm2/ecore_drm2_fb.c
@@ -224,7 +224,7 @@ ecore_drm2_fb_dirty(Ecore_Drm2_Fb *fb, Eina_Rectangle 
*rects, unsigned int count
 }
 
 EAPI int
-ecore_drm2_fb_flip(Ecore_Drm2_Fb *fb, Ecore_Drm2_Output *output, void *data)
+ecore_drm2_fb_flip(Ecore_Drm2_Fb *fb, Ecore_Drm2_Output *output)
 {
    int ret = 0;
 
@@ -260,7 +260,7 @@ ecore_drm2_fb_flip(Ecore_Drm2_Fb *fb, Ecore_Drm2_Output 
*output, void *data)
 
    ret =
      drmModePageFlip(fb->fd, output->crtc_id, fb->id,
-                     DRM_MODE_PAGE_FLIP_EVENT, data);
+                     DRM_MODE_PAGE_FLIP_EVENT, output->user_data);
    if (ret < 0)
      {
         DBG("Pageflip Failed for Crtc %u on Connector %u: %m",
diff --git a/src/lib/ecore_drm2/ecore_drm2_outputs.c 
b/src/lib/ecore_drm2/ecore_drm2_outputs.c
index a48170c..fda51f3 100644
--- a/src/lib/ecore_drm2/ecore_drm2_outputs.c
+++ b/src/lib/ecore_drm2/ecore_drm2_outputs.c
@@ -1208,3 +1208,9 @@ next:
 
    return ret;
 }
+
+EAPI void
+ecore_drm2_output_user_data_set(Ecore_Drm2_Output *o, void *data)
+{
+   o->user_data = data;
+}
diff --git a/src/lib/ecore_drm2/ecore_drm2_private.h 
b/src/lib/ecore_drm2/ecore_drm2_private.h
index 05f7102..8c16c04 100644
--- a/src/lib/ecore_drm2/ecore_drm2_private.h
+++ b/src/lib/ecore_drm2/ecore_drm2_private.h
@@ -151,6 +151,8 @@ struct _Ecore_Drm2_Output
 
    Eina_List *planes;
 
+   void *user_data;
+
    Eina_Bool connected : 1;
    Eina_Bool primary : 1;
    Eina_Bool cloned : 1;
diff --git a/src/modules/evas/engines/drm/evas_outbuf.c 
b/src/modules/evas/engines/drm/evas_outbuf.c
index e2f0c2e..3ae032e 100644
--- a/src/modules/evas/engines/drm/evas_outbuf.c
+++ b/src/modules/evas/engines/drm/evas_outbuf.c
@@ -97,7 +97,7 @@ _cb_pageflip(int fd EINA_UNUSED, unsigned int frame 
EINA_UNUSED, unsigned int se
    if (next)
      {
         ecore_drm2_output_next_fb_set(ob->priv.output, NULL);
-        ecore_drm2_fb_flip(next, ob->priv.output, ob);
+        ecore_drm2_fb_flip(next, ob->priv.output);
      }
 }
 
@@ -140,7 +140,7 @@ _outbuf_buffer_swap(Outbuf *ob, Eina_Rectangle *rects, 
unsigned int count)
      }
 
    ecore_drm2_fb_dirty(ofb->fb, rects, count);
-   if (ecore_drm2_fb_flip(ofb->fb, ob->priv.output, ob) == 0)
+   if (ecore_drm2_fb_flip(ofb->fb, ob->priv.output) == 0)
      ob->priv.display = ofb;
 
    ecore_drm2_fb_busy_set(ofb->fb, EINA_TRUE);
@@ -256,6 +256,8 @@ _outbuf_setup(Evas_Engine_Info_Drm *info, int w, int h)
    ob->ctx.vblank_handler = _cb_vblank;
    ob->ctx.page_flip_handler = _cb_pageflip;
 
+   ecore_drm2_output_user_data_set(ob->priv.output, ob);
+
    ob->hdlr =
      ecore_main_fd_handler_add(ob->fd, ECORE_FD_READ, _cb_drm_event, ob,
                                NULL, NULL);
diff --git a/src/modules/evas/engines/gl_drm/evas_outbuf.c 
b/src/modules/evas/engines/gl_drm/evas_outbuf.c
index 62c1fa3..c8710b5 100644
--- a/src/modules/evas/engines/gl_drm/evas_outbuf.c
+++ b/src/modules/evas/engines/gl_drm/evas_outbuf.c
@@ -80,7 +80,7 @@ evas_outbuf_page_flip(void *data, int fd EINA_UNUSED)
    if (next)
      {
         ecore_drm2_output_next_fb_set(ob->priv.output, NULL);
-        if (ecore_drm2_fb_flip(next, ob->priv.output, ob) < 0)
+        if (ecore_drm2_fb_flip(next, ob->priv.output) < 0)
           _outbuf_tick_source_set(NULL);
      }
 }
@@ -176,7 +176,7 @@ _evas_outbuf_buffer_swap(Outbuf *ob, Eina_Rectangle *rects, 
unsigned int count)
    if (fb)
      {
         ecore_drm2_fb_dirty(fb, rects, count);
-        if (ecore_drm2_fb_flip(fb, ob->priv.output, ob) < 0)
+        if (ecore_drm2_fb_flip(fb, ob->priv.output) < 0)
           _outbuf_tick_source_set(NULL);
 
         /* Ecore_Drm2_Plane *plane; */
@@ -480,6 +480,7 @@ evas_outbuf_new(Evas_Engine_Info_GL_Drm *info, int w, int 
h, Render_Engine_Swap_
         return NULL;
      }
 
+   ecore_drm2_output_user_data_set(ob->priv.output, ob);
    _outbuf_tick_source_set(ob);
 
    return ob;

-- 


Reply via email to