1
0
forked from MeloNX/MeloNX

android - use direct calls for progress update

This commit is contained in:
Emmanuel Hansen 2024-09-09 20:16:06 +00:00
parent e2f584a7ff
commit 5053ead4b3
10 changed files with 59 additions and 70 deletions

View File

@ -27,7 +27,9 @@ namespace LibRyujinx.Android
private static (string name, string descriptor)[] _methods = new[] private static (string name, string descriptor)[] _methods = new[]
{ {
("test", "()V"), ("test", "()V"),
("updateUiHandler", "(JJJIIIIJJ)V") ("updateUiHandler", "(JJJIIIIJJ)V"),
("frameEnded", "()V"),
("updateProgress", "(JF)V")
}; };
internal static void Initialize(JEnvRef jniEnv) internal static void Initialize(JEnvRef jniEnv)
@ -97,6 +99,21 @@ namespace LibRyujinx.Android
CallMethod("test", "()V"); 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, public static void UpdateUiHandler(string newTitle,
string newMessage, string newMessage,
string newWatermark, string newWatermark,

View File

@ -33,12 +33,6 @@ namespace LibRyujinx
[DllImport("libryujinxjni")] [DllImport("libryujinxjni")]
internal extern static void debug_break(int code); 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")] [DllImport("libryujinxjni")]
internal extern static void setCurrentTransform(long native_window, int transform); internal extern static void setCurrentTransform(long native_window, int transform);
@ -337,7 +331,7 @@ namespace LibRyujinx
SetSwapBuffersCallback(() => SetSwapBuffersCallback(() =>
{ {
var time = SwitchDevice.EmulationContext.Statistics.GetGameFrameTime(); var time = SwitchDevice.EmulationContext.Statistics.GetGameFrameTime();
onFrameEnd(time); Interop.FrameEnded(time);
}); });
RunLoop(); RunLoop();
} }

View File

@ -1,3 +1,4 @@
using LibRyujinx.Android;
using LibRyujinx.Shared; using LibRyujinx.Shared;
using OpenTK.Graphics.OpenGL; using OpenTK.Graphics.OpenGL;
using Ryujinx.Common.Configuration; using Ryujinx.Common.Configuration;
@ -113,7 +114,7 @@ namespace LibRyujinx
_isActive = true; _isActive = true;
if (Ryujinx.Common.SystemInfo.SystemInfo.IsBionic) if (Ryujinx.Common.PlatformInfo.IsBionic)
{ {
setRenderingThread(); setRenderingThread();
} }
@ -164,13 +165,15 @@ namespace LibRyujinx
{ {
void SetInfo(string status, float value) void SetInfo(string status, float value)
{ {
var ptr = Marshal.StringToHGlobalAnsi(status); if(Ryujinx.Common.PlatformInfo.IsBionic)
// add setinfo callback {
Interop.UpdateProgress(status, value);
Marshal.FreeHGlobal(ptr); }
} }
var status = $"{current} / {total}"; var status = $"{current} / {total}";
var progress = current / (float)total; var progress = current / (float)total;
if (float.IsNaN(progress))
progress = 0;
switch (state) switch (state)
{ {

View File

@ -4,11 +4,11 @@ namespace Ryujinx.Common.SystemInfo
{ {
public class 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;
} }*/
} }
} }

View File

@ -145,7 +145,7 @@ namespace Ryujinx.Graphics.Vulkan
ImageUsage = ImageUsageFlags.ColorAttachmentBit | ImageUsageFlags.TransferDstBit | (Ryujinx.Common.PlatformInfo.IsBionic ? 0 : ImageUsageFlags.StorageBit), ImageUsage = ImageUsageFlags.ColorAttachmentBit | ImageUsageFlags.TransferDstBit | (Ryujinx.Common.PlatformInfo.IsBionic ? 0 : ImageUsageFlags.StorageBit),
ImageSharingMode = SharingMode.Exclusive, ImageSharingMode = SharingMode.Exclusive,
ImageArrayLayers = 1, 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), CompositeAlpha = ChooseCompositeAlpha(capabilities.SupportedCompositeAlpha),
PresentMode = ChooseSwapPresentMode(presentModes, _vsyncEnabled), PresentMode = ChooseSwapPresentMode(presentModes, _vsyncEnabled),
Clipped = true, Clipped = true,

View File

@ -25,8 +25,6 @@ JNIEnv *_rendererEnv = nullptr;
std::chrono::time_point<std::chrono::steady_clock, std::chrono::nanoseconds> _currentTimePoint; std::chrono::time_point<std::chrono::steady_clock, std::chrono::nanoseconds> _currentTimePoint;
std::string progressInfo = "";
float progress = -1;
JNIEnv *getEnv(bool isRenderer) { JNIEnv *getEnv(bool isRenderer) {
JNIEnv *env; JNIEnv *env;
@ -160,25 +158,6 @@ Java_org_ryujinx_android_MainActivity_initVm(JNIEnv *env, jobject thiz) {
_mainActivityClass = env->GetObjectClass(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<std::chrono::nanoseconds>(
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; bool isInitialOrientationFlipped = true;
extern "C" extern "C"
@ -299,18 +278,6 @@ Java_org_ryujinx_android_NativeHelpers_setSwapInterval(JNIEnv *env, jobject thiz
return nativeWindow->setSwapInterval(nativeWindow, swap_interval); 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" extern "C"
JNIEXPORT jstring JNICALL JNIEXPORT jstring JNICALL
Java_org_ryujinx_android_NativeHelpers_getStringJava(JNIEnv *env, jobject thiz, jlong ptr) { Java_org_ryujinx_android_NativeHelpers_getStringJava(JNIEnv *env, jobject thiz, jlong ptr) {

View File

@ -38,6 +38,18 @@ class GameHost(context: Context?, private val mainViewModel: MainViewModel) : Su
override fun surfaceCreated(holder: SurfaceHolder) { 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) { override fun surfaceChanged(holder: SurfaceHolder, format: Int, width: Int, height: Int) {
if (_isClosed) if (_isClosed)
return return
@ -108,24 +120,9 @@ class GameHost(context: Context?, private val mainViewModel: MainViewModel) : Su
while (_isStarted) { while (_isStarted) {
RyujinxNative.jnaInstance.inputUpdate() RyujinxNative.jnaInstance.inputUpdate()
Thread.sleep(1) 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++ c++
if (c >= 1000) { if (c >= 1000) {
if (helper.getProgressValue() == -1f) if (progressValue?.value == -1f)
progress?.apply { progress?.apply {
this.value = this.value =
"Loading ${if (mainViewModel.isMiiEditorLaunched) "Mii Editor" else game!!.titleName}" "Loading ${if (mainViewModel.isMiiEditorLaunched) "Mii Editor" else game!!.titleName}"

View File

@ -40,7 +40,7 @@ class MainActivity : BaseActivity() {
val performanceMonitor = PerformanceMonitor() val performanceMonitor = PerformanceMonitor()
@JvmStatic @JvmStatic
fun frameEnded(gameTime: Long) { fun frameEnded() {
mainViewModel?.activity?.apply { mainViewModel?.activity?.apply {
if (isActive && QuickSettings(this).enablePerformanceMode) { if (isActive && QuickSettings(this).enablePerformanceMode) {
mainViewModel?.performanceManager?.setTurboMode(true) mainViewModel?.performanceManager?.setTurboMode(true)

View File

@ -28,8 +28,6 @@ class NativeHelpers {
external fun getMaxSwapInterval(nativeWindow: Long): Int external fun getMaxSwapInterval(nativeWindow: Long): Int
external fun getMinSwapInterval(nativeWindow: Long): Int external fun getMinSwapInterval(nativeWindow: Long): Int
external fun setSwapInterval(nativeWindow: Long, swapInterval: Int): 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 getStringJava(ptr: Long): String
external fun setIsInitialOrientationFlipped(isFlipped: Boolean) external fun setIsInitialOrientationFlipped(isFlipped: Boolean)
} }

View File

@ -98,6 +98,19 @@ class RyujinxNative {
val i = 0 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 @JvmStatic
fun updateUiHandler( fun updateUiHandler(
newTitlePointer: Long, newTitlePointer: Long,