diff options
author | Carsten Haitzler (Rasterman) <raster@rasterman.com> | 2016-11-07 11:40:02 +0900 |
---|---|---|
committer | Carsten Haitzler (Rasterman) <raster@rasterman.com> | 2016-11-07 11:40:02 +0900 |
commit | d762f749625eb82640ca947b27dfdd722690465b (patch) | |
tree | 352dbb1042f4b12ef9f5de2091dde395dc860005 | |
parent | d6ed9e048d476125508cb89b934cf1f80cdcd80a (diff) | |
download | efl-d762f749625eb82640ca947b27dfdd722690465b.tar.gz |
wl_drm and eayland_egl buffer age fix for gl when age changes
so i was just about to add buffer age debugging evlogs to everywhere
doing buffer age and i found... drm gl and wayland gl engines DONT
HANDLE age change like gl_x11! they dont reset to a "full render" for
that frame. well well. this explains bugs i am seeing for sure. very
very bag! i thought this was handled properly. this does lend some
credence to my thoughts about somehow having a single universal buffer
swapping/update calculating and "applying" api inside efl somewhere...
anyway - this fixes this issue for these 2 engines which is a real
necessary fix to be correct.
@fix
4 files changed, 6 insertions, 0 deletions
diff --git a/src/modules/evas/engines/gl_drm/evas_engine.h b/src/modules/evas/engines/gl_drm/evas_engine.h index 7dbe0a1d56..5ecb4eb414 100644 --- a/src/modules/evas/engines/gl_drm/evas_engine.h +++ b/src/modules/evas/engines/gl_drm/evas_engine.h @@ -89,6 +89,7 @@ struct _Outbuf int fd, w, h, bpp; unsigned int rotation, depth, format; + int prev_age; Render_Engine_Swap_Mode swap_mode; struct gbm_surface *surface; diff --git a/src/modules/evas/engines/gl_drm/evas_outbuf.c b/src/modules/evas/engines/gl_drm/evas_outbuf.c index a06929852a..8dc53bc93c 100644 --- a/src/modules/evas/engines/gl_drm/evas_outbuf.c +++ b/src/modules/evas/engines/gl_drm/evas_outbuf.c @@ -600,6 +600,8 @@ evas_outbuf_buffer_state_get(Outbuf *ob) else if (age == 3) swap_mode = MODE_TRIPLE; else if (age == 4) swap_mode = MODE_QUADRUPLE; else swap_mode = MODE_FULL; + if ((int)age != ob->prev_age) swap_mode = MODE_FULL; + ob->prev_age = age; return swap_mode; } diff --git a/src/modules/evas/engines/wayland_egl/evas_engine.h b/src/modules/evas/engines/wayland_egl/evas_engine.h index 0cb7de75c7..50321a0191 100644 --- a/src/modules/evas/engines/wayland_egl/evas_engine.h +++ b/src/modules/evas/engines/wayland_egl/evas_engine.h @@ -65,6 +65,7 @@ struct _Outbuf Evas_Engine_Info_Wayland *info; Evas_Engine_GL_Context *gl_context; + int prev_age; Render_Engine_Swap_Mode swap_mode; int vsync; int frame_cnt; diff --git a/src/modules/evas/engines/wayland_egl/evas_wl_main.c b/src/modules/evas/engines/wayland_egl/evas_wl_main.c index 653926f948..350d36922f 100644 --- a/src/modules/evas/engines/wayland_egl/evas_wl_main.c +++ b/src/modules/evas/engines/wayland_egl/evas_wl_main.c @@ -380,6 +380,8 @@ eng_outbuf_swap_mode_get(Outbuf *ob) else if (age == 3) swap_mode = MODE_TRIPLE; else if (age == 4) swap_mode = MODE_QUADRUPLE; else swap_mode = MODE_FULL; + if ((int)age != ob->prev_age) swap_mode = MODE_FULL; + ob->prev_age = age; return swap_mode; } |