diff --git a/JavaApp/src/main/java/net/kdt/pojavlaunch/PojavLauncher.java b/JavaApp/src/main/java/net/kdt/pojavlaunch/PojavLauncher.java index b9fee726..b3457649 100644 --- a/JavaApp/src/main/java/net/kdt/pojavlaunch/PojavLauncher.java +++ b/JavaApp/src/main/java/net/kdt/pojavlaunch/PojavLauncher.java @@ -70,7 +70,6 @@ public class PojavLauncher { } } - System.setProperty("org.lwjgl.opengl.libname", System.getenv("POJAV_RENDERER")); System.setProperty("org.lwjgl.vulkan.libname", "libMoltenVK.dylib"); Tools.mGLFWWindowWidth = Integer.parseInt(size[0]); diff --git a/Natives/JavaLauncher.m b/Natives/JavaLauncher.m index 028b9739..525d2d5b 100644 --- a/Natives/JavaLauncher.m +++ b/Natives/JavaLauncher.m @@ -24,25 +24,16 @@ static char args_path[2048]; extern char **environ; -static const char* const_progname = "java"; -static const char* const_launcher = "openjdk"; -static const char** const_jargs = NULL; -static const char** const_appclasspath = NULL; -static const jboolean const_javaw = JNI_FALSE; -static const jboolean const_cpwildcard = JNI_TRUE; -static const jint const_ergo_class = 0; // DEFAULT_POLICY - static int margc = -1; static char* margv[1000]; const char *javaHome; -const char *renderer; const char *allocmem; const char *multidir; char *homeDir; -NSString *renderer_pre; +NSString *renderer; NSString *allocmem_pre; NSString *multidir_pre; @@ -152,7 +143,7 @@ int launchJVM(NSString *username, id launchTarget, int width, int height, int mi setPreference(@"java_home", javaHome_pre); NSLog(@"[JavaLauncher] JAVA_HOME environment variable was not set. Default to %@ for future use.\n", javaHome_pre); } */ else { - if (![NSFileManager.defaultManager fileExistsAtPath:javaHome_pre]) { + if (![fm fileExistsAtPath:javaHome_pre]) { javaHome_pre = environmentFailsafes(minVersion); setPreference(@"java_home", javaHome_pre); NSLog(@"[JavaLauncher] Failed to locate %@. Restored default value for JAVA_HOME.", javaHome_pre); @@ -168,17 +159,15 @@ int launchJVM(NSString *username, id launchTarget, int width, int height, int mi javaHome = javaHome_pre.UTF8String; setenv("JAVA_HOME", javaHome, 1); - renderer_pre = getPreference(@"renderer"); - renderer = renderer_pre.UTF8String; - if (renderer_pre.length == 0) { - renderer_pre = @"libgl4es_114.dylib"; - setPreference(@"renderer", renderer_pre); - renderer = [renderer_pre cStringUsingEncoding:NSUTF8StringEncoding]; - regLog("[JavaLauncher] RENDERER environment variable was not set. Defaulting to %s for future use.\n", renderer); + renderer = getPreference(@"renderer"); + if (renderer.length == 0) { + renderer = @"auto"; + setPreference(@"renderer", renderer); + NSLog(@"[JavaLauncher] RENDERER environment variable was not set. Defaulting to %@ for future use.\n", renderer); } else { - regLog("[JavaLauncher] Restored preference: RENDERER is set to %s\n", renderer); + NSLog(@"[JavaLauncher] Restored preference: RENDERER is set to %@\n", renderer); } - setenv("POJAV_RENDERER", renderer, 1); + setenv("POJAV_RENDERER", renderer.UTF8String, 1); allocmem_pre = [getPreference(@"allocated_memory") stringValue]; allocmem = [allocmem_pre cStringUsingEncoding:NSUTF8StringEncoding]; diff --git a/Natives/LauncherMenuViewController.m b/Natives/LauncherMenuViewController.m index 0a3c15f9..5fa2958b 100644 --- a/Natives/LauncherMenuViewController.m +++ b/Natives/LauncherMenuViewController.m @@ -2,6 +2,7 @@ #import "AccountListViewController.h" #import "LauncherMenuViewController.h" #import "LauncherPreferencesViewController.h" +#import "LauncherPreferencesViewController2.h" #import "LauncherViewController.h" #import "UIButton+AFNetworking.h" #import "UIImageView+AFNetworking.h" @@ -20,10 +21,12 @@ // View controllers are put into an array to keep its state self.options = @[ [[LauncherViewController alloc] init], - [[LauncherPreferencesViewController alloc] init] + [[LauncherPreferencesViewController alloc] init], + [[LauncherPreferencesViewController2 alloc] init] ]; self.options[0].title = @"PojavLauncher"; self.options[1].title = @"Preferences"; + self.options[2].title = @"Preferences (v2)"; //@[@"News", @"Development Console", @"Crash logs"]; self.tableView.separatorStyle = UITableViewCellSeparatorStyleNone; @@ -88,7 +91,7 @@ selected.navigationItem.leftItemsSupplementBackButton = true; } - // This button is placed temporarily while migrating to the new UI + // This button is placed temporarily while migrating to the new UI (or just keep here?) self.navigationItem.rightBarButtonItem = [[UIBarButtonItem alloc] initWithTitle:@"❌" style:UIBarButtonItemStyleDone target:self.splitViewController action:@selector(dismissViewController)]; } diff --git a/Natives/LauncherPreferences.m b/Natives/LauncherPreferences.m index de7122cc..1253411e 100644 --- a/Natives/LauncherPreferences.m +++ b/Natives/LauncherPreferences.m @@ -110,7 +110,7 @@ void loadPreferences() { setDefaultValueForPref(prefDict, @"debug_logging", CONFIG_TYPE); setDefaultValueForPref(prefDict, @"arccapes_enable", @YES); setDefaultValueForPref(envPrefDict, @"java_home", @""); - setDefaultValueForPref(envPrefDict, @"renderer", @"libgl4es_114.dylib"); + setDefaultValueForPref(envPrefDict, @"renderer", @"auto"); setDefaultValueForPref(warnPrefDict, @"option_warn", @YES); setDefaultValueForPref(warnPrefDict, @"local_warn", @YES); setDefaultValueForPref(warnPrefDict, @"mem_warn", @YES); diff --git a/Natives/LauncherPreferencesViewController.m b/Natives/LauncherPreferencesViewController.m index 812c1f6f..6eaf8afc 100644 --- a/Natives/LauncherPreferencesViewController.m +++ b/Natives/LauncherPreferencesViewController.m @@ -114,9 +114,10 @@ int tempIndex; CGFloat currY = 8.0; rendererDict = @{ - @"gl4es 1.1.4 - exports OpenGL 2.1": @"libgl4es_114.dylib", - @"tinygl4angle (1.17+) - exports OpenGL 3.2 (Core Profile, limited)": @"libtinygl4angle.dylib", - @"Zink (Mesa 21.0) - exports OpenGL 4.1": @"libOSMesaOverride.dylib" + @"Auto: gl4es or tinygl4angle": @"auto", + @"gl4es 1.1.4 - exports OpenGL 2.1": @ RENDERER_NAME_GL4ES, + @"tinygl4angle (1.17+) - exports OpenGL 3.2 (Core Profile, limited)": @ RENDERER_NAME_MTL_ANGLE, + @"Zink (Mesa 21.0) - exports OpenGL 4.1": @ RENDERER_NAME_VK_ZINK }; scrollView = [[UIScrollView alloc] initWithFrame:self.view.frame]; diff --git a/Natives/egl_bridge.m b/Natives/egl_bridge.m index c2699e6e..efaac1f5 100644 --- a/Natives/egl_bridge.m +++ b/Natives/egl_bridge.m @@ -225,12 +225,15 @@ jboolean pojavInit_OpenGL() { if (config_renderer) return JNI_TRUE; NSString *renderer = @(getenv("POJAV_RENDERER")); + BOOL isAuto = [renderer isEqualToString:@"auto"]; if ([renderer isEqualToString:@"libOSMesa.8.dylib"]) { config_renderer = RENDERER_VIRGL; setenv("GALLIUM_DRIVER", "virpipe", 1); loadSymbolsVirGL(); - } else if ([renderer hasPrefix:@"libgl4es"] || [renderer hasPrefix:@"libtinygl4angle"]) { + } else if (isAuto || [renderer isEqualToString:@ RENDERER_NAME_GL4ES] || [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,6 +254,11 @@ jboolean pojavInit_OpenGL() { void *renderer_handle = dlopen(getenv("POJAV_RENDERER"), RTLD_GLOBAL); debugLog("%s=%p, error=%s", getenv("POJAV_RENDERER"), renderer_handle, dlerror()); + // Set back to gl4es + if (isAuto) { + setenv("POJAV_RENDERER", RENDERER_NAME_GL4ES, 1); + } + debugLog("EGLBridge: Initializing"); // printf("EGLBridge: ANativeWindow pointer = %p\n", potatoBridge.androidWindow); //(*env)->ThrowNew(env,(*env)->FindClass(env,"java/lang/Exception"),"Trace exception"); @@ -351,19 +359,25 @@ jboolean pojavInit_OpenGL() { } void pojavSetWindowHint(int hint, int value) { - if (hint != GLFW_CLIENT_API) return; - switch (value) { - case GLFW_NO_API: - config_renderer = RENDERER_VULKAN; - /* Nothing to do: initialization is handled in Java-side */ - // pojavInit_Vulkan(); - break; - case GLFW_OPENGL_API: - pojavInit_OpenGL(); - break; - default: - NSLog(@"GLFW: Unimplemented API 0x%x", value); - abort(); + if (hint == GLFW_CLIENT_API) { + switch (value) { + case GLFW_NO_API: + config_renderer = RENDERER_VULKAN; + /* Nothing to do: initialization is handled in Java-side */ + // pojavInit_Vulkan(); + break; + case GLFW_OPENGL_API: + pojavInit_OpenGL(); + break; + default: + 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 } } diff --git a/Natives/glfw_keycodes.h b/Natives/glfw_keycodes.h index ef1151fc..6e88a875 100644 --- a/Natives/glfw_keycodes.h +++ b/Natives/glfw_keycodes.h @@ -35,6 +35,8 @@ #define GLFW_NO_API 0 #define GLFW_OPENGL_API 0x30001 +#define GLFW_CONTEXT_VERSION_MAJOR 0x00022002 + /*! @defgroup hat_state Joystick hat states * @brief Joystick hat states. * diff --git a/Natives/utils.h b/Natives/utils.h index 4d385fb4..08c6da1a 100644 --- a/Natives/utils.h +++ b/Natives/utils.h @@ -28,6 +28,10 @@ #define GLFW_FOCUSED 0x00020001 #define GLFW_VISIBLE 0x00020004 +#define RENDERER_NAME_GL4ES "libgl4es_114.dylib" +#define RENDERER_NAME_MTL_ANGLE "libtinygl4angle.dylib" +#define RENDERER_NAME_VK_ZINK "libOSMesaOverride.dylib" + #define SPECIALBTN_KEYBOARD -1 #define SPECIALBTN_TOGGLECTRL -2 #define SPECIALBTN_MOUSEPRI -3