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)