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[]
{
("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,

View File

@ -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();
}

View File

@ -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)
{

View File

@ -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;
}*/
}
}

View File

@ -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,

View File

@ -25,8 +25,6 @@ JNIEnv *_rendererEnv = nullptr;
std::chrono::time_point<std::chrono::steady_clock, std::chrono::nanoseconds> _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<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;
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) {

View File

@ -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}"

View File

@ -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)

View File

@ -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)
}

View File

@ -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,