From fa5255416398e3e28334e94d3ea7351dcb616378 Mon Sep 17 00:00:00 2001 From: Boulay Mathias Date: Mon, 3 Oct 2022 19:51:27 +0200 Subject: [PATCH] Fix the occasional eglCreateContext_p 3005 Also, move everything. Now the big libs have their respective loaders. --- app_pojavlauncher/src/main/jni/Android.mk | 4 +- .../src/main/jni/ctxbridges/egl_loader.c | 51 +++++++++++ .../src/main/jni/ctxbridges/egl_loader.h | 29 ++++++ .../src/main/jni/{ => ctxbridges}/gl_bridge.c | 61 +++---------- .../src/main/jni/{ => ctxbridges}/gl_bridge.h | 6 +- .../src/main/jni/ctxbridges/osmesa_loader.c | 42 +++++++++ .../src/main/jni/ctxbridges/osmesa_loader.h | 22 +++++ app_pojavlauncher/src/main/jni/egl_bridge.c | 89 +++---------------- app_pojavlauncher/src/main/jni/jre_launcher.c | 2 +- 9 files changed, 172 insertions(+), 134 deletions(-) create mode 100644 app_pojavlauncher/src/main/jni/ctxbridges/egl_loader.c create mode 100644 app_pojavlauncher/src/main/jni/ctxbridges/egl_loader.h rename app_pojavlauncher/src/main/jni/{ => ctxbridges}/gl_bridge.c (66%) rename app_pojavlauncher/src/main/jni/{ => ctxbridges}/gl_bridge.h (80%) create mode 100644 app_pojavlauncher/src/main/jni/ctxbridges/osmesa_loader.c create mode 100644 app_pojavlauncher/src/main/jni/ctxbridges/osmesa_loader.h diff --git a/app_pojavlauncher/src/main/jni/Android.mk b/app_pojavlauncher/src/main/jni/Android.mk index 48e830cf0..8c6c1f194 100644 --- a/app_pojavlauncher/src/main/jni/Android.mk +++ b/app_pojavlauncher/src/main/jni/Android.mk @@ -33,7 +33,9 @@ LOCAL_MODULE := pojavexec # -DGLES_TEST LOCAL_SRC_FILES := \ egl_bridge.c \ - gl_bridge.c \ + ctxbridges/gl_bridge.c \ + ctxbridges/egl_loader.c \ + ctxbridges/osmesa_loader.c \ input_bridge_v3.c \ jre_launcher.c \ utils.c diff --git a/app_pojavlauncher/src/main/jni/ctxbridges/egl_loader.c b/app_pojavlauncher/src/main/jni/ctxbridges/egl_loader.c new file mode 100644 index 000000000..ca53001e2 --- /dev/null +++ b/app_pojavlauncher/src/main/jni/ctxbridges/egl_loader.c @@ -0,0 +1,51 @@ +// +// Created by maks on 21.09.2022. +// +#include +#include +#include +#include "egl_loader.h" + +EGLBoolean (*eglMakeCurrent_p) (EGLDisplay dpy, EGLSurface draw, EGLSurface read, EGLContext ctx); +EGLBoolean (*eglDestroyContext_p) (EGLDisplay dpy, EGLContext ctx); +EGLBoolean (*eglDestroySurface_p) (EGLDisplay dpy, EGLSurface surface); +EGLBoolean (*eglTerminate_p) (EGLDisplay dpy); +EGLBoolean (*eglReleaseThread_p) (void); +EGLContext (*eglGetCurrentContext_p) (void); +EGLDisplay (*eglGetDisplay_p) (NativeDisplayType display); +EGLBoolean (*eglInitialize_p) (EGLDisplay dpy, EGLint *major, EGLint *minor); +EGLBoolean (*eglChooseConfig_p) (EGLDisplay dpy, const EGLint *attrib_list, EGLConfig *configs, EGLint config_size, EGLint *num_config); +EGLBoolean (*eglGetConfigAttrib_p) (EGLDisplay dpy, EGLConfig config, EGLint attribute, EGLint *value); +EGLBoolean (*eglBindAPI_p) (EGLenum api); +EGLSurface (*eglCreatePbufferSurface_p) (EGLDisplay dpy, EGLConfig config, const EGLint *attrib_list); +EGLSurface (*eglCreateWindowSurface_p) (EGLDisplay dpy, EGLConfig config, NativeWindowType window, const EGLint *attrib_list); +EGLBoolean (*eglSwapBuffers_p) (EGLDisplay dpy, EGLSurface draw); +EGLint (*eglGetError_p) (void); +EGLContext (*eglCreateContext_p) (EGLDisplay dpy, EGLConfig config, EGLContext share_list, const EGLint *attrib_list); +EGLBoolean (*eglSwapInterval_p) (EGLDisplay dpy, EGLint interval); +EGLSurface (*eglGetCurrentSurface_p) (EGLint readdraw); + +void dlsym_EGL() { + void* dl_handle = NULL; + if(getenv("POJAVEXEC_EGL")) dl_handle = dlopen(getenv("POJAVEXEC_EGL"), RTLD_LAZY); + if(dl_handle == NULL) dl_handle = dlopen("libEGL.so", RTLD_LAZY); + if(dl_handle == NULL) abort(); + eglBindAPI_p = dlsym(dl_handle,"eglBindAPI"); + eglChooseConfig_p = dlsym(dl_handle, "eglChooseConfig"); + eglCreateContext_p = dlsym(dl_handle, "eglCreateContext"); + eglCreatePbufferSurface_p = dlsym(dl_handle, "eglCreatePbufferSurface"); + eglCreateWindowSurface_p = dlsym(dl_handle, "eglCreateWindowSurface"); + eglDestroyContext_p = dlsym(dl_handle, "eglDestroyContext"); + eglDestroySurface_p = dlsym(dl_handle, "eglDestroySurface"); + eglGetConfigAttrib_p = dlsym(dl_handle, "eglGetConfigAttrib"); + eglGetCurrentContext_p = dlsym(dl_handle, "eglGetCurrentContext"); + eglGetDisplay_p = dlsym(dl_handle, "eglGetDisplay"); + eglGetError_p = dlsym(dl_handle, "eglGetError"); + eglInitialize_p = dlsym(dl_handle, "eglInitialize"); + eglMakeCurrent_p = dlsym(dl_handle, "eglMakeCurrent"); + eglSwapBuffers_p = dlsym(dl_handle, "eglSwapBuffers"); + eglReleaseThread_p = dlsym(dl_handle, "eglReleaseThread"); + eglSwapInterval_p = dlsym(dl_handle, "eglSwapInterval"); + eglTerminate_p = dlsym(dl_handle, "eglTerminate"); + eglGetCurrentSurface_p = dlsym(dl_handle,"eglGetCurrentSurface"); +} diff --git a/app_pojavlauncher/src/main/jni/ctxbridges/egl_loader.h b/app_pojavlauncher/src/main/jni/ctxbridges/egl_loader.h new file mode 100644 index 000000000..5c761d262 --- /dev/null +++ b/app_pojavlauncher/src/main/jni/ctxbridges/egl_loader.h @@ -0,0 +1,29 @@ +// +// Created by maks on 21.09.2022. +// +#include +#ifndef POJAVLAUNCHER_EGL_LOADER_H +#define POJAVLAUNCHER_EGL_LOADER_H + +extern EGLBoolean (*eglMakeCurrent_p) (EGLDisplay dpy, EGLSurface draw, EGLSurface read, EGLContext ctx); +extern EGLBoolean (*eglDestroyContext_p) (EGLDisplay dpy, EGLContext ctx); +extern EGLBoolean (*eglDestroySurface_p) (EGLDisplay dpy, EGLSurface surface); +extern EGLBoolean (*eglTerminate_p) (EGLDisplay dpy); +extern EGLBoolean (*eglReleaseThread_p) (void); +extern EGLContext (*eglGetCurrentContext_p) (void); +extern EGLDisplay (*eglGetDisplay_p) (NativeDisplayType display); +extern EGLBoolean (*eglInitialize_p) (EGLDisplay dpy, EGLint *major, EGLint *minor); +extern EGLBoolean (*eglChooseConfig_p) (EGLDisplay dpy, const EGLint *attrib_list, EGLConfig *configs, EGLint config_size, EGLint *num_config); +extern EGLBoolean (*eglGetConfigAttrib_p) (EGLDisplay dpy, EGLConfig config, EGLint attribute, EGLint *value); +extern EGLBoolean (*eglBindAPI_p) (EGLenum api); +extern EGLSurface (*eglCreatePbufferSurface_p) (EGLDisplay dpy, EGLConfig config, const EGLint *attrib_list); +extern EGLSurface (*eglCreateWindowSurface_p) (EGLDisplay dpy, EGLConfig config, NativeWindowType window, const EGLint *attrib_list); +extern EGLBoolean (*eglSwapBuffers_p) (EGLDisplay dpy, EGLSurface draw); +extern EGLint (*eglGetError_p) (void); +extern EGLContext (*eglCreateContext_p) (EGLDisplay dpy, EGLConfig config, EGLContext share_list, const EGLint *attrib_list); +extern EGLBoolean (*eglSwapInterval_p) (EGLDisplay dpy, EGLint interval); +extern EGLSurface (*eglGetCurrentSurface_p) (EGLint readdraw); + +void dlsym_EGL(); + +#endif //POJAVLAUNCHER_EGL_LOADER_H diff --git a/app_pojavlauncher/src/main/jni/gl_bridge.c b/app_pojavlauncher/src/main/jni/ctxbridges/gl_bridge.c similarity index 66% rename from app_pojavlauncher/src/main/jni/gl_bridge.c rename to app_pojavlauncher/src/main/jni/ctxbridges/gl_bridge.c index 6eff6ce58..79dd314b5 100644 --- a/app_pojavlauncher/src/main/jni/gl_bridge.c +++ b/app_pojavlauncher/src/main/jni/ctxbridges/gl_bridge.c @@ -7,6 +7,7 @@ #include #include #include "gl_bridge.h" +#include "egl_loader.h" // // Created by maks on 17.09.2022. @@ -16,57 +17,15 @@ #define STATE_RENDERER_NEW_WINDOW 1 static char* g_LogTag = "GLBridge"; -EGLBoolean (*eglMakeCurrent_p) (EGLDisplay dpy, EGLSurface draw, EGLSurface read, EGLContext ctx); -EGLBoolean (*eglDestroyContext_p) (EGLDisplay dpy, EGLContext ctx); -EGLBoolean (*eglDestroySurface_p) (EGLDisplay dpy, EGLSurface surface); -EGLBoolean (*eglTerminate_p) (EGLDisplay dpy); -EGLBoolean (*eglReleaseThread_p) (void); -EGLContext (*eglGetCurrentContext_p) (void); -EGLDisplay (*eglGetDisplay_p) (NativeDisplayType display); -EGLBoolean (*eglInitialize_p) (EGLDisplay dpy, EGLint *major, EGLint *minor); -EGLBoolean (*eglChooseConfig_p) (EGLDisplay dpy, const EGLint *attrib_list, EGLConfig *configs, EGLint config_size, EGLint *num_config); -EGLBoolean (*eglGetConfigAttrib_p) (EGLDisplay dpy, EGLConfig config, EGLint attribute, EGLint *value); -EGLBoolean (*eglBindAPI_p) (EGLenum api); -EGLSurface (*eglCreatePbufferSurface_p) (EGLDisplay dpy, EGLConfig config, const EGLint *attrib_list); -EGLSurface (*eglCreateWindowSurface_p) (EGLDisplay dpy, EGLConfig config, NativeWindowType window, const EGLint *attrib_list); -EGLBoolean (*eglSwapBuffers_p) (EGLDisplay dpy, EGLSurface draw); -EGLint (*eglGetError_p) (void); -EGLContext (*eglCreateContext_p) (EGLDisplay dpy, EGLConfig config, EGLContext share_list, const EGLint *attrib_list); -EGLBoolean (*eglSwapInterval_p) (EGLDisplay dpy, EGLint interval); -EGLSurface (*eglGetCurrentSurface_p) (EGLint readdraw); + struct ANativeWindow* newWindow; -static __thread render_bundle_t* currentBundle; -static render_bundle_t* mainWindowBundle; +static __thread render_window_t* currentBundle; +static render_window_t* mainWindowBundle; EGLDisplay g_EglDisplay; -void gl_dlsym_EGL() { - void* dl_handle = NULL; - if(getenv("POJAVEXEC_EGL")) dl_handle = dlopen(getenv("POJAVEXEC_EGL"), RTLD_LAZY); - if(dl_handle == NULL) dl_handle = dlopen("libEGL.so", RTLD_LAZY); - if(dl_handle == NULL) abort(); - eglBindAPI_p = dlsym(dl_handle,"eglBindAPI"); - eglChooseConfig_p = dlsym(dl_handle, "eglChooseConfig"); - eglCreateContext_p = dlsym(dl_handle, "eglCreateContext"); - eglCreatePbufferSurface_p = dlsym(dl_handle, "eglCreatePbufferSurface"); - eglCreateWindowSurface_p = dlsym(dl_handle, "eglCreateWindowSurface"); - eglDestroyContext_p = dlsym(dl_handle, "eglDestroyContext"); - eglDestroySurface_p = dlsym(dl_handle, "eglDestroySurface"); - eglGetConfigAttrib_p = dlsym(dl_handle, "eglGetConfigAttrib"); - eglGetCurrentContext_p = dlsym(dl_handle, "eglGetCurrentContext"); - eglGetDisplay_p = dlsym(dl_handle, "eglGetDisplay"); - eglGetError_p = dlsym(dl_handle, "eglGetError"); - eglInitialize_p = dlsym(dl_handle, "eglInitialize"); - eglMakeCurrent_p = dlsym(dl_handle, "eglMakeCurrent"); - eglSwapBuffers_p = dlsym(dl_handle, "eglSwapBuffers"); - eglReleaseThread_p = dlsym(dl_handle, "eglReleaseThread"); - eglSwapInterval_p = dlsym(dl_handle, "eglSwapInterval"); - eglTerminate_p = dlsym(dl_handle, "eglTerminate"); - eglGetCurrentSurface_p = dlsym(dl_handle,"eglGetCurrentSurface"); -} - bool gl_init() { - gl_dlsym_EGL(); + dlsym_EGL(); g_EglDisplay = eglGetDisplay_p(EGL_DEFAULT_DISPLAY); if (g_EglDisplay == EGL_NO_DISPLAY) { __android_log_print(ANDROID_LOG_ERROR, g_LogTag, "%s", @@ -82,8 +41,8 @@ bool gl_init() { return true; } -render_bundle_t* gl_init_context(render_bundle_t *share) { - render_bundle_t* bundle = malloc(sizeof(render_bundle_t)); +render_window_t* gl_init_context(render_window_t *share) { + render_window_t* bundle = malloc(sizeof(render_window_t)); const EGLint egl_attributes[] = { EGL_BLUE_SIZE, 8, EGL_GREEN_SIZE, 8, EGL_RED_SIZE, 8, EGL_ALPHA_SIZE, 8, EGL_DEPTH_SIZE, 24, EGL_SURFACE_TYPE, EGL_WINDOW_BIT|EGL_PBUFFER_BIT, EGL_NONE }; EGLint num_configs = 0; if (eglChooseConfig_p(g_EglDisplay, egl_attributes, NULL, 0, &num_configs) != EGL_TRUE) { @@ -106,7 +65,7 @@ render_bundle_t* gl_init_context(render_bundle_t *share) { int libgl_es = strtol(getenv("LIBGL_ES"), NULL, 0); if(libgl_es < 0 || libgl_es > INT16_MAX) libgl_es = 2; const EGLint egl_context_attributes[] = { EGL_CONTEXT_CLIENT_VERSION, 3, EGL_NONE }; - bundle->context = eglCreateContext_p(g_EglDisplay, bundle->context, share == NULL ? EGL_NO_CONTEXT : share->context, egl_context_attributes); + bundle->context = eglCreateContext_p(g_EglDisplay, bundle->config, share == NULL ? EGL_NO_CONTEXT : share->context, egl_context_attributes); if (bundle->context == EGL_NO_CONTEXT) { __android_log_print(ANDROID_LOG_ERROR, g_LogTag, "eglCreateContext_p() finished with error: %04x", @@ -117,7 +76,7 @@ render_bundle_t* gl_init_context(render_bundle_t *share) { return bundle; } -void gl_swap_surface(render_bundle_t* bundle) { +void gl_swap_surface(render_window_t* bundle) { if(bundle->nativeSurface != NULL) { ANativeWindow_release(bundle->nativeSurface); } @@ -137,7 +96,7 @@ void gl_swap_surface(render_bundle_t* bundle) { //eglMakeCurrent_p(g_EglDisplay, bundle->surface, bundle->surface, bundle->context); } -void gl_make_current(render_bundle_t* bundle) { +void gl_make_current(render_window_t* bundle) { if(bundle == NULL) { if(eglMakeCurrent_p(g_EglDisplay, EGL_NO_SURFACE, EGL_NO_SURFACE, EGL_NO_CONTEXT)) { currentBundle = NULL; diff --git a/app_pojavlauncher/src/main/jni/gl_bridge.h b/app_pojavlauncher/src/main/jni/ctxbridges/gl_bridge.h similarity index 80% rename from app_pojavlauncher/src/main/jni/gl_bridge.h rename to app_pojavlauncher/src/main/jni/ctxbridges/gl_bridge.h index 5c7a28aa1..2e21e17f8 100644 --- a/app_pojavlauncher/src/main/jni/gl_bridge.h +++ b/app_pojavlauncher/src/main/jni/ctxbridges/gl_bridge.h @@ -13,11 +13,11 @@ typedef struct { EGLSurface surface; struct ANativeWindow *nativeSurface; struct ANativeWindow *newNativeSurface; -} render_bundle_t; +} render_window_t; bool gl_init(); -render_bundle_t* gl_init_context(render_bundle_t* share); -void gl_make_current(render_bundle_t* bundle); +render_window_t* gl_init_context(render_window_t* share); +void gl_make_current(render_window_t* bundle); void gl_swap_buffers(); void gl_setup_window(struct ANativeWindow* window); void gl_swap_interval(int swapInterval); diff --git a/app_pojavlauncher/src/main/jni/ctxbridges/osmesa_loader.c b/app_pojavlauncher/src/main/jni/ctxbridges/osmesa_loader.c new file mode 100644 index 000000000..c81c1977f --- /dev/null +++ b/app_pojavlauncher/src/main/jni/ctxbridges/osmesa_loader.c @@ -0,0 +1,42 @@ +// +// Created by maks on 21.09.2022. +// +#include +#include +#include +#include "osmesa_loader.h" + +GLboolean (*OSMesaMakeCurrent_p) (OSMesaContext ctx, void *buffer, GLenum type, + GLsizei width, GLsizei height); +OSMesaContext (*OSMesaGetCurrentContext_p) (void); +OSMesaContext (*OSMesaCreateContext_p) (GLenum format, OSMesaContext sharelist); +void (*OSMesaDestroyContext_p) (OSMesaContext ctx); +void (*OSMesaPixelStore_p) ( GLint pname, GLint value ); +GLubyte* (*glGetString_p) (GLenum name); +void (*glFinish_p) (void); +void (*glClearColor_p) (GLclampf red, GLclampf green, GLclampf blue, GLclampf alpha); +void (*glClear_p) (GLbitfield mask); +void (*glReadPixels_p) (GLint x, GLint y, GLsizei width, GLsizei height, GLenum format, GLenum type, void * data); + +void dlsym_OSMesa() { + char* main_path = NULL; + char* alt_path = NULL; + if(asprintf(&main_path, "%s/libOSMesa_8.so", getenv("POJAV_NATIVEDIR")) == -1 || + asprintf(&alt_path, "%s/libOSMesa.so.8", getenv("POJAV_NATIVEDIR")) == -1) { + abort(); + } + void* dl_handle = NULL; + dl_handle = dlopen(alt_path, RTLD_GLOBAL); + if(dl_handle == NULL) dl_handle = dlopen(main_path, RTLD_GLOBAL); + if(dl_handle == NULL) abort(); + OSMesaMakeCurrent_p = dlsym(dl_handle, "OSMesaMakeCurrent"); + OSMesaGetCurrentContext_p = dlsym(dl_handle,"OSMesaGetCurrentContext"); + OSMesaCreateContext_p = dlsym(dl_handle, "OSMesaCreateContext"); + OSMesaDestroyContext_p = dlsym(dl_handle, "OSMesaDestroyContext"); + OSMesaPixelStore_p = dlsym(dl_handle,"OSMesaPixelStore"); + glGetString_p = dlsym(dl_handle,"glGetString"); + glClearColor_p = dlsym(dl_handle, "glClearColor"); + glClear_p = dlsym(dl_handle,"glClear"); + glFinish_p = dlsym(dl_handle,"glFinish"); + glReadPixels_p = dlsym(dl_handle,"glReadPixels"); +} \ No newline at end of file diff --git a/app_pojavlauncher/src/main/jni/ctxbridges/osmesa_loader.h b/app_pojavlauncher/src/main/jni/ctxbridges/osmesa_loader.h new file mode 100644 index 000000000..6cb76d25c --- /dev/null +++ b/app_pojavlauncher/src/main/jni/ctxbridges/osmesa_loader.h @@ -0,0 +1,22 @@ +// +// Created by maks on 21.09.2022. +// + +#ifndef POJAVLAUNCHER_OSMESA_LOADER_H +#define POJAVLAUNCHER_OSMESA_LOADER_H + +#include + +extern GLboolean (*OSMesaMakeCurrent_p) (OSMesaContext ctx, void *buffer, GLenum type, + GLsizei width, GLsizei height); +extern OSMesaContext (*OSMesaGetCurrentContext_p) (void); +extern OSMesaContext (*OSMesaCreateContext_p) (GLenum format, OSMesaContext sharelist); +extern void (*OSMesaDestroyContext_p) (OSMesaContext ctx); +extern void (*OSMesaPixelStore_p) ( GLint pname, GLint value ); +extern GLubyte* (*glGetString_p) (GLenum name); +extern void (*glFinish_p) (void); +extern void (*glClearColor_p) (GLclampf red, GLclampf green, GLclampf blue, GLclampf alpha); +extern void (*glClear_p) (GLbitfield mask); +extern void (*glReadPixels_p) (GLint x, GLint y, GLsizei width, GLsizei height, GLenum format, GLenum type, void * data); +void dlsym_OSMesa(); +#endif //POJAVLAUNCHER_OSMESA_LOADER_H diff --git a/app_pojavlauncher/src/main/jni/egl_bridge.c b/app_pojavlauncher/src/main/jni/egl_bridge.c index bb6b73371..d3b992339 100644 --- a/app_pojavlauncher/src/main/jni/egl_bridge.c +++ b/app_pojavlauncher/src/main/jni/egl_bridge.c @@ -21,7 +21,7 @@ #include #include #include "utils.h" -#include "gl_bridge.h" +#include "ctxbridges/gl_bridge.h" // region OSMESA internals struct pipe_screen; @@ -594,38 +594,8 @@ struct PotatoBridge { EGLConfig config; struct PotatoBridge potatoBridge; -/* OSMesa functions */ -GLboolean (*OSMesaMakeCurrent_p) (OSMesaContext ctx, void *buffer, GLenum type, - GLsizei width, GLsizei height); -OSMesaContext (*OSMesaGetCurrentContext_p) (void); -OSMesaContext (*OSMesaCreateContext_p) (GLenum format, OSMesaContext sharelist); -void (*OSMesaDestroyContext_p) (OSMesaContext ctx); -void (*OSMesaPixelStore_p) ( GLint pname, GLint value ); -GLubyte* (*glGetString_p) (GLenum name); -void (*glFinish_p) (void); -void (*glClearColor_p) (GLclampf red, GLclampf green, GLclampf blue, GLclampf alpha); -void (*glClear_p) (GLbitfield mask); -void (*glReadPixels_p) (GLint x, GLint y, GLsizei width, GLsizei height, GLenum format, GLenum type, void * data); - -/*EGL functions */ -EGLBoolean (*eglMakeCurrent_p) (EGLDisplay dpy, EGLSurface draw, EGLSurface read, EGLContext ctx); -EGLBoolean (*eglDestroyContext_p) (EGLDisplay dpy, EGLContext ctx); -EGLBoolean (*eglDestroySurface_p) (EGLDisplay dpy, EGLSurface surface); -EGLBoolean (*eglTerminate_p) (EGLDisplay dpy); -EGLBoolean (*eglReleaseThread_p) (void); -EGLContext (*eglGetCurrentContext_p) (void); -EGLDisplay (*eglGetDisplay_p) (NativeDisplayType display); -EGLBoolean (*eglInitialize_p) (EGLDisplay dpy, EGLint *major, EGLint *minor); -EGLBoolean (*eglChooseConfig_p) (EGLDisplay dpy, const EGLint *attrib_list, EGLConfig *configs, EGLint config_size, EGLint *num_config); -EGLBoolean (*eglGetConfigAttrib_p) (EGLDisplay dpy, EGLConfig config, EGLint attribute, EGLint *value); -EGLBoolean (*eglBindAPI_p) (EGLenum api); -EGLSurface (*eglCreatePbufferSurface_p) (EGLDisplay dpy, EGLConfig config, const EGLint *attrib_list); -EGLSurface (*eglCreateWindowSurface_p) (EGLDisplay dpy, EGLConfig config, NativeWindowType window, const EGLint *attrib_list); -EGLBoolean (*eglSwapBuffers_p) (EGLDisplay dpy, EGLSurface draw); -EGLint (*eglGetError_p) (void); -EGLContext (*eglCreateContext_p) (EGLDisplay dpy, EGLConfig config, EGLContext share_list, const EGLint *attrib_list); -EGLBoolean (*eglSwapInterval_p) (EGLDisplay dpy, EGLint interval); -EGLSurface (*eglGetCurrentSurface_p) (EGLint readdraw); +#include "ctxbridges/egl_loader.h" +#include "ctxbridges/osmesa_loader.h" int (*vtest_main_p) (int argc, char** argv); void (*vtest_swap_buffers_p) (void); @@ -696,7 +666,7 @@ void* pojavGetCurrentContext() { } } -void dlsym_EGL(void* dl_handle) { +/*void dlsym_EGL(void* dl_handle) { eglBindAPI_p = dlsym(dl_handle,"eglBindAPI"); eglChooseConfig_p = dlsym(dl_handle, "eglChooseConfig"); eglCreateContext_p = dlsym(dl_handle, "eglCreateContext"); @@ -728,61 +698,24 @@ void dlsym_OSMesa(void* dl_handle) { glClear_p = dlsym(dl_handle,"glClear"); glFinish_p = dlsym(dl_handle,"glFinish"); glReadPixels_p = dlsym(dl_handle,"glReadPixels"); -} +}*/ bool loadSymbols() { - char* fileName = calloc(1, 1024); - char* fileNameExt = calloc(1, 1024); switch (config_renderer) { + case RENDERER_VIRGL: + dlsym_EGL(); case RENDERER_VK_ZINK: - sprintf(fileName, "%s/libOSMesa_8.so", getenv("POJAV_NATIVEDIR")); - sprintf(fileNameExt, "%s/libOSMesa.so.8", getenv("POJAV_NATIVEDIR")); + dlsym_OSMesa(); break; case RENDERER_GL4ES: - sprintf(fileName, "libEGL.so"); - char* eglLib = getenv("POJAVEXEC_EGL"); - if (eglLib) { - sprintf(fileNameExt, "%s", eglLib); - } + //inside glbridge break; } - void* dl_handle = dlopen(fileNameExt,RTLD_NOW|RTLD_GLOBAL|RTLD_NODELETE); - if (!dl_handle) { - dl_handle = dlopen(fileNameExt,RTLD_NOW|RTLD_GLOBAL); - } - if (!dl_handle) { - dl_handle = dlopen(fileName,RTLD_NOW|RTLD_GLOBAL|RTLD_NODELETE); - if (!dl_handle) { - dl_handle = dlopen(fileName,RTLD_NOW|RTLD_GLOBAL); - } - printf("DlLoader: using default %s\n", fileName); - } else { - printf("DlLoader: using external %s\n", fileNameExt); - } - - if(dl_handle == NULL) { - printf("DlLoader: unable to load: %s\n",dlerror()); - return 0; - } - switch(config_renderer) { - case RENDERER_VK_ZINK: - dlsym_OSMesa(dl_handle); - break; - case RENDERER_GL4ES: - dlsym_EGL(dl_handle); - break; - } - - free(fileName); - free(fileNameExt); } bool loadSymbolsVirGL() { - config_renderer = RENDERER_GL4ES; - loadSymbols(); - config_renderer = RENDERER_VK_ZINK; - loadSymbols(); config_renderer = RENDERER_VIRGL; + loadSymbols(); char* fileName = calloc(1, 1024); @@ -999,7 +932,7 @@ void pojavMakeCurrent(void* window) { // return JNI_TRUE; //} if(config_renderer == RENDERER_GL4ES) { - gl_make_current((render_bundle_t*)window); + gl_make_current((render_window_t*)window); } if (config_renderer == RENDERER_VK_ZINK || config_renderer == RENDERER_VIRGL) { printf("OSMDroid: making current\n"); diff --git a/app_pojavlauncher/src/main/jni/jre_launcher.c b/app_pojavlauncher/src/main/jni/jre_launcher.c index aa740a5af..5c58f315a 100644 --- a/app_pojavlauncher/src/main/jni/jre_launcher.c +++ b/app_pojavlauncher/src/main/jni/jre_launcher.c @@ -148,7 +148,7 @@ JNIEXPORT jint JNICALL Java_com_oracle_dalvik_VMLauncher_launchJVM(JNIEnv *env, // SA_RESETHAND; #define CATCHSIG(X) sigaction(X, &catcher, &old_sa[X]) CATCHSIG(SIGILL); - CATCHSIG(SIGABRT); + //CATCHSIG(SIGABRT); CATCHSIG(SIGBUS); CATCHSIG(SIGFPE); #ifdef TRY_SIG2JVM