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 f60ee7e001..7acbefca5e 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 4954c882a4..236a0a1661 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())