forked from MeloNX/MeloNX
add helper to get new surface on android, still crashes when screen resizes
This commit is contained in:
parent
5b9b17ef24
commit
333401b71d
@ -15,12 +15,15 @@ using Ryujinx.Common.Logging.Targets;
|
|||||||
using Silk.NET.Vulkan;
|
using Silk.NET.Vulkan;
|
||||||
using Silk.NET.Vulkan.Extensions.KHR;
|
using Silk.NET.Vulkan.Extensions.KHR;
|
||||||
using LibRyujinx.Shared.Audio.Oboe;
|
using LibRyujinx.Shared.Audio.Oboe;
|
||||||
|
using System.Threading;
|
||||||
|
|
||||||
namespace LibRyujinx
|
namespace LibRyujinx
|
||||||
{
|
{
|
||||||
public static partial class LibRyujinx
|
public static partial class LibRyujinx
|
||||||
{
|
{
|
||||||
|
private static ManualResetEvent _surfaceEvent;
|
||||||
|
private static long _surfacePtr;
|
||||||
|
|
||||||
[DllImport("libryujinxjni")]
|
[DllImport("libryujinxjni")]
|
||||||
private extern static IntPtr getStringPointer(JEnvRef jEnv, JStringLocalRef s);
|
private extern static IntPtr getStringPointer(JEnvRef jEnv, JStringLocalRef s);
|
||||||
|
|
||||||
@ -43,6 +46,8 @@ namespace LibRyujinx
|
|||||||
|
|
||||||
AudioDriver = new OboeHardwareDeviceDriver();
|
AudioDriver = new OboeHardwareDeviceDriver();
|
||||||
|
|
||||||
|
_surfaceEvent = new ManualResetEvent(false);
|
||||||
|
|
||||||
Logger.AddTarget(
|
Logger.AddTarget(
|
||||||
new AsyncLogTargetWrapper(
|
new AsyncLogTargetWrapper(
|
||||||
new AndroidLogTarget("Ryujinx"),
|
new AndroidLogTarget("Ryujinx"),
|
||||||
@ -134,8 +139,16 @@ namespace LibRyujinx
|
|||||||
return (CCharSequence)Encoding.UTF8.GetBytes(s).AsSpan();
|
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")]
|
[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)
|
if (Renderer != null)
|
||||||
{
|
{
|
||||||
@ -171,21 +184,23 @@ namespace LibRyujinx
|
|||||||
|
|
||||||
extensions.Add(GetString(jEnv, ext));
|
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) =>
|
CreateSurface createSurfaceFunc = (IntPtr instance) =>
|
||||||
{
|
{
|
||||||
|
_surfaceEvent.WaitOne();
|
||||||
|
_surfaceEvent.Reset();
|
||||||
|
|
||||||
var api = Vk.GetApi();
|
var api = Vk.GetApi();
|
||||||
if (api.TryGetInstanceExtension(new Instance(instance), out KhrAndroidSurface surfaceExtension))
|
if (api.TryGetInstanceExtension(new Instance(instance), out KhrAndroidSurface surfaceExtension))
|
||||||
{
|
{
|
||||||
var createInfo = new AndroidSurfaceCreateInfoKHR()
|
var createInfo = new AndroidSurfaceCreateInfoKHR()
|
||||||
{
|
{
|
||||||
SType = StructureType.AndroidSurfaceCreateInfoKhr,
|
SType = StructureType.AndroidSurfaceCreateInfoKhr,
|
||||||
Window = (nint*)(long)surfacePtr
|
Window = (nint*)_surfacePtr
|
||||||
};
|
};
|
||||||
|
|
||||||
var result = surfaceExtension.CreateAndroidSurface(new Instance(instance), createInfo, null, out var surface);
|
var result = surfaceExtension.CreateAndroidSurface(new Instance(instance), createInfo, null, out var surface);
|
||||||
|
Loading…
x
Reference in New Issue
Block a user