Ejemplo n.º 1
0
            public override IGlPlatformSurfaceRenderingSession BeginDraw()
            {
                var         contextLock = _egl.PrimaryEglContext.EnsureCurrent();
                IUnknown    texture     = null;
                EglSurface  surface     = null;
                IDisposable transaction = null;
                var         success     = false;

                try
                {
                    if (_window?.Item == null)
                    {
                        throw new ObjectDisposedException(GetType().FullName);
                    }

                    var size = _info.Size;
                    transaction = _window.Item.BeginTransaction();
                    _window.Item.ResizeIfNeeded(size);
                    texture = _window.Item.BeginDrawToTexture(out var offset);

                    surface = ((AngleWin32EglDisplay)_egl.Display).WrapDirect3D11Texture(_egl,
                                                                                         texture.GetNativeIntPtr(),
                                                                                         offset.X, offset.Y, size.Width, size.Height);

                    var res = base.BeginDraw(surface, _info, () =>
                    {
                        surface?.Dispose();
                        texture?.Dispose();
                        _window.Item.EndDraw();
                        transaction?.Dispose();
                        contextLock?.Dispose();
                    }, true);
                    success = true;
                    return(res);
                }
                finally
                {
                    if (!success)
                    {
                        surface?.Dispose();
                        texture?.Dispose();
                        transaction?.Dispose();
                        contextLock.Dispose();
                    }
                }
            }