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)]
internal static extern IntPtr CreateDispatcherQueueController(DispatcherQueueOptions options, out IntPtr dispatcherQueueController);
public static CompositionConnector Instance { get; } = new CompositionConnector();
private Compositor _compositor;
private Windows.System.DispatcherQueueController _dispatcherQueueController;
private CompositionGraphicsDevice _graphicsDevice;
private CompositionConnector()
internal CompositionConnector(EglPlatformOpenGlInterface egl)
{
var glPlatform = AvaloniaLocator.Current.GetService<IPlatformOpenGlInterface>();
if (glPlatform is EglPlatformOpenGlInterface egl)
{
Initialize(egl);
}
else
{
throw new PlatformNotSupportedException();
}
Initialize(egl);
}
private void Initialize(EglPlatformOpenGlInterface egl)

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

@ -21,11 +21,11 @@ namespace Avalonia.Win32
_info = info;
}
public IBlurHost AttachToCompositionTree(IntPtr hwnd)
public IBlurHost AttachToCompositionTree(CompositionConnector connector, IntPtr hwnd)
{
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;
}
}

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

@ -7,8 +7,6 @@ namespace Avalonia.Win32
{
static class Win32GlManager
{
private static bool s_attemptedToInitialize;
public static void Initialize()
{
AvaloniaLocator.CurrentMutable.Bind<IPlatformOpenGlInterface>().ToLazy<IPlatformOpenGlInterface>(() =>
@ -19,9 +17,21 @@ namespace Avalonia.Win32
var wgl = WglPlatformOpenGlInterface.TryCreate();
return wgl;
}
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;
});

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

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

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

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

Loading…
Cancel
Save