add idle flush support - 0.5 secs of no rendering gets the engine to flush

all floating data.


SVN revision: 30358
This commit is contained in:
Carsten Haitzler 2007-06-17 03:41:43 +00:00
parent 0a4199c841
commit aa68331c2a
7 changed files with 50 additions and 5 deletions

View File

@ -53,7 +53,7 @@ extern "C" {
#define HAVE_ECORE_EVAS_GL 1 #define HAVE_ECORE_EVAS_GL 1
#define HAVE_ECORE_EVAS_DIRECTFB 1 #define HAVE_ECORE_EVAS_DIRECTFB 1
typedef enum typedef enum _Ecore_Evas_Engine_Type
{ {
ECORE_EVAS_ENGINE_SOFTWARE_X11, ECORE_EVAS_ENGINE_SOFTWARE_X11,
ECORE_EVAS_ENGINE_SOFTWARE_FB, ECORE_EVAS_ENGINE_SOFTWARE_FB,
@ -70,12 +70,12 @@ typedef unsigned int Ecore_X_Window;
#ifndef _ECORE_DIRECTFB_H #ifndef _ECORE_DIRECTFB_H
#define _ECORE_DIRECTFB_WINDOW_PREDEF #define _ECORE_DIRECTFB_WINDOW_PREDEF
typedef void Ecore_DirectFB_Window; typedef struct _Ecore_DirectFB_Window Ecore_DirectFB_Window;
#endif #endif
#ifndef _ECORE_EVAS_PRIVATE_H #ifndef _ECORE_EVAS_PRIVATE_H
/* basic data types */ /* basic data types */
typedef void Ecore_Evas; typedef struct _Ecore_Evas Ecore_Evas;
#endif #endif
/* module setup/shutdown calls */ /* module setup/shutdown calls */

View File

@ -1812,6 +1812,29 @@ _ecore_evas_free(Ecore_Evas *ee)
ee->prop.cursor.file = NULL; ee->prop.cursor.file = NULL;
ee->prop.cursor.object = NULL; ee->prop.cursor.object = NULL;
ee->evas = NULL; ee->evas = NULL;
if (ee->engine.idle_flush_timer)
ecore_timer_del(ee->engine.idle_flush_timer);
if (ee->engine.func->fn_free) ee->engine.func->fn_free(ee); if (ee->engine.func->fn_free) ee->engine.func->fn_free(ee);
free(ee); free(ee);
} }
static int
_ecore_evas_cb_idle_flush(void *data)
{
Ecore_Evas *ee;
ee = (Ecore_Evas *)data;
evas_render_idle_flush(ee);
ee->engine.idle_flush_timer = NULL;
return 0;
}
void
_ecore_evas_idle_timeout_update(Ecore_Evas *ee)
{
if (ee->engine.idle_flush_timer)
ecore_timer_del(ee->engine.idle_flush_timer);
ee->engine.idle_flush_timer = ecore_timer_add(IDLE_FLUSH_TIME,
_ecore_evas_cb_idle_flush,
ee);
}

View File

@ -114,6 +114,7 @@ _ecore_evas_buffer_render(Ecore_Evas *ee)
if (ee2->func.fn_pre_render) ee2->func.fn_pre_render(ee2); if (ee2->func.fn_pre_render) ee2->func.fn_pre_render(ee2);
_ecore_evas_buffer_render(ee2); _ecore_evas_buffer_render(ee2);
if (ee2->func.fn_post_render) ee2->func.fn_post_render(ee2); if (ee2->func.fn_post_render) ee2->func.fn_post_render(ee2);
_ecore_evas_idle_timeout_update(ee2);
} }
if (ee->engine.buffer.image) if (ee->engine.buffer.image)
{ {

View File

@ -21,8 +21,20 @@ static Ecore_Idle_Enterer *ecore_evas_directfb_idle_enterer = NULL;
static void static void
_ecore_evas_directfb_render(Ecore_Evas *ee) _ecore_evas_directfb_render(Ecore_Evas *ee)
{ {
Evas_List *updates; Evas_List *updates, *ll;
#ifdef BUILD_ECORE_EVAS_BUFFER
for (ll = ee->sub_ecore_evas; ll; ll = ll->next)
{
Ecore_Evas *ee2;
ee2 = ll->data;
if (ee2->func.fn_pre_render) ee2->func.fn_pre_render(ee2);
_ecore_evas_buffer_render(ee2);
if (ee2->func.fn_post_render) ee2->func.fn_post_render(ee2);
_ecore_evas_idle_timeout_update(ee2);
}
#endif
if (ee->func.fn_pre_render) ee->func.fn_pre_render(ee); if (ee->func.fn_pre_render) ee->func.fn_pre_render(ee);
updates = evas_render_updates(ee->evas); updates = evas_render_updates(ee->evas);
if (updates) if (updates)
@ -45,6 +57,8 @@ _ecore_evas_directfb_render(Ecore_Evas *ee)
} }
evas_render_updates_free(updates); evas_render_updates_free(updates);
} }
if (ee->func.fn_post_render) ee->func.fn_post_render(ee);
_ecore_evas_idle_timeout_update(ee);
} }
static int static int

View File

@ -229,6 +229,7 @@ _ecore_evas_idle_enter(void *data __UNUSED__)
} }
else else
evas_norender(ee->evas); evas_norender(ee->evas);
_ecore_evas_idle_timeout_update(ee);
} }
if (_ecore_evas_fps_debug) if (_ecore_evas_fps_debug)
{ {

View File

@ -59,6 +59,8 @@
#include <Evas_Engine_Buffer.h> #include <Evas_Engine_Buffer.h>
#endif #endif
#define IDLE_FLUSH_TIME 0.5
typedef struct _Ecore_Evas Ecore_Evas; typedef struct _Ecore_Evas Ecore_Evas;
typedef struct _Ecore_Evas_Engine Ecore_Evas_Engine; typedef struct _Ecore_Evas_Engine Ecore_Evas_Engine;
typedef struct _Ecore_Evas_Engine_Func Ecore_Evas_Engine_Func; typedef struct _Ecore_Evas_Engine_Func Ecore_Evas_Engine_Func;
@ -163,6 +165,7 @@ struct _Ecore_Evas_Engine
Ecore_DirectFB_Window *window; Ecore_DirectFB_Window *window;
} directfb; } directfb;
#endif #endif
Ecore_Timer *idle_flush_timer;
}; };
struct _Ecore_Evas struct _Ecore_Evas
@ -261,5 +264,6 @@ void _ecore_evas_fps_debug_init(void);
void _ecore_evas_fps_debug_shutdown(void); void _ecore_evas_fps_debug_shutdown(void);
void _ecore_evas_fps_debug_rendertime_add(double t); void _ecore_evas_fps_debug_rendertime_add(double t);
void _ecore_evas_free(Ecore_Evas *ee); void _ecore_evas_free(Ecore_Evas *ee);
void _ecore_evas_idle_timeout_update(Ecore_Evas *ee);
#endif #endif

View File

@ -148,6 +148,7 @@ _ecore_evas_x_render(Ecore_Evas *ee)
if (ee2->func.fn_pre_render) ee2->func.fn_pre_render(ee2); if (ee2->func.fn_pre_render) ee2->func.fn_pre_render(ee2);
_ecore_evas_buffer_render(ee2); _ecore_evas_buffer_render(ee2);
if (ee2->func.fn_post_render) ee2->func.fn_post_render(ee2); if (ee2->func.fn_post_render) ee2->func.fn_post_render(ee2);
_ecore_evas_idle_timeout_update(ee2);
} }
#endif #endif
if (ee->func.fn_pre_render) ee->func.fn_pre_render(ee); if (ee->func.fn_pre_render) ee->func.fn_pre_render(ee);
@ -328,6 +329,7 @@ _ecore_evas_x_render(Ecore_Evas *ee)
else else
evas_norender(ee->evas); evas_norender(ee->evas);
if (ee->func.fn_post_render) ee->func.fn_post_render(ee); if (ee->func.fn_post_render) ee->func.fn_post_render(ee);
_ecore_evas_idle_timeout_update(ee);
} }
static void static void