From 8291c9e33e3c005993a1b28b278d1c4a2e4d314d Mon Sep 17 00:00:00 2001 From: "Carsten Haitzler (Rasterman)" Date: Tue, 15 Sep 2015 18:26:35 +0900 Subject: [PATCH] evas - sw async render - move pixel upload/swap to a thread @feature this should unload mainloop some more and have pixel upload now in a thread - same as rendering. this eeems to work where i see it so let's put this in and see with further testing. --- src/lib/evas/canvas/evas_render.c | 48 +++++++++++++++++++------------ 1 file changed, 30 insertions(+), 18 deletions(-) diff --git a/src/lib/evas/canvas/evas_render.c b/src/lib/evas/canvas/evas_render.c index dbe0e5d94a..aee5a131b3 100644 --- a/src/lib/evas/canvas/evas_render.c +++ b/src/lib/evas/canvas/evas_render.c @@ -2722,16 +2722,17 @@ evas_render_updates_internal(Evas *eo_e, fx, fy, alpha, do_async, &offset); - - eina_evlog("+render_push", eo_e, 0.0, NULL); - e->engine.func->output_redraws_next_update_push(e->engine.data.output, - surface, - ux, uy, uw, uh, - render_mode); - eina_evlog("-render_push", eo_e, 0.0, NULL); + if (!do_async) + { + eina_evlog("+render_push", eo_e, 0.0, NULL); + e->engine.func->output_redraws_next_update_push(e->engine.data.output, + surface, + ux, uy, uw, uh, + render_mode); + eina_evlog("-render_push", eo_e, 0.0, NULL); + } } - eina_evlog("+render_output_flush", eo_e, 0.0, NULL); if (do_async) { eo_ref(eo_e); @@ -2742,6 +2743,7 @@ evas_render_updates_internal(Evas *eo_e, } else if (haveup) { + eina_evlog("+render_output_flush", eo_e, 0.0, NULL); EINA_LIST_FOREACH(e->video_objects, ll, eo_obj) { _evas_object_image_video_overlay_do(eo_obj); @@ -2750,8 +2752,8 @@ evas_render_updates_internal(Evas *eo_e, e->engine.func->output_flush(e->engine.data.output, EVAS_RENDER_MODE_SYNC); _cb_always_call(eo_e, EVAS_CALLBACK_RENDER_FLUSH_POST, NULL); + eina_evlog("-render_output_flush", eo_e, 0.0, NULL); } - eina_evlog("-render_output_flush", eo_e, 0.0, NULL); eina_evlog("-render_surface", eo_e, 0.0, NULL); } eina_evlog("-render_phase6", eo_e, 0.0, NULL); @@ -2940,14 +2942,7 @@ evas_render_wakeup(Evas *eo_e) EINA_LIST_FREE(e->render.updates, ru) { - /* punch rect out */ - e->engine.func->output_redraws_next_update_push - (e->engine.data.output, ru->surface, - ru->area->x, ru->area->y, ru->area->w, ru->area->h, - EVAS_RENDER_MODE_ASYNC_END); - ret_updates = eina_list_append(ret_updates, ru->area); - evas_cache_image_drop(ru->surface); free(ru); haveup = EINA_TRUE; } @@ -2962,8 +2957,6 @@ evas_render_wakeup(Evas *eo_e) _evas_object_image_video_overlay_do(eo_obj); } _cb_always_call(eo_e, EVAS_CALLBACK_RENDER_FLUSH_PRE, NULL); - e->engine.func->output_flush(e->engine.data.output, - EVAS_RENDER_MODE_ASYNC_END); _cb_always_call(eo_e, EVAS_CALLBACK_RENDER_FLUSH_POST, NULL); } @@ -3011,6 +3004,25 @@ evas_render_async_wakeup(void *target, Evas_Callback_Type type EINA_UNUSED, void static void evas_render_pipe_wakeup(void *data) { + Eina_List *l; + Render_Updates *ru; + Evas_Public_Data *e = data; + + EINA_LIST_FOREACH(e->render.updates, l, ru) + { + eina_evlog("+render_push", e->evas, 0.0, NULL); + e->engine.func->output_redraws_next_update_push + (e->engine.data.output, ru->surface, + ru->area->x, ru->area->y, ru->area->w, ru->area->h, + EVAS_RENDER_MODE_ASYNC_END); + eina_evlog("-render_push", e->evas, 0.0, NULL); + evas_cache_image_drop(ru->surface); + ru->surface = NULL; + } + eina_evlog("+render_output_flush", e->evas, 0.0, NULL); + e->engine.func->output_flush(e->engine.data.output, + EVAS_RENDER_MODE_ASYNC_END); + eina_evlog("+render_output_flush", e->evas, 0.0, NULL); evas_async_events_put(data, 0, NULL, evas_render_async_wakeup); }