diff --git a/src/LibRyujinx/Android/Interop.cs b/src/LibRyujinx/Android/Interop.cs index 0b3b58ec5..edbe5bf41 100644 --- a/src/LibRyujinx/Android/Interop.cs +++ b/src/LibRyujinx/Android/Interop.cs @@ -27,7 +27,9 @@ namespace LibRyujinx.Android private static (string name, string descriptor)[] _methods = new[] { ("test", "()V"), - ("updateUiHandler", "(JJJIIIIJJ)V") + ("updateUiHandler", "(JJJIIIIJJ)V"), + ("frameEnded", "()V"), + ("updateProgress", "(JF)V") }; internal static void Initialize(JEnvRef jniEnv) @@ -97,6 +99,21 @@ namespace LibRyujinx.Android CallMethod("test", "()V"); } + public static void FrameEnded(double time) + { + CallMethod("frameEnded", "()V"); + } + + public static void UpdateProgress(string info, float progress) + { + using var infoPtr = new TempNativeString(info); + CallMethod("updateProgress", "(JF)V", new JValue[] + { + JValue.Create(infoPtr.AsBytes()), + JValue.Create(progress.AsBytes()) + }); + } + public static void UpdateUiHandler(string newTitle, string newMessage, string newWatermark, diff --git a/src/LibRyujinx/Android/JniExportedMethods.cs b/src/LibRyujinx/Android/JniExportedMethods.cs index 6cf774255..93d80a47d 100644 --- a/src/LibRyujinx/Android/JniExportedMethods.cs +++ b/src/LibRyujinx/Android/JniExportedMethods.cs @@ -33,12 +33,6 @@ namespace LibRyujinx [DllImport("libryujinxjni")] internal extern static void debug_break(int code); - [DllImport("libryujinxjni")] - internal extern static void onFrameEnd(double time); - - [DllImport("libryujinxjni")] - internal extern static void setProgressInfo(IntPtr info, float progress); - [DllImport("libryujinxjni")] internal extern static void setCurrentTransform(long native_window, int transform); @@ -337,7 +331,7 @@ namespace LibRyujinx SetSwapBuffersCallback(() => { var time = SwitchDevice.EmulationContext.Statistics.GetGameFrameTime(); - onFrameEnd(time); + Interop.FrameEnded(time); }); RunLoop(); } diff --git a/src/LibRyujinx/LibRyujinx.Graphics.cs b/src/LibRyujinx/LibRyujinx.Graphics.cs index a194f2cd8..bfe07713c 100644 --- a/src/LibRyujinx/LibRyujinx.Graphics.cs +++ b/src/LibRyujinx/LibRyujinx.Graphics.cs @@ -1,3 +1,4 @@ +using LibRyujinx.Android; using LibRyujinx.Shared; using OpenTK.Graphics.OpenGL; using Ryujinx.Common.Configuration; @@ -113,7 +114,7 @@ namespace LibRyujinx _isActive = true; - if (Ryujinx.Common.SystemInfo.SystemInfo.IsBionic) + if (Ryujinx.Common.PlatformInfo.IsBionic) { setRenderingThread(); } @@ -164,13 +165,15 @@ namespace LibRyujinx { void SetInfo(string status, float value) { - var ptr = Marshal.StringToHGlobalAnsi(status); - // add setinfo callback - - Marshal.FreeHGlobal(ptr); + if(Ryujinx.Common.PlatformInfo.IsBionic) + { + Interop.UpdateProgress(status, value); + } } var status = $"{current} / {total}"; var progress = current / (float)total; + if (float.IsNaN(progress)) + progress = 0; switch (state) { diff --git a/src/Ryujinx.Common/SystemInfo/SystemInfo.cs b/src/Ryujinx.Common/SystemInfo/SystemInfo.cs index beae178e9..3e641ca7e 100644 --- a/src/Ryujinx.Common/SystemInfo/SystemInfo.cs +++ b/src/Ryujinx.Common/SystemInfo/SystemInfo.cs @@ -4,11 +4,11 @@ namespace Ryujinx.Common.SystemInfo { public class SystemInfo { - public static bool IsBionic { get; set; } + //public static bool IsBionic { get; set; } - public static bool IsAndroid() + /* public static bool IsAnddroid() { - return OperatingSystem.IsAndroid() || IsBionic; - } + // return OperatingSystem.IsAndroid() || IsBionic; + }*/ } } diff --git a/src/Ryujinx.Graphics.Vulkan/Window.cs b/src/Ryujinx.Graphics.Vulkan/Window.cs index 1ee0b29cf..f3485738a 100644 --- a/src/Ryujinx.Graphics.Vulkan/Window.cs +++ b/src/Ryujinx.Graphics.Vulkan/Window.cs @@ -145,7 +145,7 @@ namespace Ryujinx.Graphics.Vulkan ImageUsage = ImageUsageFlags.ColorAttachmentBit | ImageUsageFlags.TransferDstBit | (Ryujinx.Common.PlatformInfo.IsBionic ? 0 : ImageUsageFlags.StorageBit), ImageSharingMode = SharingMode.Exclusive, ImageArrayLayers = 1, - PreTransform = Ryujinx.Common.SystemInfo.SystemInfo.IsAndroid() ? SurfaceTransformFlagsKHR.IdentityBitKhr : capabilities.CurrentTransform, + PreTransform = Ryujinx.Common.PlatformInfo.IsBionic ? SurfaceTransformFlagsKHR.IdentityBitKhr : capabilities.CurrentTransform, CompositeAlpha = ChooseCompositeAlpha(capabilities.SupportedCompositeAlpha), PresentMode = ChooseSwapPresentMode(presentModes, _vsyncEnabled), Clipped = true, diff --git a/src/RyujinxAndroid/app/src/main/cpp/ryujinx.cpp b/src/RyujinxAndroid/app/src/main/cpp/ryujinx.cpp index cb6ef4e0b..6f7fe0c62 100644 --- a/src/RyujinxAndroid/app/src/main/cpp/ryujinx.cpp +++ b/src/RyujinxAndroid/app/src/main/cpp/ryujinx.cpp @@ -25,8 +25,6 @@ JNIEnv *_rendererEnv = nullptr; std::chrono::time_point _currentTimePoint; -std::string progressInfo = ""; -float progress = -1; JNIEnv *getEnv(bool isRenderer) { JNIEnv *env; @@ -160,25 +158,6 @@ Java_org_ryujinx_android_MainActivity_initVm(JNIEnv *env, jobject thiz) { _mainActivityClass = env->GetObjectClass(thiz); } -extern "C" -void onFrameEnd(double time) { - auto env = getEnv(true); - auto cl = env->FindClass("org/ryujinx/android/MainActivity"); - jmethodID frameEnd = env->GetStaticMethodID(cl, "frameEnded", "(J)V"); - - auto now = std::chrono::high_resolution_clock::now(); - auto nano = std::chrono::duration_cast( - now - _currentTimePoint).count(); - env->CallStaticVoidMethod(cl, frameEnd, - nano); -} - -extern "C" -void setProgressInfo(char *info, float progressValue) { - progressInfo = std::string(info); - progress = progressValue; -} - bool isInitialOrientationFlipped = true; extern "C" @@ -299,18 +278,6 @@ Java_org_ryujinx_android_NativeHelpers_setSwapInterval(JNIEnv *env, jobject thiz return nativeWindow->setSwapInterval(nativeWindow, swap_interval); } -extern "C" -JNIEXPORT jfloat JNICALL -Java_org_ryujinx_android_NativeHelpers_getProgressValue(JNIEnv *env, jobject thiz) { - return progress; -} - -extern "C" -JNIEXPORT jstring JNICALL -Java_org_ryujinx_android_NativeHelpers_getProgressInfo(JNIEnv *env, jobject thiz) { - return createStringFromStdString(env, progressInfo); -} - extern "C" JNIEXPORT jstring JNICALL Java_org_ryujinx_android_NativeHelpers_getStringJava(JNIEnv *env, jobject thiz, jlong ptr) { diff --git a/src/RyujinxAndroid/app/src/main/java/org/ryujinx/android/GameHost.kt b/src/RyujinxAndroid/app/src/main/java/org/ryujinx/android/GameHost.kt index 2fa058b3c..444fb1296 100644 --- a/src/RyujinxAndroid/app/src/main/java/org/ryujinx/android/GameHost.kt +++ b/src/RyujinxAndroid/app/src/main/java/org/ryujinx/android/GameHost.kt @@ -38,6 +38,18 @@ class GameHost(context: Context?, private val mainViewModel: MainViewModel) : Su override fun surfaceCreated(holder: SurfaceHolder) { } + fun setProgress(info : String, progressVal: Float) { + showLoading?.apply { + progressValue?.apply { + this.value = progressVal + } + + progress?.apply { + this.value = info + } + } + } + override fun surfaceChanged(holder: SurfaceHolder, format: Int, width: Int, height: Int) { if (_isClosed) return @@ -108,24 +120,9 @@ class GameHost(context: Context?, private val mainViewModel: MainViewModel) : Su while (_isStarted) { RyujinxNative.jnaInstance.inputUpdate() Thread.sleep(1) - - showLoading?.apply { - if (value) { - val value = helper.getProgressValue() - - if (value != -1f) - progress?.apply { - this.value = helper.getProgressInfo() - } - - progressValue?.apply { - this.value = value - } - } - } c++ if (c >= 1000) { - if (helper.getProgressValue() == -1f) + if (progressValue?.value == -1f) progress?.apply { this.value = "Loading ${if (mainViewModel.isMiiEditorLaunched) "Mii Editor" else game!!.titleName}" diff --git a/src/RyujinxAndroid/app/src/main/java/org/ryujinx/android/MainActivity.kt b/src/RyujinxAndroid/app/src/main/java/org/ryujinx/android/MainActivity.kt index 3553de774..c120913c9 100644 --- a/src/RyujinxAndroid/app/src/main/java/org/ryujinx/android/MainActivity.kt +++ b/src/RyujinxAndroid/app/src/main/java/org/ryujinx/android/MainActivity.kt @@ -40,7 +40,7 @@ class MainActivity : BaseActivity() { val performanceMonitor = PerformanceMonitor() @JvmStatic - fun frameEnded(gameTime: Long) { + fun frameEnded() { mainViewModel?.activity?.apply { if (isActive && QuickSettings(this).enablePerformanceMode) { mainViewModel?.performanceManager?.setTurboMode(true) diff --git a/src/RyujinxAndroid/app/src/main/java/org/ryujinx/android/NativeHelpers.kt b/src/RyujinxAndroid/app/src/main/java/org/ryujinx/android/NativeHelpers.kt index 917b9fa3c..f04c0c45a 100644 --- a/src/RyujinxAndroid/app/src/main/java/org/ryujinx/android/NativeHelpers.kt +++ b/src/RyujinxAndroid/app/src/main/java/org/ryujinx/android/NativeHelpers.kt @@ -28,8 +28,6 @@ class NativeHelpers { external fun getMaxSwapInterval(nativeWindow: Long): Int external fun getMinSwapInterval(nativeWindow: Long): Int external fun setSwapInterval(nativeWindow: Long, swapInterval: Int): Int - external fun getProgressInfo(): String - external fun getProgressValue(): Float external fun getStringJava(ptr: Long): String external fun setIsInitialOrientationFlipped(isFlipped: Boolean) } diff --git a/src/RyujinxAndroid/app/src/main/java/org/ryujinx/android/RyujinxNative.kt b/src/RyujinxAndroid/app/src/main/java/org/ryujinx/android/RyujinxNative.kt index 8423451f2..7436d6575 100644 --- a/src/RyujinxAndroid/app/src/main/java/org/ryujinx/android/RyujinxNative.kt +++ b/src/RyujinxAndroid/app/src/main/java/org/ryujinx/android/RyujinxNative.kt @@ -98,6 +98,19 @@ class RyujinxNative { val i = 0 } + @JvmStatic + fun frameEnded() + { + MainActivity.frameEnded() + } + + @JvmStatic + fun updateProgress(infoPtr : Long, progress: Float) + { + val info = NativeHelpers.instance.getStringJava(infoPtr); + MainActivity.mainViewModel?.gameHost?.setProgress(info, progress) + } + @JvmStatic fun updateUiHandler( newTitlePointer: Long,