Avalonia: Fix OpenGL crashing on Linux (#3902)

* ava: Fix OpenGL crashing on Linux

Fixes a regression from #3901

* Fix formatting
This commit is contained in:
TSRBerry 2022-11-26 12:06:53 +01:00 committed by GitHub
parent 70f2da8fdf
commit 6f0f99ee2b
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
2 changed files with 22 additions and 11 deletions

View file

@ -15,12 +15,12 @@ using static Ryujinx.Ava.Ui.Controls.Win32NativeInterop;
namespace Ryujinx.Ava.Ui.Controls namespace Ryujinx.Ava.Ui.Controls
{ {
public unsafe class EmbeddedWindow : NativeControlHost public class EmbeddedWindow : NativeControlHost
{ {
private WindowProc _wndProcDelegate; private WindowProc _wndProcDelegate;
private string _className; private string _className;
protected GLXWindow X11Window { get; private set; } protected GLXWindow X11Window { get; set; }
protected IntPtr WindowHandle { get; set; } protected IntPtr WindowHandle { get; set; }
protected IntPtr X11Display { get; set; } protected IntPtr X11Display { get; set; }
@ -94,21 +94,17 @@ namespace Ryujinx.Ava.Ui.Controls
} }
[SupportedOSPlatform("linux")] [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; WindowHandle = X11Window.WindowHandle.RawHandle;
X11Display = X11Window.DisplayHandle.RawHandle;
X11Display = X11Window.DisplayHandle.RawHandle;
X11Window.Hide();
return new PlatformHandle(WindowHandle, "X11"); return new PlatformHandle(WindowHandle, "X11");
} }
[SupportedOSPlatform("windows")] [SupportedOSPlatform("windows")]
unsafe IPlatformHandle CreateWin32(IPlatformHandle parent) IPlatformHandle CreateWin32(IPlatformHandle parent)
{ {
_className = "NativeWindow-" + Guid.NewGuid(); _className = "NativeWindow-" + Guid.NewGuid();
_wndProcDelegate = WndProc; _wndProcDelegate = WndProc;
@ -144,7 +140,7 @@ namespace Ryujinx.Ava.Ui.Controls
} }
[SupportedOSPlatform("windows")] [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 point = new Point((long)lParam & 0xFFFF, ((long)lParam >> 16) & 0xFFFF);
var root = VisualRoot as Window; var root = VisualRoot as Window;

View file

@ -1,10 +1,13 @@
using Avalonia.Platform;
using Ryujinx.Ava.Ui.Controls; using Ryujinx.Ava.Ui.Controls;
using Silk.NET.Vulkan; using Silk.NET.Vulkan;
using SPB.Graphics.Vulkan; using SPB.Graphics.Vulkan;
using SPB.Platform.GLX;
using SPB.Platform.Win32; using SPB.Platform.Win32;
using SPB.Platform.X11; using SPB.Platform.X11;
using SPB.Windowing; using SPB.Windowing;
using System; using System;
using System.Runtime.Versioning;
namespace Ryujinx.Ava.Ui namespace Ryujinx.Ava.Ui
{ {
@ -12,6 +15,18 @@ namespace Ryujinx.Ava.Ui
{ {
private NativeWindowBase _window; 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) public SurfaceKHR CreateSurface(Instance instance)
{ {
if (OperatingSystem.IsWindows()) if (OperatingSystem.IsWindows())