summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDerek Foreman <derekf@osg.samsung.com>2017-03-17 15:32:26 -0500
committerDerek Foreman <derekf@osg.samsung.com>2017-03-17 15:32:26 -0500
commit7b687c1a255f19e0d682cf57965eaaf8706facc5 (patch)
tree5279e1393cfce9b4986438ebb77847f32de0ea09
parent39da430878ed0d8b4521694087f7f4ed6e1a2e4a (diff)
downloadefl-7b687c1a255f19e0d682cf57965eaaf8706facc5.tar.gz
gl_drm: Fix KHR partial update support
I fixed this in other engines but missed this one. The result is some terrible flickering on gl_drm on recent mali drivers.
-rw-r--r--src/modules/evas/engines/gl_drm/evas_engine.c2
-rw-r--r--src/modules/evas/engines/gl_drm/evas_engine.h1
-rw-r--r--src/modules/evas/engines/gl_drm/evas_outbuf.c29
3 files changed, 18 insertions, 14 deletions
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 ((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;
+ if (glsym_eglSetDamageRegionKHR)
+ {
+ Tilebuf_Rect *tr;
+ int *rect, *rects, count;
- _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;