From: Leandro Pereira Date: Thu, 17 Jan 2013 14:31:34 +0000 (+0000) Subject: evas_render: Measure time spent while rendering in sync and async modes X-Git-Tag: submit/devel/efl/20131022.203902~2186 X-Git-Url: http://review.tizen.org/git/?a=commitdiff_plain;h=f52f44e7a2b4368c3b1dc794479ff3116947ae98;p=platform%2Fupstream%2Fefl.git evas_render: Measure time spent while rendering in sync and async modes SVN revision: 82936 --- diff --git a/src/lib/evas/canvas/evas_render.c b/src/lib/evas/canvas/evas_render.c index 7531090..649a32c 100644 --- a/src/lib/evas/canvas/evas_render.c +++ b/src/lib/evas/canvas/evas_render.c @@ -5,6 +5,10 @@ #include "evas_cs2_private.h" #endif +#ifdef EVAS_RENDER_DEBUG_TIMING +#include +#endif + /* debug rendering * NOTE: Define REND_DBG 1 in evas_private.h to enable debugging. Don't define * it here since the flag is used on other places too. */ @@ -59,6 +63,59 @@ struct _Render_Updates static Eina_Bool evas_render_updates_internal(Evas *eo_e, unsigned char make_updates, unsigned char do_draw, Evas_Render_Done_Cb done_func, void *done_data, Evas_Event_Cb updates_func, void *updates_data, Eina_Bool do_async); +#ifdef EVAS_RENDER_DEBUG_TIMING +static double +_time_get() +{ + struct timeval tv; + + gettimeofday(&tv, NULL); + + return (tv.tv_sec + tv.tv_usec / 1000000.0) * 1000.0; +} + +struct accumulator { + double total, min, max; + int samples; + const char *what; +}; + +static struct accumulator async_accumulator = { + .total = 0, + .min = 1000000, + .max = 0, + .samples = 0, + .what = "async render" +}; +static struct accumulator sync_accumulator = { + .total = 0, + .min = 1000000, + .max = 0, + .samples = 0, + .what = "sync render" +}; + +static void +_accumulate_time(double before, struct accumulator *acc) +{ + double diff = _time_get() - before; + + acc->total += diff; + if (diff > acc->max) acc->max = diff; + if (diff < acc->min) acc->min = diff; + + acc->samples++; + if (acc->samples % 100 == 0) + { + fprintf(stderr, "*** %s: avg %fms min %fms max %fms\n", + acc->what, acc->total / 100.0, acc->min, acc->max); + acc->total = 0.0; + acc->max = 0.0; + acc->min = 1000000; + } +} +#endif + EAPI void evas_damage_rectangle_add(Evas *eo_e, int x, int y, int w, int h) { @@ -1361,6 +1418,9 @@ evas_render_updates_internal(Evas *eo_e, int redraw_all = 0; Eina_Bool haveup = 0; Evas_Render_Mode render_mode = EVAS_RENDER_MODE_UNDEF; +#ifdef EVAS_RENDER_DEBUG_TIMING + double start_time = _time_get(); +#endif MAGIC_CHECK(eo_e, Evas, MAGIC_EVAS); return EINA_FALSE; @@ -1852,6 +1912,10 @@ evas_render_updates_internal(Evas *eo_e, RD("---]\n"); +#ifdef EVAS_RENDER_DEBUG_TIMING + _accumulate_time(start_time, do_async ? &async_accumulator : &sync_accumulator); +#endif + return EINA_TRUE; } diff --git a/src/modules/ecore_evas/engines/x/ecore_evas_x.c b/src/modules/ecore_evas/engines/x/ecore_evas_x.c index dba60a7..b23d4e8 100644 --- a/src/modules/ecore_evas/engines/x/ecore_evas_x.c +++ b/src/modules/ecore_evas/engines/x/ecore_evas_x.c @@ -3178,7 +3178,11 @@ ecore_evas_software_x11_new_internal(const char *disp_name, Ecore_X_Window paren ee->prop.request_pos = 0; ee->prop.sticky = 0; edata->state.sticky = 0; - ee->can_async_render = 1; + + if (getenv("ECORE_EVAS_FORCE_SYNC_RENDER")) + ee->can_async_render = 0; + else + ee->can_async_render = 1; /* init evas here */ ee->evas = evas_new();