Summary: This patch is for QUADRUPLE window buffers.
Test Plan:
When enlightenment uses quadruple buffers or window system can support quadruple buffers,
application can use quadruple buffers with partial rendering
Reviewers: tasn, seoz, raster
Reviewed By: raster
CC: cedric
Differential Revision: https://phab.enlightenment.org/D527
typedef enum _Evas_Engine_Info_GL_X11_Swap_Mode
{
- EVAS_ENGINE_GL_X11_SWAP_MODE_AUTO = 0,
- EVAS_ENGINE_GL_X11_SWAP_MODE_FULL = 1,
- EVAS_ENGINE_GL_X11_SWAP_MODE_COPY = 2,
- EVAS_ENGINE_GL_X11_SWAP_MODE_DOUBLE = 3,
- EVAS_ENGINE_GL_X11_SWAP_MODE_TRIPLE = 4
+ EVAS_ENGINE_GL_X11_SWAP_MODE_AUTO = 0,
+ EVAS_ENGINE_GL_X11_SWAP_MODE_FULL = 1,
+ EVAS_ENGINE_GL_X11_SWAP_MODE_COPY = 2,
+ EVAS_ENGINE_GL_X11_SWAP_MODE_DOUBLE = 3,
+ EVAS_ENGINE_GL_X11_SWAP_MODE_TRIPLE = 4,
+ EVAS_ENGINE_GL_X11_SWAP_MODE_QUADRUPLE = 5
} Evas_Engine_Info_GL_X11_Swap_Mode;
struct _Evas_Engine_Info_GL_X11
MODE_FULL,
MODE_COPY,
MODE_DOUBLE,
- MODE_TRIPLE
+ MODE_TRIPLE,
+ MODE_QUADRUPLE
};
typedef struct _Render_Engine Render_Engine;
struct _Render_Engine
{
Tilebuf_Rect *rects;
- Tilebuf_Rect *rects_prev[3];
+ Tilebuf_Rect *rects_prev[4];
Eina_Inlist *cur_rect;
Evas_GL_X11_Window *win;
(!strcasecmp(s, "t")) ||
(!strcasecmp(s, "3")))
re->mode = MODE_TRIPLE;
+ else if ((!strcasecmp(s, "quadruple")) ||
+ (!strcasecmp(s, "q")) ||
+ (!strcasecmp(s, "4")))
+ re->mode = MODE_QUADRUPLE;
}
else
{
case EVAS_ENGINE_GL_X11_SWAP_MODE_TRIPLE:
re->mode = MODE_TRIPLE;
break;
+ case EVAS_ENGINE_GL_X11_SWAP_MODE_QUADRUPLE:
+ re->mode = MODE_QUADRUPLE;
+ break;
default:
break;
}
if (re->rects_prev[0]) evas_common_tilebuf_free_render_rects(re->rects_prev[0]);
if (re->rects_prev[1]) evas_common_tilebuf_free_render_rects(re->rects_prev[1]);
if (re->rects_prev[2]) evas_common_tilebuf_free_render_rects(re->rects_prev[2]);
+ if (re->rects_prev[3]) evas_common_tilebuf_free_render_rects(re->rects_prev[3]);
free(re);
}
static Tilebuf_Rect *
-_merge_rects(Tilebuf *tb, Tilebuf_Rect *r1, Tilebuf_Rect *r2, Tilebuf_Rect *r3)
+_merge_rects(Tilebuf *tb, Tilebuf_Rect *r1, Tilebuf_Rect *r2, Tilebuf_Rect *r3, Tilebuf_Rect *r4)
{
Tilebuf_Rect *r, *rects;
Evas_Point p1, p2;
evas_common_tilebuf_add_redraw(tb, r->x, r->y, r->w, r->h);
}
}
+ if (r4)
+ {
+ EINA_INLIST_FOREACH(EINA_INLIST_GET(r4), r)
+ {
+ evas_common_tilebuf_add_redraw(tb, r->x, r->y, r->w, r->h);
+ }
+ }
rects = evas_common_tilebuf_get_render_rects(tb);
if (partial_rect_union_mode == -1)
if (age == 1) re->mode = MODE_COPY;
else if (age == 2) re->mode = MODE_DOUBLE;
else if (age == 3) re->mode = MODE_TRIPLE;
+ else if (age == 4) re->mode = MODE_QUADRUPLE;
else re->mode = MODE_FULL;
if ((int)age != re->prev_age) re->mode = MODE_FULL;
re->prev_age = age;
/* ensure we get rid of previous rect lists we dont need if mode
* changed/is appropriate */
evas_common_tilebuf_clear(re->tb);
- CLEAR_PREV_RECTS(2);
+ CLEAR_PREV_RECTS(3);
+ re->rects_prev[3] = re->rects_prev[2];
re->rects_prev[2] = re->rects_prev[1];
re->rects_prev[1] = re->rects_prev[0];
re->rects_prev[0] = re->rects;
{
case MODE_FULL:
case MODE_COPY: // no prev rects needed
- re->rects = _merge_rects(re->tb, re->rects_prev[0], NULL, NULL);
+ re->rects = _merge_rects(re->tb, re->rects_prev[0], NULL, NULL, NULL);
break;
case MODE_DOUBLE: // double mode - only 1 level of prev rect
- re->rects = _merge_rects(re->tb, re->rects_prev[0], re->rects_prev[1], NULL);
+ re->rects = _merge_rects(re->tb, re->rects_prev[0], re->rects_prev[1], NULL, NULL);
+ break;
+ case MODE_TRIPLE: // triple mode - 2 levels of prev rect
+ re->rects = _merge_rects(re->tb, re->rects_prev[0], re->rects_prev[1], re->rects_prev[2], NULL);
break;
- case MODE_TRIPLE: // keep all
- re->rects = _merge_rects(re->tb, re->rects_prev[0], re->rects_prev[1], re->rects_prev[2]);
+ case MODE_QUADRUPLE: // keep all
+ re->rects = _merge_rects(re->tb, re->rects_prev[0], re->rects_prev[1], re->rects_prev[2], re->rects_prev[3]);
break;
default:
break;
case MODE_COPY:
case MODE_DOUBLE:
case MODE_TRIPLE:
+ case MODE_QUADRUPLE:
rect = (Tilebuf_Rect *)re->cur_rect;
*x = rect->x;
*y = rect->y;
Tilebuf *tb;
Outbuf *ob;
Tilebuf_Rect *rects;
- Tilebuf_Rect *rects_prev[3];
+ Tilebuf_Rect *rects_prev[4];
Eina_Inlist *cur_rect;
short mode;
unsigned char end : 1;
if (re->rects_prev[0]) evas_common_tilebuf_free_render_rects(re->rects_prev[0]);
if (re->rects_prev[1]) evas_common_tilebuf_free_render_rects(re->rects_prev[1]);
if (re->rects_prev[2]) evas_common_tilebuf_free_render_rects(re->rects_prev[2]);
+ if (re->rects_prev[3]) evas_common_tilebuf_free_render_rects(re->rects_prev[3]);
#ifdef BUILD_ENGINE_SOFTWARE_XLIB
_output_egl_shutdown(re);
#endif
}
static Tilebuf_Rect *
-_merge_rects(Tilebuf *tb, Tilebuf_Rect *r1, Tilebuf_Rect *r2, Tilebuf_Rect *r3)
+_merge_rects(Tilebuf *tb, Tilebuf_Rect *r1, Tilebuf_Rect *r2, Tilebuf_Rect *r3, Tilebuf_Rect *r4)
{
Tilebuf_Rect *r, *rects;
// int px1, py1, px2, py2;
evas_common_tilebuf_add_redraw(tb, r->x, r->y, r->w, r->h);
}
}
+
+ if (r4)
+ {
+ EINA_INLIST_FOREACH(EINA_INLIST_GET(r4), r)
+ {
+ evas_common_tilebuf_add_redraw(tb, r->x, r->y, r->w, r->h);
+ }
+ }
+
rects = evas_common_tilebuf_get_render_rects(tb);
/*
// bounding box -> make a bounding box single region update of all regions.
/* ensure we get rid of previous rect lists we dont need if mode
* changed/is appropriate */
evas_common_tilebuf_clear(re->tb);
- CLEAR_PREV_RECTS(2);
+ CLEAR_PREV_RECTS(3);
+ re->rects_prev[3] = re->rects_prev[2];
re->rects_prev[2] = re->rects_prev[1];
re->rects_prev[1] = re->rects_prev[0];
re->rects_prev[0] = re->rects;
{
case MODE_FULL:
case MODE_COPY: // no prev rects needed
- re->rects = _merge_rects(re->tb, re->rects_prev[0], NULL, NULL);
+ re->rects = _merge_rects(re->tb, re->rects_prev[0], NULL, NULL, NULL);
break;
case MODE_DOUBLE: // double mode - only 1 level of prev rect
- re->rects = _merge_rects(re->tb, re->rects_prev[0], re->rects_prev[1], NULL);
+ re->rects = _merge_rects(re->tb, re->rects_prev[0], re->rects_prev[1], NULL, NULL);
+ break;
+ case MODE_TRIPLE: // triple mode - 2 levels of prev rect
+ re->rects = _merge_rects(re->tb, re->rects_prev[0], re->rects_prev[1], re->rects_prev[2], NULL);
break;
- case MODE_TRIPLE: // keep all
- re->rects = _merge_rects(re->tb, re->rects_prev[0], re->rects_prev[1], re->rects_prev[2]);
+ case MODE_QUADRUPLE: // keep all
+ re->rects = _merge_rects(re->tb, re->rects_prev[0], re->rects_prev[1], re->rects_prev[2], re->rects_prev[3]);
break;
default:
break;
case MODE_COPY:
case MODE_DOUBLE:
case MODE_TRIPLE:
+ case MODE_QUADRUPLE:
rect = (Tilebuf_Rect *)re->cur_rect;
*x = rect->x;
*y = rect->y;
MODE_FULL,
MODE_COPY,
MODE_DOUBLE,
- MODE_TRIPLE
+ MODE_TRIPLE,
+ MODE_QUADRUPLE
};
typedef struct _Outbuf Outbuf;
if (swap_debug) printf("Reuse changed - force FULL\n");
return MODE_FULL;
}
- if (swap_debug) printf("Swap state idx_reuse = %i (0=FULL, 1=COPY, 2=DOUBLE, 3=TRIPLE)\n", flags->data.idx_reuse);
+ if (swap_debug) printf("Swap state idx_reuse = %i (0=FULL, 1=COPY, 2=DOUBLE, 3=TRIPLE, 4=QUAD)\n", flags->data.idx_reuse);
if (flags->data.idx_reuse == 0) return MODE_FULL;
else if (flags->data.idx_reuse == 1) return MODE_COPY;
else if (flags->data.idx_reuse == 2) return MODE_DOUBLE;
else if (flags->data.idx_reuse == 3) return MODE_TRIPLE;
+ else if (flags->data.idx_reuse == 4) return MODE_QUADRUPLE;
return MODE_FULL;
}