diff --git a/src/modules/evas/engines/gl_drm/evas_engine.c b/src/modules/evas/engines/gl_drm/evas_engine.c index 9af7e8844e..b87a10c478 100644 --- a/src/modules/evas/engines/gl_drm/evas_engine.c +++ b/src/modules/evas/engines/gl_drm/evas_engine.c @@ -855,7 +855,7 @@ eng_setup(void *in, unsigned int w, unsigned int h) evas_outbuf_rot_get, evas_outbuf_reconfigure, evas_outbuf_update_region_first_rect, - NULL, + evas_outbuf_damage_region_set, evas_outbuf_update_region_new, evas_outbuf_update_region_push, evas_outbuf_update_region_free, diff --git a/src/modules/evas/engines/gl_drm/evas_engine.h b/src/modules/evas/engines/gl_drm/evas_engine.h index 295fb65725..95a48ed72a 100644 --- a/src/modules/evas/engines/gl_drm/evas_engine.h +++ b/src/modules/evas/engines/gl_drm/evas_engine.h @@ -129,6 +129,7 @@ void evas_outbuf_update_region_push(Outbuf *ob, RGBA_Image *update, int x, int y void evas_outbuf_update_region_free(Outbuf *ob, RGBA_Image *update); void evas_outbuf_flush(Outbuf *ob, Tilebuf_Rect *surface_damage, Tilebuf_Rect *buffer_damage, Evas_Render_Mode render_mode); void evas_outbuf_release_fb(void *, void *); +void evas_outbuf_damage_region_set(Outbuf *ob, Tilebuf_Rect *damage); Evas_Engine_GL_Context* evas_outbuf_gl_context_get(Outbuf *ob); void *evas_outbuf_egl_display_get(Outbuf *ob); diff --git a/src/modules/evas/engines/gl_drm/evas_outbuf.c b/src/modules/evas/engines/gl_drm/evas_outbuf.c index f246366d7f..0419575dc8 100644 --- a/src/modules/evas/engines/gl_drm/evas_outbuf.c +++ b/src/modules/evas/engines/gl_drm/evas_outbuf.c @@ -660,18 +660,24 @@ _glcoords_convert(int *result, Outbuf *ob, int x, int y, int w, int h) } } -static void -_damage_rect_set(Outbuf *ob, int x, int y, int w, int h) +void +evas_outbuf_damage_region_set(Outbuf *ob, Tilebuf_Rect *damage) { - int rects[4]; + if (glsym_eglSetDamageRegionKHR) + { + Tilebuf_Rect *tr; + int *rect, *rects, count; - if ((x == 0) && (y == 0) && - (((w == ob->gl_context->w) && (h == ob->gl_context->h)) || - ((h == ob->gl_context->w) && (w == ob->gl_context->h)))) - return; - - _glcoords_convert(rects, ob, x, y, w, h); - glsym_eglSetDamageRegionKHR(ob->egl.disp, ob->egl.surface, rects, 1); + count = eina_inlist_count(EINA_INLIST_GET(damage)); + rects = alloca(sizeof(int) * 4 * count); + rect = rects; + EINA_INLIST_FOREACH(damage, tr) + { + _glcoords_convert(rect, ob, tr->x, tr->y, tr->w, tr->h); + rect += 4; + } + glsym_eglSetDamageRegionKHR(ob->egl.disp, ob->egl.surface, rects, count); + } } void * @@ -686,9 +692,6 @@ evas_outbuf_update_region_new(Outbuf *ob, int x, int y, int w, int h, int *cx EI ob->gl_context->master_clip.y = y; ob->gl_context->master_clip.w = w; ob->gl_context->master_clip.h = h; - - if (glsym_eglSetDamageRegionKHR) - _damage_rect_set(ob, x, y, w, h); } return ob->gl_context->def_surface;