From 91f695d8600a846060ef56eb0f114e94b3ff90fc Mon Sep 17 00:00:00 2001 From: ShirosakiMio <852468399@qq.com> Date: Thu, 21 Nov 2024 12:27:44 +0800 Subject: [PATCH] Fix[RendererPlugin]: fix Mesa lib not work --- .../com/tungsten/fclauncher/FCLauncher.java | 18 +++++++++++++++--- FCLauncher/src/main/jni/glfw/osmesa_context.c | 6 +++++- .../main/jni/pojav/ctxbridges/osmesa_loader.c | 6 +++++- 3 files changed, 25 insertions(+), 5 deletions(-) diff --git a/FCLauncher/src/main/java/com/tungsten/fclauncher/FCLauncher.java b/FCLauncher/src/main/java/com/tungsten/fclauncher/FCLauncher.java index ab5ea1885..3b401937b 100644 --- a/FCLauncher/src/main/java/com/tungsten/fclauncher/FCLauncher.java +++ b/FCLauncher/src/main/java/com/tungsten/fclauncher/FCLauncher.java @@ -192,13 +192,21 @@ private static void addRendererEnv(FCLConfig config, HashMap env envMap.put("LIBEGL_NAME", RendererPlugin.getSelected().getEglName()); RendererPlugin.getSelected().getBoatEnv().forEach(env -> { String[] split = env.split("="); - envMap.put(split[0], split[1]); + if (split[0].equals("LIB_MESA_NAME")) { + envMap.put(split[0], RendererPlugin.getSelected().getPath() + "/" + split[1]); + } else { + envMap.put(split[0], split[1]); + } }); } else { envMap.put("POJAVEXEC_EGL", RendererPlugin.getSelected().getEglName()); RendererPlugin.getSelected().getPojavEnv().forEach(env -> { String[] split = env.split("="); - envMap.put(split[0], split[1]); + if (split[0].equals("LIB_MESA_NAME")) { + envMap.put(split[0], RendererPlugin.getSelected().getPath() + "/" + split[1]); + } else { + envMap.put(split[0], split[1]); + } }); } return; @@ -315,7 +323,11 @@ private static void setupGraphicAndSoundEngine(FCLConfig config, FCLBridge bridg String nativeDir = config.getContext().getApplicationInfo().nativeLibraryDir; bridge.dlopen(nativeDir + "/libopenal.so"); - bridge.dlopen(nativeDir + "/" + config.getRenderer().getGlLibName()); + if (config.getRenderer() == FCLConfig.Renderer.RENDERER_CUSTOM) { + bridge.dlopen(RendererPlugin.getSelected().getPath() + "/" + RendererPlugin.getSelected().getGlName()); + } else { + bridge.dlopen(nativeDir + "/" + config.getRenderer().getGlLibName()); + } } private static void launch(FCLConfig config, FCLBridge bridge, String task) throws IOException { diff --git a/FCLauncher/src/main/jni/glfw/osmesa_context.c b/FCLauncher/src/main/jni/glfw/osmesa_context.c index 41b1eeaac..b46852576 100644 --- a/FCLauncher/src/main/jni/glfw/osmesa_context.c +++ b/FCLauncher/src/main/jni/glfw/osmesa_context.c @@ -186,7 +186,11 @@ GLFWbool _glfwInitOSMesa(void) if (_glfw.osmesa.handle) return GLFW_TRUE; - _glfw.osmesa.handle = _glfw_dlopen(getenv("LIBGL_NAME")); + char *lib_name = getenv("LIB_MESA_NAME"); + if (!lib_name) { + lib_name = getenv("LIBGL_NAME"); + } + _glfw.osmesa.handle = _glfw_dlopen(lib_name); const char *renderer = getenv("LIBGL_STRING"); diff --git a/FCLauncher/src/main/jni/pojav/ctxbridges/osmesa_loader.c b/FCLauncher/src/main/jni/pojav/ctxbridges/osmesa_loader.c index 917dd3898..b8d303ac8 100644 --- a/FCLauncher/src/main/jni/pojav/ctxbridges/osmesa_loader.c +++ b/FCLauncher/src/main/jni/pojav/ctxbridges/osmesa_loader.c @@ -27,7 +27,11 @@ bool dlsym_OSMesa() { if (pojav_environ->config_renderer == RENDERER_VIRGL) { dl_handle = dlopen("libOSMesa_81.so", RTLD_LOCAL | RTLD_LAZY); } else { - dl_handle = dlopen("libOSMesa_8.so", RTLD_LOCAL | RTLD_LAZY); + char *lib_name = getenv("LIB_MESA_NAME"); + if (!lib_name) { + lib_name = "libOSMesa_8.so"; + } + dl_handle = dlopen(lib_name, RTLD_LOCAL | RTLD_LAZY); } if (dl_handle == NULL) return false; OSMesaGetProcAddress_p = dlsym(dl_handle, "OSMesaGetProcAddress");