diff --git a/src/Windows/Avalonia.Win32/OpenGl/Angle/AngleWin32EglDisplay.cs b/src/Windows/Avalonia.Win32/OpenGl/Angle/AngleWin32EglDisplay.cs index c1fb757468..892278a60a 100644 --- a/src/Windows/Avalonia.Win32/OpenGl/Angle/AngleWin32EglDisplay.cs +++ b/src/Windows/Avalonia.Win32/OpenGl/Angle/AngleWin32EglDisplay.cs @@ -46,8 +46,7 @@ namespace Avalonia.Win32.OpenGl.Angle }, AngleOptions.PlatformApi.DirectX11); } - public static unsafe AngleWin32EglDisplay CreateD3D11Display(Win32AngleEglInterface egl, - bool preferDiscreteAdapter = false) + public static unsafe AngleWin32EglDisplay CreateD3D11Display(Win32AngleEglInterface egl) { var featureLevels = new[] { @@ -65,7 +64,9 @@ namespace Avalonia.Win32.OpenGl.Angle using var factory = MicroComRuntime.CreateProxyFor(pDxgiFactory, true); void* pAdapter = null; - if (preferDiscreteAdapter) + // As for now, we only need to redefine default adapter only on ARM64 just in case of Adreno GPU. + var redefineDefaultAdapter = RuntimeInformation.ProcessArchitecture == Architecture.Arm64; + if (redefineDefaultAdapter) { ushort adapterIndex = 0; var adapters = new List<(IDXGIAdapter1 adapter, string name)>(); @@ -80,9 +81,14 @@ namespace Avalonia.Win32.OpenGl.Angle if (adapters.Count == 0) throw new OpenGlException("No adapters found"); + chosenAdapter = adapters - .OrderByDescending(x => x.name.Contains("nvidia") ? 2 : x.name.Contains("amd") ? 1 : 0) - .First().adapter.CloneReference(); + .OrderByDescending(x => + // Put adreno in lower priority - it's broken in Avalonia. + x.name.Contains("adreno") ? -1 : 0) + .First().adapter + .CloneReference(); + foreach (var a in adapters) a.adapter.Dispose(); }