Browse Source

Handle compositor creation failure and add logging.

pull/4936/head
Dariusz Komosinski 6 years ago
parent
commit
f79065b795
  1. 32
      src/Windows/Avalonia.Win32/Composition/CompositionConnector.cs
  2. 10
      src/Windows/Avalonia.Win32/Win32GlManager.cs

32
src/Windows/Avalonia.Win32/Composition/CompositionConnector.cs

@ -1,5 +1,6 @@
using System; using System;
using System.Runtime.InteropServices; using System.Runtime.InteropServices;
using Avalonia.Logging;
using Avalonia.OpenGL; using Avalonia.OpenGL;
using Avalonia.OpenGL.Angle; using Avalonia.OpenGL.Angle;
using Avalonia.OpenGL.Egl; using Avalonia.OpenGL.Egl;
@ -43,6 +44,37 @@ namespace Avalonia.Win32
[DllImport("coremessaging.dll", EntryPoint = "CreateDispatcherQueueController", CharSet = CharSet.Unicode)] [DllImport("coremessaging.dll", EntryPoint = "CreateDispatcherQueueController", CharSet = CharSet.Unicode)]
internal static extern IntPtr CreateDispatcherQueueController(DispatcherQueueOptions options, out IntPtr dispatcherQueueController); internal static extern IntPtr CreateDispatcherQueueController(DispatcherQueueOptions options, out IntPtr dispatcherQueueController);
public static CompositionConnector TryCreate(EglPlatformOpenGlInterface egl)
{
const int majorRequired = 10;
const int buildRequired = 16299;
var majorInstalled = Win32Platform.WindowsVersion.Major;
var buildInstalled = Win32Platform.WindowsVersion.Build;
if (majorInstalled >= majorRequired &&
buildInstalled >= buildRequired)
{
try
{
return new CompositionConnector(egl);
}
catch (Exception e)
{
Logger.TryGet(LogEventLevel.Error, "WinUIComposition")?.Log(null, "Unable to initialize WinUI compositor: {0}", e);
return null;
}
}
var osVersionNotice = $"Windows {majorRequired} Build {buildRequired} is required. Your machine has Windows {majorInstalled} Build {buildInstalled} installed.";
Logger.TryGet(LogEventLevel.Warning, "WinUIComposition")?.Log(null,
$"Unable to initialize WinUI compositor: {osVersionNotice}");
return null;
}
public CompositionConnector(EglPlatformOpenGlInterface egl) public CompositionConnector(EglPlatformOpenGlInterface egl)
{ {
EnsureDispatcherQueue(); EnsureDispatcherQueue();

10
src/Windows/Avalonia.Win32/Win32GlManager.cs

@ -1,3 +1,4 @@
using System;
using Avalonia.OpenGL; using Avalonia.OpenGL;
using Avalonia.OpenGL.Angle; using Avalonia.OpenGL.Angle;
using Avalonia.OpenGL.Egl; using Avalonia.OpenGL.Egl;
@ -23,11 +24,12 @@ namespace Avalonia.Win32
var egl = EglPlatformOpenGlInterface.TryCreate(() => new AngleWin32EglDisplay()); var egl = EglPlatformOpenGlInterface.TryCreate(() => new AngleWin32EglDisplay());
if (egl is { } && if (egl is { } &&
opts?.UseWindowsUIComposition == true && opts?.UseWindowsUIComposition == true)
Win32Platform.WindowsVersion.Major >= 10 &&
Win32Platform.WindowsVersion.Build >= 16299)
{ {
AvaloniaLocator.CurrentMutable.BindToSelf(new CompositionConnector(egl)); var compositionConnector = CompositionConnector.TryCreate(egl);
if (compositionConnector != null)
AvaloniaLocator.CurrentMutable.BindToSelf(compositionConnector);
} }
return egl; return egl;

Loading…
Cancel
Save