فهرست منبع

Avoid Adreno DXGI adapter on Win-ARM devices (#13538)

* Avoid adreno DXGI adapter on Win-ARM devices

* Update src/Windows/Avalonia.Win32/OpenGl/Angle/AngleWin32EglDisplay.cs
Max Katz 1 سال پیش
والد
کامیت
ba5dd3ba05
1فایلهای تغییر یافته به همراه11 افزوده شده و 5 حذف شده
  1. 11 5
      src/Windows/Avalonia.Win32/OpenGl/Angle/AngleWin32EglDisplay.cs

+ 11 - 5
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<IDXGIFactory1>(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();
                 }