diff --git a/JavaApp/src/main/java/org/lwjgl/opengl/GL.java b/JavaApp/src/main/java/org/lwjgl/opengl/GL.java index bbcf4d1b..7c91ea73 100644 --- a/JavaApp/src/main/java/org/lwjgl/opengl/GL.java +++ b/JavaApp/src/main/java/org/lwjgl/opengl/GL.java @@ -108,7 +108,9 @@ public final class GL { GL = Library.loadNative(GL.class, "org.lwjgl.opengl", Configuration.OPENGL_LIBRARY_NAME, "libGL.so.1", "libGL.so"); break; case MACOSX: - String override = Configuration.OPENGL_LIBRARY_NAME.get(); + // Configuration does not get updated if the value changes, so we have to use System.getProperty() + String override = System.getProperty("org.lwjgl.opengl.libname"); + //Configuration.OPENGL_LIBRARY_NAME.get(); GL = override != null ? Library.loadNative(GL.class, "org.lwjgl.opengl", override) : MacOSXLibrary.getWithIdentifier("com.apple.opengl"); diff --git a/Natives/egl_bridge.m b/Natives/egl_bridge.m index f37c0efd..76057d28 100644 --- a/Natives/egl_bridge.m +++ b/Natives/egl_bridge.m @@ -91,15 +91,14 @@ pid_t gettid() { return (pid_t) pthread_mach_thread_np(pthread_self()); } - -JNIEXPORT void JNICALL Java_net_kdt_pojavlaunch_utils_JREUtils_setenv(JNIEnv *env, jclass clazz, jstring name, jstring value, jboolean overwrite) { - char const *name_c = (*env)->GetStringUTFChars(env, name, NULL); - char const *value_c = (*env)->GetStringUTFChars(env, value, NULL); - - setenv(name_c, value_c, overwrite); - - (*env)->ReleaseStringUTFChars(env, name, name_c); - (*env)->ReleaseStringUTFChars(env, value, value_c); +void JNI_LWJGL_changeRenderer(const char* value_c) { + JNIEnv *env; + (*runtimeJavaVMPtr)->GetEnv(runtimeJavaVMPtr, (void **)&env, JNI_VERSION_1_4); + jstring key = (*env)->NewStringUTF(env, "org.lwjgl.opengl.libname"); + jstring value = (*env)->NewStringUTF(env, value_c); + jclass clazz = (*env)->FindClass(env, "java/lang/System"); + jmethodID method = (*env)->GetStaticMethodID(env, clazz, "setProperty", "(Ljava/lang/String;Ljava/lang/String;)Ljava/lang/String;"); + (*env)->CallStaticObjectMethod(env, clazz, method, key, value); } void pojavTerminate() { @@ -230,10 +229,12 @@ jboolean pojavInit_OpenGL() { config_renderer = RENDERER_VIRGL; setenv("GALLIUM_DRIVER", "virpipe", 1); loadSymbolsVirGL(); - } else if (isAuto || [renderer isEqualToString:@ RENDERER_NAME_GL4ES] || [renderer isEqualToString:@ RENDERER_NAME_MTL_ANGLE]) { + } else if (isAuto || [renderer isEqualToString:@ RENDERER_NAME_GL4ES]) { + config_renderer = RENDERER_MTL_ANGLE; + setenv("POJAV_RENDERER", RENDERER_NAME_GL4ES, 1); + loadSymbols(); + } else if ([renderer isEqualToString:@ RENDERER_NAME_MTL_ANGLE]) { config_renderer = RENDERER_MTL_ANGLE; - setenv("POJAV_RENDERER", RENDERER_NAME_MTL_ANGLE, 1); - setenv("POJAV_RENDERER_AUTO", "1", 1); loadSymbols(); } else if ([renderer hasPrefix:@"libOSMesa"]) { config_renderer = RENDERER_VK_ZINK; @@ -251,12 +252,17 @@ jboolean pojavInit_OpenGL() { } // Pre-load the renderer library + // FIXME: gl4es has to be pre-loaded if it is going to be used later, + // or glCheckFramebufferStatus will return an error void *renderer_handle = dlopen(getenv("POJAV_RENDERER"), RTLD_GLOBAL); debugLog("%s=%p, error=%s", getenv("POJAV_RENDERER"), renderer_handle, dlerror()); - // Set back to gl4es + // Set back to the previous value + setenv("POJAV_RENDERER", renderer.UTF8String, 1); if (isAuto) { - setenv("POJAV_RENDERER", RENDERER_NAME_GL4ES, 1); + JNI_LWJGL_changeRenderer(RENDERER_NAME_GL4ES); + } else { + JNI_LWJGL_changeRenderer(renderer.UTF8String); } debugLog("EGLBridge: Initializing"); @@ -373,12 +379,13 @@ void pojavSetWindowHint(int hint, int value) { NSLog(@"GLFW: Unimplemented API 0x%x", value); abort(); } - } /*else if (getenv("POJAV_RENDERER_AUTO") && hint == GLFW_CONTEXT_VERSION_MAJOR && value >= 3) { - jclass System = env; - setenv("POJAV_RENDERER", RENDERER_NAME_MTL_ANGLE, 1); - NSLog(@"----- Set RENDERER to tinygl4angle -----"); - // setProperty org.lwjgl.opengl.libname - } */ + } else if (strcmp(getenv("POJAV_RENDERER"), "auto")==0 && hint == GLFW_CONTEXT_VERSION_MAJOR && value >= 3) { + // Free unused gl4es library + void *renderer_handle = dlopen(RENDERER_NAME_GL4ES, RTLD_GLOBAL); + dlclose(renderer_handle); + + JNI_LWJGL_changeRenderer(RENDERER_NAME_MTL_ANGLE); + } } int32_t stride;