Beispiel #1
0
        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();
        }