aboutsummaryrefslogtreecommitdiff
path: root/Ryujinx.Ava/UI/Renderer/EmbeddedWindow.cs
diff options
context:
space:
mode:
Diffstat (limited to 'Ryujinx.Ava/UI/Renderer/EmbeddedWindow.cs')
-rw-r--r--Ryujinx.Ava/UI/Renderer/EmbeddedWindow.cs28
1 files changed, 25 insertions, 3 deletions
diff --git a/Ryujinx.Ava/UI/Renderer/EmbeddedWindow.cs b/Ryujinx.Ava/UI/Renderer/EmbeddedWindow.cs
index 532f4dc2..a5c8b003 100644
--- a/Ryujinx.Ava/UI/Renderer/EmbeddedWindow.cs
+++ b/Ryujinx.Ava/UI/Renderer/EmbeddedWindow.cs
@@ -2,9 +2,9 @@ using Avalonia;
using Avalonia.Controls;
using Avalonia.Input;
using Avalonia.Platform;
-using Ryujinx.Ava.UI.Helpers;
using Ryujinx.Common.Configuration;
using Ryujinx.Ui.Common.Configuration;
+using Ryujinx.Ui.Common.Helper;
using SPB.Graphics;
using SPB.Platform;
using SPB.Platform.GLX;
@@ -30,6 +30,7 @@ namespace Ryujinx.Ava.UI.Renderer
protected IntPtr NsView { get; set; }
protected IntPtr MetalLayer { get; set; }
+ public delegate void UpdateBoundsCallbackDelegate(Rect rect);
private UpdateBoundsCallbackDelegate _updateBoundsCallback;
public event EventHandler<IntPtr> WindowCreated;
@@ -237,8 +238,29 @@ namespace Ryujinx.Ava.UI.Renderer
[SupportedOSPlatform("macos")]
IPlatformHandle CreateMacOS()
{
- MetalLayer = MetalHelper.GetMetalLayer(out IntPtr nsView, out _updateBoundsCallback);
+ // Create a new CAMetalLayer.
+ IntPtr layerClass = ObjectiveC.objc_getClass("CAMetalLayer");
+ IntPtr metalLayer = ObjectiveC.IntPtr_objc_msgSend(layerClass, "alloc");
+ ObjectiveC.objc_msgSend(metalLayer, "init");
+
+ // Create a child NSView to render into.
+ IntPtr nsViewClass = ObjectiveC.objc_getClass("NSView");
+ IntPtr child = ObjectiveC.IntPtr_objc_msgSend(nsViewClass, "alloc");
+ ObjectiveC.objc_msgSend(child, "init", new ObjectiveC.NSRect(0, 0, 0, 0));
+
+ // Make its renderer our metal layer.
+ ObjectiveC.objc_msgSend(child, "setWantsLayer:", 1);
+ ObjectiveC.objc_msgSend(child, "setLayer:", metalLayer);
+ ObjectiveC.objc_msgSend(metalLayer, "setContentsScale:", Program.DesktopScaleFactor);
+
+ // Ensure the scale factor is up to date.
+ _updateBoundsCallback = rect =>
+ {
+ ObjectiveC.objc_msgSend(metalLayer, "setContentsScale:", Program.DesktopScaleFactor);
+ };
+ IntPtr nsView = child;
+ MetalLayer = metalLayer;
NsView = nsView;
return new PlatformHandle(nsView, "NSView");
@@ -260,7 +282,7 @@ namespace Ryujinx.Ava.UI.Renderer
[SupportedOSPlatform("macos")]
void DestroyMacOS()
{
- MetalHelper.DestroyMetalLayer(NsView, MetalLayer);
+ // TODO
}
}
} \ No newline at end of file