mirror of
https://github.com/libretro/RetroArch
synced 2025-03-23 01:21:47 +00:00
(Android) - EGL context cleanups
- Add shared context support
This commit is contained in:
parent
2ea68714f6
commit
5216e90c12
@ -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);
|
||||||
|
|
||||||
|
@ -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,
|
||||||
};
|
};
|
||||||
|
Loading…
x
Reference in New Issue
Block a user