From 6f0f99ee2b844284d00da9ef8533acfd96de08fd Mon Sep 17 00:00:00 2001 From: TSRBerry <20988865+TSRBerry@users.noreply.github.com> Date: Sat, 26 Nov 2022 12:06:53 +0100 Subject: [PATCH] Avalonia: Fix OpenGL crashing on Linux (#3902) * ava: Fix OpenGL crashing on Linux Fixes a regression from #3901 * Fix formatting --- Ryujinx.Ava/Ui/Controls/EmbeddedWindow.cs | 18 +++++++----------- .../Ui/Controls/VulkanEmbeddedWindow.cs | 15 +++++++++++++++ 2 files changed, 22 insertions(+), 11 deletions(-) diff --git a/Ryujinx.Ava/Ui/Controls/EmbeddedWindow.cs b/Ryujinx.Ava/Ui/Controls/EmbeddedWindow.cs index f60ee7e00..7acbefca5 100644 --- a/Ryujinx.Ava/Ui/Controls/EmbeddedWindow.cs +++ b/Ryujinx.Ava/Ui/Controls/EmbeddedWindow.cs @@ -15,12 +15,12 @@ using static Ryujinx.Ava.Ui.Controls.Win32NativeInterop; namespace Ryujinx.Ava.Ui.Controls { - public unsafe class EmbeddedWindow : NativeControlHost + public class EmbeddedWindow : NativeControlHost { private WindowProc _wndProcDelegate; private string _className; - protected GLXWindow X11Window { get; private set; } + protected GLXWindow X11Window { get; set; } protected IntPtr WindowHandle { get; set; } protected IntPtr X11Display { get; set; } @@ -94,21 +94,17 @@ namespace Ryujinx.Ava.Ui.Controls } [SupportedOSPlatform("linux")] - IPlatformHandle CreateLinux(IPlatformHandle parent) + protected virtual IPlatformHandle CreateLinux(IPlatformHandle parent) { - X11Window = new GLXWindow(new NativeHandle(X11.DefaultDisplay), new NativeHandle(parent.Handle)); - + X11Window = PlatformHelper.CreateOpenGLWindow(FramebufferFormat.Default, 0, 0, 100, 100) as GLXWindow; WindowHandle = X11Window.WindowHandle.RawHandle; - - X11Display = X11Window.DisplayHandle.RawHandle; - - X11Window.Hide(); + X11Display = X11Window.DisplayHandle.RawHandle; return new PlatformHandle(WindowHandle, "X11"); } [SupportedOSPlatform("windows")] - unsafe IPlatformHandle CreateWin32(IPlatformHandle parent) + IPlatformHandle CreateWin32(IPlatformHandle parent) { _className = "NativeWindow-" + Guid.NewGuid(); _wndProcDelegate = WndProc; @@ -144,7 +140,7 @@ namespace Ryujinx.Ava.Ui.Controls } [SupportedOSPlatform("windows")] - internal IntPtr WndProc(IntPtr hWnd, WindowsMessages msg, IntPtr wParam, IntPtr lParam) + IntPtr WndProc(IntPtr hWnd, WindowsMessages msg, IntPtr wParam, IntPtr lParam) { var point = new Point((long)lParam & 0xFFFF, ((long)lParam >> 16) & 0xFFFF); var root = VisualRoot as Window; diff --git a/Ryujinx.Ava/Ui/Controls/VulkanEmbeddedWindow.cs b/Ryujinx.Ava/Ui/Controls/VulkanEmbeddedWindow.cs index 4954c882a..236a0a166 100644 --- a/Ryujinx.Ava/Ui/Controls/VulkanEmbeddedWindow.cs +++ b/Ryujinx.Ava/Ui/Controls/VulkanEmbeddedWindow.cs @@ -1,10 +1,13 @@ +using Avalonia.Platform; using Ryujinx.Ava.Ui.Controls; using Silk.NET.Vulkan; using SPB.Graphics.Vulkan; +using SPB.Platform.GLX; using SPB.Platform.Win32; using SPB.Platform.X11; using SPB.Windowing; using System; +using System.Runtime.Versioning; namespace Ryujinx.Ava.Ui { @@ -12,6 +15,18 @@ namespace Ryujinx.Ava.Ui { private NativeWindowBase _window; + [SupportedOSPlatform("linux")] + protected override IPlatformHandle CreateLinux(IPlatformHandle parent) + { + X11Window = new GLXWindow(new NativeHandle(X11.DefaultDisplay), new NativeHandle(parent.Handle)); + WindowHandle = X11Window.WindowHandle.RawHandle; + X11Display = X11Window.DisplayHandle.RawHandle; + + X11Window.Hide(); + + return new PlatformHandle(WindowHandle, "X11"); + } + public SurfaceKHR CreateSurface(Instance instance) { if (OperatingSystem.IsWindows())