evas/engines: Introduce render mode

The render mode should be useful for engines other than software one.

Signed-off-by: Paulo Alcantara <pcacjr@profusion.mobi>


SVN revision: 81384
This commit is contained in:
Paulo Alcantara 2012-12-19 16:15:58 +00:00 committed by Leandro Pereira
parent 9e5266109d
commit 76932dcc9f
14 changed files with 100 additions and 46 deletions

View File

@ -1328,6 +1328,7 @@ evas_render_updates_internal(Evas *eo_e,
unsigned int i, j;
int redraw_all = 0;
Eina_Bool haveup = 0;
Evas_Render_Mode render_mode = EVAS_RENDER_MODE_UNDEF;
MAGIC_CHECK(eo_e, Evas, MAGIC_EVAS);
return EINA_FALSE;
@ -1692,10 +1693,13 @@ evas_render_updates_internal(Evas *eo_e,
}
}
if (!do_async)
e->engine.func->output_redraws_next_update_push(e->engine.data.output,
surface,
ux, uy, uw, uh);
if (!do_async) render_mode = EVAS_RENDER_MODE_SYNC;
else render_mode = EVAS_RENDER_MODE_ASYNC_INIT;
e->engine.func->output_redraws_next_update_push(e->engine.data.output,
surface,
ux, uy, uw, uh,
render_mode);
/* free obscuring objects list */
eina_array_clean(&e->temporary_objects);
@ -1709,7 +1713,8 @@ evas_render_updates_internal(Evas *eo_e,
else if (haveup)
{
evas_event_callback_call(eo_e, EVAS_CALLBACK_RENDER_FLUSH_PRE, NULL);
e->engine.func->output_flush(e->engine.data.output);
e->engine.func->output_flush(e->engine.data.output,
EVAS_RENDER_MODE_SYNC);
evas_event_callback_call(eo_e, EVAS_CALLBACK_RENDER_FLUSH_POST, NULL);
}
}
@ -1831,12 +1836,11 @@ 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);
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);
if (e->render.updates_cb)
ret_updates = eina_list_append(ret_updates, ru->area);
else
@ -1850,7 +1854,8 @@ evas_render_wakeup(Evas *eo_e)
if (haveup)
{
evas_event_callback_call(eo_e, EVAS_CALLBACK_RENDER_FLUSH_PRE, NULL);
e->engine.func->output_flush(e->engine.data.output);
e->engine.func->output_flush(e->engine.data.output,
EVAS_RENDER_MODE_ASYNC_END);
evas_event_callback_call(eo_e, EVAS_CALLBACK_RENDER_FLUSH_POST, NULL);
}

View File

@ -1274,6 +1274,15 @@ void evas_thread_init(void);
void evas_thread_shutdown(void);
EAPI void evas_thread_cmd_enqueue(Evas_Thread_Command_Cb cb, void *data, size_t size);
EAPI void evas_thread_queue_flush(Evas_Thread_Command_Cb cb, void *data, size_t size);
typedef enum _Evas_Render_Mode
{
EVAS_RENDER_MODE_UNDEF,
EVAS_RENDER_MODE_SYNC,
EVAS_RENDER_MODE_ASYNC_INIT,
EVAS_RENDER_MODE_ASYNC_END,
} Evas_Render_Mode;
/****/
/*****************************************************************************/

View File

@ -769,8 +769,8 @@ struct _Evas_Func
void (*output_redraws_rect_del) (void *data, int x, int y, int w, int h);
void (*output_redraws_clear) (void *data);
void *(*output_redraws_next_update_get) (void *data, int *x, int *y, int *w, int *h, int *cx, int *cy, int *cw, int *ch);
void (*output_redraws_next_update_push) (void *data, void *surface, int x, int y, int w, int h);
void (*output_flush) (void *data);
void (*output_redraws_next_update_push) (void *data, void *surface, int x, int y, int w, int h, Evas_Render_Mode render_mode);
void (*output_flush) (void *data, Evas_Render_Mode render_mode);
void (*output_idle_flush) (void *data);
void (*output_dump) (void *data);

View File

@ -42,8 +42,8 @@ static void eng_output_redraws_rect_add(void *data, int x, int y, int w, int h);
static void eng_output_redraws_rect_del(void *data, int x, int y, int w, int h);
static void eng_output_redraws_clear(void *data);
static void *eng_output_redraws_next_update_get(void *data, int *x, int *y, int *w, int *h, int *cx, int *cy, int *cw, int *ch);
static void eng_output_redraws_next_update_push(void *data, void *surface, int x, int y, int w, int h);
static void eng_output_flush(void *data);
static void eng_output_redraws_next_update_push(void *data, void *surface, int x, int y, int w, int h, Evas_Render_Mode render_mode);
static void eng_output_flush(void *data, Evas_Render_Mode render_mode);
static void eng_output_idle_flush(void *data);
/* internal engine routines */
@ -345,10 +345,12 @@ eng_output_redraws_next_update_get(void *data, int *x, int *y, int *w, int *h, i
}
static void
eng_output_redraws_next_update_push(void *data, void *surface, int x, int y, int w, int h)
eng_output_redraws_next_update_push(void *data, void *surface, int x, int y, int w, int h, Evas_Render_Mode render_mode)
{
Render_Engine *re;
if (render_mode == EVAS_RENDER_MODE_ASYNC_INIT) return;
re = (Render_Engine *)data;
#ifdef BUILD_PIPE_RENDER
evas_common_pipe_map_begin(surface);
@ -359,9 +361,12 @@ eng_output_redraws_next_update_push(void *data, void *surface, int x, int y, int
}
static void
eng_output_flush(void *data)
eng_output_flush(void *data, Evas_Render_Mode render_mode)
{
Render_Engine *re = (Render_Engine *)data;
if (render_mode == EVAS_RENDER_MODE_ASYNC_INIT) return;
evas_buffer_outbuf_buf_switch_buffer(re->ob);
}

View File

@ -33,8 +33,8 @@ static void eng_output_redraws_rect_add(void *data, int x, int y, int w, int h);
static void eng_output_redraws_rect_del(void *data, int x, int y, int w, int h);
static void eng_output_redraws_clear(void *data);
static void *eng_output_redraws_next_update_get(void *data, int *x, int *y, int *w, int *h, int *cx, int *cy, int *cw, int *ch);
static void eng_output_redraws_next_update_push(void *data, void *surface, int x, int y, int w, int h);
static void eng_output_flush(void *data);
static void eng_output_redraws_next_update_push(void *data, void *surface, int x, int y, int w, int h, Evas_Render_Mode render_mode);
static void eng_output_flush(void *data, Evas_Render_Mode render_mode);
static void eng_output_idle_flush(void *data);
/* internal engine routines */
@ -217,10 +217,12 @@ eng_output_redraws_next_update_get(void *data, int *x, int *y, int *w, int *h, i
}
static void
eng_output_redraws_next_update_push(void *data, void *surface, int x, int y, int w, int h)
eng_output_redraws_next_update_push(void *data, void *surface, int x, int y, int w, int h, Evas_Render_Mode render_mode)
{
Render_Engine *re;
if (render_mode == EVAS_RENDER_MODE_ASYNC_INIT) return;
re = (Render_Engine *)data;
#ifdef BUILD_PIPE_RENDER
evas_common_pipe_map_begin(surface);
@ -231,7 +233,7 @@ eng_output_redraws_next_update_push(void *data, void *surface, int x, int y, int
}
static void
eng_output_flush(void *data EINA_UNUSED)
eng_output_flush(void *data EINA_UNUSED, Evas_Render_Mode render_mode EINA_UNUSED)
{
}

View File

@ -278,10 +278,12 @@ eng_output_redraws_next_update_get(void *data, int *x, int *y, int *w, int *h, i
}
static void
eng_output_redraws_next_update_push(void *data, void *surface EINA_UNUSED, int x EINA_UNUSED, int y EINA_UNUSED, int w EINA_UNUSED, int h EINA_UNUSED)
eng_output_redraws_next_update_push(void *data, void *surface EINA_UNUSED, int x EINA_UNUSED, int y EINA_UNUSED, int w EINA_UNUSED, int h EINA_UNUSED, Evas_Render_Mode render_mode)
{
Render_Engine *re;
if (render_mode == EVAS_RENDER_MODE_ASYNC_INIT) return;
re = (Render_Engine *)data;
/* put back update surface.. in this case just unflag redraw */
re->win->draw.redraw = 0;
@ -290,10 +292,12 @@ eng_output_redraws_next_update_push(void *data, void *surface EINA_UNUSED, int x
}
static void
eng_output_flush(void *data)
eng_output_flush(void *data, Evas_Render_Mode render_mode)
{
Render_Engine *re;
if (render_mode == EVAS_RENDER_MODE_ASYNC_INIT) return;
re = (Render_Engine *)data;
if (!re->win->draw.drew) return;

View File

@ -222,10 +222,12 @@ eng_output_redraws_next_update_get(void *data, int *x, int *y, int *w, int *h, i
}
static void
eng_output_redraws_next_update_push(void *data, void *surface EINA_UNUSED, int x EINA_UNUSED, int y EINA_UNUSED, int w EINA_UNUSED, int h EINA_UNUSED)
eng_output_redraws_next_update_push(void *data, void *surface EINA_UNUSED, int x EINA_UNUSED, int y EINA_UNUSED, int w EINA_UNUSED, int h EINA_UNUSED, Evas_Render_Mode render_mode)
{
Render_Engine *re;
if (render_mode == EVAS_RENDER_MODE_ASYNC_INIT) return;
re = (Render_Engine *)data;
/* put back update surface.. in this case just unflag redraw */
re->draw.redraw = 0;
@ -235,10 +237,12 @@ eng_output_redraws_next_update_push(void *data, void *surface EINA_UNUSED, int x
}
static void
eng_output_flush(void *data)
eng_output_flush(void *data, Evas_Render_Mode render_mode)
{
Render_Engine *re;
if (render_mode == EVAS_RENDER_MODE_ASYNC_INIT) return;
re = (Render_Engine *)data;
if (!re->draw.drew) return;
//x// printf("frame -> flush\n");

View File

@ -1124,10 +1124,12 @@ eng_output_redraws_next_update_get(void *data, int *x, int *y, int *w, int *h, i
static int safe_native = -1;
static void
eng_output_redraws_next_update_push(void *data, void *surface EINA_UNUSED, int x EINA_UNUSED, int y EINA_UNUSED, int w EINA_UNUSED, int h EINA_UNUSED)
eng_output_redraws_next_update_push(void *data, void *surface EINA_UNUSED, int x EINA_UNUSED, int y EINA_UNUSED, int w EINA_UNUSED, int h EINA_UNUSED, Evas_Render_Mode render_mode)
{
Render_Engine *re;
if (render_mode == EVAS_RENDER_MODE_ASYNC_INIT) return;
re = (Render_Engine *)data;
/* put back update surface.. in this case just unflag redraw */
if (!_re_wincheck(re)) return;
@ -1165,10 +1167,12 @@ eng_output_redraws_next_update_push(void *data, void *surface EINA_UNUSED, int x
}
static void
eng_output_flush(void *data)
eng_output_flush(void *data, Evas_Render_Mode render_mode)
{
Render_Engine *re;
if (render_mode == EVAS_RENDER_MODE_ASYNC_INIT) return;
re = (Render_Engine *)data;
if (!_re_wincheck(re)) return;
if (!re->win->draw.drew) return;

View File

@ -59,9 +59,9 @@ static void
eng_output_redraws_clear(void *data);
static void *eng_output_redraws_next_update_get(void *data, int *x, int *y, int *w, int *h, int *cx, int *cy, int *cw, int *ch);
static void
eng_output_redraws_next_update_push(void *data, void *surface, int x, int y, int w, int h);
eng_output_redraws_next_update_push(void *data, void *surface, int x, int y, int w, int h, Evas_Render_Mode render_mode);
static void
eng_output_flush(void *data);
eng_output_flush(void *data, Evas_Render_Mode render_mode);
static void
eng_output_idle_flush(void *data);
@ -346,19 +346,21 @@ eng_output_redraws_next_update_get(void *data, int *x, int *y, int *w, int *h, i
}
static void
eng_output_redraws_next_update_push(void *data, void *surface, int x, int y, int w, int h)
eng_output_redraws_next_update_push(void *data EINA_UNUSED, void *surface EINA_UNUSED, int x EINA_UNUSED, int y EINA_UNUSED, int w EINA_UNUSED, int h EINA_UNUSED, Evas_Render_Mode render_mode EINA_UNUSED)
{
/* Don't do anything, we'll just coy the whole buffer when it's time to flush */
}
static void
eng_output_flush(void *data)
eng_output_flush(void *data, Evas_Render_Mode render_mode)
{
Render_Engine *re;
rsxBuffer *buffer;
int width;
int height;
if (render_mode == EVAS_RENDER_MODE_ASYNC_INIT) return;
//printf ("eng_output_flush called\n");
re = (Render_Engine *)data;
buffer = &re->buffers[re->currentBuffer];

View File

@ -282,10 +282,12 @@ eng_output_redraws_next_update_get(void *data,
}
static void
eng_output_redraws_next_update_push(void *data, void *surface, int x, int y, int w, int h)
eng_output_redraws_next_update_push(void *data, void *surface, int x, int y, int w, int h, Evas_Render_Mode render_mode)
{
Render_Engine *re;
if (render_mode == EVAS_RENDER_MODE_ASYNC_INIT) return;
re = (Render_Engine *)data;
#ifdef BUILD_PIPE_RENDER
evas_common_pipe_map_begin(surface);
@ -296,10 +298,12 @@ eng_output_redraws_next_update_push(void *data, void *surface, int x, int y, int
}
static void
eng_output_flush(void *data)
eng_output_flush(void *data, Evas_Render_Mode render_mode)
{
Render_Engine *re;
if (render_mode == EVAS_RENDER_MODE_ASYNC_INIT) return;
re = (Render_Engine *)data;
evas_software_ddraw_outbuf_flush(re->ob);
}

View File

@ -288,10 +288,12 @@ eng_output_redraws_next_update_get(void *data,
}
static void
eng_output_redraws_next_update_push(void *data, void *surface, int x, int y, int w, int h)
eng_output_redraws_next_update_push(void *data, void *surface, int x, int y, int w, int h, Evas_Render_Mode render_mode)
{
Render_Engine *re;
if (render_mode == EVAS_RENDER_MODE_ASYNC_INIT) return;
re = (Render_Engine *)data;
#ifdef BUILD_PIPE_RENDER
evas_common_pipe_map_begin(surface);
@ -302,10 +304,12 @@ eng_output_redraws_next_update_push(void *data, void *surface, int x, int y, int
}
static void
eng_output_flush(void *data)
eng_output_flush(void *data, Evas_Render_Mode render_mode)
{
Render_Engine *re;
if (render_mode == EVAS_RENDER_MODE_ASYNC_INIT) return;
re = (Render_Engine *)data;
evas_software_gdi_outbuf_flush(re->ob);
}

View File

@ -71,8 +71,8 @@ static void eng_output_redraws_rect_add(void *data, int x, int y, int w, int h);
static void eng_output_redraws_rect_del(void *data, int x, int y, int w, int h);
static void eng_output_redraws_clear(void *data);
static void *eng_output_redraws_next_update_get(void *data, int *x, int *y, int *w, int *h, int *cx, int *cy, int *cw, int *ch);
static void eng_output_redraws_next_update_push(void *data, void *surface, int x, int y, int w, int h);
static void eng_output_flush(void *data);
static void eng_output_redraws_next_update_push(void *data, void *surface, int x, int y, int w, int h, Evas_Render_Mode render_mode);
static void eng_output_flush(void *data, Evas_Render_Mode render_mode);
static void eng_output_idle_flush(void *data);
/* internal engine routines */
@ -880,10 +880,12 @@ eng_output_redraws_next_update_get(void *data, int *x, int *y, int *w, int *h, i
}
static void
eng_output_redraws_next_update_push(void *data, void *surface, int x, int y, int w, int h)
eng_output_redraws_next_update_push(void *data, void *surface, int x, int y, int w, int h, Evas_Render_Mode render_mode)
{
Render_Engine *re;
if (render_mode == EVAS_RENDER_MODE_ASYNC_INIT) return;
re = (Render_Engine *)data;
#if defined(BUILD_PIPE_RENDER)
evas_common_pipe_map_begin(surface);
@ -894,10 +896,12 @@ eng_output_redraws_next_update_push(void *data, void *surface, int x, int y, int
}
static void
eng_output_flush(void *data)
eng_output_flush(void *data, Evas_Render_Mode render_mode)
{
Render_Engine *re;
if (render_mode == EVAS_RENDER_MODE_ASYNC_INIT) return;
re = (Render_Engine *)data;
re->outbuf_flush(re->ob);
if (re->rects)

View File

@ -1018,7 +1018,7 @@ get_time(void)
static int safe_native = -1;
static void
eng_output_redraws_next_update_push(void *data, void *surface EINA_UNUSED, int x EINA_UNUSED, int y EINA_UNUSED, int w EINA_UNUSED, int h EINA_UNUSED)
eng_output_redraws_next_update_push(void *data, void *surface EINA_UNUSED, int x EINA_UNUSED, int y EINA_UNUSED, int w EINA_UNUSED, int h EINA_UNUSED, Evas_Render_Mode render_mode)
{
Render_Engine *re;
#ifdef FRAMECOUNT
@ -1026,6 +1026,8 @@ eng_output_redraws_next_update_push(void *data, void *surface EINA_UNUSED, int x
double ta, tb;
#endif
if (render_mode == EVAS_RENDER_MODE_ASYNC_INIT) return;
re = (Render_Engine *)data;
/* put back update surface.. in this case just unflag redraw */
if (!_re_wincheck(re)) return;
@ -1071,10 +1073,12 @@ eng_output_redraws_next_update_push(void *data, void *surface EINA_UNUSED, int x
}
static void
eng_output_flush(void *data)
eng_output_flush(void *data, Evas_Render_Mode render_mode)
{
Render_Engine *re;
if (render_mode == EVAS_RENDER_MODE_ASYNC_INIT) return;
re = (Render_Engine *)data;
if (!_re_wincheck(re)) return;
if (!re->win->draw.drew) return;

View File

@ -41,8 +41,8 @@ static void eng_output_redraws_rect_add(void *data, int x, int y, int w, int h);
static void eng_output_redraws_rect_del(void *data, int x, int y, int w, int h);
static void eng_output_redraws_clear(void *data);
static void *eng_output_redraws_next_update_get(void *data, int *x, int *y, int *w, int *h, int *cx, int *cy, int *cw, int *ch);
static void eng_output_redraws_next_update_push(void *data, void *surface, int x, int y, int w, int h);
static void eng_output_flush(void *data);
static void eng_output_redraws_next_update_push(void *data, void *surface, int x, int y, int w, int h, Evas_Render_Mode render_mode);
static void eng_output_flush(void *data, Evas_Render_Mode render_mode);
static void eng_output_idle_flush(void *data);
static Eina_Bool eng_canvas_alpha_get(void *data, void *context EINA_UNUSED);
@ -274,10 +274,12 @@ eng_output_redraws_next_update_get(void *data, int *x, int *y, int *w, int *h, i
}
static void
eng_output_redraws_next_update_push(void *data, void *surface, int x, int y, int w, int h)
eng_output_redraws_next_update_push(void *data, void *surface, int x, int y, int w, int h, Evas_Render_Mode render_mode)
{
Render_Engine *re = NULL;
if (render_mode == EVAS_RENDER_MODE_ASYNC_INIT) return;
if (!(re = (Render_Engine *)data)) return;
#ifdef BUILD_PIPE_RENDER
evas_common_pipe_map_begin(surface);
@ -291,10 +293,11 @@ eng_output_redraws_next_update_push(void *data, void *surface, int x, int y, int
}
static void
eng_output_flush(void *data)
eng_output_flush(void *data, Evas_Render_Mode render_mode)
{
Render_Engine *re = NULL;
if (render_mode == EVAS_RENDER_MODE_ASYNC_INIT) return;
if (!(re = (Render_Engine *)data)) return;
}