From e759dafa87da7f1d7856fee0917cc066caedf8f3 Mon Sep 17 00:00:00 2001 From: edde746 <86283021+edde746@users.noreply.github.com> Date: Sun, 22 Mar 2026 13:10:03 +0100 Subject: [PATCH] fix: disable impeller on Tensor/NVIDIA GPUs --- .../kotlin/com/edde746/plezy/MainActivity.kt | 31 +++++++++++++++++-- lib/main.dart | 7 ++++- 2 files changed, 35 insertions(+), 3 deletions(-) diff --git a/android/app/src/main/kotlin/com/edde746/plezy/MainActivity.kt b/android/app/src/main/kotlin/com/edde746/plezy/MainActivity.kt index b5c3d5a8..1e645b01 100644 --- a/android/app/src/main/kotlin/com/edde746/plezy/MainActivity.kt +++ b/android/app/src/main/kotlin/com/edde746/plezy/MainActivity.kt @@ -19,6 +19,7 @@ import android.view.inputmethod.InputMethodManager import android.widget.FrameLayout import androidx.core.content.FileProvider import io.flutter.embedding.android.FlutterActivity +import io.flutter.embedding.engine.FlutterShellArgs import io.flutter.embedding.android.FlutterTextureView import io.flutter.embedding.android.RenderMode import io.flutter.embedding.android.TransparencyMode @@ -32,6 +33,10 @@ import java.io.File class MainActivity : FlutterActivity() { + companion object { + var usingSkia = false + } + private val PIP_CHANNEL = "com.plezy/pip" private val EXTERNAL_PLAYER_CHANNEL = "com.plezy/external_player" private val THEME_CHANNEL = "com.plezy/theme" @@ -113,6 +118,25 @@ class MainActivity : FlutterActivity() { } } + override fun getFlutterShellArgs(): FlutterShellArgs { + val args = super.getFlutterShellArgs() + usingSkia = shouldDisableImpeller() + if (usingSkia) args.add("--enable-impeller=false") + return args + } + + private fun shouldDisableImpeller(): Boolean { + // Android TV devices — weaker GPUs, less Impeller testing + if (packageManager.hasSystemFeature("android.software.leanback")) return true + // Google Tensor SoC (Mali GPU) — Pixel 6+ + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.S) { + if (Build.SOC_MODEL.startsWith("Tensor", ignoreCase = true)) return true + } + // NVIDIA Tegra (Shield TV) + if (Build.MANUFACTURER.equals("NVIDIA", ignoreCase = true)) return true + return false + } + override fun getRenderMode(): RenderMode { // Use TextureView so Flutter doesn't occupy a SurfaceView layer. // This allows the libass subtitle SurfaceView to sit between video and Flutter UI. @@ -140,9 +164,11 @@ class MainActivity : FlutterActivity() { lastWidth = w; lastHeight = h pendingResize?.let { handler.removeCallbacks(it) } pendingResize = Runnable { - original.onSurfaceTextureSizeChanged(surface, w, h) + if (flutterTextureView.isAvailable) { + original.onSurfaceTextureSizeChanged(surface, w, h) + } } - handler.post(pendingResize!!) + handler.postDelayed(pendingResize!!, 100) } override fun onSurfaceTextureUpdated(surface: SurfaceTexture) { original.onSurfaceTextureUpdated(surface) @@ -214,6 +240,7 @@ class MainActivity : FlutterActivity() { // Splash screen theme: persist user's chosen theme for next launch (API 31+) MethodChannel(flutterEngine.dartExecutor.binaryMessenger, THEME_CHANNEL).setMethodCallHandler { call, result -> when (call.method) { + "getRenderer" -> result.success(if (usingSkia) "Skia" else "Impeller") "setSplashTheme" -> { val mode = call.argument("mode") diff --git a/lib/main.dart b/lib/main.dart index 97f8920c..8c470d62 100644 --- a/lib/main.dart +++ b/lib/main.dart @@ -3,6 +3,7 @@ import 'package:flutter/foundation.dart'; import 'package:flutter/material.dart'; import 'package:flutter/gestures.dart'; import 'dart:io' show Platform, ProcessInfo; +import 'package:flutter/services.dart'; import 'package:window_manager/window_manager.dart'; import 'package:provider/provider.dart'; import 'package:flutter_svg/flutter_svg.dart'; @@ -152,7 +153,11 @@ Future _bootstrapApp() async { // Log app version and git commit at startup final packageInfo = await PackageInfo.fromPlatform(); final commitSuffix = gitCommit.isNotEmpty ? ' (${gitCommit.substring(0, 7)})' : ''; - appLogger.i('Plezy v${packageInfo.version}+${packageInfo.buildNumber}$commitSuffix'); + String renderer = ''; + if (Platform.isAndroid) { + renderer = ' [${await const MethodChannel('com.plezy/theme').invokeMethod('getRenderer')}]'; + } + appLogger.i('Plezy v${packageInfo.version}+${packageInfo.buildNumber}$commitSuffix$renderer'); // Initialize download storage service with settings await DownloadStorageService.instance.initialize(settings);