diff --git a/src/Windows/Avalonia.Win32/OpenGl/Angle/AngleWin32EglDisplay.cs b/src/Windows/Avalonia.Win32/OpenGl/Angle/AngleWin32EglDisplay.cs index 9b23bc9aa8..afee6efd23 100644 --- a/src/Windows/Avalonia.Win32/OpenGl/Angle/AngleWin32EglDisplay.cs +++ b/src/Windows/Avalonia.Win32/OpenGl/Angle/AngleWin32EglDisplay.cs @@ -4,6 +4,7 @@ using System.ComponentModel; using System.Linq; using System.Runtime.CompilerServices; using System.Runtime.InteropServices; +using Avalonia.Logging; using Avalonia.OpenGL; using Avalonia.OpenGL.Angle; using Avalonia.OpenGL.Egl; @@ -95,19 +96,28 @@ namespace Avalonia.Win32.OpenGl.Angle if (adapters.Count == 0) throw new OpenGlException("No adapters found"); - if (applyArmAdrenoBlacklist && adapters.Count > 1) - { - for (var c = adapters.Count - 1; c >= 0; c--) - if (adapters[c].desc.Description?.Contains("adreno") == true) - { - adapters[c].adapter.Dispose(); - adapters.RemoveAt(c); - } - } - + // The Adreno blacklist (see #10405) now only moves the *default* selection away + // from Adreno GPUs - it no longer hides adapters from the selection callback, so + // an application can deliberately opt back into hardware acceleration. var chosenAdapterIndex = 0; if (selectionCallback != null) + { chosenAdapterIndex = selectionCallback(adapters.Select(a => a.desc).ToArray()); + } + else if (applyArmAdrenoBlacklist && adapters.Count > 1) + { + var firstNonAdreno = adapters.FindIndex(a => a.desc.Description?.Contains("adreno") != true); + if (firstNonAdreno > 0) + { + chosenAdapterIndex = firstNonAdreno; + Logger.TryGet(LogEventLevel.Warning, "OpenGL")?.Log(null, + "ARM64 Adreno GPU detected; the Adreno rendering blocklist is forcing a " + + "fallback to '{FallbackAdapter}' (typically a software renderer). Set " + + "Win32PlatformOptions.GraphicsAdapterSelectionCallback to choose an adapter " + + "explicitly, or switch Win32PlatformOptions.RenderingMode to Vulkan or Wgl.", + adapters[firstNonAdreno].desc.Description); + } + } chosenAdapter = adapters[chosenAdapterIndex].adapter.CloneReference();