diff --git a/app/src/main/java/com/limelight/Game.java b/app/src/main/java/com/limelight/Game.java index d463baa2..264d4e84 100644 --- a/app/src/main/java/com/limelight/Game.java +++ b/app/src/main/java/com/limelight/Game.java @@ -630,6 +630,7 @@ public class Game extends Activity implements SurfaceHolder.Callback, // On M, we can explicitly set the optimal display mode if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) { Display.Mode bestMode = display.getMode(); + boolean isNativeResolutionStream = PreferenceConfiguration.isNativeResolution(prefConfig.width, prefConfig.height); boolean refreshRateIsGood = isRefreshRateGoodMatch(bestMode.getRefreshRate()); for (Display.Mode candidate : display.getSupportedModes()) { boolean refreshRateReduced = candidate.getRefreshRate() < bestMode.getRefreshRate(); @@ -641,14 +642,15 @@ public class Game extends Activity implements SurfaceHolder.Callback, LimeLog.info("Examining display mode: "+candidate.getPhysicalWidth()+"x"+ candidate.getPhysicalHeight()+"x"+candidate.getRefreshRate()); - if (candidate.getPhysicalWidth() > 4096) { + if (candidate.getPhysicalWidth() > 4096 && prefConfig.width <= 4096) { // Avoid resolutions options above 4K to be safe continue; } // On non-4K streams, we force the resolution to never change unless it's above - // 60 FPS, which may require a resolution reduction due to HDMI bandwidth limitations. - if (prefConfig.width < 3840 && prefConfig.fps <= 60) { + // 60 FPS, which may require a resolution reduction due to HDMI bandwidth limitations, + // or it's a native resolution stream. + if (prefConfig.width < 3840 && prefConfig.fps <= 60 && !isNativeResolutionStream) { if (display.getMode().getPhysicalWidth() != candidate.getPhysicalWidth() || display.getMode().getPhysicalHeight() != candidate.getPhysicalHeight()) { continue; diff --git a/app/src/main/java/com/limelight/preferences/PreferenceConfiguration.java b/app/src/main/java/com/limelight/preferences/PreferenceConfiguration.java index 98dff8f6..87b96ce0 100644 --- a/app/src/main/java/com/limelight/preferences/PreferenceConfiguration.java +++ b/app/src/main/java/com/limelight/preferences/PreferenceConfiguration.java @@ -109,6 +109,30 @@ public class PreferenceConfiguration { public boolean touchscreenTrackpad; public MoonBridge.AudioConfiguration audioConfiguration; + public static boolean isNativeResolution(int width, int height) { + // It's not a native resolution if it matches an existing resolution option + if (width == 640 && height == 360) { + return false; + } + else if (width == 854 && height == 480) { + return false; + } + else if (width == 1280 && height == 720) { + return false; + } + else if (width == 1920 && height == 1080) { + return false; + } + else if (width == 2560 && height == 1440) { + return false; + } + else if (width == 3840 && height == 2160) { + return false; + } + + return true; + } + private static String convertFromLegacyResolutionString(String resString) { if (resString.equalsIgnoreCase("360p")) { return RES_360P; diff --git a/app/src/main/res/values/arrays.xml b/app/src/main/res/values/arrays.xml index 2d0a4697..96c5565b 100644 --- a/app/src/main/res/values/arrays.xml +++ b/app/src/main/res/values/arrays.xml @@ -8,6 +8,8 @@ 1440p 4K + + 640x360 854x480