Browse Source
[hw_composer]: Add "Respect present interval 0 for unlocked FPS"
Co-authored-by: Zephyron <zephyron@citron-emu.org>
interval-zero
Gamer64
5 months ago
committed by
Caio Oliveira
No known key found for this signature in database
GPG Key ID: 362DA3DC1901E080
7 changed files with
29 additions and
0 deletions
src/android/app/src/main/java/org/yuzu/yuzu_emu/features/settings/model/BooleanSetting.kt
src/android/app/src/main/java/org/yuzu/yuzu_emu/features/settings/model/view/SettingsItem.kt
src/android/app/src/main/java/org/yuzu/yuzu_emu/features/settings/ui/SettingsFragmentPresenter.kt
src/android/app/src/main/res/values/strings.xml
src/common/settings.h
src/core/hle/service/nvnflinger/hardware_composer.cpp
src/qt_common/config/shared_translation.cpp
@ -53,6 +53,7 @@ enum class BooleanSetting(override val key: String) : AbstractBooleanSetting {
SOC_OVERLAY_BACKGROUND ( " soc_overlay_background " ) ,
ENABLE_INPUT_OVERLAY_AUTO_HIDE ( " enable_input_overlay_auto_hide " ) ,
RESPECT_PRESENT_INTERVAL_ZERO ( " respect_present_interval_zero " ) ,
PERF_OVERLAY_BACKGROUND ( " perf_overlay_background " ) ,
SHOW_PERFORMANCE_OVERLAY ( " show_performance_overlay " ) ,
@ -237,6 +237,13 @@ abstract class SettingsItem(
override fun reset ( ) = BooleanSetting . USE_DOCKED_MODE . reset ( )
}
put (
SwitchSetting (
BooleanSetting . RESPECT_PRESENT_INTERVAL_ZERO ,
titleId = R . string . respect_present_interval_zero ,
descriptionId = R . string . respect_present_interval_zero_description
)
)
put (
SwitchSetting (
dockedModeSetting ,
@ -460,6 +460,7 @@ class SettingsFragmentPresenter(
add ( IntSetting . RENDERER_SAMPLE_SHADING_FRACTION . key )
add ( HeaderSetting ( R . string . veil_renderer ) )
add ( BooleanSetting . RESPECT_PRESENT_INTERVAL_ZERO . key )
add ( BooleanSetting . RENDERER_EARLY_RELEASE_FENCES . key )
add ( IntSetting . DMA_ACCURACY . key )
add ( BooleanSetting . BUFFER_REORDER_DISABLE . key )
@ -105,6 +105,8 @@
<string name= "sample_shading_fraction_description" > The intensity of the sample shading pass. Higher values improve quality more but also reduce performance to a greater extent.</string>
<string name= "veil_renderer" > Renderer</string>
<string name= "respect_present_interval_zero" > Respect present interval 0 for unlocked FPS</string>
<string name= "respect_present_interval_zero_description" > When enabled, present interval 0 will be used for games requesting unlocked FPS. This matches console behavior more closely, but may cause higher battery usage and frame pacing issues. When disabled (default), present interval 0 is capped at 120FPS to conserve battery.</string>
<string name= "renderer_early_release_fences" > Release Fences Early</string>
<string name= "renderer_early_release_fences_description" > Helps fix 0 FPS in games like DKCR:HD, Subnautica Below Zero and Ori 2, but may break loading or performance in Unreal Engine games.</string>
<string name= "sync_memory_operations" > Sync Memory Operations</string>
@ -342,6 +342,9 @@ struct Values {
Category : : Renderer } ;
SwitchableSetting < bool > use_asynchronous_gpu_emulation {
linkage , true , " use_asynchronous_gpu_emulation " , Category : : Renderer } ;
SwitchableSetting < bool > respect_present_interval_zero {
linkage , false , " respect_present_interval_zero " , Category : : Renderer } ;
SwitchableSetting < AstcDecodeMode , true > accelerate_astc { linkage ,
# ifdef ANDROID
AstcDecodeMode : : Cpu ,
@ -8,6 +8,8 @@
# include <boost/container/small_vector.hpp>
# include "common/settings.h"
# include "core/hle/service/nvdrv/devices/nvdisp_disp0.h"
# include "core/hle/service/nvnflinger/buffer_item.h"
# include "core/hle/service/nvnflinger/buffer_item_consumer.h"
@ -21,6 +23,14 @@ namespace {
s32 NormalizeSwapInterval ( f32 * out_speed_scale , s32 swap_interval ) {
if ( swap_interval < = 0 ) {
// If swap_interval is 0 and setting enabled, respect it as unlocked FPS
if ( swap_interval = = 0 & & Settings : : values . respect_present_interval_zero . GetValue ( ) ) {
if ( out_speed_scale ) {
* out_speed_scale = 1.0f ;
}
return 0 ;
}
// As an extension, treat nonpositive swap interval as speed multiplier.
if ( out_speed_scale ) {
* out_speed_scale = 2.f * static_cast < f32 > ( 1 - swap_interval ) ;
@ -213,6 +213,11 @@ std::unique_ptr<TranslationMap> InitializeTranslations(QObject* parent)
use_asynchronous_gpu_emulation ,
tr ( " Use asynchronous GPU emulation " ) ,
tr ( " Uses an extra CPU thread for rendering. \n This option should always remain enabled. " ) ) ;
INSERT (
Settings , respect_present_interval_zero , tr ( " Respect present interval 0 for unlocked FPS " ) ,
tr ( " When enabled, present interval 0 will be used for games requesting unlocked FPS. \n "
" This matches console behavior more closely, but may cause higher battery usage and frame pacing issues. \n "
" When disabled (default), present interval 0 is capped at 120FPS to conserve battery. " ) ) ;
INSERT ( Settings ,
nvdec_emulation ,
tr ( " NVDEC emulation: " ) ,