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 3 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); }, AngleOptions.PlatformApi.DirectX11);
} }
public static unsafe AngleWin32EglDisplay CreateD3D11Display(Win32AngleEglInterface egl, public static unsafe AngleWin32EglDisplay CreateD3D11Display(Win32AngleEglInterface egl)
bool preferDiscreteAdapter = false)
{ {
var featureLevels = new[] var featureLevels = new[]
{ {
@ -65,7 +64,9 @@ namespace Avalonia.Win32.OpenGl.Angle
using var factory = MicroComRuntime.CreateProxyFor<IDXGIFactory1>(pDxgiFactory, true); using var factory = MicroComRuntime.CreateProxyFor<IDXGIFactory1>(pDxgiFactory, true);
void* pAdapter = null; 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; ushort adapterIndex = 0;
var adapters = new List<(IDXGIAdapter1 adapter, string name)>(); var adapters = new List<(IDXGIAdapter1 adapter, string name)>();
@ -80,9 +81,14 @@ namespace Avalonia.Win32.OpenGl.Angle
if (adapters.Count == 0) if (adapters.Count == 0)
throw new OpenGlException("No adapters found"); throw new OpenGlException("No adapters found");
chosenAdapter = adapters chosenAdapter = adapters
.OrderByDescending(x => x.name.Contains("nvidia") ? 2 : x.name.Contains("amd") ? 1 : 0) .OrderByDescending(x =>
.First().adapter.CloneReference(); // Put adreno in lower priority - it's broken in Avalonia.
x.name.Contains("adreno") ? -1 : 0)
.First().adapter
.CloneReference();
foreach (var a in adapters) foreach (var a in adapters)
a.adapter.Dispose(); a.adapter.Dispose();
} }

Loading…
Cancel
Save