diff --git a/gfx/common/egl_common.c b/gfx/common/egl_common.c index b9416d2f135..348d1bafe4e 100644 --- a/gfx/common/egl_common.c +++ b/gfx/common/egl_common.c @@ -309,14 +309,31 @@ static EGLDisplay get_egl_display(EGLenum platform, void *native) return eglGetDisplay((EGLNativeDisplayType) native); } +bool egl_default_accept_config_cb(void *display_data, EGLDisplay dpy, EGLConfig config) +{ + /* Makes sure we have 8 bit color. */ + EGLint r, g, b; + if (!eglGetConfigAttrib(dpy, config, EGL_RED_SIZE, &r)) + return false; + if (!eglGetConfigAttrib(dpy, config, EGL_GREEN_SIZE, &g)) + return false; + if (!eglGetConfigAttrib(dpy, config, EGL_BLUE_SIZE, &b)) + return false; + + if (r != 8 || g != 8 || b != 8) + return false; + + return true; +} + bool egl_init_context(egl_ctx_data_t *egl, EGLenum platform, void *display_data, EGLint *major, EGLint *minor, - EGLint *n, const EGLint *attrib_ptr) + EGLint *n, const EGLint *attrib_ptr, + egl_accept_config_cb_t cb) { - int i; - EGLint id; + EGLint i; EGLConfig *configs = NULL; EGLint count = 0; EGLint matched = 0; @@ -336,14 +353,13 @@ bool egl_init_context(egl_ctx_data_t *egl, RARCH_LOG("[EGL]: EGL version: %d.%d\n", *major, *minor); -#ifdef HAVE_GBM if (!eglGetConfigs(egl->dpy, NULL, 0, &count) || count < 1) { RARCH_ERR("[EGL]: No configs to choose from.\n"); return false; } - configs = malloc(count * sizeof *configs); + configs = malloc(count * sizeof(*configs)); if (!configs) return false; @@ -354,32 +370,23 @@ bool egl_init_context(egl_ctx_data_t *egl, return false; } - for (i = 0; i < count; ++i) + for (i = 0; i < count; i++) { - if (!eglGetConfigAttrib(egl->dpy, - configs[i], EGL_NATIVE_VISUAL_ID, &id)) - continue; - - if (id == GBM_FORMAT_XRGB8888) + if (!cb || cb(display_data, egl->dpy, configs[i])) + { + egl->config = configs[i]; break; + } } - if (id != GBM_FORMAT_XRGB8888) + free(configs); + + if (i == count) { - RARCH_ERR("[EGL]: No EGL configs with format XRGB8888\n"); + RARCH_ERR("[EGL]: No EGL config found which satifies requirements.\n"); return false; } - config_index = i; - if (config_index != -1) - egl->config = configs[config_index]; - - free(configs); -#else - if (!eglChooseConfig(egl->dpy, attrib_ptr, &egl->config, 1, n) || *n != 1) - return false; -#endif - egl->major = g_egl_major; egl->minor = g_egl_minor; diff --git a/gfx/common/egl_common.h b/gfx/common/egl_common.h index 5481efc9376..5fe4bec6e8c 100644 --- a/gfx/common/egl_common.h +++ b/gfx/common/egl_common.h @@ -88,13 +88,17 @@ void egl_set_swap_interval(egl_ctx_data_t *egl, int interval); void egl_get_video_size(egl_ctx_data_t *egl, unsigned *width, unsigned *height); +typedef bool (*egl_accept_config_cb_t)(void *display_data, EGLDisplay dpy, EGLConfig config); +bool egl_default_accept_config_cb(void *display_data, EGLDisplay dpy, EGLConfig config); + bool egl_init_context(egl_ctx_data_t *egl, EGLenum platform, void *display_data, EGLint *major, EGLint *minor, EGLint *n, - const EGLint *attrib_ptr); + const EGLint *attrib_ptr, + egl_accept_config_cb_t cb); bool egl_create_context(egl_ctx_data_t *egl, const EGLint *egl_attribs); diff --git a/gfx/drivers_context/android_ctx.c b/gfx/drivers_context/android_ctx.c index 69b9c2a3899..116a6a9fdf0 100644 --- a/gfx/drivers_context/android_ctx.c +++ b/gfx/drivers_context/android_ctx.c @@ -137,7 +137,7 @@ static void *android_gfx_ctx_init(video_frame_info_t *video_info, void *video_dr RARCH_LOG("Android EGL: GLES version = %d.\n", g_es3 ? 3 : 2); if (!egl_init_context(&and->egl, EGL_NONE, EGL_DEFAULT_DISPLAY, - &major, &minor, &n, attribs)) + &major, &minor, &n, attribs, NULL)) { egl_report_error(); goto error; diff --git a/gfx/drivers_context/drm_ctx.c b/gfx/drivers_context/drm_ctx.c index bd814797928..d362bb745ae 100644 --- a/gfx/drivers_context/drm_ctx.c +++ b/gfx/drivers_context/drm_ctx.c @@ -497,6 +497,28 @@ static EGLint *gfx_ctx_drm_egl_fill_attribs( } #ifdef HAVE_EGL +static bool gbm_choose_xrgb8888_cb(void *display_data, EGLDisplay dpy, EGLConfig config) +{ + EGLint r, g, b, id; + (void)display_data; + + /* Makes sure we have 8 bit color. */ + if (!eglGetConfigAttrib(dpy, config, EGL_RED_SIZE, &r)) + return false; + if (!eglGetConfigAttrib(dpy, config, EGL_GREEN_SIZE, &g)) + return false; + if (!eglGetConfigAttrib(dpy, config, EGL_BLUE_SIZE, &b)) + return false; + + if (r != 8 || g != 8 || b != 8) + return false; + + if (!eglGetConfigAttrib(dpy, config, EGL_NATIVE_VISUAL_ID, &id)) + return false; + + return id == GBM_FORMAT_XRGB8888; +} + #define DRM_EGL_ATTRIBS_BASE \ EGL_SURFACE_TYPE, EGL_WINDOW_BIT, \ EGL_RED_SIZE, 1, \ @@ -575,7 +597,7 @@ static bool gfx_ctx_drm_egl_set_video_mode(gfx_ctx_drm_data_t *drm) #ifdef HAVE_EGL if (!egl_init_context(&drm->egl, EGL_PLATFORM_GBM_KHR, (EGLNativeDisplayType)g_gbm_dev, &major, - &minor, &n, attrib_ptr)) + &minor, &n, attrib_ptr, gbm_choose_xrgb8888_cb)) goto error; attr = gfx_ctx_drm_egl_fill_attribs(drm, egl_attribs); diff --git a/gfx/drivers_context/emscriptenegl_ctx.c b/gfx/drivers_context/emscriptenegl_ctx.c index b2eb2b71007..46410ba68df 100644 --- a/gfx/drivers_context/emscriptenegl_ctx.c +++ b/gfx/drivers_context/emscriptenegl_ctx.c @@ -212,7 +212,7 @@ static void *gfx_ctx_emscripten_init(video_frame_info_t *video_info, } if (!egl_init_context(&emscripten->egl, EGL_NONE, - (void *)EGL_DEFAULT_DISPLAY, &major, &minor, &n, attribute_list)) + (void *)EGL_DEFAULT_DISPLAY, &major, &minor, &n, attribute_list, NULL)) { egl_report_error(); goto error; diff --git a/gfx/drivers_context/mali_fbdev_ctx.c b/gfx/drivers_context/mali_fbdev_ctx.c index cb86849d95c..363e3c01829 100644 --- a/gfx/drivers_context/mali_fbdev_ctx.c +++ b/gfx/drivers_context/mali_fbdev_ctx.c @@ -116,7 +116,7 @@ static void *gfx_ctx_mali_fbdev_init(video_frame_info_t *video_info, void *video #ifdef HAVE_EGL if (!egl_init_context(&mali->egl, EGL_NONE, EGL_DEFAULT_DISPLAY, - &major, &minor, &n, attribs)) + &major, &minor, &n, attribs, NULL)) { egl_report_error(); goto error; diff --git a/gfx/drivers_context/opendingux_fbdev_ctx.c b/gfx/drivers_context/opendingux_fbdev_ctx.c index 41d6e34aae4..f774c9c34b4 100644 --- a/gfx/drivers_context/opendingux_fbdev_ctx.c +++ b/gfx/drivers_context/opendingux_fbdev_ctx.c @@ -87,7 +87,7 @@ static void *gfx_ctx_opendingux_init(video_frame_info_t *video_info, void *video if (!egl_init_context(&viv->egl, EGL_NONE, EGL_DEFAULT_DISPLAY, &major, &minor, - &n, attribs)) + &n, attribs, NULL)) { egl_report_error(); goto error; diff --git a/gfx/drivers_context/qnx_ctx.c b/gfx/drivers_context/qnx_ctx.c index 7ce06b5f28c..f71c2f50b3a 100644 --- a/gfx/drivers_context/qnx_ctx.c +++ b/gfx/drivers_context/qnx_ctx.c @@ -134,7 +134,7 @@ static void *gfx_ctx_qnx_init(video_frame_info_t *video_info, void *video_driver #ifdef HAVE_EGL if (!egl_init_context(&qnx->egl, EGL_NONE, EGL_DEFAULT_DISPLAY, &major, &minor, - &n, attribs)) + &n, attribs, NULL)) { egl_report_error(); goto error; diff --git a/gfx/drivers_context/switch_ctx.c b/gfx/drivers_context/switch_ctx.c index 47ab760b47a..6a8e075cd68 100644 --- a/gfx/drivers_context/switch_ctx.c +++ b/gfx/drivers_context/switch_ctx.c @@ -88,7 +88,7 @@ static void *switch_ctx_init(video_frame_info_t *video_info, void *video_driver) #ifdef HAVE_EGL if (!egl_init_context(&ctx_nx->egl, EGL_NONE, EGL_DEFAULT_DISPLAY, - &major, &minor, &n, attribs)) + &major, &minor, &n, attribs, NULL)) { egl_report_error(); goto error; diff --git a/gfx/drivers_context/vc_egl_ctx.c b/gfx/drivers_context/vc_egl_ctx.c index 04aaf3ee1fc..183ab77557a 100644 --- a/gfx/drivers_context/vc_egl_ctx.c +++ b/gfx/drivers_context/vc_egl_ctx.c @@ -210,7 +210,7 @@ static void *gfx_ctx_vc_init(video_frame_info_t *video_info, void *video_driver) #ifdef HAVE_EGL if (!egl_init_context(&vc->egl, EGL_NONE, EGL_DEFAULT_DISPLAY, - &major, &minor, &n, attribute_list)) + &major, &minor, &n, attribute_list, NULL)) { egl_report_error(); goto error; diff --git a/gfx/drivers_context/vivante_fbdev_ctx.c b/gfx/drivers_context/vivante_fbdev_ctx.c index 2270ee003c0..4eff7b8835f 100644 --- a/gfx/drivers_context/vivante_fbdev_ctx.c +++ b/gfx/drivers_context/vivante_fbdev_ctx.c @@ -93,7 +93,7 @@ static void *gfx_ctx_vivante_init(video_frame_info_t *video_info, void *video_dr #ifdef HAVE_EGL if (!egl_init_context(&viv->egl, EGL_NONE, EGL_DEFAULT_DISPLAY, &major, &minor, - &n, attribs)) + &n, attribs, NULL)) { egl_report_error(); goto error; diff --git a/gfx/drivers_context/wayland_ctx.c b/gfx/drivers_context/wayland_ctx.c index 929e441978f..01a5e521333 100644 --- a/gfx/drivers_context/wayland_ctx.c +++ b/gfx/drivers_context/wayland_ctx.c @@ -1305,7 +1305,8 @@ static void *gfx_ctx_wl_init(video_frame_info_t *video_info, void *video_driver) if (!egl_init_context(&wl->egl, EGL_PLATFORM_WAYLAND_KHR, (EGLNativeDisplayType)wl->input.dpy, - &major, &minor, &n, attrib_ptr)) + &major, &minor, &n, attrib_ptr, + egl_default_accept_config_cb)) { egl_report_error(); goto error; diff --git a/gfx/drivers_context/xegl_ctx.c b/gfx/drivers_context/xegl_ctx.c index ad21ce4644d..24d2546c539 100644 --- a/gfx/drivers_context/xegl_ctx.c +++ b/gfx/drivers_context/xegl_ctx.c @@ -172,7 +172,7 @@ static void *gfx_ctx_xegl_init(video_frame_info_t *video_info, void *video_drive #ifdef HAVE_EGL if (!egl_init_context(&xegl->egl, EGL_PLATFORM_X11_KHR, - (EGLNativeDisplayType)g_x11_dpy, &major, &minor, &n, attrib_ptr)) + (EGLNativeDisplayType)g_x11_dpy, &major, &minor, &n, attrib_ptr, egl_default_accept_config_cb)) { egl_report_error(); goto error;