(Android) - EGL context cleanups

- Add shared context support
This commit is contained in:
twinaphex 2014-06-20 04:34:42 +02:00
parent 2ea68714f6
commit 5216e90c12
2 changed files with 51 additions and 34 deletions

View File

@ -40,7 +40,6 @@ public final class UserPreferences
final String external = System.getenv("EXTERNAL_STORAGE"); final String external = System.getenv("EXTERNAL_STORAGE");
// Native library directory and data directory for this front-end. // Native library directory and data directory for this front-end.
final String nativeLibraryDir = ctx.getApplicationInfo().nativeLibraryDir;
final String dataDir = ctx.getApplicationInfo().dataDir; final String dataDir = ctx.getApplicationInfo().dataDir;
final String coreDir = dataDir + "/cores/"; final String coreDir = dataDir + "/cores/";
@ -160,7 +159,6 @@ public final class UserPreferences
final String dataDir = ctx.getApplicationInfo().dataDir; final String dataDir = ctx.getApplicationInfo().dataDir;
final String coreDir = dataDir + "/cores/"; final String coreDir = dataDir + "/cores/";
final String nativeLibraryDir = ctx.getApplicationInfo().nativeLibraryDir;
final SharedPreferences prefs = getPreferences(ctx); final SharedPreferences prefs = getPreferences(ctx);

View File

@ -31,11 +31,12 @@
#include "../shader_glsl.h" #include "../shader_glsl.h"
#endif #endif
static bool g_use_hw_ctx;
static EGLContext g_egl_hw_ctx;
static EGLContext g_egl_ctx; static EGLContext g_egl_ctx;
static EGLSurface g_egl_surf; static EGLSurface g_egl_surf;
static EGLDisplay g_egl_dpy; static EGLDisplay g_egl_dpy;
static EGLConfig g_config; static EGLConfig g_config;
static bool g_resize;
static bool g_es3; static bool g_es3;
static void gfx_ctx_set_swap_interval(void *data, unsigned interval) static void gfx_ctx_set_swap_interval(void *data, unsigned interval)
@ -48,17 +49,30 @@ static void gfx_ctx_set_swap_interval(void *data, unsigned interval)
static void gfx_ctx_destroy(void *data) static void gfx_ctx_destroy(void *data)
{ {
(void)data; (void)data;
RARCH_LOG("gfx_ctx_destroy().\n");
if (g_egl_dpy)
{
if (g_egl_ctx)
{
eglMakeCurrent(g_egl_dpy, EGL_NO_SURFACE, EGL_NO_SURFACE, EGL_NO_CONTEXT); eglMakeCurrent(g_egl_dpy, EGL_NO_SURFACE, EGL_NO_SURFACE, EGL_NO_CONTEXT);
eglDestroyContext(g_egl_dpy, g_egl_ctx); eglDestroyContext(g_egl_dpy, g_egl_ctx);
}
if (g_egl_hw_ctx)
eglDestroyContext(g_egl_dpy, g_egl_hw_ctx);
if (g_egl_surf)
eglDestroySurface(g_egl_dpy, g_egl_surf); eglDestroySurface(g_egl_dpy, g_egl_surf);
eglTerminate(g_egl_dpy); eglTerminate(g_egl_dpy);
}
g_egl_dpy = EGL_NO_DISPLAY; // Be as careful as possible in deinit.
g_egl_surf = EGL_NO_SURFACE;
g_egl_ctx = EGL_NO_CONTEXT; g_egl_ctx = NULL;
g_egl_hw_ctx = NULL;
g_egl_surf = NULL;
g_egl_dpy = NULL;
g_config = 0; g_config = 0;
g_resize = false;
} }
static void gfx_ctx_get_video_size(void *data, unsigned *width, unsigned *height) static void gfx_ctx_get_video_size(void *data, unsigned *width, unsigned *height)
@ -101,27 +115,20 @@ static bool gfx_ctx_init(void *data)
EGL_NONE EGL_NONE
}; };
RARCH_LOG("Initializing context\n"); g_egl_dpy = eglGetDisplay(EGL_DEFAULT_DISPLAY);
if (!g_egl_dpy)
if ((g_egl_dpy = eglGetDisplay(EGL_DEFAULT_DISPLAY)) == EGL_NO_DISPLAY)
{ {
RARCH_ERR("eglGetDisplay failed.\n"); RARCH_ERR("[Android/EGL]: Couldn't get EGL display.\n");
goto error; goto error;
} }
if (!eglInitialize(g_egl_dpy, &egl_version_major, &egl_version_minor)) if (!eglInitialize(g_egl_dpy, &egl_version_major, &egl_version_minor))
{
RARCH_ERR("eglInitialize failed.\n");
goto error; goto error;
}
RARCH_LOG("[ANDROID/EGL]: EGL version: %d.%d\n", egl_version_major, egl_version_minor); RARCH_LOG("[ANDROID/EGL]: EGL version: %d.%d\n", egl_version_major, egl_version_minor);
if (!eglChooseConfig(g_egl_dpy, attribs, &g_config, 1, &num_config)) if (!eglChooseConfig(g_egl_dpy, attribs, &g_config, 1, &num_config))
{
RARCH_ERR("eglChooseConfig failed.\n");
goto error; goto error;
}
int var = eglGetConfigAttrib(g_egl_dpy, g_config, EGL_NATIVE_VISUAL_ID, &format); int var = eglGetConfigAttrib(g_egl_dpy, g_config, EGL_NATIVE_VISUAL_ID, &format);
@ -133,28 +140,31 @@ static bool gfx_ctx_init(void *data)
ANativeWindow_setBuffersGeometry(android_app->window, 0, 0, format); ANativeWindow_setBuffersGeometry(android_app->window, 0, 0, format);
if (!(g_egl_surf = eglCreateWindowSurface(g_egl_dpy, g_config, android_app->window, 0))) g_egl_ctx = eglCreateContext(g_egl_dpy, g_config, EGL_NO_CONTEXT, context_attributes);
if (g_egl_ctx == EGL_NO_CONTEXT)
goto error;
if (g_use_hw_ctx)
{ {
RARCH_ERR("eglCreateWindowSurface failed.\n"); g_egl_hw_ctx = eglCreateContext(g_egl_dpy, g_config, g_egl_ctx,
context_attributes);
RARCH_LOG("[Android/EGL]: Created shared context: %p.\n", (void*)g_egl_hw_ctx);
if (g_egl_hw_ctx == EGL_NO_CONTEXT)
goto error; goto error;
} }
if (!(g_egl_ctx = eglCreateContext(g_egl_dpy, g_config, 0, context_attributes))) g_egl_surf = eglCreateWindowSurface(g_egl_dpy, g_config, android_app->window, 0);
{ if (!g_egl_surf)
RARCH_ERR("eglCreateContext failed.\n");
goto error; goto error;
}
if (!eglMakeCurrent(g_egl_dpy, g_egl_surf, g_egl_surf, g_egl_ctx)) if (!eglMakeCurrent(g_egl_dpy, g_egl_surf, g_egl_surf, g_egl_ctx))
{
RARCH_ERR("eglMakeCurrent failed.\n");
goto error; goto error;
}
return true; return true;
error: error:
RARCH_ERR("EGL error: %d.\n", eglGetError());
gfx_ctx_destroy(data); gfx_ctx_destroy(data);
return false; return false;
} }
@ -256,6 +266,14 @@ static bool gfx_ctx_has_focus(void *data)
return true; return true;
} }
static void android_gfx_ctx_bind_hw_render(void *data, bool enable)
{
(void)data;
g_use_hw_ctx = enable;
if (g_egl_dpy && g_egl_surf)
eglMakeCurrent(g_egl_dpy, g_egl_surf, g_egl_surf, enable ? g_egl_hw_ctx : g_egl_ctx);
}
const gfx_ctx_driver_t gfx_ctx_android = { const gfx_ctx_driver_t gfx_ctx_android = {
gfx_ctx_init, gfx_ctx_init,
gfx_ctx_destroy, gfx_ctx_destroy,
@ -277,4 +295,5 @@ const gfx_ctx_driver_t gfx_ctx_android = {
#endif #endif
NULL, NULL,
"android", "android",
android_gfx_ctx_bind_hw_render,
}; };