diff --git a/gfx/common/angle_common.c b/gfx/common/angle_common.c index d15476da5e..8dca63ebd5 100644 --- a/gfx/common/angle_common.c +++ b/gfx/common/angle_common.c @@ -30,7 +30,6 @@ #include "../../verbosity.h" #include "../../frontend/frontend_driver.h" - /* Normal DirectX 11 backend */ const EGLint backendD3D11[] = { @@ -87,21 +86,23 @@ const char* backendNamesList[] = { /* Try initializing EGL with the backend specified in display_attr. */ static bool angle_try_initialize(egl_ctx_data_t* egl, void* display_data, const EGLint* display_attr, - EGLint* major, EGLint* minor) { - + EGLint* major, EGLint* minor) +{ EGLDisplay dpy = EGL_NO_DISPLAY; PFNEGLGETPLATFORMDISPLAYEXTPROC ptr_eglGetPlatformDisplayEXT = - (PFNEGLGETPLATFORMDISPLAYEXTPROC)eglGetProcAddress("eglGetPlatformDisplayEXT"); + (PFNEGLGETPLATFORMDISPLAYEXTPROC)egl_get_proc_address("eglGetPlatformDisplayEXT"); - if (ptr_eglGetPlatformDisplayEXT == NULL) + if (!ptr_eglGetPlatformDisplayEXT) return false; dpy = ptr_eglGetPlatformDisplayEXT(EGL_PLATFORM_ANGLE_ANGLE, display_data, display_attr); - if (dpy == EGL_NO_DISPLAY) return false; + if (dpy == EGL_NO_DISPLAY) + return false; - if (!eglInitialize(dpy, major, minor)) { - eglTerminate(egl->dpy); + if (!egl_initialize(dpy, major, minor)) + { + egl_terminate(egl->dpy); return false; } @@ -117,60 +118,23 @@ bool angle_init_context(egl_ctx_data_t *egl, EGLint *count, const EGLint *attrib_ptr, egl_accept_config_cb_t cb) { - EGLint i; int j; - EGLConfig *configs = NULL; - EGLint matched = 0; - int config_index = -1; + int j; bool success = false; - for (j = 0; backendNamesList[j] != NULL; j++) { + for (j = 0; backendNamesList[j] != NULL; j++) + { RARCH_LOG("[ANGLE] Trying %s...\n", backendNamesList[j]); - if (angle_try_initialize(egl, display_data, backendList[j], major, minor)) { + if (angle_try_initialize(egl, display_data, backendList[j], major, minor)) + { success = true; break; } } - if (!success) return false; + if (!success) + return false; RARCH_LOG("[EGL]: EGL version: %d.%d\n", *major, *minor); - if (!eglGetConfigs(egl->dpy, NULL, 0, count) || *count < 1) - { - RARCH_ERR("[EGL]: No configs to choose from.\n"); - return false; - } - - configs = (EGLConfig*)malloc(*count * sizeof(*configs)); - if (!configs) - return false; - - if (!eglChooseConfig(egl->dpy, attrib_ptr, - configs, *count, &matched) || !matched) - { - RARCH_ERR("[EGL]: No EGL configs with appropriate attributes.\n"); - return false; - } - - for (i = 0; i < *count; i++) - { - if (!cb || cb(display_data, egl->dpy, configs[i])) - { - egl->config = configs[i]; - break; - } - } - - free(configs); - - if (i == *count) - { - RARCH_ERR("[EGL]: No EGL config found which satifies requirements.\n"); - return false; - } - - egl->major = g_egl_major; - egl->minor = g_egl_minor; - - return true; + return egl_init_context_common(egl, count, attrib_ptr, cb, display_data); } diff --git a/gfx/common/angle_common.h b/gfx/common/angle_common.h index b41aa3ca8b..9dcf9ae0aa 100644 --- a/gfx/common/angle_common.h +++ b/gfx/common/angle_common.h @@ -43,8 +43,9 @@ RETRO_BEGIN_DECLS -bool angle_init_context(egl_ctx_data_t* egl, void* display_data, EGLint* major, EGLint* minor, - EGLint* count, const EGLint* attrib_ptr, egl_accept_config_cb_t cb); +bool angle_init_context(egl_ctx_data_t* egl, + void* display_data, EGLint* major, EGLint* minor, + EGLint* count, const EGLint* attrib_ptr, egl_accept_config_cb_t cb); RETRO_END_DECLS diff --git a/gfx/common/egl_common.c b/gfx/common/egl_common.c index 077b1a4777..d35f87159f 100644 --- a/gfx/common/egl_common.c +++ b/gfx/common/egl_common.c @@ -109,6 +109,11 @@ gfx_ctx_proc_t egl_get_proc_address(const char *symbol) return eglGetProcAddress(symbol); } +void egl_terminate(EGLDisplay dpy) +{ + eglTerminate(dpy); +} + void egl_destroy(egl_ctx_data_t *egl) { if (egl->dpy) @@ -133,7 +138,7 @@ void egl_destroy(egl_ctx_data_t *egl) if (egl->surf != EGL_NO_SURFACE) eglDestroySurface(egl->dpy, egl->surf); - eglTerminate(egl->dpy); + egl_terminate(egl->dpy); } /* Be as careful as possible in deinit. @@ -329,31 +334,17 @@ bool egl_default_accept_config_cb(void *display_data, EGLDisplay dpy, EGLConfig return true; } -bool egl_init_context(egl_ctx_data_t *egl, - EGLenum platform, - void *display_data, - EGLint *major, EGLint *minor, - EGLint *count, const EGLint *attrib_ptr, - egl_accept_config_cb_t cb) +bool egl_init_context_common( + egl_ctx_data_t *egl, EGLint *count, + const EGLint *attrib_ptr, + egl_accept_config_cb_t cb, + void *display_data) { EGLint i; - EGLConfig *configs = NULL; EGLint matched = 0; - int config_index = -1; - EGLDisplay dpy = get_egl_display(platform, display_data); - - if (dpy == EGL_NO_DISPLAY) - { - RARCH_ERR("[EGL]: Couldn't get EGL display.\n"); + EGLConfig *configs = NULL; + if (!egl) return false; - } - - egl->dpy = dpy; - - if (!eglInitialize(egl->dpy, major, minor)) - return false; - - RARCH_LOG("[EGL]: EGL version: %d.%d\n", *major, *minor); if (!eglGetConfigs(egl->dpy, NULL, 0, count) || *count < 1) { @@ -395,6 +386,38 @@ bool egl_init_context(egl_ctx_data_t *egl, return true; } +bool egl_initialize(EGLDisplay dpy, EGLint *major, EGLint *minor) +{ + return eglInitialize(dpy, major, minor); +} + +bool egl_init_context(egl_ctx_data_t *egl, + EGLenum platform, + void *display_data, + EGLint *major, EGLint *minor, + EGLint *count, const EGLint *attrib_ptr, + egl_accept_config_cb_t cb) +{ + int config_index = -1; + EGLDisplay dpy = get_egl_display(platform, display_data); + + if (dpy == EGL_NO_DISPLAY) + { + RARCH_ERR("[EGL]: Couldn't get EGL display.\n"); + return false; + } + + egl->dpy = dpy; + + if (!egl_initialize(egl->dpy, major, minor)) + return false; + + RARCH_LOG("[EGL]: EGL version: %d.%d\n", *major, *minor); + + return egl_init_context_common(egl, count, attrib_ptr, cb, + display_data); +} + bool egl_bind_api(EGLenum egl_api) { return eglBindAPI(egl_api); diff --git a/gfx/common/egl_common.h b/gfx/common/egl_common.h index 0dd96bf98a..47f68a7b16 100644 --- a/gfx/common/egl_common.h +++ b/gfx/common/egl_common.h @@ -78,6 +78,8 @@ void egl_report_error(void); void egl_destroy(egl_ctx_data_t *egl); +void egl_terminate(EGLDisplay dpy); + gfx_ctx_proc_t egl_get_proc_address(const char *symbol); void egl_bind_hw_render(egl_ctx_data_t *egl, bool enable); @@ -91,6 +93,14 @@ 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_initialize(EGLDisplay dpy, EGLint *major, EGLint *minor); + +bool egl_init_context_common( + egl_ctx_data_t *egl, EGLint *count, + const EGLint *attrib_ptr, + egl_accept_config_cb_t cb, + void *display_data); + bool egl_init_context(egl_ctx_data_t *egl, EGLenum platform, void *display_data,