Browse Source

simplify composition connection.

pull/4346/head
Dan Walmsley 6 years ago
parent
commit
ae876bd058
  1. 15
      src/Windows/Avalonia.Win32/Composition/CompositionConnector.cs
  2. 4
      src/Windows/Avalonia.Win32/Composition/CompositionEglGlPlatformSurface.cs
  3. 18
      src/Windows/Avalonia.Win32/Win32GlManager.cs
  4. 3
      src/Windows/Avalonia.Win32/Win32Platform.cs
  5. 9
      src/Windows/Avalonia.Win32/WindowImpl.cs

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

@ -39,24 +39,13 @@ 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 Instance { get; } = new CompositionConnector();
private Compositor _compositor; private Compositor _compositor;
private Windows.System.DispatcherQueueController _dispatcherQueueController; private Windows.System.DispatcherQueueController _dispatcherQueueController;
private CompositionGraphicsDevice _graphicsDevice; private CompositionGraphicsDevice _graphicsDevice;
private CompositionConnector() internal CompositionConnector(EglPlatformOpenGlInterface egl)
{ {
var glPlatform = AvaloniaLocator.Current.GetService<IPlatformOpenGlInterface>(); Initialize(egl);
if (glPlatform is EglPlatformOpenGlInterface egl)
{
Initialize(egl);
}
else
{
throw new PlatformNotSupportedException();
}
} }
private void Initialize(EglPlatformOpenGlInterface egl) private void Initialize(EglPlatformOpenGlInterface egl)

4
src/Windows/Avalonia.Win32/Composition/CompositionEglGlPlatformSurface.cs

@ -21,11 +21,11 @@ namespace Avalonia.Win32
_info = info; _info = info;
} }
public IBlurHost AttachToCompositionTree(IntPtr hwnd) public IBlurHost AttachToCompositionTree(CompositionConnector connector, IntPtr hwnd)
{ {
using (_egl.PrimaryContext.MakeCurrent()) using (_egl.PrimaryContext.MakeCurrent())
{ {
_surfaceInterop = CompositionConnector.Instance.InitialiseWindowCompositionTree(hwnd, out _surface, out var blurHost); _surfaceInterop = connector.InitialiseWindowCompositionTree(hwnd, out _surface, out var blurHost);
return blurHost; return blurHost;
} }
} }

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

@ -7,8 +7,6 @@ namespace Avalonia.Win32
{ {
static class Win32GlManager static class Win32GlManager
{ {
private static bool s_attemptedToInitialize;
public static void Initialize() public static void Initialize()
{ {
AvaloniaLocator.CurrentMutable.Bind<IPlatformOpenGlInterface>().ToLazy<IPlatformOpenGlInterface>(() => AvaloniaLocator.CurrentMutable.Bind<IPlatformOpenGlInterface>().ToLazy<IPlatformOpenGlInterface>(() =>
@ -19,9 +17,21 @@ namespace Avalonia.Win32
var wgl = WglPlatformOpenGlInterface.TryCreate(); var wgl = WglPlatformOpenGlInterface.TryCreate();
return wgl; return wgl;
} }
if (opts?.AllowEglInitialization == true) if (opts?.AllowEglInitialization == true)
return EglPlatformOpenGlInterface.TryCreate(() => new AngleWin32EglDisplay()); {
var egl = EglPlatformOpenGlInterface.TryCreate(() => new AngleWin32EglDisplay());
if (egl is { } &&
opts?.UseWindowsUIComposition == true &&
Win32Platform.WindowsVersion.Major >= 10 &&
Win32Platform.WindowsVersion.Build >= 16299)
{
AvaloniaLocator.CurrentMutable.BindToSelf(new CompositionConnector(egl));
}
return egl;
}
return null; return null;
}); });

3
src/Windows/Avalonia.Win32/Win32Platform.cs

@ -12,6 +12,7 @@ using Avalonia.Controls.Platform;
using Avalonia.Input; using Avalonia.Input;
using Avalonia.Input.Platform; using Avalonia.Input.Platform;
using Avalonia.OpenGL; using Avalonia.OpenGL;
using Avalonia.OpenGL.Egl;
using Avalonia.Platform; using Avalonia.Platform;
using Avalonia.Rendering; using Avalonia.Rendering;
using Avalonia.Threading; using Avalonia.Threading;
@ -113,7 +114,7 @@ namespace Avalonia.Win32
.Bind<IMountedVolumeInfoProvider>().ToConstant(new WindowsMountedVolumeInfoProvider()); .Bind<IMountedVolumeInfoProvider>().ToConstant(new WindowsMountedVolumeInfoProvider());
Win32GlManager.Initialize(); Win32GlManager.Initialize();
_uiThread = Thread.CurrentThread; _uiThread = Thread.CurrentThread;
if (OleContext.Current != null) if (OleContext.Current != null)

9
src/Windows/Avalonia.Win32/WindowImpl.cs

@ -107,9 +107,10 @@ namespace Avalonia.Win32
var glPlatform = AvaloniaLocator.Current.GetService<IPlatformOpenGlInterface>(); var glPlatform = AvaloniaLocator.Current.GetService<IPlatformOpenGlInterface>();
_isUsingComposition = Win32Platform.Options.UseWindowsUIComposition && var compositionConnector = AvaloniaLocator.Current.GetService<CompositionConnector>();
Win32Platform.WindowsVersion.Major >= 10 && Win32Platform.WindowsVersion.Build >= 16299 &&
glPlatform != null && glPlatform is EglPlatformOpenGlInterface egl && _isUsingComposition = compositionConnector is { } &&
glPlatform is EglPlatformOpenGlInterface egl &&
egl.Display is AngleWin32EglDisplay angleDisplay && egl.Display is AngleWin32EglDisplay angleDisplay &&
angleDisplay.PlatformApi == AngleOptions.PlatformApi.DirectX11; angleDisplay.PlatformApi == AngleOptions.PlatformApi.DirectX11;
@ -121,7 +122,7 @@ namespace Avalonia.Win32
if (_isUsingComposition) if (_isUsingComposition)
{ {
var cgl = new CompositionEglGlPlatformSurface(glPlatform as EglPlatformOpenGlInterface, this); var cgl = new CompositionEglGlPlatformSurface(glPlatform as EglPlatformOpenGlInterface, this);
_blurHost = cgl.AttachToCompositionTree(_hwnd); _blurHost = cgl.AttachToCompositionTree(compositionConnector, _hwnd);
_gl = cgl; _gl = cgl;

Loading…
Cancel
Save