forked from MeloNX/MeloNX
android - use direct calls for progress update
This commit is contained in:
parent
e2f584a7ff
commit
5053ead4b3
@ -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,
|
||||
|
@ -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();
|
||||
}
|
||||
|
@ -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)
|
||||
{
|
||||
|
@ -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;
|
||||
}*/
|
||||
}
|
||||
}
|
||||
|
@ -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,
|
||||
|
@ -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) {
|
||||
|
@ -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}"
|
||||
|
@ -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)
|
||||
|
@ -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)
|
||||
}
|
||||
|
@ -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,
|
||||
|
Loading…
x
Reference in New Issue
Block a user