From 333401b71dee6a1179de8d9929ee58cb8b5ba05c Mon Sep 17 00:00:00 2001 From: Emmanuel Hansen Date: Wed, 28 Jun 2023 16:13:31 +0000 Subject: [PATCH] add helper to get new surface on android, still crashes when screen resizes --- src/LibRyujinx/JniExportedMethods.cs | 29 +++++++++++++++++++++------- 1 file changed, 22 insertions(+), 7 deletions(-) diff --git a/src/LibRyujinx/JniExportedMethods.cs b/src/LibRyujinx/JniExportedMethods.cs index cb90f6609..9571a2121 100644 --- a/src/LibRyujinx/JniExportedMethods.cs +++ b/src/LibRyujinx/JniExportedMethods.cs @@ -15,12 +15,15 @@ using Ryujinx.Common.Logging.Targets; using Silk.NET.Vulkan; using Silk.NET.Vulkan.Extensions.KHR; using LibRyujinx.Shared.Audio.Oboe; - +using System.Threading; namespace LibRyujinx { public static partial class LibRyujinx { + private static ManualResetEvent _surfaceEvent; + private static long _surfacePtr; + [DllImport("libryujinxjni")] private extern static IntPtr getStringPointer(JEnvRef jEnv, JStringLocalRef s); @@ -43,6 +46,8 @@ namespace LibRyujinx AudioDriver = new OboeHardwareDeviceDriver(); + _surfaceEvent = new ManualResetEvent(false); + Logger.AddTarget( new AsyncLogTargetWrapper( new AndroidLogTarget("Ryujinx"), @@ -134,8 +139,16 @@ namespace LibRyujinx return (CCharSequence)Encoding.UTF8.GetBytes(s).AsSpan(); } + [UnmanagedCallersOnly(EntryPoint = "Java_org_ryujinx_android_RyujinxNative_graphicsSetSurface")] + public unsafe static void JniSetSurface(JEnvRef jEnv, JObjectLocalRef jObj, JLong surfacePtr) + { + _surfacePtr = surfacePtr; + + _surfaceEvent.Set(); + } + [UnmanagedCallersOnly(EntryPoint = "Java_org_ryujinx_android_RyujinxNative_graphicsInitializeRenderer")] - public unsafe static JBoolean JniInitializeGraphicsRendererNative(JEnvRef jEnv, JObjectLocalRef jObj, JObjectLocalRef nativeInterop, JArrayLocalRef extensionsArray, JLong surfacePtr) + public unsafe static JBoolean JniInitializeGraphicsRendererNative(JEnvRef jEnv, JObjectLocalRef jObj, JArrayLocalRef extensionsArray, JLong surfacePtr) { if (Renderer != null) { @@ -171,21 +184,23 @@ namespace LibRyujinx extensions.Add(GetString(jEnv, ext)); } - var jobject = getObjectClass(jEnv, nativeInterop); - var getSurfacePtr = (nint)getLongField(jEnv, nativeInterop, getFieldId(jEnv, jobject, GetCCharSequence("VkCreateSurface"), GetCCharSequence("J"))); - JavaVMRef javaVM = default; - getJvm(jEnv, ref javaVM); + _surfaceEvent.Set(); + + _surfacePtr = (long)surfacePtr; CreateSurface createSurfaceFunc = (IntPtr instance) => { + _surfaceEvent.WaitOne(); + _surfaceEvent.Reset(); + var api = Vk.GetApi(); if (api.TryGetInstanceExtension(new Instance(instance), out KhrAndroidSurface surfaceExtension)) { var createInfo = new AndroidSurfaceCreateInfoKHR() { SType = StructureType.AndroidSurfaceCreateInfoKhr, - Window = (nint*)(long)surfacePtr + Window = (nint*)_surfacePtr }; var result = surfaceExtension.CreateAndroidSurface(new Instance(instance), createInfo, null, out var surface);