diff options
author | Carsten Haitzler (Rasterman) <raster@rasterman.com> | 2018-07-10 16:04:01 +0900 |
---|---|---|
committer | Carsten Haitzler (Rasterman) <raster@rasterman.com> | 2018-07-10 16:08:19 +0900 |
commit | cb9dc80fdf88a4bbb345775d1ca8f83dc07d352b (patch) | |
tree | 48bebf6f6505aca365927b5805887aaac605a969 | |
parent | d5db69012ebcad914f1c4dae790fc19fd287f948 (diff) | |
download | efl-cb9dc80fdf88a4bbb345775d1ca8f83dc07d352b.tar.gz |
evas gl-x11 engine - nvidia driver - fix performance drop
this has been going on for a while. on nvidia drivers in gles mode on
x11 there is a massive perf drop to like a few fps with enough windows
if we build for egl/gles instead of opengl. it was the re-creating of
eglimages every frame. put a vendor specific workaround for this and
avoid it. it's not needed there anyway. framerate back to 60fps
smoothness afterwards.
@fix
-rw-r--r-- | src/modules/evas/engines/gl_x11/evas_engine.c | 2 | ||||
-rw-r--r-- | src/modules/evas/engines/gl_x11/evas_engine.h | 2 | ||||
-rw-r--r-- | src/modules/evas/engines/gl_x11/evas_x_main.c | 7 |
3 files changed, 11 insertions, 0 deletions
diff --git a/src/modules/evas/engines/gl_x11/evas_engine.c b/src/modules/evas/engines/gl_x11/evas_engine.c index b76b3d51b4..dabadcbb02 100644 --- a/src/modules/evas/engines/gl_x11/evas_engine.c +++ b/src/modules/evas/engines/gl_x11/evas_engine.c @@ -2550,6 +2550,8 @@ eng_image_native_set(void *engine, void *image, void *native) n->ns_data.x11.multiple_buffer = 0; else n->ns_data.x11.multiple_buffer = 1; + if (ob->detected.no_multi_buffer_native) + n->ns_data.x11.multiple_buffer = 0; if (!n->ns_data.x11.surface) { diff --git a/src/modules/evas/engines/gl_x11/evas_engine.h b/src/modules/evas/engines/gl_x11/evas_engine.h index c5cef71064..ed7277172d 100644 --- a/src/modules/evas/engines/gl_x11/evas_engine.h +++ b/src/modules/evas/engines/gl_x11/evas_engine.h @@ -75,6 +75,8 @@ struct _Outbuf unsigned char msaa; #ifndef GL_GLES Eina_Bool loose_binding : 1; +#else + Eina_Bool no_multi_buffer_native : 1; #endif } detected; diff --git a/src/modules/evas/engines/gl_x11/evas_x_main.c b/src/modules/evas/engines/gl_x11/evas_x_main.c index 10ab397c9d..b86916966b 100644 --- a/src/modules/evas/engines/gl_x11/evas_x_main.c +++ b/src/modules/evas/engines/gl_x11/evas_x_main.c @@ -345,6 +345,13 @@ try_gles2: eng_window_free(gw); return NULL; } + // nvidia drivers in egl/gles mode dont need re-creating of the + // eglimage ... and doign so is super slow on them, so avoid the + // multi buffer path - as it's only for nvidia and this fixes + // the performance regression there, it's fairly safe to do + // as it's not universal across all drivers. + if (strstr((const char *)vendor, "NVIDIA")) + gw->detected.no_multi_buffer_native = 1; eglGetConfigAttrib(gw->egl_disp, gw->egl_config, EGL_DEPTH_SIZE, &val); gw->detected.depth_buffer_size = val; |