static bool TryCreateAndRegisterCore(EglPlatformOpenGlInterface angle, float?backdropCornerRadius) { var tcs = new TaskCompletionSource <bool>(); var pumpLock = new object(); var th = new Thread(() => { WinUICompositorConnection connect; try { NativeWinRTMethods.CreateDispatcherQueueController(new NativeWinRTMethods.DispatcherQueueOptions { apartmentType = NativeWinRTMethods.DISPATCHERQUEUE_THREAD_APARTMENTTYPE.DQTAT_COM_NONE, dwSize = Marshal.SizeOf <NativeWinRTMethods.DispatcherQueueOptions>(), threadType = NativeWinRTMethods.DISPATCHERQUEUE_THREAD_TYPE.DQTYPE_THREAD_CURRENT }); connect = new WinUICompositorConnection(angle, pumpLock, backdropCornerRadius); AvaloniaLocator.CurrentMutable.BindToSelf(connect); AvaloniaLocator.CurrentMutable.Bind <IRenderTimer>().ToConstant(connect); tcs.SetResult(true); } catch (Exception e) { tcs.SetException(e); return; } connect.RunLoop(); }) { IsBackground = true }; th.SetApartmentState(ApartmentState.STA); th.Start(); return(tcs.Task.Result); }
public WinUICompositorConnection(EglPlatformOpenGlInterface gl, object pumpLock) { _gl = gl; _pumpLock = pumpLock; _syncContext = _gl.PrimaryEglContext; _angle = (AngleWin32EglDisplay)_gl.Display; _compositor = NativeWinRTMethods.CreateInstance <ICompositor>("Windows.UI.Composition.Compositor"); _compositor2 = _compositor.QueryInterface <ICompositor2>(); _compositor5 = _compositor.QueryInterface <ICompositor5>(); _compositorInterop = _compositor.QueryInterface <ICompositorInterop>(); _compositorDesktopInterop = _compositor.QueryInterface <ICompositorDesktopInterop>(); using var device = MicroComRuntime.CreateProxyFor <IUnknown>(_angle.GetDirect3DDevice(), true); _device = _compositorInterop.CreateGraphicsDevice(device); _blurBrush = CreateBlurBrush(); }