From: Derek Foreman Date: Fri, 2 Sep 2016 18:59:12 +0000 (-0500) Subject: ecore_drm2: Add a function to set the pageflip callback data once X-Git-Tag: upstream/1.20.0~4452 X-Git-Url: http://review.tizen.org/git/?a=commitdiff_plain;h=3d39c1e9b8647aebb12d4edfe426ec88e361c70d;p=platform%2Fupstream%2Fefl.git 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. --- 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;