diff --git a/app/src/main/java/com/droiddeck/launcher/DriverMenus.kt b/app/src/main/java/com/droiddeck/launcher/DriverMenus.kt index 42a8fb64c..b36041421 100644 --- a/app/src/main/java/com/droiddeck/launcher/DriverMenus.kt +++ b/app/src/main/java/com/droiddeck/launcher/DriverMenus.kt @@ -157,7 +157,7 @@ internal class DriverMenus(private val activity: Activity, private val ui: Handl fun ensureAuto(force: Boolean) { mode = SessionPrefs.gpuDriverMode(activity) if (mode != SessionPrefs.GPU_DRIVERS_AUTO || pairBusy != null || releaseChecking) return - if (gpu.family == GpuInfo.Family.POWERVR) { + if (gpu.family == GpuInfo.Family.POWERVR && !SystemVulkanDriver.isXclipse()) { // Auto owns both choices. Manual imports remain available when Manual is selected. SessionPrefs.ensurePowerVrAutoDrivers(activity) autoStatus = activity.getString(R.string.drivers_powervr_builtin) @@ -211,6 +211,12 @@ internal class DriverMenus(private val activity: Activity, private val ui: Handl when { row?.active == true -> autoStatus = problem?.let { activity.getString(R.string.drivers_up_to_date_check_failed, it) } ?: activity.getString(R.string.upd_current_status) + gpu.family == GpuInfo.Family.POWERVR && (pair == null || !pair.complete) -> { + // RADV is not published right now: the Xclipse falls back to the system route. + SessionPrefs.ensurePowerVrAutoDrivers(activity) + autoStatus = activity.getString(R.string.drivers_powervr_builtin) + refreshDrivers() + } gpu.family.mali && (pair == null || !pair.complete) -> { // No open driver for this Mali published yet: draw through the bridge. useMaliBridge() diff --git a/app/src/main/java/com/droiddeck/launcher/gpu/DriverPairs.kt b/app/src/main/java/com/droiddeck/launcher/gpu/DriverPairs.kt index 9ce267cc6..f5e1da362 100644 --- a/app/src/main/java/com/droiddeck/launcher/gpu/DriverPairs.kt +++ b/app/src/main/java/com/droiddeck/launcher/gpu/DriverPairs.kt @@ -139,9 +139,11 @@ object DriverPairs { * the 710/720/722, and upstream Banners-Turnip for the rest. Null when nothing fits (not Adreno). */ fun recommendedKey(gpu: GpuInfo, pairs: List, sdk: Int = android.os.Build.VERSION.SDK_INT): String? = when (gpu.family) { - // PowerVR and Xclipse keep the system driver (RADV stays a manual choice); a Mali no open - // build covers draws through the Vulkan bridge instead (DriverMenus.ensureAuto). - Family.NOT_ADRENO, Family.POWERVR, Family.MALI_OTHER -> null + // Xclipse takes the RADV pair (testers: it boots to Steam where the system route's GL fails), + // with the system route as its fallback; PowerVR keeps the system driver. A Mali no open + // build covers draws through the Vulkan bridge (DriverMenus.ensureAuto). + Family.POWERVR -> NAD_RADV_XCLIPSE.takeIf { gpu.name.contains("Xclipse", ignoreCase = true) } + Family.NOT_ADRENO, Family.MALI_OTHER -> null Family.MALI_JM, Family.MALI_G610_G710, Family.MALI_G615, Family.MALI_G720, Family.MALI_LATEST -> maliKey(gpu, pairs, sdk) Family.A8XX -> if (gpu.model == 840) newestDdTurnip(pairs) ?: WN_BALANCED else WN_BALANCED Family.A7XX_LOW -> BANNER_710 diff --git a/app/src/main/java/com/droiddeck/launcher/session/SessionPrefs.kt b/app/src/main/java/com/droiddeck/launcher/session/SessionPrefs.kt index 89b97883d..c7354d6d8 100644 --- a/app/src/main/java/com/droiddeck/launcher/session/SessionPrefs.kt +++ b/app/src/main/java/com/droiddeck/launcher/session/SessionPrefs.kt @@ -220,7 +220,11 @@ object SessionPrefs { /** Also called by direct session launches, which may never open the driver settings. */ @JvmStatic - fun ensurePowerVrAutoDrivers(context: Context) = ensurePowerVrAutoDrivers(context, SystemVulkanDriver.isPowerVr()) + fun ensurePowerVrAutoDrivers(context: Context) { + // An open driver pair Auto chose for this GPU (RADV on an Xclipse) is not undone here. + if (com.droiddeck.launcher.core.DeviceSupport.openDriverActive(context)) return + ensurePowerVrAutoDrivers(context, SystemVulkanDriver.isPowerVr()) + } internal fun ensurePowerVrAutoDrivers(context: Context, powerVr: Boolean) { if (!powerVr || gpuDriverMode(context) != GPU_DRIVERS_AUTO) return diff --git a/app/src/test/java/com/droiddeck/launcher/gpu/DriverPairsTest.kt b/app/src/test/java/com/droiddeck/launcher/gpu/DriverPairsTest.kt index 5401fa4cd..ee8d87f38 100644 --- a/app/src/test/java/com/droiddeck/launcher/gpu/DriverPairsTest.kt +++ b/app/src/test/java/com/droiddeck/launcher/gpu/DriverPairsTest.kt @@ -229,4 +229,10 @@ class DriverPairsTest { assertEquals(Family.MALI_LATEST, GpuInfo.familyOf(false, 0, mali = "Mali-G925 (by chip mt6991)")) assertTrue(GpuInfo.maliKbaseCovered("Mali-G720 (by chip mt6989)")) } + + @Test + fun autoTakesRadvOnAnXclipseAndLeavesPowerVrOnTheSystemDriver() { + assertEquals(DriverPairs.NAD_RADV_XCLIPSE, DriverPairs.recommendedKey(GpuInfo("Samsung Xclipse 940", 0, Family.POWERVR, "", false), emptyList())) + assertNull(DriverPairs.recommendedKey(GpuInfo("PowerVR", 0, Family.POWERVR, "", false), emptyList())) + } }