From f79065b795ae720d3bc05271745d05a8bf8ae4f0 Mon Sep 17 00:00:00 2001 From: Dariusz Komosinski Date: Mon, 26 Oct 2020 11:22:23 +0100 Subject: [PATCH] Handle compositor creation failure and add logging. --- .../Composition/CompositionConnector.cs | 32 +++++++++++++++++++ src/Windows/Avalonia.Win32/Win32GlManager.cs | 10 +++--- 2 files changed, 38 insertions(+), 4 deletions(-) diff --git a/src/Windows/Avalonia.Win32/Composition/CompositionConnector.cs b/src/Windows/Avalonia.Win32/Composition/CompositionConnector.cs index fc18b623bf..5bdc0cd410 100644 --- a/src/Windows/Avalonia.Win32/Composition/CompositionConnector.cs +++ b/src/Windows/Avalonia.Win32/Composition/CompositionConnector.cs @@ -1,5 +1,6 @@ using System; using System.Runtime.InteropServices; +using Avalonia.Logging; using Avalonia.OpenGL; using Avalonia.OpenGL.Angle; using Avalonia.OpenGL.Egl; @@ -43,6 +44,37 @@ namespace Avalonia.Win32 [DllImport("coremessaging.dll", EntryPoint = "CreateDispatcherQueueController", CharSet = CharSet.Unicode)] 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) { EnsureDispatcherQueue(); diff --git a/src/Windows/Avalonia.Win32/Win32GlManager.cs b/src/Windows/Avalonia.Win32/Win32GlManager.cs index 6a6ce2ec3c..4363b5fd29 100644 --- a/src/Windows/Avalonia.Win32/Win32GlManager.cs +++ b/src/Windows/Avalonia.Win32/Win32GlManager.cs @@ -1,3 +1,4 @@ +using System; using Avalonia.OpenGL; using Avalonia.OpenGL.Angle; using Avalonia.OpenGL.Egl; @@ -23,11 +24,12 @@ namespace Avalonia.Win32 var egl = EglPlatformOpenGlInterface.TryCreate(() => new AngleWin32EglDisplay()); if (egl is { } && - opts?.UseWindowsUIComposition == true && - Win32Platform.WindowsVersion.Major >= 10 && - Win32Platform.WindowsVersion.Build >= 16299) + opts?.UseWindowsUIComposition == true) { - AvaloniaLocator.CurrentMutable.BindToSelf(new CompositionConnector(egl)); + var compositionConnector = CompositionConnector.TryCreate(egl); + + if (compositionConnector != null) + AvaloniaLocator.CurrentMutable.BindToSelf(compositionConnector); } return egl;