From 49260889313a5ca454fad1b051775e4343a5028e Mon Sep 17 00:00:00 2001 From: Shinwoo Kim Date: Fri, 27 Nov 2020 18:03:27 +0900 Subject: [PATCH] evas: support render sync commit There is a requirement to know display server side commit. This patch set provides way to get the commit of display server. [Usage] https://review.tizen.org/gerrit/#/c/profile/mobile/platform/core/uifw/elm-demo-tizen-mobile/+/240108/ @tizen_only Change-Id: Ie75465d4e5b3f07ae2a8309b39ea6a6284d416dc --- src/lib/evas/Evas_Common.h | 18 +++++++++++++ src/lib/evas/canvas/evas_render.c | 23 ++++++++++++++++ src/lib/evas/include/evas_private.h | 4 +++ .../evas/engines/software_generic/evas_engine.c | 3 +++ src/modules/evas/engines/wayland_egl/evas_engine.c | 31 ++++++++++++++++++++++ 5 files changed, 79 insertions(+) diff --git a/src/lib/evas/Evas_Common.h b/src/lib/evas/Evas_Common.h index 4ecd9fd..df84cf9 100644 --- a/src/lib/evas/Evas_Common.h +++ b/src/lib/evas/Evas_Common.h @@ -3481,6 +3481,24 @@ EAPI int evas_font_glyph_lru_size_get(void); * END * *******/ +//TIZEN_ONLY(20201127) support evas render sync +typedef enum _Evas_Render_Sync_Type +{ + EVAS_RENDER_SYNC_COMMIT = 0, + EVAS_RENDER_SYNC_PRESENT = 1 +} Evas_Render_Sync_Type; + +/** + * @brief Create a file descriptor for rendering sync for a given evas + * + * @param obj The evas to create a file descriptor for rendering sync + * @return The file descriptor. It must be closed manually by the caller using `close` + * + * @ingroup Evas_Canvas + */ +EAPI int evas_render_sync_fd_create(Evas *obj, Evas_Render_Sync_Type sync_type); +// + /** * @} */ diff --git a/src/lib/evas/canvas/evas_render.c b/src/lib/evas/canvas/evas_render.c index 9d8e405..5a863d8 100644 --- a/src/lib/evas/canvas/evas_render.c +++ b/src/lib/evas/canvas/evas_render.c @@ -4133,6 +4133,29 @@ evas_render_updates_free(Eina_List *updates) eina_rectangle_free(r); } +//TIZEN_ONLY(20201127) support evas render sync +EAPI int +evas_render_sync_fd_create(Evas *obj, Evas_Render_Sync_Type sync_type) +{ + int fd = -1; + + if (!obj) return fd; + + Evas_Public_Data *e = efl_data_scope_get(obj, EVAS_CANVAS_CLASS); + Efl_Canvas_Output *output; + + output = eina_list_data_get(e->outputs); + if (!output) return fd; + + if (e->engine.func->render_sync_fd_create) + fd = e->engine.func->render_sync_fd_create(output->output, sync_type); + else + ERR("engine does not support render sync file descriptor"); + + return fd; +} +// + EOLIAN Eina_Bool _evas_canvas_render_async(Eo *eo_e, Evas_Public_Data *e) { diff --git a/src/lib/evas/include/evas_private.h b/src/lib/evas/include/evas_private.h index ed4cbfa..aea246b 100755 --- a/src/lib/evas/include/evas_private.h +++ b/src/lib/evas/include/evas_private.h @@ -1115,6 +1115,10 @@ struct _Evas_Func void (*font_glyphs_gc_collect) (void *engine, float ratio, int *texture_size, int *atlas_size, Eina_Bool only_when_requested); + //TIZEN_ONLY(20201127) support evas render sync + int (*render_sync_fd_create) (void *data, Evas_Render_Sync_Type sync_type); + // + unsigned int info_size; }; diff --git a/src/modules/evas/engines/software_generic/evas_engine.c b/src/modules/evas/engines/software_generic/evas_engine.c index 1ea9e6b..8d27410 100755 --- a/src/modules/evas/engines/software_generic/evas_engine.c +++ b/src/modules/evas/engines/software_generic/evas_engine.c @@ -4954,6 +4954,9 @@ static Evas_Func func = NULL, /* END */ eng_font_glyphs_gc_collect, + //TIZEN_ONLY(20201127) support evas render sync + NULL, // render_sync_fd_create + // 0 // sizeof (Info) }; diff --git a/src/modules/evas/engines/wayland_egl/evas_engine.c b/src/modules/evas/engines/wayland_egl/evas_engine.c index c442919..453c375 100755 --- a/src/modules/evas/engines/wayland_egl/evas_engine.c +++ b/src/modules/evas/engines/wayland_egl/evas_engine.c @@ -1096,6 +1096,34 @@ eng_output_free(void *engine, void *data) } } +//TIZEN_ONLY(20201127) support evas render sync +static int +eng_render_sync_fd_create(void *data, Evas_Render_Sync_Type sync_type) +{ + int fd = -1; + Render_Engine *re; + Outbuf *ob; + + if (!(re = (Render_Engine *)data)) return fd; + + ob = eng_get_ob(re); + + if (!ob || !ob->win) return fd; + + if (sync_type == EVAS_RENDER_SYNC_COMMIT) + fd = wl_egl_window_tizen_create_commit_sync_fd(ob->win); + else if (sync_type == EVAS_RENDER_SYNC_COMMIT) + fd = wl_egl_window_tizen_create_presentation_sync_fd(ob->win); + else + ERR("invalid render sync type: %d", sync_type); + + if (fd == -1) + ERR("does not support render sync file descriptor"); + + return fd; +} +// + static void eng_output_dump(void *engine EINA_UNUSED, void *data) { @@ -1866,6 +1894,9 @@ module_open(Evas_Module *em) ORD(gl_error_get); ORD(gl_get_pixels); + //TIZEN_ONLY(20201127) support evas render sync + ORD(render_sync_fd_create); + // evas_gl_thread_link_init(); symbols(); -- 2.7.4