diff --git a/JavaApp/src/main/java/net/kdt/pojavlaunch/authenticator/microsoft/Msa.java b/JavaApp/src/main/java/net/kdt/pojavlaunch/authenticator/microsoft/Msa.java index fd8928a4..e7b9c667 100644 --- a/JavaApp/src/main/java/net/kdt/pojavlaunch/authenticator/microsoft/Msa.java +++ b/JavaApp/src/main/java/net/kdt/pojavlaunch/authenticator/microsoft/Msa.java @@ -79,7 +79,7 @@ public class Msa { if(conn.getResponseCode() >= 200 && conn.getResponseCode() < 300) { JSONObject jo = new JSONObject(Tools.read(conn.getInputStream())); msRefreshToken = jo.getString("refresh_token"); - // Log.i("MicroAuth","Acess Token = "+jo.getString("access_token")); + // System.out.println("MicroAuth: Acess Token = "+jo.getString("access_token")); acquireXBLToken(jo.getString("access_token")); }else{ throwResponseError(conn); diff --git a/JavaApp/src/main/java/org/lwjgl/opengl/GL.java b/JavaApp/src/main/java/org/lwjgl/opengl/GL.java index 9af906bf..543ead72 100644 --- a/JavaApp/src/main/java/org/lwjgl/opengl/GL.java +++ b/JavaApp/src/main/java/org/lwjgl/opengl/GL.java @@ -75,7 +75,13 @@ public final class GL { @Nullable private static GLXCapabilities capabilitiesGLX; + private static final boolean isUsingRegal; + static { + isUsingRegal = System.getProperty("org.lwjgl.opengl.libname").contains("libRegal.dylib"); + // if (isUsingRegal) + + Library.loadSystem(System::load, System::loadLibrary, GL.class, "org.lwjgl.opengl", Platform.mapLibraryNameBundled("lwjgl_opengl")); MAX_VERSION = apiParseVersion(Configuration.OPENGL_MAXVERSION); @@ -85,6 +91,8 @@ public final class GL { } } + private static native void nativeRegalMakeCurrent(); + private GL() {} /** Ensures that the lwjgl_opengl shared library has been loaded. */ @@ -174,7 +182,7 @@ public final class GL { private final long glXGetProcAddress; { - long GetProcAddress = library.getFunctionAddress("glXGetProcAddress"); + long GetProcAddress = library.getFunctionAddress(isUsingRegal ? "glGetProcAddressREGAL" : "glXGetProcAddress"); if (GetProcAddress == NULL) { GetProcAddress = library.getFunctionAddress("glXGetProcAddressARB"); } @@ -190,7 +198,7 @@ public final class GL { break; case MACOSX: functionProvider = new SharedLibraryGL(OPENGL) { - private final long gl4es_GetProcAddress = library.getFunctionAddress("gl4es_GetProcAddress"); + private final long gl4es_GetProcAddress = library.getFunctionAddress(isUsingRegal ? "glGetProcAddressREGAL" : "gl4es_GetProcAddress"); @Override long getExtensionAddress(long name) { @@ -334,7 +342,8 @@ public final class GL { public static GLCapabilities createCapabilities() { return createCapabilities(false); } - + private static native long getGraphicsBufferAddr(); + private static native int[] getNativeWidthHeight(); /** * Creates a new {@link GLCapabilities} instance for the OpenGL context that is current in the current thread. * @@ -349,9 +358,6 @@ public final class GL { */ @SuppressWarnings("AssignmentToMethodParameter") public static GLCapabilities createCapabilities(boolean forwardCompatible) { - // This fixed framebuffer issue on 1.13+ 64-bit by another making current - // GLFW.nativeEglMakeCurrent(1); - // System.setProperty("glfwstub.internal.glthreadid", Long.toString(Thread.currentThread().getId())); FunctionProvider functionProvider = GL.functionProvider; @@ -362,6 +368,18 @@ public final class GL { GLCapabilities caps = null; try { + if (System.getenv("RENDERER").startsWith("libgl4es") || isUsingRegal) { + // This fixed framebuffer issue on 1.13+ 64-bit by another making current + GLFW.nativeEglMakeCurrent(GLFW.mainContext); + if (isUsingRegal) { + nativeRegalMakeCurrent(); + GLFW.nativeEglMakeCurrent(GLFW.mainContext); + } + } else if (System.getenv("RENDERER").contains("zink")) { + int[] dims = getNativeWidthHeight(); + callJPI(GLFW.glfwGetCurrentContext(),getGraphicsBufferAddr(),GL_UNSIGNED_BYTE,dims[0],dims[1],functionProvider.getFunctionAddress("OSMesaMakeCurrent")); + } + // We don't have a current ContextCapabilities when this method is called // so we have to use the native bindings directly. long GetError = functionProvider.getFunctionAddress("glGetError"); diff --git a/Makefile b/Makefile index 56d2fca1..4106041a 100644 --- a/Makefile +++ b/Makefile @@ -14,7 +14,7 @@ ifndef RELEASE RELEASE := 0 endif ifeq (1,$(RELEASE)) -CMAKE_BUILD_TYPE := RelWithDebInfo +CMAKE_BUILD_TYPE := Release else CMAKE_BUILD_TYPE := Debug endif diff --git a/Natives/JavaLauncher.m b/Natives/JavaLauncher.m index f8173c4d..b4f29261 100644 --- a/Natives/JavaLauncher.m +++ b/Natives/JavaLauncher.m @@ -143,6 +143,7 @@ int launchJVM(int argc, char *argv[]) { init_loadCustomEnv(); loadPreferences(); + init_migrateToPlist("selected_version", "config_ver.txt"); init_migrateToPlist("java_args", "overrideargs.txt"); @@ -186,6 +187,14 @@ int launchJVM(int argc, char *argv[]) { // Disable overloaded functions hack for Minecraft 1.17+ setenv("LIBGL_NOINTOVLHACK", "1", 1); + // Regal environment variables + setenv("REGAL_GL_VENDOR", "MetalANGLE", 1); + setenv("REGAL_GL_RENDERER", "Regal", 1); + setenv("REGAL_GL_VERSION", "4.5", 1); + setenv("REGAL_LOG_APP", "1", 1); + setenv("REGAL_LOG_DRIVER", "1", 1); + setenv("REGAL_LOG_INTERNAL", "1", 1); + javaHome_pre = getPreference(@"java_home"); javaHome = [javaHome_pre cStringUsingEncoding:NSUTF8StringEncoding]; if ([javaHome_pre length] == 0) { @@ -202,7 +211,7 @@ int launchJVM(int argc, char *argv[]) { } } else { javaHome = calloc(1, 2048); - sprintf((char *)javaHome, "%s/jre8", getenv("BUNDLE_PATH")); + sprintf((char *)javaHome, "%s/jre", homeDir); } setenv("JAVA_HOME", javaHome, 1); debug("[Pre-init] JAVA_HOME environment variable was not set. Defaulting to %s for future use.\n", javaHome); @@ -224,6 +233,57 @@ int launchJVM(int argc, char *argv[]) { } } + // Symlink frameworks -> dylibs on jailed environment + if (!started && strncmp(argv[0], "/Applications", 13)) { + char src[2048], dst[2048]; + mkdir(javaHome, 755); + + // Symlink the skeleton part of JRE + sprintf((char *)src, "%s/jre/lib", getenv("BUNDLE_PATH")); + sprintf((char *)dst, "%s/lib", javaHome); + mkdir(dst, 755); + DIR *d; + struct dirent *dir; + d = opendir(src); + assert(d); + int i = 0; + while ((dir = readdir(d)) != NULL) { + // Skip "." and ".." + if (i < 2) { + i++; + continue; + } else { + sprintf((char *)src, "%s/jre/lib/%s", getenv("BUNDLE_PATH"), dir->d_name); + sprintf((char *)dst, "%s/lib/%s", javaHome, dir->d_name); + symlink(src, dst); + } + } + closedir(d); + + // Symlink dylibs + sprintf((char *)src, "%s/Frameworks", getenv("BUNDLE_PATH")); + d = opendir(src); + assert(d); + i = 0; + while ((dir = readdir(d)) != NULL) { + // Skip "." and ".." + if (i < 2) { + i++; + continue; + } else if (!strncmp(dir->d_name, "lib", 3)) { + assert(strlen(dir->d_name) > 12); + char *dylibName = strdup(dir->d_name); + dylibName[strlen(dylibName) - 11] = '\0'; + sprintf((char *)src, "%s/Frameworks/%s/%s", getenv("BUNDLE_PATH"), dir->d_name, dylibName); + sprintf((char *)dst, "%s/lib/%s", javaHome, dylibName); + symlink(src, dst); + dylibName[strlen(dylibName) - 11] = '.'; + free(dylibName); + } + } + closedir(d); + } + renderer_pre = getPreference(@"renderer"); renderer = [renderer_pre cStringUsingEncoding:NSUTF8StringEncoding]; if ([renderer_pre length] == 0) { @@ -233,7 +293,7 @@ int launchJVM(int argc, char *argv[]) { setenv("RENDERER", renderer, 1); debug("[Pre-init] RENDERER environment variable was not set. Defaulting to %s for future use.\n", renderer); } else { - if(![renderer_pre isEqualToString:@"libgl4es_114.dylib"] && ![renderer_pre isEqualToString:@"libgl4es_115.dylib"]) { + if(![renderer_pre isEqualToString:@"libgl4es_114.dylib"] && ![renderer_pre isEqualToString:@"libgl4es_115.dylib"] && ![renderer_pre isEqualToString:@"libRegal.dylib"]) { debug("[Pre-Init] Failed to locate %s. Restoring default value for RENDERER.", renderer); renderer_pre = @"libgl4es_114.dylib"; setPreference(@"renderer", renderer_pre); diff --git a/Natives/LoginViewController.m b/Natives/LoginViewController.m index a837dcbb..c8b4f099 100644 --- a/Natives/LoginViewController.m +++ b/Natives/LoginViewController.m @@ -454,6 +454,7 @@ void loginAccountInput(UINavigationController *controller, int type, const char* } // List accounts + // TODO: convert to objc DIR *d; struct dirent *dir; char accPath[2048]; diff --git a/Natives/egl_bridge.m b/Natives/egl_bridge.m index 95a85fec..39344559 100644 --- a/Natives/egl_bridge.m +++ b/Natives/egl_bridge.m @@ -33,8 +33,8 @@ struct PotatoBridge potatoBridge; typedef void gl4esInitialize_func(); // typedef void gl4esSwapBuffers_func(); - // gl4esSwapBuffers_func *gl4esSwapBuffers; +typedef jint RegalMakeCurrent_func(EGLContext context); // Called from JNI_OnLoad of liblwjgl_opengl void pojav_openGLOnLoad() { @@ -161,6 +161,14 @@ JNIEXPORT jboolean JNICALL Java_org_lwjgl_glfw_GLFW_nativeEglTerminate(JNIEnv* e return JNI_TRUE; } +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_GL_nativeRegalMakeCurrent(JNIEnv *env, jclass clazz) { + debug("Regal: making current"); + + RegalMakeCurrent_func *RegalMakeCurrent = (RegalMakeCurrent_func *) dlsym(RTLD_DEFAULT, "RegalMakeCurrent"); + assert(RegalMakeCurrent); + RegalMakeCurrent(potatoBridge.eglContext); +} + bool stopMakeCurrent; JNIEXPORT jboolean JNICALL Java_org_lwjgl_glfw_GLFW_nativeEglSwapBuffers(JNIEnv *env, jclass clazz) { jboolean result = (jboolean) eglSwapBuffers(potatoBridge.eglDisplay, eglGetCurrentSurface(EGL_DRAW));