diff --git a/app_pojavlauncher/src/main/java/net/kdt/pojavlaunch/prefs/LauncherPreferences.java b/app_pojavlauncher/src/main/java/net/kdt/pojavlaunch/prefs/LauncherPreferences.java index 3c4c98f08..17c78538c 100644 --- a/app_pojavlauncher/src/main/java/net/kdt/pojavlaunch/prefs/LauncherPreferences.java +++ b/app_pojavlauncher/src/main/java/net/kdt/pojavlaunch/prefs/LauncherPreferences.java @@ -60,6 +60,7 @@ public class LauncherPreferences { public static boolean PREF_GYRO_INVERT_X = false; public static boolean PREF_GYRO_INVERT_Y = false; + public static boolean PREF_FORCE_VSYNC = false; public static void loadPreferences(Context ctx) { @@ -99,6 +100,7 @@ public class LauncherPreferences { PREF_GYRO_SAMPLE_RATE = DEFAULT_PREF.getInt("gyroSampleRate", 16); PREF_GYRO_INVERT_X = DEFAULT_PREF.getBoolean("gyroInvertX", false); PREF_GYRO_INVERT_Y = DEFAULT_PREF.getBoolean("gyroInvertY", false); + PREF_FORCE_VSYNC = DEFAULT_PREF.getBoolean("force_vsync", false); /* if (PREF_CUSTOM_JAVA_ARGS.isEmpty()) { diff --git a/app_pojavlauncher/src/main/java/net/kdt/pojavlaunch/prefs/screens/LauncherPreferenceVideoFragment.java b/app_pojavlauncher/src/main/java/net/kdt/pojavlaunch/prefs/screens/LauncherPreferenceVideoFragment.java index aa7763f0d..912f6e8e0 100644 --- a/app_pojavlauncher/src/main/java/net/kdt/pojavlaunch/prefs/screens/LauncherPreferenceVideoFragment.java +++ b/app_pojavlauncher/src/main/java/net/kdt/pojavlaunch/prefs/screens/LauncherPreferenceVideoFragment.java @@ -2,14 +2,17 @@ package net.kdt.pojavlaunch.prefs.screens; import static net.kdt.pojavlaunch.prefs.LauncherPreferences.PREF_NOTCH_SIZE; +import android.content.SharedPreferences; import android.os.Build; import android.os.Bundle; import androidx.preference.PreferenceFragmentCompat; import androidx.preference.SwitchPreference; +import androidx.preference.SwitchPreferenceCompat; import net.kdt.pojavlaunch.R; import net.kdt.pojavlaunch.prefs.CustomSeekBarPreference; +import net.kdt.pojavlaunch.prefs.LauncherPreferences; /** * Fragment for any settings video related @@ -34,5 +37,17 @@ public class LauncherPreferenceVideoFragment extends LauncherPreferenceFragment // Sustained performance is only available since Nougat SwitchPreference sustainedPerfSwitch = findPreference("sustainedPerformance"); sustainedPerfSwitch.setVisible(Build.VERSION.SDK_INT >= Build.VERSION_CODES.N); + computeVisibility(); + } + + @Override + public void onSharedPreferenceChanged(SharedPreferences p, String s) { + super.onSharedPreferenceChanged(p, s); + computeVisibility(); + } + + private void computeVisibility(){ + SwitchPreferenceCompat preference = findPreference("force_vsync"); + preference.setVisible(LauncherPreferences.PREF_USE_ALTERNATE_SURFACE); } } diff --git a/app_pojavlauncher/src/main/java/net/kdt/pojavlaunch/utils/JREUtils.java b/app_pojavlauncher/src/main/java/net/kdt/pojavlaunch/utils/JREUtils.java index d4d3ad998..87c9d0ba2 100644 --- a/app_pojavlauncher/src/main/java/net/kdt/pojavlaunch/utils/JREUtils.java +++ b/app_pojavlauncher/src/main/java/net/kdt/pojavlaunch/utils/JREUtils.java @@ -203,6 +203,8 @@ public class JREUtils { // The OPEN GL version is changed according envMap.put("LIBGL_ES", (String) ExtraCore.getValue(ExtraConstants.OPEN_GL_VERSION)); + envMap.put("FORCE_VSYNC", String.valueOf(LauncherPreferences.PREF_FORCE_VSYNC)); + envMap.put("MESA_GLSL_CACHE_DIR", activity.getCacheDir().getAbsolutePath()); if (LOCAL_RENDERER != null) { envMap.put("MESA_GL_VERSION_OVERRIDE", LOCAL_RENDERER.equals("opengles3_virgl")?"4.3":"4.6"); diff --git a/app_pojavlauncher/src/main/jni/ctxbridges/gl_bridge.c b/app_pojavlauncher/src/main/jni/ctxbridges/gl_bridge.c index 6576e2114..c7f722fc4 100644 --- a/app_pojavlauncher/src/main/jni/ctxbridges/gl_bridge.c +++ b/app_pojavlauncher/src/main/jni/ctxbridges/gl_bridge.c @@ -165,5 +165,7 @@ void gl_setup_window() { } void gl_swap_interval(int swapInterval) { + if(pojav_environ->force_vsync) swapInterval = 1; + eglSwapInterval_p(g_EglDisplay, swapInterval); } diff --git a/app_pojavlauncher/src/main/jni/egl_bridge.c b/app_pojavlauncher/src/main/jni/egl_bridge.c index 2d0f980ea..262643c83 100644 --- a/app_pojavlauncher/src/main/jni/egl_bridge.c +++ b/app_pojavlauncher/src/main/jni/egl_bridge.c @@ -732,6 +732,11 @@ int pojavInit() { savedHeight = ANativeWindow_getHeight(pojav_environ->pojavWindow); ANativeWindow_setBuffersGeometry(pojav_environ->pojavWindow,savedWidth,savedHeight,AHARDWAREBUFFER_FORMAT_R8G8B8X8_UNORM); + // Only affects GL4ES as of now + const char *forceVsync = getenv("FORCE_VSYNC"); + if (strcmp(forceVsync, "true") == 0) + pojav_environ->force_vsync = true; + // NOTE: Override for now. const char *renderer = getenv("POJAV_RENDERER"); if (strncmp("opengles3_virgl", renderer, 15) == 0) { diff --git a/app_pojavlauncher/src/main/jni/environ/environ.h b/app_pojavlauncher/src/main/jni/environ/environ.h index b527483a5..3abee0b21 100644 --- a/app_pojavlauncher/src/main/jni/environ/environ.h +++ b/app_pojavlauncher/src/main/jni/environ/environ.h @@ -11,6 +11,7 @@ struct pojav_environ_s { struct ANativeWindow* pojavWindow; render_window_t* mainWindowBundle; int config_renderer; + bool force_vsync; }; extern struct pojav_environ_s *pojav_environ; diff --git a/app_pojavlauncher/src/main/res/values/strings.xml b/app_pojavlauncher/src/main/res/values/strings.xml index 7c3acf380..11845fde9 100644 --- a/app_pojavlauncher/src/main/res/values/strings.xml +++ b/app_pojavlauncher/src/main/res/values/strings.xml @@ -284,6 +284,8 @@ Use things there with consideration, no support. Enable sustained performance mode Limit thermal throttling by limiting peak performance + Force enable vsync + Limit thermal throttling by limiting peak performance Force language to english Allows you to see original strings, as intended by developers. Requires a restart Edit custom controls diff --git a/app_pojavlauncher/src/main/res/xml/pref_video.xml b/app_pojavlauncher/src/main/res/xml/pref_video.xml index 89e037c8b..faaca6621 100644 --- a/app_pojavlauncher/src/main/res/xml/pref_video.xml +++ b/app_pojavlauncher/src/main/res/xml/pref_video.xml @@ -45,5 +45,12 @@ android:summary="@string/mcl_setting_subtitle_use_surface_view" android:title="@string/mcl_setting_title_use_surface_view" /> + + \ No newline at end of file