evas: add more infrastructure to software_generic backend to be ready for GL_X11 migration.

This commit is contained in:
Cedric BAIL 2014-07-04 13:51:03 +02:00
parent 4be4991315
commit 289b3691b0
23 changed files with 168 additions and 123 deletions

View File

@ -107,6 +107,7 @@ _output_setup(int w,
evas_buffer_outbuf_buf_swap_mode_get, evas_buffer_outbuf_buf_swap_mode_get,
evas_buffer_outbuf_buf_rot_get, evas_buffer_outbuf_buf_rot_get,
evas_buffer_outbuf_reconfigure, evas_buffer_outbuf_reconfigure,
NULL,
evas_buffer_outbuf_buf_new_region_for_update, evas_buffer_outbuf_buf_new_region_for_update,
evas_buffer_outbuf_buf_push_updated_region, evas_buffer_outbuf_buf_push_updated_region,
evas_buffer_outbuf_buf_free_region_for_update, evas_buffer_outbuf_buf_free_region_for_update,

View File

@ -38,6 +38,7 @@ _output_setup(Evas_Engine_Info_Drm *info, int w, int h)
evas_outbuf_buffer_state_get, evas_outbuf_buffer_state_get,
evas_outbuf_get_rot, evas_outbuf_get_rot,
evas_outbuf_reconfigure, evas_outbuf_reconfigure,
NULL,
evas_outbuf_update_region_new, evas_outbuf_update_region_new,
evas_outbuf_update_region_push, evas_outbuf_update_region_push,
evas_outbuf_update_region_free, evas_outbuf_update_region_free,
@ -144,7 +145,7 @@ eng_setup(Evas *evas, void *einfo)
if (ob) return 0; if (ob) return 0;
/* if we have an existing outbuf, free it */ /* if we have an existing outbuf, free it */
evas_render_engine_software_generic_update(&re->generic, ob); evas_render_engine_software_generic_update(&re->generic, ob, epd->output.w, epd->output.h);
} }
/* update the info structure pointer */ /* update the info structure pointer */

View File

@ -123,10 +123,10 @@ void evas_outbuf_free(Outbuf *ob);
void evas_outbuf_reconfigure(Outbuf *ob, int w, int h, int rot, Outbuf_Depth depth); void evas_outbuf_reconfigure(Outbuf *ob, int w, int h, int rot, Outbuf_Depth depth);
Render_Engine_Swap_Mode evas_outbuf_buffer_state_get(Outbuf *ob); Render_Engine_Swap_Mode evas_outbuf_buffer_state_get(Outbuf *ob);
int evas_outbuf_get_rot(Outbuf *ob); int evas_outbuf_get_rot(Outbuf *ob);
RGBA_Image *evas_outbuf_update_region_new(Outbuf *ob, int x, int y, int w, int h, int *cx, int *cy, int *cw, int *ch); void *evas_outbuf_update_region_new(Outbuf *ob, int x, int y, int w, int h, int *cx, int *cy, int *cw, int *ch);
void evas_outbuf_update_region_push(Outbuf *ob, RGBA_Image *update, int x, int y, int w, int h); void evas_outbuf_update_region_push(Outbuf *ob, RGBA_Image *update, int x, int y, int w, int h);
void evas_outbuf_update_region_free(Outbuf *ob, RGBA_Image *update); void evas_outbuf_update_region_free(Outbuf *ob, RGBA_Image *update);
void evas_outbuf_flush(Outbuf *ob); void evas_outbuf_flush(Outbuf *ob, Tilebuf_Rect *rects, Evas_Render_Mode render_mode);
Eina_Bool evas_drm_init(Evas_Engine_Info_Drm *info); Eina_Bool evas_drm_init(Evas_Engine_Info_Drm *info);
Eina_Bool evas_drm_shutdown(Evas_Engine_Info_Drm *info); Eina_Bool evas_drm_shutdown(Evas_Engine_Info_Drm *info);

View File

@ -226,7 +226,7 @@ evas_outbuf_buffer_state_get(Outbuf *ob)
return MODE_FULL; return MODE_FULL;
} }
RGBA_Image * void *
evas_outbuf_update_region_new(Outbuf *ob, int x, int y, int w, int h, int *cx, int *cy, int *cw, int *ch) evas_outbuf_update_region_new(Outbuf *ob, int x, int y, int w, int h, int *cx, int *cy, int *cw, int *ch)
{ {
RGBA_Image *img = NULL; RGBA_Image *img = NULL;
@ -411,19 +411,21 @@ evas_outbuf_update_region_free(Outbuf *ob EINA_UNUSED,
/* evas_cache_image_drop(&update->cache_entry); */ /* evas_cache_image_drop(&update->cache_entry); */
} }
void void
evas_outbuf_flush(Outbuf *ob) evas_outbuf_flush(Outbuf *ob, Tilebuf_Rect *rects EINA_UNUSED, Evas_Render_Mode render_mode)
{ {
Eina_Rectangle *rects; Eina_Rectangle *r;
RGBA_Image *img; RGBA_Image *img;
unsigned int n = 0, i = 0; unsigned int n = 0, i = 0;
if (render_mode == EVAS_RENDER_MODE_ASYNC_INIT) return;
/* get number of pending writes */ /* get number of pending writes */
n = eina_list_count(ob->priv.pending_writes); n = eina_list_count(ob->priv.pending_writes);
if (n == 0) return; if (n == 0) return;
/* allocate rectangles */ /* allocate rectangles */
if (!(rects = alloca(n * sizeof(Eina_Rectangle)))) return; if (!(r = alloca(n * sizeof(Eina_Rectangle)))) return;
/* loop the pending writes */ /* loop the pending writes */
EINA_LIST_FREE(ob->priv.pending_writes, img) EINA_LIST_FREE(ob->priv.pending_writes, img)
@ -438,35 +440,35 @@ evas_outbuf_flush(Outbuf *ob)
/* based on rotation, set rectangle position */ /* based on rotation, set rectangle position */
if (ob->rotation == 0) if (ob->rotation == 0)
{ {
rects[i].x = x; r[i].x = x;
rects[i].y = y; r[i].y = y;
} }
else if (ob->rotation == 90) else if (ob->rotation == 90)
{ {
rects[i].x = y; r[i].x = y;
rects[i].y = (ob->w - x - w); r[i].y = (ob->w - x - w);
} }
else if (ob->rotation == 180) else if (ob->rotation == 180)
{ {
rects[i].x = (ob->w - x - w); r[i].x = (ob->w - x - w);
rects[i].y = (ob->h - y - h); r[i].y = (ob->h - y - h);
} }
else if (ob->rotation == 270) else if (ob->rotation == 270)
{ {
rects[i].x = (ob->h - y - h); r[i].x = (ob->h - y - h);
rects[i].y = x; r[i].y = x;
} }
/* based on rotation, set rectangle size */ /* based on rotation, set rectangle size */
if ((ob->rotation == 0) || (ob->rotation == 180)) if ((ob->rotation == 0) || (ob->rotation == 180))
{ {
rects[i].w = w; r[i].w = w;
rects[i].h = h; r[i].h = h;
} }
else if ((ob->rotation == 90) || (ob->rotation == 270)) else if ((ob->rotation == 90) || (ob->rotation == 270))
{ {
rects[i].w = h; r[i].w = h;
rects[i].h = w; r[i].h = w;
} }
eina_rectangle_free(rect); eina_rectangle_free(rect);
@ -482,7 +484,7 @@ evas_outbuf_flush(Outbuf *ob)
} }
/* force a buffer swap */ /* force a buffer swap */
_evas_outbuf_buffer_swap(ob, rects, n); _evas_outbuf_buffer_swap(ob, r, n);
} }
int int

View File

@ -57,6 +57,7 @@ _output_setup(int w, int h, int rot, int vt, int dev, int refresh)
if (!evas_render_engine_software_generic_init(&re->generic, ob, NULL, if (!evas_render_engine_software_generic_init(&re->generic, ob, NULL,
evas_fb_outbuf_fb_get_rot, evas_fb_outbuf_fb_get_rot,
evas_fb_outbuf_fb_reconfigure, evas_fb_outbuf_fb_reconfigure,
NULL,
evas_fb_outbuf_fb_new_region_for_update, evas_fb_outbuf_fb_new_region_for_update,
evas_fb_outbuf_fb_push_updated_region, evas_fb_outbuf_fb_push_updated_region,
evas_fb_outbuf_fb_free_region_for_update, evas_fb_outbuf_fb_free_region_for_update,

View File

@ -57,7 +57,7 @@ Outbuf *evas_fb_outbuf_fb_setup_fb (int w, int h, int rot, Ou
void evas_fb_outbuf_fb_blit (Outbuf *buf, int src_x, int src_y, int w, int h, int dst_x, int dst_y); void evas_fb_outbuf_fb_blit (Outbuf *buf, int src_x, int src_y, int w, int h, int dst_x, int dst_y);
void evas_fb_outbuf_fb_update (Outbuf *buf, int x, int y, int w, int h); void evas_fb_outbuf_fb_update (Outbuf *buf, int x, int y, int w, int h);
RGBA_Image *evas_fb_outbuf_fb_new_region_for_update (Outbuf *buf, int x, int y, int w, int h, int *cx, int *cy, int *cw, int *ch); void *evas_fb_outbuf_fb_new_region_for_update (Outbuf *buf, int x, int y, int w, int h, int *cx, int *cy, int *cw, int *ch);
void evas_fb_outbuf_fb_free_region_for_update (Outbuf *buf, RGBA_Image *update); void evas_fb_outbuf_fb_free_region_for_update (Outbuf *buf, RGBA_Image *update);
void evas_fb_outbuf_fb_push_updated_region (Outbuf *buf, RGBA_Image *update, int x, int y, int w, int h); void evas_fb_outbuf_fb_push_updated_region (Outbuf *buf, RGBA_Image *update, int x, int y, int w, int h);
void evas_fb_outbuf_fb_reconfigure (Outbuf *buf, int w, int h, int rot, Outbuf_Depth depth); void evas_fb_outbuf_fb_reconfigure (Outbuf *buf, int w, int h, int rot, Outbuf_Depth depth);

View File

@ -240,7 +240,7 @@ evas_fb_outbuf_fb_update(Outbuf *buf, int x, int y, int w, int h)
} }
} }
RGBA_Image * void *
evas_fb_outbuf_fb_new_region_for_update(Outbuf *buf, int x, int y, int w, int h, int *cx, int *cy, int *cw, int *ch) evas_fb_outbuf_fb_new_region_for_update(Outbuf *buf, int x, int y, int w, int h, int *cx, int *cy, int *cw, int *ch)
{ {
if (buf->priv.back_buf) if (buf->priv.back_buf)

View File

@ -140,7 +140,7 @@ void evas_software_ddraw_outbuf_push_updated_region(Outbuf *buf,
void evas_software_ddraw_outbuf_free_region_for_update(Outbuf *buf, void evas_software_ddraw_outbuf_free_region_for_update(Outbuf *buf,
RGBA_Image *update); RGBA_Image *update);
void evas_software_ddraw_outbuf_flush(Outbuf *buf); void evas_software_ddraw_outbuf_flush(Outbuf *buf, Evas_Render_Mode render_mode);
void evas_software_ddraw_outbuf_idle_flush(Outbuf *buf); void evas_software_ddraw_outbuf_idle_flush(Outbuf *buf);

View File

@ -356,7 +356,7 @@ evas_software_ddraw_outbuf_free_region_for_update(Outbuf *buf EINA_UNUSED,
} }
void void
evas_software_ddraw_outbuf_flush(Outbuf *buf) evas_software_ddraw_outbuf_flush(Outbuf *buf, Evas_Render_Mode render_mode)
{ {
Eina_List *l; Eina_List *l;
RGBA_Image *im; RGBA_Image *im;
@ -367,6 +367,8 @@ evas_software_ddraw_outbuf_flush(Outbuf *buf)
int ddraw_pitch; int ddraw_pitch;
int ddraw_depth; int ddraw_depth;
if (render_mode == EVAS_RENDER_MODE_ASYNC_INIT) return;
/* lock the back surface */ /* lock the back surface */
if (!(ddraw_data = evas_software_ddraw_lock(buf, if (!(ddraw_data = evas_software_ddraw_lock(buf,
&ddraw_width, &ddraw_width,

View File

@ -184,7 +184,7 @@ void evas_software_gdi_outbuf_push_updated_region(Outbuf *buf,
void evas_software_gdi_outbuf_free_region_for_update(Outbuf *buf, void evas_software_gdi_outbuf_free_region_for_update(Outbuf *buf,
RGBA_Image *update); RGBA_Image *update);
void evas_software_gdi_outbuf_flush(Outbuf *buf); void evas_software_gdi_outbuf_flush(Outbuf *buf, Evas_Render_Mode render_mode);
void evas_software_gdi_outbuf_idle_flush(Outbuf *buf); void evas_software_gdi_outbuf_idle_flush(Outbuf *buf);

View File

@ -563,12 +563,14 @@ evas_software_gdi_outbuf_free_region_for_update(Outbuf *buf EINA_UNUSED,
} }
void void
evas_software_gdi_outbuf_flush(Outbuf *buf) evas_software_gdi_outbuf_flush(Outbuf *buf, Evas_Render_Mode render_mode)
{ {
Eina_List *l; Eina_List *l;
RGBA_Image *im; RGBA_Image *im;
Outbuf_Region *obr; Outbuf_Region *obr;
if (render_mode == EVAS_RENDER_MODE_ASYNC_INIT) return;
/* copy safely the images that need to be drawn onto the back surface */ /* copy safely the images that need to be drawn onto the back surface */
EINA_LIST_FOREACH(buf->priv.pending_writes, l, im) EINA_LIST_FOREACH(buf->priv.pending_writes, l, im)
{ {

View File

@ -28,7 +28,8 @@ typedef enum {
MODE_COPY, MODE_COPY,
MODE_DOUBLE, MODE_DOUBLE,
MODE_TRIPLE, MODE_TRIPLE,
MODE_QUADRUPLE MODE_QUADRUPLE,
MODE_AUTO
} Render_Engine_Swap_Mode; } Render_Engine_Swap_Mode;
typedef enum { typedef enum {
@ -41,13 +42,14 @@ typedef struct _Outbuf Outbuf;
typedef Render_Engine_Swap_Mode (*Outbuf_Swap_Mode_Get)(Outbuf *ob); typedef Render_Engine_Swap_Mode (*Outbuf_Swap_Mode_Get)(Outbuf *ob);
typedef void (*Outbuf_Reconfigure)(Outbuf *ob, int w, int h, int rot, Outbuf_Depth depth); typedef void (*Outbuf_Reconfigure)(Outbuf *ob, int w, int h, int rot, Outbuf_Depth depth);
typedef RGBA_Image *(*Outbuf_New_Region_For_Update)(Outbuf *ob, int x, int y, int w, int h, int *cx, int *cy, int *cw, int *ch); typedef Eina_Bool (*Outbuf_Region_First_Rect)(Outbuf *ob);
typedef void *(*Outbuf_New_Region_For_Update)(Outbuf *ob, int x, int y, int w, int h, int *cx, int *cy, int *cw, int *ch);
typedef void (*Outbuf_Push_Updated_Region)(Outbuf *ob, RGBA_Image *update, int x, int y, int w, int h); typedef void (*Outbuf_Push_Updated_Region)(Outbuf *ob, RGBA_Image *update, int x, int y, int w, int h);
typedef void (*Outbuf_Idle_Flush)(Outbuf *ob); typedef void (*Outbuf_Idle_Flush)(Outbuf *ob);
typedef void (*Outbuf_Free_Region_For_Update)(Outbuf *ob, RGBA_Image *update); typedef void (*Outbuf_Free_Region_For_Update)(Outbuf *ob, RGBA_Image *update);
typedef void (*Outbuf_Free)(Outbuf *ob); typedef void (*Outbuf_Free)(Outbuf *ob);
typedef int (*Outbuf_Get_Rot)(Outbuf *ob); typedef int (*Outbuf_Get_Rot)(Outbuf *ob);
typedef void (*Outbuf_Flush)(Outbuf *ob); typedef void (*Outbuf_Flush)(Outbuf *ob, Tilebuf_Rect *rects, Evas_Render_Mode render_mode);
struct _Render_Engine_Software_Generic struct _Render_Engine_Software_Generic
{ {
@ -60,6 +62,7 @@ struct _Render_Engine_Software_Generic
Outbuf_Swap_Mode_Get outbuf_swap_mode_get; Outbuf_Swap_Mode_Get outbuf_swap_mode_get;
Outbuf_Get_Rot outbuf_get_rot; Outbuf_Get_Rot outbuf_get_rot;
Outbuf_Reconfigure outbuf_reconfigure; Outbuf_Reconfigure outbuf_reconfigure;
Outbuf_Region_First_Rect outbuf_region_first_rect;
Outbuf_New_Region_For_Update outbuf_new_region_for_update; Outbuf_New_Region_For_Update outbuf_new_region_for_update;
Outbuf_Push_Updated_Region outbuf_push_updated_region; Outbuf_Push_Updated_Region outbuf_push_updated_region;
Outbuf_Idle_Flush outbuf_idle_flush; Outbuf_Idle_Flush outbuf_idle_flush;
@ -74,6 +77,7 @@ struct _Render_Engine_Software_Generic
unsigned char end : 1; unsigned char end : 1;
unsigned char lost_back : 1; unsigned char lost_back : 1;
unsigned char tile_strict : 1;
}; };
static inline Eina_Bool static inline Eina_Bool
@ -82,6 +86,7 @@ evas_render_engine_software_generic_init(Render_Engine_Software_Generic *re,
Outbuf_Swap_Mode_Get outbuf_swap_mode_get, Outbuf_Swap_Mode_Get outbuf_swap_mode_get,
Outbuf_Get_Rot outbuf_get_rot, Outbuf_Get_Rot outbuf_get_rot,
Outbuf_Reconfigure outbuf_reconfigure, Outbuf_Reconfigure outbuf_reconfigure,
Outbuf_Region_First_Rect outbuf_region_first_rect,
Outbuf_New_Region_For_Update outbuf_new_region_for_update, Outbuf_New_Region_For_Update outbuf_new_region_for_update,
Outbuf_Push_Updated_Region outbuf_push_updated_region, Outbuf_Push_Updated_Region outbuf_push_updated_region,
Outbuf_Free_Region_For_Update outbuf_free_region_for_update, Outbuf_Free_Region_For_Update outbuf_free_region_for_update,
@ -96,6 +101,7 @@ evas_render_engine_software_generic_init(Render_Engine_Software_Generic *re,
re->outbuf_swap_mode_get = outbuf_swap_mode_get; re->outbuf_swap_mode_get = outbuf_swap_mode_get;
re->outbuf_get_rot = outbuf_get_rot; re->outbuf_get_rot = outbuf_get_rot;
re->outbuf_reconfigure = outbuf_reconfigure; re->outbuf_reconfigure = outbuf_reconfigure;
re->outbuf_region_first_rect = outbuf_region_first_rect;
re->outbuf_new_region_for_update = outbuf_new_region_for_update; re->outbuf_new_region_for_update = outbuf_new_region_for_update;
re->outbuf_push_updated_region = outbuf_push_updated_region; re->outbuf_push_updated_region = outbuf_push_updated_region;
re->outbuf_idle_flush = outbuf_idle_flush; re->outbuf_idle_flush = outbuf_idle_flush;
@ -114,6 +120,7 @@ evas_render_engine_software_generic_init(Render_Engine_Software_Generic *re,
re->merge_mode = MERGE_FULL; re->merge_mode = MERGE_FULL;
re->end = 0; re->end = 0;
re->lost_back = 0; re->lost_back = 0;
re->tile_strict = 0;
re->tb = evas_common_tilebuf_new(w, h); re->tb = evas_common_tilebuf_new(w, h);
if (!re->tb) return EINA_FALSE; if (!re->tb) return EINA_FALSE;
@ -139,14 +146,6 @@ evas_render_engine_software_generic_clean(Render_Engine_Software_Generic *re)
memset(re, 0, sizeof (Render_Engine_Software_Generic)); memset(re, 0, sizeof (Render_Engine_Software_Generic));
} }
static inline void
evas_render_engine_software_generic_update(Render_Engine_Software_Generic *re,
Outbuf *ob)
{
if (re->ob) re->outbuf_free(re->ob);
re->ob = ob;
}
static inline void static inline void
evas_render_engine_software_generic_merge_mode_set(Render_Engine_Software_Generic *re, evas_render_engine_software_generic_merge_mode_set(Render_Engine_Software_Generic *re,
Render_Engine_Merge_Mode merge_mode) Render_Engine_Merge_Mode merge_mode)
@ -154,4 +153,28 @@ evas_render_engine_software_generic_merge_mode_set(Render_Engine_Software_Generi
re->merge_mode = merge_mode; re->merge_mode = merge_mode;
} }
static inline void
evas_render_engine_software_generic_tile_strict_set(Render_Engine_Software_Generic *re,
Eina_Bool tile_strict)
{
re->tile_strict = !!tile_strict;
evas_common_tilebuf_tile_strict_set(re->tb, re->tile_strict);
}
static inline Eina_Bool
evas_render_engine_software_generic_update(Render_Engine_Software_Generic *re,
Outbuf *ob,
int w, int h)
{
if (re->ob) re->outbuf_free(re->ob);
re->ob = ob;
evas_common_tilebuf_free(re->tb);
re->tb = evas_common_tilebuf_new(w, h);
if (!re->tb) return EINA_FALSE;
evas_common_tilebuf_set_tile_size(re->tb, TILESIZE, TILESIZE);
evas_render_engine_software_generic_tile_strict_set(re, re->tile_strict);
return EINA_TRUE;
}
#endif #endif

View File

@ -2586,6 +2586,7 @@ eng_output_resize(void *data, int w, int h)
re->tb = evas_common_tilebuf_new(w, h); re->tb = evas_common_tilebuf_new(w, h);
if (re->tb) if (re->tb)
evas_common_tilebuf_set_tile_size(re->tb, TILESIZE, TILESIZE); evas_common_tilebuf_set_tile_size(re->tb, TILESIZE, TILESIZE);
evas_common_tilebuf_tile_strict_set(re->tb, re->tile_strict);
re->w = w; re->w = w;
re->h = h; re->h = h;
} }
@ -2703,9 +2704,8 @@ 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) eng_output_redraws_next_update_get(void *data, int *x, int *y, int *w, int *h, int *cx, int *cy, int *cw, int *ch)
{ {
Render_Engine_Software_Generic *re; Render_Engine_Software_Generic *re;
RGBA_Image *surface; void *surface;
Tilebuf_Rect *rect; Tilebuf_Rect *rect;
Eina_Bool first_rect = EINA_FALSE;
#define CLEAR_PREV_RECTS(x) \ #define CLEAR_PREV_RECTS(x) \
do { \ do { \
@ -2728,9 +2728,13 @@ eng_output_redraws_next_update_get(void *data, int *x, int *y, int *w, int *h, i
re->rects = evas_common_tilebuf_get_render_rects(re->tb); re->rects = evas_common_tilebuf_get_render_rects(re->tb);
if (re->rects) if (re->rects)
{ {
// do anything needed for the first rect and update lost backbuffer if needed
if (re->outbuf_region_first_rect)
re->lost_back |= re->outbuf_region_first_rect(re->ob);
if (re->outbuf_swap_mode_get) mode = re->outbuf_swap_mode_get(re->ob); if (re->outbuf_swap_mode_get) mode = re->outbuf_swap_mode_get(re->ob);
re->swap_mode = mode; re->swap_mode = mode;
if ((re->lost_back) || (re->swap_mode == MODE_FULL)) if ((re->lost_back) || (re->swap_mode == MODE_FULL) || (re->swap_mode == MODE_AUTO))
{ {
/* if we lost our backbuffer since the last frame redraw all */ /* if we lost our backbuffer since the last frame redraw all */
re->lost_back = 0; re->lost_back = 0;
@ -2749,6 +2753,7 @@ eng_output_redraws_next_update_get(void *data, int *x, int *y, int *w, int *h, i
re->rects = NULL; re->rects = NULL;
switch (re->swap_mode) switch (re->swap_mode)
{ {
case MODE_AUTO:
case MODE_FULL: case MODE_FULL:
case MODE_COPY: // no prev rects needed case MODE_COPY: // no prev rects needed
re->rects = _merge_rects(re->merge_mode, re->tb, re->rects_prev[0], NULL, NULL, NULL); re->rects = _merge_rects(re->merge_mode, re->tb, re->rects_prev[0], NULL, NULL, NULL);
@ -2765,7 +2770,6 @@ eng_output_redraws_next_update_get(void *data, int *x, int *y, int *w, int *h, i
default: default:
break; break;
} }
first_rect = EINA_TRUE;
} }
evas_common_tilebuf_clear(re->tb); evas_common_tilebuf_clear(re->tb);
re->cur_rect = EINA_INLIST_GET(re->rects); re->cur_rect = EINA_INLIST_GET(re->rects);
@ -2791,6 +2795,7 @@ eng_output_redraws_next_update_get(void *data, int *x, int *y, int *w, int *h, i
*ch = rect->h; *ch = rect->h;
re->cur_rect = re->cur_rect->next; re->cur_rect = re->cur_rect->next;
break; break;
case MODE_AUTO:
case MODE_FULL: case MODE_FULL:
re->cur_rect = NULL; re->cur_rect = NULL;
if (x) *x = 0; if (x) *x = 0;
@ -2805,10 +2810,6 @@ eng_output_redraws_next_update_get(void *data, int *x, int *y, int *w, int *h, i
default: default:
break; break;
} }
if (first_rect)
{
// do anything needed fir the first frame
}
surface = re->outbuf_new_region_for_update(re->ob, surface = re->outbuf_new_region_for_update(re->ob,
*x, *y, *w, *h, *x, *y, *w, *h,
cx, cy, cw, ch); cx, cy, cw, ch);
@ -2845,8 +2846,8 @@ eng_output_flush(void *data, Evas_Render_Mode render_mode)
if (render_mode == EVAS_RENDER_MODE_ASYNC_INIT) return; if (render_mode == EVAS_RENDER_MODE_ASYNC_INIT) return;
re = (Render_Engine_Software_Generic *)data; re = (Render_Engine_Software_Generic *)data;
if (re->outbuf_flush) re->outbuf_flush(re->ob); if (re->outbuf_flush) re->outbuf_flush(re->ob, re->rects, render_mode);
if (re->rects) if (re->rects && render_mode != EVAS_RENDER_MODE_ASYNC_INIT)
{ {
evas_common_tilebuf_free_render_rects(re->rects); evas_common_tilebuf_free_render_rects(re->rects);
re->rects = NULL; re->rects = NULL;

View File

@ -163,6 +163,7 @@ _output_xlib_setup(int w, int h, int rot, Display *disp, Drawable draw,
if (!evas_render_engine_software_generic_init(&re->generic, ob, NULL, if (!evas_render_engine_software_generic_init(&re->generic, ob, NULL,
evas_software_xlib_outbuf_get_rot, evas_software_xlib_outbuf_get_rot,
evas_software_xlib_outbuf_reconfigure, evas_software_xlib_outbuf_reconfigure,
NULL,
evas_software_xlib_outbuf_new_region_for_update, evas_software_xlib_outbuf_new_region_for_update,
evas_software_xlib_outbuf_push_updated_region, evas_software_xlib_outbuf_push_updated_region,
evas_software_xlib_outbuf_free_region_for_update, evas_software_xlib_outbuf_free_region_for_update,
@ -207,6 +208,7 @@ _output_swapbuf_setup(int w, int h, int rot, Display *disp, Drawable draw,
evas_software_xlib_swapbuf_buffer_state_get, evas_software_xlib_swapbuf_buffer_state_get,
evas_software_xlib_swapbuf_get_rot, evas_software_xlib_swapbuf_get_rot,
evas_software_xlib_swapbuf_reconfigure, evas_software_xlib_swapbuf_reconfigure,
NULL,
evas_software_xlib_swapbuf_new_region_for_update, evas_software_xlib_swapbuf_new_region_for_update,
evas_software_xlib_swapbuf_push_updated_region, evas_software_xlib_swapbuf_push_updated_region,
evas_software_xlib_swapbuf_free_region_for_update, evas_software_xlib_swapbuf_free_region_for_update,
@ -262,6 +264,7 @@ _output_xcb_setup(int w, int h, int rot, xcb_connection_t *conn,
if (!evas_render_engine_software_generic_init(re, ob, NULL, if (!evas_render_engine_software_generic_init(re, ob, NULL,
evas_software_xcb_outbuf_rotation_get, evas_software_xcb_outbuf_rotation_get,
evas_software_xcb_outbuf_reconfigure, evas_software_xcb_outbuf_reconfigure,
NULL,
evas_software_xcb_outbuf_new_region_for_update, evas_software_xcb_outbuf_new_region_for_update,
evas_software_xcb_outbuf_push_updated_region, evas_software_xcb_outbuf_push_updated_region,
evas_software_xcb_outbuf_free_region_for_update, evas_software_xcb_outbuf_free_region_for_update,
@ -568,7 +571,7 @@ eng_setup(Evas *eo_e, void *in)
if (ob) if (ob)
{ {
evas_render_engine_software_generic_update(&re->generic, ob); evas_render_engine_software_generic_update(&re->generic, ob, e->output.w, e->output.h);
} }
/* if ((re) && (re->ob)) re->ob->onebuf = ponebuf; */ /* if ((re) && (re->ob)) re->ob->onebuf = ponebuf; */

View File

@ -259,7 +259,7 @@ evas_software_xcb_outbuf_setup(int w, int h, int rot, Outbuf_Depth depth, xcb_co
return buf; return buf;
} }
RGBA_Image * void *
evas_software_xcb_outbuf_new_region_for_update(Outbuf *buf, int x, int y, int w, int h, int *cx, int *cy, int *cw, int *ch) evas_software_xcb_outbuf_new_region_for_update(Outbuf *buf, int x, int y, int w, int h, int *cx, int *cy, int *cw, int *ch)
{ {
RGBA_Image *im = NULL; RGBA_Image *im = NULL;
@ -581,12 +581,14 @@ evas_software_xcb_outbuf_free_region_for_update(Outbuf *buf EINA_UNUSED, RGBA_Im
} }
void void
evas_software_xcb_outbuf_flush(Outbuf *buf) evas_software_xcb_outbuf_flush(Outbuf *buf, Tilebuf_Rect *rects, Evas_Render_Mode render_mode)
{ {
Eina_List *l = NULL; Eina_List *l = NULL;
RGBA_Image *im = NULL; RGBA_Image *im = NULL;
Outbuf_Region *obr = NULL; Outbuf_Region *obr = NULL;
if (render_mode == EVAS_RENDER_MODE_ASYNC_INIT) return;
if ((buf->priv.onebuf) && (eina_array_count(&buf->priv.onebuf_regions))) if ((buf->priv.onebuf) && (eina_array_count(&buf->priv.onebuf_regions)))
{ {
Eina_Array_Iterator it; Eina_Array_Iterator it;

View File

@ -6,9 +6,9 @@
void evas_software_xcb_outbuf_init(void); void evas_software_xcb_outbuf_init(void);
void evas_software_xcb_outbuf_free(Outbuf *buf); void evas_software_xcb_outbuf_free(Outbuf *buf);
Outbuf *evas_software_xcb_outbuf_setup(int w, int h, int rot, Outbuf_Depth depth, xcb_connection_t *conn, xcb_screen_t *screen, xcb_drawable_t draw, xcb_visualtype_t *vis, xcb_colormap_t cmap, int xdepth, Eina_Bool grayscale, int max_colors, xcb_drawable_t mask, Eina_Bool shape_dither, Eina_Bool alpha); Outbuf *evas_software_xcb_outbuf_setup(int w, int h, int rot, Outbuf_Depth depth, xcb_connection_t *conn, xcb_screen_t *screen, xcb_drawable_t draw, xcb_visualtype_t *vis, xcb_colormap_t cmap, int xdepth, Eina_Bool grayscale, int max_colors, xcb_drawable_t mask, Eina_Bool shape_dither, Eina_Bool alpha);
RGBA_Image *evas_software_xcb_outbuf_new_region_for_update(Outbuf *buf, int x, int y, int w, int h, int *cx, int *cy, int *cw, int *ch); void *evas_software_xcb_outbuf_new_region_for_update(Outbuf *buf, int x, int y, int w, int h, int *cx, int *cy, int *cw, int *ch);
void evas_software_xcb_outbuf_free_region_for_update(Outbuf *buf, RGBA_Image *update); void evas_software_xcb_outbuf_free_region_for_update(Outbuf *buf, RGBA_Image *update);
void evas_software_xcb_outbuf_flush(Outbuf *buf); void evas_software_xcb_outbuf_flush(Outbuf *buf, Tilebuf_Rect *rects, Evas_Render_Mode render_mode);
void evas_software_xcb_outbuf_idle_flush(Outbuf *buf); void evas_software_xcb_outbuf_idle_flush(Outbuf *buf);
void evas_software_xcb_outbuf_push_updated_region(Outbuf *buf, RGBA_Image *update, int x, int y, int w, int h); void evas_software_xcb_outbuf_push_updated_region(Outbuf *buf, RGBA_Image *update, int x, int y, int w, int h);
void evas_software_xcb_outbuf_reconfigure(Outbuf *buf, int w, int h, int rot, Outbuf_Depth depth); void evas_software_xcb_outbuf_reconfigure(Outbuf *buf, int w, int h, int rot, Outbuf_Depth depth);

View File

@ -172,7 +172,7 @@ evas_software_xlib_outbuf_free(Outbuf *buf)
free(obr); free(obr);
} }
evas_software_xlib_outbuf_idle_flush(buf); evas_software_xlib_outbuf_idle_flush(buf);
evas_software_xlib_outbuf_flush(buf); evas_software_xlib_outbuf_flush(buf, NULL, MODE_FULL);
if (buf->priv.x11.xlib.gc) if (buf->priv.x11.xlib.gc)
XFreeGC(buf->priv.x11.xlib.disp, buf->priv.x11.xlib.gc); XFreeGC(buf->priv.x11.xlib.disp, buf->priv.x11.xlib.gc);
if (buf->priv.x11.xlib.gcm) if (buf->priv.x11.xlib.gcm)
@ -361,7 +361,7 @@ evas_software_xlib_outbuf_setup_x(int w, int h, int rot, Outbuf_Depth depth,
return buf; return buf;
} }
RGBA_Image * void *
evas_software_xlib_outbuf_new_region_for_update(Outbuf *buf, int x, int y, int w, int h, int *cx, int *cy, int *cw, int *ch) evas_software_xlib_outbuf_new_region_for_update(Outbuf *buf, int x, int y, int w, int h, int *cx, int *cy, int *cw, int *ch)
{ {
RGBA_Image *im; RGBA_Image *im;
@ -710,12 +710,14 @@ evas_software_xlib_outbuf_free_region_for_update(Outbuf *buf EINA_UNUSED, RGBA_I
} }
void void
evas_software_xlib_outbuf_flush(Outbuf *buf) evas_software_xlib_outbuf_flush(Outbuf *buf, Tilebuf_Rect *rects EINA_UNUSED, Evas_Render_Mode render_mode)
{ {
Eina_List *l; Eina_List *l;
RGBA_Image *im; RGBA_Image *im;
Outbuf_Region *obr; Outbuf_Region *obr;
if (render_mode == EVAS_RENDER_MODE_ASYNC_INIT) return;
if ((buf->priv.onebuf) && eina_array_count(&buf->priv.onebuf_regions)) if ((buf->priv.onebuf) && eina_array_count(&buf->priv.onebuf_regions))
{ {
Eina_Rectangle *rect; Eina_Rectangle *rect;

View File

@ -25,20 +25,20 @@ Outbuf *evas_software_xlib_outbuf_setup_x (int w,
int destination_alpha); int destination_alpha);
RGBA_Image *evas_software_xlib_outbuf_new_region_for_update (Outbuf *buf, void *evas_software_xlib_outbuf_new_region_for_update (Outbuf *buf,
int x, int x,
int y, int y,
int w, int w,
int h, int h,
int *cx, int *cx,
int *cy, int *cy,
int *cw, int *cw,
int *ch); int *ch);
void evas_software_xlib_outbuf_free_region_for_update (Outbuf *buf, void evas_software_xlib_outbuf_free_region_for_update (Outbuf *buf,
RGBA_Image *update); RGBA_Image *update);
void evas_software_xlib_outbuf_flush (Outbuf *buf); void evas_software_xlib_outbuf_flush (Outbuf *buf, Tilebuf_Rect *rects, Evas_Render_Mode render_mode);
void evas_software_xlib_outbuf_idle_flush (Outbuf *buf); void evas_software_xlib_outbuf_idle_flush (Outbuf *buf);

View File

@ -34,7 +34,7 @@ evas_software_xlib_swapbuf_init(void)
void void
evas_software_xlib_swapbuf_free(Outbuf *buf) evas_software_xlib_swapbuf_free(Outbuf *buf)
{ {
evas_software_xlib_swapbuf_flush(buf); evas_software_xlib_swapbuf_flush(buf, NULL, MODE_FULL);
evas_software_xlib_swapbuf_idle_flush(buf); evas_software_xlib_swapbuf_idle_flush(buf);
if (buf->priv.pal) if (buf->priv.pal)
evas_software_xlib_x_color_deallocate evas_software_xlib_x_color_deallocate
@ -207,7 +207,7 @@ evas_software_xlib_swapbuf_setup_x(int w, int h, int rot, Outbuf_Depth depth,
return buf; return buf;
} }
RGBA_Image * void *
evas_software_xlib_swapbuf_new_region_for_update(Outbuf *buf, int x, int y, int w, int h, int *cx, int *cy, int *cw, int *ch) evas_software_xlib_swapbuf_new_region_for_update(Outbuf *buf, int x, int y, int w, int h, int *cx, int *cy, int *cw, int *ch)
{ {
RECTS_CLIP_TO_RECT(x, y, w, h, 0, 0, buf->w, buf->h); RECTS_CLIP_TO_RECT(x, y, w, h, 0, 0, buf->w, buf->h);
@ -315,25 +315,27 @@ evas_software_xlib_swapbuf_free_region_for_update(Outbuf *buf EINA_UNUSED, RGBA_
} }
void void
evas_software_xlib_swapbuf_flush(Outbuf *buf) evas_software_xlib_swapbuf_flush(Outbuf *buf, Tilebuf_Rect *rects EINA_UNUSED, Evas_Render_Mode render_mode EINA_UNUSED)
{ {
if (render_mode == EVAS_RENDER_MODE_ASYNC_INIT) return;
if (!buf->priv.pending_writes) if (!buf->priv.pending_writes)
{ {
Eina_Rectangle *rects, *rect; Eina_Rectangle *result, *rect;
Eina_Array_Iterator it; Eina_Array_Iterator it;
unsigned int n, i; unsigned int n, i;
RGBA_Image *im; RGBA_Image *im;
n = eina_array_count_get(&buf->priv.onebuf_regions); n = eina_array_count_get(&buf->priv.onebuf_regions);
if (n == 0) return; if (n == 0) return;
rects = alloca(n * sizeof(Eina_Rectangle)); result = alloca(n * sizeof(Eina_Rectangle));
EINA_ARRAY_ITER_NEXT(&buf->priv.onebuf_regions, i, rect, it) EINA_ARRAY_ITER_NEXT(&buf->priv.onebuf_regions, i, rect, it)
{ {
rects[i] = *rect; result[i] = *rect;
eina_rectangle_free(rect); eina_rectangle_free(rect);
} }
evas_xlib_swapper_buffer_unmap(buf->priv.swapper); evas_xlib_swapper_buffer_unmap(buf->priv.swapper);
evas_xlib_swapper_swap(buf->priv.swapper, rects, n); evas_xlib_swapper_swap(buf->priv.swapper, result, n);
eina_array_clean(&buf->priv.onebuf_regions); eina_array_clean(&buf->priv.onebuf_regions);
im = buf->priv.onebuf; im = buf->priv.onebuf;
buf->priv.onebuf = NULL; buf->priv.onebuf = NULL;
@ -350,12 +352,12 @@ evas_software_xlib_swapbuf_flush(Outbuf *buf)
else else
{ {
RGBA_Image *im; RGBA_Image *im;
Eina_Rectangle *rects; Eina_Rectangle *result;
unsigned int n, i = 0; unsigned int n, i = 0;
n = eina_list_count(buf->priv.pending_writes); n = eina_list_count(buf->priv.pending_writes);
if (n == 0) return; if (n == 0) return;
rects = alloca(n * sizeof(Eina_Rectangle)); result = alloca(n * sizeof(Eina_Rectangle));
EINA_LIST_FREE(buf->priv.pending_writes, im) EINA_LIST_FREE(buf->priv.pending_writes, im)
{ {
Eina_Rectangle *rect = im->extended_info; Eina_Rectangle *rect = im->extended_info;
@ -364,33 +366,33 @@ evas_software_xlib_swapbuf_flush(Outbuf *buf)
x = rect->x; y = rect->y; w = rect->w; h = rect->h; x = rect->x; y = rect->y; w = rect->w; h = rect->h;
if (buf->rot == 0) if (buf->rot == 0)
{ {
rects[i].x = x; result[i].x = x;
rects[i].y = y; result[i].y = y;
} }
else if (buf->rot == 90) else if (buf->rot == 90)
{ {
rects[i].x = y; result[i].x = y;
rects[i].y = buf->w - x - w; result[i].y = buf->w - x - w;
} }
else if (buf->rot == 180) else if (buf->rot == 180)
{ {
rects[i].x = buf->w - x - w; result[i].x = buf->w - x - w;
rects[i].y = buf->h - y - h; result[i].y = buf->h - y - h;
} }
else if (buf->rot == 270) else if (buf->rot == 270)
{ {
rects[i].x = buf->h - y - h; result[i].x = buf->h - y - h;
rects[i].y = x; result[i].y = x;
} }
if ((buf->rot == 0) || (buf->rot == 180)) if ((buf->rot == 0) || (buf->rot == 180))
{ {
rects[i].w = w; result[i].w = w;
rects[i].h = h; result[i].h = h;
} }
else if ((buf->rot == 90) || (buf->rot == 270)) else if ((buf->rot == 90) || (buf->rot == 270))
{ {
rects[i].w = h; result[i].w = h;
rects[i].h = w; result[i].h = w;
} }
eina_rectangle_free(rect); eina_rectangle_free(rect);
#ifdef EVAS_CSERVE2 #ifdef EVAS_CSERVE2
@ -402,7 +404,7 @@ evas_software_xlib_swapbuf_flush(Outbuf *buf)
i++; i++;
} }
evas_xlib_swapper_buffer_unmap(buf->priv.swapper); evas_xlib_swapper_buffer_unmap(buf->priv.swapper);
evas_xlib_swapper_swap(buf->priv.swapper, rects, n); evas_xlib_swapper_swap(buf->priv.swapper, result, n);
// evas_xlib_swapper_swap(buf->priv.swapper, NULL, 0); // evas_xlib_swapper_swap(buf->priv.swapper, NULL, 0);
} }
} }

View File

@ -21,18 +21,18 @@ Outbuf *evas_software_xlib_swapbuf_setup_x(int w,
Pixmap mask, Pixmap mask,
int shape_dither, int shape_dither,
int destination_alpha); int destination_alpha);
RGBA_Image *evas_software_xlib_swapbuf_new_region_for_update(Outbuf *buf, void *evas_software_xlib_swapbuf_new_region_for_update(Outbuf *buf,
int x, int x,
int y, int y,
int w, int w,
int h, int h,
int *cx, int *cx,
int *cy, int *cy,
int *cw, int *cw,
int *ch); int *ch);
void evas_software_xlib_swapbuf_free_region_for_update(Outbuf *buf, void evas_software_xlib_swapbuf_free_region_for_update(Outbuf *buf,
RGBA_Image *update); RGBA_Image *update);
void evas_software_xlib_swapbuf_flush(Outbuf *buf); void evas_software_xlib_swapbuf_flush(Outbuf *buf, Tilebuf_Rect *rects, Evas_Render_Mode render_mode);
void evas_software_xlib_swapbuf_idle_flush(Outbuf *buf); void evas_software_xlib_swapbuf_idle_flush(Outbuf *buf);
void evas_software_xlib_swapbuf_push_updated_region(Outbuf *buf, void evas_software_xlib_swapbuf_push_updated_region(Outbuf *buf,
RGBA_Image *update, RGBA_Image *update,

View File

@ -54,6 +54,7 @@ _output_engine_setup(Evas_Engine_Info_Wayland_Shm *info,
evas_swapbuf_state_get, evas_swapbuf_state_get,
evas_swapbuf_rotation_get, evas_swapbuf_rotation_get,
NULL, NULL,
NULL,
evas_swapbuf_update_region_new, evas_swapbuf_update_region_new,
evas_swapbuf_update_region_push, evas_swapbuf_update_region_push,
evas_swapbuf_update_region_free, evas_swapbuf_update_region_free,
@ -167,7 +168,7 @@ eng_setup(Evas *eo_evas, void *einfo)
info->info.wl_surface); info->info.wl_surface);
if (!ob) return 0; if (!ob) return 0;
evas_render_engine_software_generic_update(&re->generic, ob); evas_render_engine_software_generic_update(&re->generic, ob, epd->output.w, epd->output.h);
if ((re) && (re->generic.ob)) re->generic.ob->onebuf = ponebuf; if ((re) && (re->generic.ob)) re->generic.ob->onebuf = ponebuf;
} }

View File

@ -79,7 +79,7 @@ evas_swapbuf_free(Outbuf *ob)
if (!ob) return; if (!ob) return;
/* flush the output buffer */ /* flush the output buffer */
evas_swapbuf_flush(ob); evas_swapbuf_flush(ob, NULL, MODE_FULL);
evas_swapbuf_idle_flush(ob); evas_swapbuf_idle_flush(ob);
evas_swapper_free(ob->priv.swapper); evas_swapper_free(ob->priv.swapper);
eina_array_flush(&ob->priv.onebuf_regions); eina_array_flush(&ob->priv.onebuf_regions);
@ -137,7 +137,7 @@ evas_swapbuf_reconfigure(Outbuf *ob, int x, int y, int w, int h, int rotation, O
} }
} }
RGBA_Image * void *
evas_swapbuf_update_region_new(Outbuf *ob, int x, int y, int w, int h, int *cx, int *cy, int *cw, int *ch) evas_swapbuf_update_region_new(Outbuf *ob, int x, int y, int w, int h, int *cx, int *cy, int *cw, int *ch)
{ {
RGBA_Image *img; RGBA_Image *img;
@ -375,14 +375,16 @@ evas_swapbuf_update_region_free(Outbuf *ob EINA_UNUSED, RGBA_Image *update EINA_
} }
void void
evas_swapbuf_flush(Outbuf *ob) evas_swapbuf_flush(Outbuf *ob, Tilebuf_Rect *rects EINA_UNUSED, Evas_Render_Mode render_mode)
{ {
Eina_Rectangle *rects; Eina_Rectangle *result;
RGBA_Image *img; RGBA_Image *img;
unsigned int n = 0, i = 0; unsigned int n = 0, i = 0;
LOGFN(__FILE__, __LINE__, __FUNCTION__); LOGFN(__FILE__, __LINE__, __FUNCTION__);
if (render_mode == EVAS_RENDER_MODE_ASYNC_INIT) return;
/* check for valid output buffer */ /* check for valid output buffer */
if (!ob) return; if (!ob) return;
@ -397,17 +399,17 @@ evas_swapbuf_flush(Outbuf *ob)
if (n == 0) return; if (n == 0) return;
/* allocate rectangles */ /* allocate rectangles */
if (!(rects = alloca(n * sizeof(Eina_Rectangle)))) return; if (!(result = alloca(n * sizeof(Eina_Rectangle)))) return;
/* loop the buffer regions and assign to rects */ /* loop the buffer regions and assign to result */
EINA_ARRAY_ITER_NEXT(&ob->priv.onebuf_regions, i, rect, it) EINA_ARRAY_ITER_NEXT(&ob->priv.onebuf_regions, i, rect, it)
rects[i] = *rect; result[i] = *rect;
/* unmap the buffer */ /* unmap the buffer */
evas_swapper_buffer_unmap(ob->priv.swapper); evas_swapper_buffer_unmap(ob->priv.swapper);
/* force a buffer swap */ /* force a buffer swap */
evas_swapper_swap(ob->priv.swapper, rects, n); evas_swapper_swap(ob->priv.swapper, result, n);
/* clean array */ /* clean array */
eina_array_clean(&ob->priv.onebuf_regions); eina_array_clean(&ob->priv.onebuf_regions);
@ -431,7 +433,7 @@ evas_swapbuf_flush(Outbuf *ob)
if (n == 0) return; if (n == 0) return;
/* allocate rectangles */ /* allocate rectangles */
if (!(rects = alloca(n * sizeof(Eina_Rectangle)))) return; if (!(result = alloca(n * sizeof(Eina_Rectangle)))) return;
/* loop the pending writes */ /* loop the pending writes */
EINA_LIST_FREE(ob->priv.pending_writes, img) EINA_LIST_FREE(ob->priv.pending_writes, img)
@ -446,35 +448,35 @@ evas_swapbuf_flush(Outbuf *ob)
/* based on rotation, set rectangle position */ /* based on rotation, set rectangle position */
if (ob->rotation == 0) if (ob->rotation == 0)
{ {
rects[i].x = x; result[i].x = x;
rects[i].y = y; result[i].y = y;
} }
else if (ob->rotation == 90) else if (ob->rotation == 90)
{ {
rects[i].x = y; result[i].x = y;
rects[i].y = (ob->w - x - w); result[i].y = (ob->w - x - w);
} }
else if (ob->rotation == 180) else if (ob->rotation == 180)
{ {
rects[i].x = (ob->w - x - w); result[i].x = (ob->w - x - w);
rects[i].y = (ob->h - y - h); result[i].y = (ob->h - y - h);
} }
else if (ob->rotation == 270) else if (ob->rotation == 270)
{ {
rects[i].x = (ob->h - y - h); result[i].x = (ob->h - y - h);
rects[i].y = x; result[i].y = x;
} }
/* based on rotation, set rectangle size */ /* based on rotation, set rectangle size */
if ((ob->rotation == 0) || (ob->rotation == 180)) if ((ob->rotation == 0) || (ob->rotation == 180))
{ {
rects[i].w = w; result[i].w = w;
rects[i].h = h; result[i].h = h;
} }
else if ((ob->rotation == 90) || (ob->rotation == 270)) else if ((ob->rotation == 90) || (ob->rotation == 270))
{ {
rects[i].w = h; result[i].w = h;
rects[i].h = w; result[i].h = w;
} }
eina_rectangle_free(rect); eina_rectangle_free(rect);
@ -493,7 +495,7 @@ evas_swapbuf_flush(Outbuf *ob)
evas_swapper_buffer_unmap(ob->priv.swapper); evas_swapper_buffer_unmap(ob->priv.swapper);
/* force a buffer swap */ /* force a buffer swap */
evas_swapper_swap(ob->priv.swapper, rects, n); evas_swapper_swap(ob->priv.swapper, result, n);
} }
} }

View File

@ -6,10 +6,10 @@
Outbuf *evas_swapbuf_setup(Evas_Engine_Info_Wayland_Shm *info, int w, int h, unsigned int rotation, Outbuf_Depth depth, Eina_Bool alpha, struct wl_shm *wl_shm, struct wl_surface *wl_surface); Outbuf *evas_swapbuf_setup(Evas_Engine_Info_Wayland_Shm *info, int w, int h, unsigned int rotation, Outbuf_Depth depth, Eina_Bool alpha, struct wl_shm *wl_shm, struct wl_surface *wl_surface);
void evas_swapbuf_free(Outbuf *ob); void evas_swapbuf_free(Outbuf *ob);
void evas_swapbuf_reconfigure(Outbuf *ob, int x, int y, int w, int h, int rotation, Outbuf_Depth depth, Eina_Bool alpha); void evas_swapbuf_reconfigure(Outbuf *ob, int x, int y, int w, int h, int rotation, Outbuf_Depth depth, Eina_Bool alpha);
RGBA_Image *evas_swapbuf_update_region_new(Outbuf *ob, int x, int y, int w, int h, int *cx, int *cy, int *cw, int *ch); void *evas_swapbuf_update_region_new(Outbuf *ob, int x, int y, int w, int h, int *cx, int *cy, int *cw, int *ch);
void evas_swapbuf_update_region_push(Outbuf *ob, RGBA_Image *update, int x, int y, int w, int h); void evas_swapbuf_update_region_push(Outbuf *ob, RGBA_Image *update, int x, int y, int w, int h);
void evas_swapbuf_update_region_free(Outbuf *ob, RGBA_Image *update); void evas_swapbuf_update_region_free(Outbuf *ob, RGBA_Image *update);
void evas_swapbuf_flush(Outbuf *ob); void evas_swapbuf_flush(Outbuf *ob, Tilebuf_Rect *rects, Evas_Render_Mode render_mode);
void evas_swapbuf_idle_flush(Outbuf *ob EINA_UNUSED); void evas_swapbuf_idle_flush(Outbuf *ob EINA_UNUSED);
Render_Engine_Swap_Mode evas_swapbuf_state_get(Outbuf *ob); Render_Engine_Swap_Mode evas_swapbuf_state_get(Outbuf *ob);
int evas_swapbuf_rotation_get(Outbuf *ob); int evas_swapbuf_rotation_get(Outbuf *ob);