Browse Source

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
pull/13789/head
Max Katz 2 years ago
committed by GitHub
parent
commit
ba5dd3ba05
No known key found for this signature in database GPG Key ID: 4AEE18F83AFDEB23
  1. 16
      src/Windows/Avalonia.Win32/OpenGl/Angle/AngleWin32EglDisplay.cs

16
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();
}

Loading…
Cancel
Save