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[]
|
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,
|
||||||
|
@ -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();
|
||||||
}
|
}
|
||||||
|
@ -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)
|
||||||
{
|
{
|
||||||
|
@ -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;
|
||||||
}
|
}*/
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -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,
|
||||||
|
@ -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) {
|
||||||
|
@ -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}"
|
||||||
|
@ -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)
|
||||||
|
@ -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)
|
||||||
}
|
}
|
||||||
|
@ -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,
|
||||||
|
Loading…
x
Reference in New Issue
Block a user