From 3147060a69237fb58ba639fa1bd7623ffd986f97 Mon Sep 17 00:00:00 2001 From: Lubos Date: Sat, 11 Apr 2026 21:12:01 +0200 Subject: [PATCH 1/2] fix: Meta Quest 3 and newer use system gfx driver --- .../app/gamenative/utils/BestConfigService.kt | 11 ++++++++-- .../com/winlator/core/GPUInformation.java | 21 ++++++++++++++++++- 2 files changed, 29 insertions(+), 3 deletions(-) diff --git a/app/src/main/java/app/gamenative/utils/BestConfigService.kt b/app/src/main/java/app/gamenative/utils/BestConfigService.kt index f294c64299..8e2a5cf45d 100644 --- a/app/src/main/java/app/gamenative/utils/BestConfigService.kt +++ b/app/src/main/java/app/gamenative/utils/BestConfigService.kt @@ -8,6 +8,7 @@ import com.winlator.box86_64.Box86_64PresetManager import com.winlator.container.Container import com.winlator.container.ContainerData import com.winlator.contents.ContentProfile +import com.winlator.core.GPUInformation import com.winlator.fexcore.FEXCorePresetManager import com.winlator.core.KeyValueSet import kotlinx.coroutines.Dispatchers @@ -729,10 +730,16 @@ object BestConfigService { resultMap["graphicsDriver"] = filteredJson.optString("graphicsDriver", "") } if (filteredJson.has("graphicsDriverVersion") && !filteredJson.isNull("graphicsDriverVersion")) { - resultMap["graphicsDriverVersion"] = filteredJson.optString("graphicsDriverVersion", "") + val version = filteredJson.optString("graphicsDriverVersion", "") + if (!version.contains("turnip") || !GPUInformation.isTurnipBlacklisted()) { + resultMap["graphicsDriverVersion"] = version + } } if (filteredJson.has("graphicsDriverConfig") && !filteredJson.isNull("graphicsDriverConfig")) { - resultMap["graphicsDriverConfig"] = filteredJson.optString("graphicsDriverConfig", "") + val config = filteredJson.optString("graphicsDriverConfig", "") + if (!config.contains("turnip") || !GPUInformation.isTurnipBlacklisted()) { + resultMap["graphicsDriverConfig"] = config + } } if (filteredJson.has("dxwrapper") && !filteredJson.isNull("dxwrapper")) { resultMap["dxwrapper"] = filteredJson.optString("dxwrapper", "") diff --git a/app/src/main/java/com/winlator/core/GPUInformation.java b/app/src/main/java/com/winlator/core/GPUInformation.java index 7ee9996d09..43dc01b1ae 100644 --- a/app/src/main/java/com/winlator/core/GPUInformation.java +++ b/app/src/main/java/com/winlator/core/GPUInformation.java @@ -2,6 +2,7 @@ import android.content.Context; import android.opengl.EGL14; +import android.os.Build; import android.util.Log; import androidx.collection.ArrayMap; @@ -97,6 +98,7 @@ private static ArrayMap loadGPUInformation(Context context) { String gpuRenderer = Objects.toString(gl.glGetString(GL10.GL_RENDERER), ""); String gpuVendor = Objects.toString(gl.glGetString(GL10.GL_VENDOR), ""); String gpuVersion = Objects.toString(gl.glGetString(GL10.GL_VERSION), ""); + if (isTurnipBlacklisted()) gpuRenderer += " - " + Build.MANUFACTURER; gpuInfo.put("renderer", gpuRenderer); gpuInfo.put("vendor", gpuVendor); @@ -159,10 +161,27 @@ public static boolean isAdreno8Elite(Context context) { return r.contains("adreno") && r.matches(".*\\b8(3[0-9]|4[0-9]|5[0-9])\\b.*"); } + public static boolean isTurnipBlacklisted() { + if ((Build.MANUFACTURER.compareToIgnoreCase("OCULUS") == 0) || + (Build.MANUFACTURER.compareToIgnoreCase("META") == 0)) { + return switch (Build.PRODUCT) { + //Quest 1 + case "monterey", "vr_monterey" -> false; + //Quest 2, Quest Pro + case "hollywood", "seacliff" -> false; + //Quest 3, Quest 3s + case "eureka", "stinson", "panther" -> true; + //future devices + default -> true; + }; + } + return false; + } + public static boolean isTurnipCapable(Context context) { String r = getRenderer(context).toLowerCase(Locale.ENGLISH); // match “adreno 610…699” or “adreno 710…799” - return r.contains("adreno") && r.matches(".*\\b[67][0-9]{2}\\b.*"); + return r.contains("adreno") && r.matches(".*\\b[67][0-9]{2}\\b.*") && !isTurnipBlacklisted(); } /** From bd0f59827341b128c52608698f8b7f8f39761b9e Mon Sep 17 00:00:00 2001 From: Lubos Date: Sat, 11 Apr 2026 22:36:20 +0200 Subject: [PATCH 2/2] Code review --- .../app/gamenative/utils/BestConfigService.kt | 6 ++--- .../java/com/winlator/core/GPUBlackist.java | 23 +++++++++++++++++++ .../com/winlator/core/GPUInformation.java | 21 ++--------------- 3 files changed, 28 insertions(+), 22 deletions(-) create mode 100644 app/src/main/java/com/winlator/core/GPUBlackist.java diff --git a/app/src/main/java/app/gamenative/utils/BestConfigService.kt b/app/src/main/java/app/gamenative/utils/BestConfigService.kt index 8e2a5cf45d..844f6ad023 100644 --- a/app/src/main/java/app/gamenative/utils/BestConfigService.kt +++ b/app/src/main/java/app/gamenative/utils/BestConfigService.kt @@ -8,7 +8,7 @@ import com.winlator.box86_64.Box86_64PresetManager import com.winlator.container.Container import com.winlator.container.ContainerData import com.winlator.contents.ContentProfile -import com.winlator.core.GPUInformation +import com.winlator.core.GPUBlackist import com.winlator.fexcore.FEXCorePresetManager import com.winlator.core.KeyValueSet import kotlinx.coroutines.Dispatchers @@ -731,13 +731,13 @@ object BestConfigService { } if (filteredJson.has("graphicsDriverVersion") && !filteredJson.isNull("graphicsDriverVersion")) { val version = filteredJson.optString("graphicsDriverVersion", "") - if (!version.contains("turnip") || !GPUInformation.isTurnipBlacklisted()) { + if (!version.contains("turnip", ignoreCase = true) || !GPUBlackist.isTurnipBlacklisted()) { resultMap["graphicsDriverVersion"] = version } } if (filteredJson.has("graphicsDriverConfig") && !filteredJson.isNull("graphicsDriverConfig")) { val config = filteredJson.optString("graphicsDriverConfig", "") - if (!config.contains("turnip") || !GPUInformation.isTurnipBlacklisted()) { + if (!config.contains("turnip", ignoreCase = true) || !GPUBlackist.isTurnipBlacklisted()) { resultMap["graphicsDriverConfig"] = config } } diff --git a/app/src/main/java/com/winlator/core/GPUBlackist.java b/app/src/main/java/com/winlator/core/GPUBlackist.java new file mode 100644 index 0000000000..0b199a91b7 --- /dev/null +++ b/app/src/main/java/com/winlator/core/GPUBlackist.java @@ -0,0 +1,23 @@ +package com.winlator.core; + +import android.os.Build; + +public class GPUBlackist { + + public static boolean isTurnipBlacklisted() { + if ((Build.MANUFACTURER.compareToIgnoreCase("OCULUS") == 0) || + (Build.MANUFACTURER.compareToIgnoreCase("META") == 0)) { + return switch (Build.PRODUCT) { + //Quest 1 + case "monterey", "vr_monterey" -> false; + //Quest 2, Quest Pro + case "hollywood", "seacliff" -> false; + //Quest 3, Quest 3s + case "eureka", "stinson", "panther" -> true; + //future devices + default -> true; + }; + } + return false; + } +} diff --git a/app/src/main/java/com/winlator/core/GPUInformation.java b/app/src/main/java/com/winlator/core/GPUInformation.java index 43dc01b1ae..5fe270ced8 100644 --- a/app/src/main/java/com/winlator/core/GPUInformation.java +++ b/app/src/main/java/com/winlator/core/GPUInformation.java @@ -98,7 +98,7 @@ private static ArrayMap loadGPUInformation(Context context) { String gpuRenderer = Objects.toString(gl.glGetString(GL10.GL_RENDERER), ""); String gpuVendor = Objects.toString(gl.glGetString(GL10.GL_VENDOR), ""); String gpuVersion = Objects.toString(gl.glGetString(GL10.GL_VERSION), ""); - if (isTurnipBlacklisted()) gpuRenderer += " - " + Build.MANUFACTURER; + if (GPUBlackist.isTurnipBlacklisted()) gpuRenderer += " - " + Build.MANUFACTURER; gpuInfo.put("renderer", gpuRenderer); gpuInfo.put("vendor", gpuVendor); @@ -161,27 +161,10 @@ public static boolean isAdreno8Elite(Context context) { return r.contains("adreno") && r.matches(".*\\b8(3[0-9]|4[0-9]|5[0-9])\\b.*"); } - public static boolean isTurnipBlacklisted() { - if ((Build.MANUFACTURER.compareToIgnoreCase("OCULUS") == 0) || - (Build.MANUFACTURER.compareToIgnoreCase("META") == 0)) { - return switch (Build.PRODUCT) { - //Quest 1 - case "monterey", "vr_monterey" -> false; - //Quest 2, Quest Pro - case "hollywood", "seacliff" -> false; - //Quest 3, Quest 3s - case "eureka", "stinson", "panther" -> true; - //future devices - default -> true; - }; - } - return false; - } - public static boolean isTurnipCapable(Context context) { String r = getRenderer(context).toLowerCase(Locale.ENGLISH); // match “adreno 610…699” or “adreno 710…799” - return r.contains("adreno") && r.matches(".*\\b[67][0-9]{2}\\b.*") && !isTurnipBlacklisted(); + return r.contains("adreno") && r.matches(".*\\b[67][0-9]{2}\\b.*") && !GPUBlackist.isTurnipBlacklisted(); } /**