From b5d73e91bfbbe8949a425f2f5fdc5e7e7cb3dcb0 Mon Sep 17 00:00:00 2001 From: tomikun <60690056+alexytomi@users.noreply.github.com> Date: Sun, 23 Aug 2026 00:03:05 +0800 Subject: [PATCH] def wrong --- .../net/kdt/pojavlaunch/utils/JREUtils.java | 2 +- .../src/main/jni/ctxbridges/egl_loader.c | 10 +++++----- .../src/main/jni/driver_helper/nsbypass.c | 18 ++++++++++++++++-- app_pojavlauncher/src/main/jni/egl_bridge.c | 3 +++ .../src/main/res/values/headings_array.xml | 3 +++ 5 files changed, 28 insertions(+), 8 deletions(-) diff --git a/app_pojavlauncher/src/main/java/net/kdt/pojavlaunch/utils/JREUtils.java b/app_pojavlauncher/src/main/java/net/kdt/pojavlaunch/utils/JREUtils.java index cd75ca582..2be79916d 100644 --- a/app_pojavlauncher/src/main/java/net/kdt/pojavlaunch/utils/JREUtils.java +++ b/app_pojavlauncher/src/main/java/net/kdt/pojavlaunch/utils/JREUtils.java @@ -544,7 +544,7 @@ public class JREUtils { renderLibrary = "libng_gl4es.so"; break; case "vulkan_zink": renderLibrary = "libOSMesa.so"; break; case "opengles_mobileglues": renderLibrary = "libmobileglues.so"; break; - case "opengles3_desktopgl_zink_kopper": renderLibrary = "libglxshim.so"; break; + case "opengles3_desktopgl_zink_kopper": renderLibrary = "libEGL_mesa.so"; break; case "opengles3_ltw" : renderLibrary = "libltw.so"; break; case "opengles_system_gles" : return null; // Literally nothing, this is for system GLES. default: diff --git a/app_pojavlauncher/src/main/jni/ctxbridges/egl_loader.c b/app_pojavlauncher/src/main/jni/ctxbridges/egl_loader.c index 7ccb9d97e..a71d0615c 100644 --- a/app_pojavlauncher/src/main/jni/ctxbridges/egl_loader.c +++ b/app_pojavlauncher/src/main/jni/ctxbridges/egl_loader.c @@ -35,11 +35,11 @@ __eglMustCastToProperFunctionPointerType (*eglGetProcAddress_p) (const char *pro bool dlsym_EGL() { char* gles = getenv("LIBGL_GLES"); char* eglName = (strncmp(gles ? gles : "", "libGLESv2_angle.so", 18) == 0) ? "libEGL_angle.so" : getenv("POJAVEXEC_EGL"); - // Kopper needs this - if (eglName != NULL && strncmp(eglName, "libEGL_mesa.so", 14) == 0) { - void* cutils_handle = loader_dlopen("libcutils.so", "libcutils.so", RTLD_GLOBAL|RTLD_NOW); - if(cutils_handle == NULL) return false; - } +// // Kopper needs this +// if (eglName != NULL && strncmp(eglName, "libEGL_mesa.so", 14) == 0) { +// void* cutils_handle = loader_dlopen("libcutils.so", "libcutils.so", RTLD_GLOBAL|RTLD_NOW); +// if(cutils_handle == NULL) return false; +// } void* dl_handle = loader_dlopen(eglName,"libEGL.so", RTLD_LOCAL|RTLD_LAZY); if(dl_handle == NULL) return false; eglGetProcAddress_p = dlsym(dl_handle, "eglGetProcAddress"); diff --git a/app_pojavlauncher/src/main/jni/driver_helper/nsbypass.c b/app_pojavlauncher/src/main/jni/driver_helper/nsbypass.c index af6c77140..08bcc8ef3 100644 --- a/app_pojavlauncher/src/main/jni/driver_helper/nsbypass.c +++ b/app_pojavlauncher/src/main/jni/driver_helper/nsbypass.c @@ -29,6 +29,7 @@ #define ELF_HALF Elf64_Half #define ELF_XWORD Elf64_Xword #define ELF_DYN Elf64_Dyn +#define ELF_SYM Elf64_Sym //#define ADRENO_POSSIBLE @@ -74,6 +75,9 @@ bool linker_ns_load(const char* lib_search_path) { #ifndef ADRENO_POSSIBLE return false; #else + // Makes bytehook stop being all crashy about hooky + if(driver_namespace != NULL) return true; + loader_dlopen_t loader_dlopen = find_branch_label(&dlopen); // reprotecting the functions removes protection from indirect jumps mprotect(loader_dlopen, page_size, PROT_WRITE | PROT_READ | PROT_EXEC); @@ -127,6 +131,14 @@ void* linker_ns_dlopen(const char* name, int flag) { #endif } + +/** + * @brief Overwrites the first three characters of a soname + * @note IMPORTANT: The supplied soname patch will overwrite the first strlen(sonamePatch) chars of the soname + * @param elfPath Full path to the elf to patch + * @param targetFd FD to use for storing the patched library + * @return True on success + */ bool patch_elf_soname(int patchfd, int realfd, uint16_t patchid) { struct stat realstat; if(fstat(realfd, &realstat)) return false; @@ -139,20 +151,22 @@ bool patch_elf_soname(int patchfd, int realfd, uint16_t patchid) { } close(realfd); - ELF_EHDR *ehdr = (ELF_EHDR*)target; ELF_SHDR *shdr = (ELF_SHDR*)(target + ehdr->e_shoff); + // Iterate over section headers to find the .dynamic section for(ELF_HALF i = 0; i < ehdr->e_shnum; i++) { ELF_SHDR *hdr = &shdr[i]; if(hdr->sh_type == SHT_DYNAMIC) { char* strtab = target + shdr[hdr->sh_link].sh_offset; - // If there's a warning below, it's bogus, ignore it ELF_DYN *dynEntries = (ELF_DYN*)(target + hdr->sh_offset); + + // Iterate over .dynamic entries to find DT_SONAME for(ELF_XWORD k = 0; k < (hdr->sh_size / hdr->sh_entsize);k++) { ELF_DYN* dynEntry = &dynEntries[k]; if(dynEntry->d_tag == DT_SONAME) { char* soname = strtab + dynEntry->d_un.d_val; char sprb[4]; + // Partially replace the old soname with the soname patch snprintf(sprb, 4, "%03x", patchid); memcpy(soname, sprb, 3); munmap(target, realstat.st_size); diff --git a/app_pojavlauncher/src/main/jni/egl_bridge.c b/app_pojavlauncher/src/main/jni/egl_bridge.c index 004113623..60d0be09a 100644 --- a/app_pojavlauncher/src/main/jni/egl_bridge.c +++ b/app_pojavlauncher/src/main/jni/egl_bridge.c @@ -169,6 +169,9 @@ int pojavInitOpenGL() { load_vulkan(); setenv("GALLIUM_DRIVER", "zink", 1); setenv("MESA_ANDROID_NO_KMS_SWRAST", "1", 1); + } else if (!strcmp(renderer, "opengles3_desktopgl_freedreno")) { + setenv("GALLIUM_DRIVER", "freedreno", 1); + setenv("MESA_LOADER_DRIVER_OVERRIDE", "kgsl", 1); } set_gl_bridge_tbl(); } else if (strcmp(renderer, "vulkan_zink") == 0) { diff --git a/app_pojavlauncher/src/main/res/values/headings_array.xml b/app_pojavlauncher/src/main/res/values/headings_array.xml index 1b4f7d801..abbe7c9b8 100644 --- a/app_pojavlauncher/src/main/res/values/headings_array.xml +++ b/app_pojavlauncher/src/main/res/values/headings_array.xml @@ -6,6 +6,7 @@ @string/mcl_setting_renderer_vulkan_kopper_zink @string/mcl_setting_renderer_vulkan_zink @string/mcl_setting_renderer_ltw + @string/mcl_setting_renderer_freedreno @@ -39,6 +40,7 @@ opengles2 opengles_mobileglues + opengles3_desktopgl_freedreno opengles3_desktopgl_zink_kopper vulkan_zink opengles3_ltw @@ -106,4 +108,5 @@ 2 1 + Freedreno (Adreno only, OpenGL 4.6) - (all versions, mid)