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