added settings to android (#118)

Signed-off-by: Aleksandr Popovich <alekpopo@pm.me>
Signed-off-by: swurl <swurl@swurl.xyz>
Reviewed-on: #118
Co-authored-by: Aleksandr Popovich <alekpopo@pm.me>
Co-authored-by: swurl <swurl@swurl.xyz>
Co-committed-by: Aleksandr Popovich <alekpopo@pm.me>
This commit is contained in:
swurl 2025-05-21 18:02:34 -04:00
parent b1b6e0064f
commit c79b7f82c8
No known key found for this signature in database
GPG key ID: A5A7629F109C8FD1
38 changed files with 243 additions and 104 deletions

View file

@ -166,6 +166,11 @@ object NativeLibrary {
*/
external fun getPerfStats(): DoubleArray
/**
* Returns the number of shaders being built
*/
external fun getShadersBuilding(): Int
/**
* Returns the current CPU backend.
*/

View file

@ -33,16 +33,18 @@ enum class BooleanSetting(override val key: String) : AbstractBooleanSetting {
TOUCHSCREEN("touchscreen"),
SHOW_THERMAL_OVERLAY("show_thermal_overlay"),
FRAME_INTERPOLATION("frame_interpolation"),
FRAME_SKIPPING("frame_skipping"),
// FRAME_SKIPPING("frame_skipping"),
SHOW_FPS("show_fps"),
SHOW_FRAMETIME("show_frame_time"),
SHOW_SPEED("show_speed"),
SHOW_APP_RAM_USAGE("show_app_ram_usage"),
SHOW_SYSTEM_RAM_USAGE("show_system_ram_usage"),
SHOW_BAT_TEMPERATURE("show_bat_temperature"),
SHOW_SHADERS_BUILDING("show_shaders_building"),
OVERLAY_BACKGROUND("overlay_background"),
DONT_SHOW_EDEN_VEIL_WARNING("dont_show_eden_veil_warning"),
DEBUG_FLUSH_BY_LINE("flush_lines"),
USE_LRU_CACHE("use_lru_cache"),;
external fun isFrameSkippingEnabled(): Boolean
// external fun isFrameSkippingEnabled(): Boolean
external fun isFrameInterpolationEnabled(): Boolean

View file

@ -33,6 +33,7 @@ enum class IntSetting(override val key: String) : AbstractIntSetting {
LOCK_DRAWER("lock_drawer"),
VERTICAL_ALIGNMENT("vertical_alignment"),
PERF_OVERLAY_POSITION("perf_overlay_position"),
MEMORY_LAYOUT("memory_layout_mode"),
FSR_SHARPENING_SLIDER("fsr_sharpening_slider"),
CABINET_APPLET("cabinet_applet_mode"),
CONTROLLER_APPLET("controller_applet_mode"),

View file

@ -34,6 +34,7 @@ object Settings {
const val PREF_FIRST_APP_LAUNCH = "FirstApplicationLaunch"
const val PREF_SHOULD_SHOW_PRE_ALPHA_WARNING = "ShouldShowPreAlphaWarning"
const val PREF_SHOULD_SHOW_PRE_ALPHA_BANNER = "ShouldShowPreAlphaBanner"
const val PREF_MEMORY_WARNING_SHOWN = "MemoryWarningShown"
const val SECTION_STATS_OVERLAY = "Stats Overlay"

View file

@ -52,10 +52,6 @@ abstract class SettingsItem(
val isEditable: Boolean
get() {
if (setting.key == BooleanSetting.FRAME_SKIPPING.key) {
// disabled for now
return false
}
// Can't change docked mode toggle when using handheld mode
if (setting.key == BooleanSetting.USE_DOCKED_MODE.key) {
return NativeInput.getStyleIndex(0) != NpadStyleIndex.Handheld
@ -136,7 +132,7 @@ abstract class SettingsItem(
titleId = R.string.dyna_state,
descriptionId = R.string.dyna_state_description,
min = 0,
max = 2,
max = 3,
)
)
put(
@ -186,6 +182,13 @@ abstract class SettingsItem(
descriptionId = R.string.picture_in_picture_description
)
)
put(
SwitchSetting(
BooleanSetting.DEBUG_FLUSH_BY_LINE,
titleId = R.string.flush_by_line,
descriptionId = R.string.flush_by_line_description
)
)
val dockedModeSetting = object : AbstractBooleanSetting {
override val key = BooleanSetting.USE_DOCKED_MODE.key
@ -216,13 +219,13 @@ abstract class SettingsItem(
)
)
put(
SwitchSetting(
BooleanSetting.FRAME_SKIPPING,
titleId = R.string.frame_skipping,
descriptionId = R.string.frame_skipping_description
)
)
// put(
// SwitchSetting(
// BooleanSetting.FRAME_SKIPPING,
// titleId = R.string.frame_skipping,
// descriptionId = R.string.frame_skipping_description
// )
// )
put(
SwitchSetting(
@ -231,6 +234,15 @@ abstract class SettingsItem(
descriptionId = R.string.use_docked_mode_description
)
)
put(
SingleChoiceSetting(
IntSetting.MEMORY_LAYOUT,
titleId = R.string.memory_layout,
descriptionId = R.string.memory_layout_description,
choicesId = R.array.memoryNames,
valuesId = R.array.memoryValues
)
)
put(
SwitchSetting(
BooleanSetting.CORE_SYNC_CORE_SPEED,
@ -362,13 +374,6 @@ abstract class SettingsItem(
descriptionId = R.string.show_frametime_description
)
)
put(
SwitchSetting(
BooleanSetting.SHOW_SPEED,
R.string.show_speed,
descriptionId = R.string.show_speed_description
)
)
put(
SwitchSetting(
BooleanSetting.SHOW_APP_RAM_USAGE,
@ -390,6 +395,13 @@ abstract class SettingsItem(
descriptionId = R.string.show_bat_temperature_description
)
)
put(
SwitchSetting(
BooleanSetting.SHOW_SHADERS_BUILDING,
R.string.show_shaders_building,
descriptionId = R.string.show_shaders_building_description
)
)
put(
SingleChoiceSetting(
IntSetting.RENDERER_VSYNC,

View file

@ -8,6 +8,7 @@ import android.os.Bundle
import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup
import androidx.core.content.edit
import androidx.core.view.ViewCompat
import androidx.core.view.WindowInsetsCompat
import androidx.core.view.updatePadding
@ -15,15 +16,17 @@ import androidx.fragment.app.Fragment
import androidx.fragment.app.activityViewModels
import androidx.navigation.findNavController
import androidx.navigation.fragment.navArgs
import androidx.preference.PreferenceManager
import androidx.recyclerview.widget.LinearLayoutManager
import com.google.android.material.transition.MaterialSharedAxis
import org.yuzu.yuzu_emu.R
import org.yuzu.yuzu_emu.databinding.FragmentSettingsBinding
import org.yuzu.yuzu_emu.features.input.NativeInput
import org.yuzu.yuzu_emu.features.settings.model.BooleanSetting
import org.yuzu.yuzu_emu.features.settings.model.Settings
import org.yuzu.yuzu_emu.fragments.MessageDialogFragment
import org.yuzu.yuzu_emu.utils.ViewUtils.updateMargins
import org.yuzu.yuzu_emu.utils.collect
import org.yuzu.yuzu_emu.utils.*
class SettingsFragment : Fragment() {
private lateinit var presenter: SettingsFragmentPresenter
@ -66,7 +69,8 @@ class SettingsFragment : Fragment() {
presenter = SettingsFragmentPresenter(
settingsViewModel,
settingsAdapter!!,
args.menuTag
args.menuTag,
activity
)
binding.toolbarSettingsLayout.title = if (args.menuTag == Settings.MenuTag.SECTION_ROOT &&
@ -86,6 +90,7 @@ class SettingsFragment : Fragment() {
else -> getString(args.menuTag.titleId)
}
}
binding.listSettings.apply {
adapter = settingsAdapter
layoutManager = LinearLayoutManager(requireContext())

View file

@ -4,6 +4,8 @@
package org.yuzu.yuzu_emu.features.settings.ui
import android.annotation.SuppressLint
import android.app.Activity
import android.app.AlertDialog
import android.os.Build
import android.widget.Toast
import androidx.preference.PreferenceManager
@ -29,11 +31,14 @@ import org.yuzu.yuzu_emu.features.settings.model.view.*
import org.yuzu.yuzu_emu.utils.InputHandler
import org.yuzu.yuzu_emu.utils.NativeConfig
import androidx.core.content.edit
import androidx.fragment.app.FragmentActivity
import org.yuzu.yuzu_emu.fragments.MessageDialogFragment
class SettingsFragmentPresenter(
private val settingsViewModel: SettingsViewModel,
private val adapter: SettingsAdapter,
private var menuTag: MenuTag
private var menuTag: MenuTag,
private var activity: FragmentActivity?
) {
private var settingsList = ArrayList<SettingsItem>()
@ -66,7 +71,7 @@ class SettingsFragmentPresenter(
}
// Allows you to show/hide abstract settings based on the paired setting key
fun ArrayList<SettingsItem>.addAbstract(item: SettingsItem) {
private fun ArrayList<SettingsItem>.addAbstract(item: SettingsItem) {
val pairedSettingKey = item.setting.pairedSettingKey
if (pairedSettingKey.isNotEmpty()) {
val pairedSettingsItem =
@ -78,6 +83,9 @@ class SettingsFragmentPresenter(
}
fun onViewCreated() {
if (menuTag == MenuTag.SECTION_EDEN_VEIL) {
showEdenVeilWarningDialog()
}
loadSettingsList()
}
@ -224,10 +232,10 @@ class SettingsFragmentPresenter(
add(HeaderSetting(R.string.stats_overlay_items))
add(BooleanSetting.SHOW_FPS.key)
add(BooleanSetting.SHOW_FRAMETIME.key)
add(BooleanSetting.SHOW_SPEED.key)
add(BooleanSetting.SHOW_APP_RAM_USAGE.key)
add(BooleanSetting.SHOW_SYSTEM_RAM_USAGE.key)
add(BooleanSetting.SHOW_BAT_TEMPERATURE.key)
add(BooleanSetting.SHOW_SHADERS_BUILDING.key)
}
}
@ -387,24 +395,25 @@ class SettingsFragmentPresenter(
// TODO(alekpop): sort these into headers.
private fun addEdenVeilSettings(sl: ArrayList<SettingsItem>) {
sl.apply {
add(BooleanSetting.FRAME_INTERPOLATION.key)
add(BooleanSetting.FRAME_SKIPPING.key)
add(BooleanSetting.USE_LRU_CACHE.key)
add(BooleanSetting.RENDERER_FAST_GPU.key)
add(HeaderSetting(R.string.veil_extensions))
add(ByteSetting.RENDERER_DYNA_STATE.key)
add(BooleanSetting.RENDERER_PROVOKING_VERTEX.key)
add(BooleanSetting.RENDERER_DESCRIPTOR_INDEXING.key)
add(BooleanSetting.CORE_SYNC_CORE_SPEED.key)
add(HeaderSetting(R.string.veil_renderer))
add(BooleanSetting.FRAME_INTERPOLATION.key)
add(BooleanSetting.RENDERER_FAST_GPU.key)
add(IntSetting.RENDERER_SHADER_BACKEND.key)
add(IntSetting.RENDERER_NVDEC_EMULATION.key)
add(IntSetting.RENDERER_ASTC_DECODE_METHOD.key)
add(IntSetting.RENDERER_ASTC_RECOMPRESSION.key)
add(IntSetting.RENDERER_VRAM_USAGE_MODE.key)
add(IntSetting.RENDERER_OPTIMIZE_SPIRV_OUTPUT.key)
add(HeaderSetting(R.string.veil_misc))
add(BooleanSetting.USE_LRU_CACHE.key)
add(BooleanSetting.CORE_SYNC_CORE_SPEED.key)
add(IntSetting.MEMORY_LAYOUT.key)
}
}
@ -1076,6 +1085,28 @@ class SettingsFragmentPresenter(
add(BooleanSetting.USE_AUTO_STUB.key)
add(BooleanSetting.CPU_DEBUG_MODE.key)
add(SettingsItem.FASTMEM_COMBINED)
add(HeaderSetting(R.string.log))
add(BooleanSetting.DEBUG_FLUSH_BY_LINE.key)
}
}
fun showEdenVeilWarningDialog() {
val shouldDisplayVeilWarning = !BooleanSetting.DONT_SHOW_EDEN_VEIL_WARNING.getBoolean()
if (shouldDisplayVeilWarning) {
activity?.let {
MessageDialogFragment.newInstance(
it,
titleId = R.string.eden_veil_warning_title,
descriptionId = R.string.eden_veil_warning_description,
positiveButtonTitleId = R.string.dont_show_again,
negativeButtonTitleId = R.string.close,
showNegativeButton = true,
positiveAction = {
BooleanSetting.DONT_SHOW_EDEN_VEIL_WARNING.setBoolean(true)
}
).show(it.supportFragmentManager, MessageDialogFragment.TAG)
}
}
}
}

View file

@ -399,7 +399,7 @@ class EmulationFragment : Fragment(), SurfaceHolder.Callback {
emulationState.updateSurface()
// Setup overlays
updateshowStatsOvelray()
updateShowStatsOverlay()
// Re update binding when the specs values get initialized properly
binding.inGameMenu.getHeaderView(0).apply {
@ -532,7 +532,7 @@ class EmulationFragment : Fragment(), SurfaceHolder.Callback {
}
}
@SuppressLint("DefaultLocale")
private fun updateshowStatsOvelray() {
private fun updateShowStatsOverlay() {
val showOverlay = BooleanSetting.SHOW_PERFORMANCE_OVERLAY.getBoolean()
binding.showStatsOverlayText.apply {
setTextColor(
@ -560,7 +560,7 @@ class EmulationFragment : Fragment(), SurfaceHolder.Callback {
if (BooleanSetting.SHOW_FPS.getBoolean(NativeConfig.isPerGameConfigLoaded())) {
val enableFrameInterpolation = BooleanSetting.FRAME_INTERPOLATION.getBoolean()
val enableFrameSkipping = BooleanSetting.FRAME_SKIPPING.getBoolean()
// val enableFrameSkipping = BooleanSetting.FRAME_SKIPPING.getBoolean()
var fpsText = String.format("FPS: %.1f", actualFps)
@ -568,9 +568,9 @@ class EmulationFragment : Fragment(), SurfaceHolder.Callback {
fpsText += " " + getString(R.string.enhanced_fps_suffix)
}
if (enableFrameSkipping) {
fpsText += " " + getString(R.string.skipping_fps_suffix)
}
// if (enableFrameSkipping) {
// fpsText += " " + getString(R.string.skipping_fps_suffix)
// }
sb.append(fpsText)
}
@ -585,16 +585,6 @@ class EmulationFragment : Fragment(), SurfaceHolder.Callback {
)
}
if (BooleanSetting.SHOW_SPEED.getBoolean(NativeConfig.isPerGameConfigLoaded())) {
if (sb.isNotEmpty()) sb.append(" | ")
sb.append(
String.format(
"Speed: %d%%",
(perfStats[SPEED] * 100.0 + 0.5).toInt()
)
)
}
if (BooleanSetting.SHOW_APP_RAM_USAGE.getBoolean(NativeConfig.isPerGameConfigLoaded())) {
if (sb.isNotEmpty()) sb.append(" | ")
val appRamUsage = File("/proc/self/statm").readLines()[0].split(' ')[1].toLong() * 4096 / 1000000
@ -619,6 +609,16 @@ class EmulationFragment : Fragment(), SurfaceHolder.Callback {
sb.append(String.format("%.1f°C/%.1f°F", batteryTemp, tempF))
}
val shadersBuilding = NativeLibrary.getShadersBuilding()
if (BooleanSetting.SHOW_SHADERS_BUILDING.getBoolean(NativeConfig.isPerGameConfigLoaded()) && shadersBuilding != 0) {
if (sb.isNotEmpty()) sb.append(" | ")
val prefix = getString(R.string.shaders_prefix)
val suffix = getString(R.string.shaders_suffix)
sb.append(String.format("$prefix %d $suffix", shadersBuilding))
}
if (BooleanSetting.OVERLAY_BACKGROUND.getBoolean(NativeConfig.isPerGameConfigLoaded())) {
binding.showStatsOverlayText.setBackgroundResource(R.color.yuzu_transparent_black)
} else {
@ -849,7 +849,7 @@ class EmulationFragment : Fragment(), SurfaceHolder.Callback {
R.id.menu_show_stats_overlay -> {
it.isChecked = !it.isChecked
BooleanSetting.SHOW_PERFORMANCE_OVERLAY.setBoolean(it.isChecked)
updateshowStatsOvelray()
updateShowStatsOverlay()
true
}
R.id.menu_edit_overlay -> {

View file

@ -12,10 +12,13 @@ import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup
import android.view.inputmethod.InputMethodManager
import android.widget.ImageButton
import android.widget.PopupMenu
import android.widget.TextView
import androidx.activity.result.contract.ActivityResultContracts
import androidx.appcompat.app.AppCompatActivity
import androidx.compose.ui.graphics.Color
import androidx.compose.ui.graphics.toArgb
import androidx.constraintlayout.widget.ConstraintLayout
import androidx.core.view.ViewCompat
import androidx.core.view.WindowInsetsCompat
@ -43,6 +46,7 @@ import org.yuzu.yuzu_emu.utils.collect
import java.util.Locale
import androidx.core.content.edit
import androidx.core.view.updateLayoutParams
import org.yuzu.yuzu_emu.features.settings.model.Settings
class GamesFragment : Fragment() {
private var _binding: FragmentGamesBinding? = null
@ -58,7 +62,8 @@ class GamesFragment : Fragment() {
private val homeViewModel: HomeViewModel by activityViewModels()
private lateinit var gameAdapter: GameAdapter
private val preferences = PreferenceManager.getDefaultSharedPreferences(YuzuApplication.appContext)
private val preferences =
PreferenceManager.getDefaultSharedPreferences(YuzuApplication.appContext)
private lateinit var mainActivity: MainActivity
private val getGamesDirectory =
@ -151,8 +156,13 @@ class GamesFragment : Fragment() {
getGamesDirectory.launch(Intent(Intent.ACTION_OPEN_DOCUMENT_TREE).data)
}
setInsets()
addPreAlphaBanner()
setInsets()
val shouldDisplayPreAlphaBanner =
PreferenceManager.getDefaultSharedPreferences(requireContext())
.getBoolean(Settings.PREF_SHOULD_SHOW_PRE_ALPHA_BANNER, true)
if (shouldDisplayPreAlphaBanner) {
addPreAlphaBanner()
}
}
val applyGridGamesBinding = {
@ -260,7 +270,44 @@ class GamesFragment : Fragment() {
)
gravity = Gravity.CENTER
}
val closeButton = ImageButton(requireContext()).apply {
id = "pre_alpha_close_button".hashCode()
layoutParams = ConstraintLayout.LayoutParams(
resources.getDimensionPixelSize(R.dimen.spacing_large),
resources.getDimensionPixelSize(R.dimen.spacing_large)
).apply {
startToStart = "pre_alpha_banner".hashCode()
topToTop = "pre_alpha_banner".hashCode()
bottomToBottom = "pre_alpha_banner".hashCode()
marginStart = resources.getDimensionPixelSize(R.dimen.spacing_large) * 2
topMargin = resources.getDimensionPixelSize(R.dimen.spacing_small)
}
setImageResource(android.R.drawable.ic_menu_close_clear_cancel)
setColorFilter(
MaterialColors.getColor(
this,
com.google.android.material.R.attr.colorOnError
)
)
setBackgroundColor(Color.Transparent.toArgb())
setOnClickListener {
PreferenceManager.getDefaultSharedPreferences(requireContext())
.edit() {
putBoolean(Settings.PREF_SHOULD_SHOW_PRE_ALPHA_BANNER, false)
}
binding.root.removeView(preAlphaBanner)
binding.root.removeView(this)
binding.swipeRefresh.updateLayoutParams<ConstraintLayout.LayoutParams> {
topToBottom = R.id.frame_search
}
}
}
binding.root.addView(preAlphaBanner)
binding.root.addView(closeButton)
binding.swipeRefresh.updateLayoutParams<ConstraintLayout.LayoutParams> {
topToBottom = preAlphaBanner.id
}
@ -284,12 +331,14 @@ class GamesFragment : Fragment() {
item.isChecked = true
true
}
R.id.view_list -> {
preferences.edit() { putInt(PREF_VIEW_TYPE, GameAdapter.VIEW_TYPE_LIST) }
applyGridGamesBinding()
item.isChecked = true
true
}
else -> false
}
}
@ -394,7 +443,7 @@ class GamesFragment : Fragment() {
val barInsets = windowInsets.getInsets(WindowInsetsCompat.Type.systemBars())
val cutoutInsets = windowInsets.getInsets(WindowInsetsCompat.Type.displayCutout())
val spacingNavigation = resources.getDimensionPixelSize(R.dimen.spacing_navigation)
resources.getDimensionPixelSize(R.dimen.spacing_navigation_rail)
resources.getDimensionPixelSize(R.dimen.spacing_navigation_rail)
val isLandscape =
resources.configuration.orientation == Configuration.ORIENTATION_LANDSCAPE
@ -418,7 +467,7 @@ class GamesFragment : Fragment() {
binding.noticeText.updatePadding(bottom = spacingNavigation)
binding.header.updatePadding(top = cutoutInsets.top + resources.getDimensionPixelSize(R.dimen.spacing_large) + if (isLandscape) barInsets.top else 0)
binding.gridGames.updatePadding(
top = resources.getDimensionPixelSize(R.dimen.spacing_med)
top = resources.getDimensionPixelSize(R.dimen.spacing_med)
)
val mlpFab = binding.addDirectory.layoutParams as ViewGroup.MarginLayoutParams

View file

@ -79,18 +79,20 @@ struct Values {
Settings::Category::Overlay, Settings::Specialization::Default, true , true, &show_performance_overlay};
Settings::Setting<bool> show_frame_time{linkage, false, "show_frame_time",
Settings::Category::Overlay, Settings::Specialization::Default, true , true, &show_performance_overlay};
Settings::Setting<bool> show_speed{linkage, true, "show_speed",
Settings::Category::Overlay, Settings::Specialization::Default, true , true, &show_performance_overlay};
Settings::Setting<bool> show_app_ram_usage{linkage, false, "show_app_ram_usage",
Settings::Category::Overlay, Settings::Specialization::Default, true , true, &show_performance_overlay};
Settings::Setting<bool> show_system_ram_usage{linkage, false, "show_system_ram_usage",
Settings::Category::Overlay, Settings::Specialization::Default, true , true, &show_performance_overlay};
Settings::Setting<bool> show_bat_temperature{linkage, false, "show_bat_temperature",
Settings::Category::Overlay, Settings::Specialization::Default, true , true, &show_performance_overlay};
Settings::Setting<bool> show_shaders_building{linkage, true, "show_shaders_building",
Settings::Category::Overlay, Settings::Specialization::Default, true , true, &show_performance_overlay};
Settings::Setting<bool> show_input_overlay{linkage, true, "show_input_overlay",
Settings::Category::Overlay};
Settings::Setting<bool> touchscreen{linkage, true, "touchscreen", Settings::Category::Overlay};
Settings::Setting<s32> lock_drawer{linkage, false, "lock_drawer", Settings::Category::Overlay};
Settings::Setting<bool> dont_show_eden_veil_warning{linkage, false, "dont_show_eden_veil_warning", Settings::Category::Miscellaneous};
};
extern Values values;

View file

@ -67,6 +67,7 @@
#include "video_core/renderer_vulkan/renderer_vulkan.h"
#include "video_core/vulkan_common/vulkan_instance.h"
#include "video_core/vulkan_common/vulkan_surface.h"
#include "video_core/shader_notify.h"
#define jconst [[maybe_unused]] const auto
#define jauto [[maybe_unused]] auto
@ -158,6 +159,12 @@ const Core::PerfStatsResults& EmulationSession::PerfStats() {
return m_perf_stats;
}
int EmulationSession::ShadersBuilding() {
auto& shader_notify = m_system.GPU().ShaderNotify();
m_shaders_building = shader_notify.ShadersBuilding();
return m_shaders_building;
}
void EmulationSession::SurfaceChanged() {
if (!IsRunning()) {
return;
@ -610,6 +617,16 @@ jdoubleArray Java_org_yuzu_yuzu_1emu_NativeLibrary_getPerfStats(JNIEnv* env, jcl
return j_stats;
}
jint Java_org_yuzu_yuzu_1emu_NativeLibrary_getShadersBuilding(JNIEnv* env, jclass clazz) {
jint j_shaders = 0;
if (EmulationSession::GetInstance().IsRunning()) {
j_shaders = EmulationSession::GetInstance().ShadersBuilding();
}
return j_shaders;
}
jstring Java_org_yuzu_yuzu_1emu_NativeLibrary_getCpuBackend(JNIEnv* env, jclass clazz) {
if (Settings::IsNceEnabled()) {
return Common::Android::ToJString(env, "NCE");

View file

@ -44,6 +44,7 @@ public:
void ShutdownEmulation();
const Core::PerfStatsResults& PerfStats();
int ShadersBuilding();
void ConfigureFilesystemProvider(const std::string& filepath);
void InitializeSystem(bool reload);
void SetAppletId(int applet_id);
@ -72,6 +73,7 @@ private:
InputCommon::InputSubsystem m_input_subsystem;
Common::DetachedTasks m_detached_tasks;
Core::PerfStatsResults m_perf_stats{};
int m_shaders_building{0};
std::shared_ptr<FileSys::VfsFilesystem> m_vfs;
Core::SystemResultStatus m_load_result{Core::SystemResultStatus::ErrorNotInitialized};
std::atomic<bool> m_is_running = false;

View file

@ -7,7 +7,6 @@
<!-- Stats Overlay settings -->
<string name="enhanced_fps_suffix">(مُحسَّن)</string>
<string name="skipping_fps_suffix">(تخطي)</string>
<string name="system_info_label">النظام:</string>
<string name="show_stats_overlay">عرض إحصائيات الأداء</string>
<string name="stats_overlay_customization">تخصيص</string>

View file

@ -8,7 +8,6 @@
<!-- Stats Overlay settings -->
<string name="enhanced_fps_suffix">(پێشکەوتوو)</string>
<string name="skipping_fps_suffix">(بازدان)</string>
<string name="system_info_label">سیستەم:</string>
<string name="show_stats_overlay">پیشاندانی ستاتیستی کارایی</string>
<string name="stats_overlay_customization">خۆڕێکخستن</string>

View file

@ -7,7 +7,6 @@
<!-- Stats Overlay settings -->
<string name="enhanced_fps_suffix">(Vylepšený)</string>
<string name="skipping_fps_suffix">(Přeskakování)</string>
<string name="system_info_label">Systém:</string>
<string name="show_stats_overlay">Zobrazit překryv statistik výkonu</string>
<string name="stats_overlay_customization">Přizpůsobení</string>

View file

@ -8,7 +8,6 @@
<!-- Stats Overlay settings -->
<string name="enhanced_fps_suffix">(Enhanced)</string>
<string name="skipping_fps_suffix">(Skipping)</string>
<string name="system_info_label">System:</string>
<string name="show_stats_overlay">Leistungsstatistik Overlay anzeigen</string>
<string name="stats_overlay_customization">Anpassung</string>

View file

@ -8,7 +8,6 @@
<!-- Stats Overlay settings -->
<string name="enhanced_fps_suffix">(Mejorado)</string>
<string name="skipping_fps_suffix">(Saltando)</string>
<string name="system_info_label">Sistema:</string>
<string name="show_stats_overlay">Mostrar superposición de estadísticas de rendimiento</string>
<string name="stats_overlay_customization">Personalización</string>

View file

@ -8,7 +8,6 @@
<!-- Stats Overlay settings -->
<string name="enhanced_fps_suffix">(بهبودیافته)</string>
<string name="skipping_fps_suffix">(رد کردن)</string>
<string name="system_info_label">سیستم:</string>
<string name="show_stats_overlay">نمایش آمار عملکرد</string>
<string name="stats_overlay_customization">سفارشی‌سازی</string>

View file

@ -8,7 +8,6 @@
<!-- Stats Overlay settings -->
<string name="enhanced_fps_suffix">(Amélioré)</string>
<string name="skipping_fps_suffix">(Saut)</string>
<string name="system_info_label">Système:</string>
<string name="show_stats_overlay">Afficher les stats de performance</string>
<string name="stats_overlay_customization">Personnalisation</string>

View file

@ -8,7 +8,6 @@
<!-- Stats Overlay settings -->
<string name="enhanced_fps_suffix">(משופר)</string>
<string name="skipping_fps_suffix">(דילוג)</string>
<string name="system_info_label">מערכת:</string>
<string name="show_stats_overlay">הצג סטטיסטיקות ביצועים</string>
<string name="stats_overlay_customization">התאמה אישית</string>

View file

@ -8,7 +8,6 @@
<!-- Stats Overlay settings -->
<string name="enhanced_fps_suffix">(Továbbfejlesztett)</string>
<string name="skipping_fps_suffix">(Kihagyás)</string>
<string name="system_info_label">Rendszer:</string>
<string name="show_stats_overlay">Teljesítmény statisztikák megjelenítése</string>
<string name="stats_overlay_customization">Testreszabás</string>

View file

@ -8,7 +8,6 @@
<!-- Stats Overlay settings -->
<string name="enhanced_fps_suffix">(Ditingkatkan)</string>
<string name="skipping_fps_suffix">(Melewatkan)</string>
<string name="system_info_label">Sistem:</string>
<string name="show_stats_overlay">Tampilkan Overlay Statistik Performa</string>
<string name="stats_overlay_customization">Kustomisasi</string>

View file

@ -8,7 +8,6 @@
<!-- Stats Overlay settings -->
<string name="enhanced_fps_suffix">(Migliorato)</string>
<string name="skipping_fps_suffix">(Salto)</string>
<string name="system_info_label">Sistema:</string>
<string name="show_stats_overlay">Mostra overlay prestazioni</string>
<string name="stats_overlay_customization">Personalizzazione</string>

View file

@ -8,7 +8,6 @@
<!-- Stats Overlay settings -->
<string name="enhanced_fps_suffix">(強化)</string>
<string name="skipping_fps_suffix">(スキップ)</string>
<string name="system_info_label">システム:</string>
<string name="show_stats_overlay">パフォーマンス統計オーバーレイを表示</string>
<string name="stats_overlay_customization">カスタマイズ</string>

View file

@ -8,7 +8,6 @@
<!-- Stats Overlay settings -->
<string name="enhanced_fps_suffix">(향상됨)</string>
<string name="skipping_fps_suffix">(건너뜀)</string>
<string name="system_info_label">시스템:</string>
<string name="show_stats_overlay">성능 통계 오버레이 표시</string>
<string name="stats_overlay_customization">사용자 지정</string>

View file

@ -8,7 +8,6 @@
<!-- Stats Overlay settings -->
<string name="enhanced_fps_suffix">(Forbedret)</string>
<string name="skipping_fps_suffix">(Hopp)</string>
<string name="system_info_label">System:</string>
<string name="show_stats_overlay">Vis ytelsesstatistikkoverlay</string>
<string name="stats_overlay_customization">Tilpasning</string>

View file

@ -8,7 +8,6 @@
<!-- Stats Overlay settings -->
<string name="enhanced_fps_suffix">(Ulepszony)</string>
<string name="skipping_fps_suffix">(Pomijanie)</string>
<string name="system_info_label">System:</string>
<string name="show_stats_overlay">Pokaż nakładkę statystyk wydajności</string>
<string name="stats_overlay_customization">Dostosowanie</string>

View file

@ -8,7 +8,6 @@
<!-- Stats Overlay settings -->
<string name="enhanced_fps_suffix">(Aprimorado)</string>
<string name="skipping_fps_suffix">(Pular)</string>
<string name="system_info_label">Sistema:</string>
<string name="show_stats_overlay">Mostrar sobreposição de estatísticas de desempenho</string>
<string name="stats_overlay_customization">Personalização</string>

View file

@ -8,7 +8,6 @@
<!-- Stats Overlay settings -->
<string name="enhanced_fps_suffix">(Melhorado)</string>
<string name="skipping_fps_suffix">(Saltar)</string>
<string name="system_info_label">Sistema:</string>
<string name="show_stats_overlay">Mostrar Overlay de Desempenho</string>
<string name="stats_overlay_customization">Personalização</string>

View file

@ -8,7 +8,6 @@
<!-- Stats Overlay settings -->
<string name="enhanced_fps_suffix">(Улучшенный)</string>
<string name="skipping_fps_suffix">(Пропуск)</string>
<string name="system_info_label">Система:</string>
<string name="show_stats_overlay">Показать оверлей статистики</string>
<string name="stats_overlay_customization">Настройки</string>

View file

@ -8,7 +8,6 @@
<!-- Stats Overlay settings -->
<string name="enhanced_fps_suffix">(Покращений)</string>
<string name="skipping_fps_suffix">(Пропуск)</string>
<string name="system_info_label">Система:</string>
<string name="show_stats_overlay">Показати накладання статистики</string>
<string name="stats_overlay_customization">Налаштування</string>

View file

@ -8,7 +8,6 @@
<!-- Stats Overlay settings -->
<string name="enhanced_fps_suffix">(Nâng cao)</string>
<string name="skipping_fps_suffix">(Bỏ qua)</string>
<string name="system_info_label">Hệ thống:</string>
<string name="show_stats_overlay">Hiển thị thống kê hiệu suất</string>
<string name="stats_overlay_customization">Tùy chỉnh</string>

View file

@ -8,7 +8,6 @@
<!-- Stats Overlay settings -->
<string name="enhanced_fps_suffix">(增强)</string>
<string name="skipping_fps_suffix">(跳过)</string>
<string name="system_info_label">系统:</string>
<string name="show_stats_overlay">显示性能统计悬浮窗</string>
<string name="stats_overlay_customization">自定义</string>

View file

@ -8,7 +8,6 @@
<!-- Stats Overlay settings -->
<string name="enhanced_fps_suffix">(增強)</string>
<string name="skipping_fps_suffix">(跳過)</string>
<string name="system_info_label">系統:</string>
<string name="show_stats_overlay">顯示效能統計疊加層</string>
<string name="stats_overlay_customization">自訂</string>

View file

@ -21,6 +21,18 @@
<item>1</item>
</integer-array>
<string-array name="memoryNames">
<item>@string/memory_4gb</item>
<item>@string/memory_6gb</item>
<item>@string/memory_8gb</item>
</string-array>
<integer-array name="memoryValues">
<item>0</item>
<item>1</item>
<item>2</item>
</integer-array>
<string-array name="languageNames">
<item>@string/language_brazilian_portuguese</item>
<item>@string/language_british_english</item>

View file

@ -11,9 +11,10 @@
<!-- Stats Overlay settings -->
<string name="enhanced_fps_suffix">(Enhanced)</string>
<string name="skipping_fps_suffix">(Skipping)</string>
<string name="shaders_prefix">Building</string>
<string name="shaders_suffix">Shader(s)</string>
<string name="system_info_label">System:</string>
<string name="show_stats_overlay">ShoW Performance Stats Overlay</string>
<string name="show_stats_overlay">Show Performance Stats Overlay</string>
<string name="stats_overlay_customization">Customization</string>
<string name="stats_overlay_items">Visibility</string>
<string name="stats_overlay_options">Overlay</string>
@ -31,6 +32,8 @@
<string name="show_system_ram_usage_description">Display the amount of RAM used by the system</string>
<string name="show_bat_temperature">Show Battery Temperature</string>
<string name="show_bat_temperature_description">Display current Battery temperature in Celsius and Fahrenheit</string>
<string name="show_shaders_building">Show Shaders Building</string>
<string name="show_shaders_building_description">Display current number of shaders being built</string>
<string name="overlay_position">Overlay Position</string>
<string name="overlay_position_description">Choose where the performance stats overlay is displayed on the screen</string>
<string name="overlay_position_top_left">Top Left</string>
@ -44,23 +47,35 @@
<!-- Eden`s Veil -->
<string name="eden_veil">Edens Veil</string>
<string name="eden_veil_description">Beyond default</string>
<string name="frame_interpolation">Enhanced Frame Pacing</string>
<string name="frame_interpolation_description">Ensures smooth and consistent frame delivery by synchronizing the timing between frames, reducing stuttering and uneven animation. Ideal for games that experience frame timing instability or micro-stutters during gameplay.</string>
<string name="eden_veil_description">Experimental settings to improve performance and capability. These settings may cause black screens or other game issues.</string>
<string name="eden_veil_warning_title">Experimental Settings</string>
<string name="eden_veil_warning_description">The settings contained within Eden\'s Veil are highly experimental and may cause issues. If your game does not boot, disable any extensions and change Extended Dynamic State to 0.</string>
<string name="veil_extensions">GPU Extensions</string>
<string name="dyna_state">Extended Dynamic State</string>
<string name="dyna_state_description">Enables Vulkan features to improve performance, rendering, and save resources on pipeline creation while maintaining lower CPU/GPU usage. These extensions may increase device temperature, and GPUs belonging to the older A6XX line may not react properly. Set to 0 to use Legacy emulated formats.</string>
<string name="use_sync_core">Synchronize Core Speed</string>
<string name="use_sync_core_description">Synchronize the core tick speed to the maximum speed percentage to improve performance without altering the game\'s actual speed.</string>
<string name="provoking_vertex">Provoking Vertex</string>
<string name="provoking_vertex_description">Improves lighting and vertex handling in certain games. Only supported on Vulkan 1.0+ GPUs.</string>
<string name="descriptor_indexing">Descriptor Indexing</string>
<string name="descriptor_indexing_description">Improves texture and buffer handling, as well as the Maxwell translation layer. Supported by some Vulkan 1.1 GPUs and all Vulkan 1.2+ GPUs.</string>
<string name="veil_renderer">Renderer</string>
<string name="frame_interpolation">Enhanced Frame Pacing</string>
<string name="frame_interpolation_description">Ensures smooth and consistent frame delivery by synchronizing the timing between frames, reducing stuttering and uneven animation. Ideal for games that experience frame timing instability or micro-stutters during gameplay.</string>
<string name="use_auto_stub">Use Auto Stub</string>
<string name="use_auto_stub_description">Automatically stub missing services and functions. This may improve compatibility but can cause crashes and stability issues.</string>
<string name="uninstall_firmware">Uninstall firmware</string>
<string name="uninstall_firmware_description">Uninstalling the firmware will remove it from the device and may affect game compatibility.</string>
<string name="firmware_uninstalling">Uninstalling firmware</string>
<string name="firmware_uninstalled_success">Firmware uninstalled successfully</string>
<string name="provoking_vertex">Provoking Vertex</string>
<string name="provoking_vertex_description">Improves lighting and vertex handling in certain games. Only supported on Vulkan 1.0+ GPUs.</string>
<string name="descriptor_indexing">Descriptor Indexing</string>
<string name="descriptor_indexing_description">Improves texture and buffer handling, as well as the Maxwell translation layer. Supported by some Vulkan 1.1 GPUs and all Vulkan 1.2+ GPUs.</string>
<string name="veil_misc">Miscellaneous</string>
<string name="use_sync_core">Synchronize Core Speed</string>
<string name="use_sync_core_description">Synchronize the core tick speed to the maximum speed percentage to improve performance without altering the game\'s actual speed.</string>
<string name="use_lru_cache">Enable LRU Cache</string>
<string name="use_lru_cache_description">Enable or disable the Least Recently Used (LRU) cache, increasing performance by saving CPU process usage. Some games have issue with it, notably TotK 1.2.1, so disable if the game doesn\'t boot or crashes randomly.</string>
<string name="memory_layout">Memory Layout</string>
<string name="memory_layout_description">(EXPERIMENTAL) Change the emulated memory layout. This setting will not increase performance, but may help with games utilizing high resolutions via mods. Do not use on phones with 8GB of RAM or less.</string>
<!-- Shader Backend -->
<string name="shader_backend">Shader Backend</string>
@ -404,12 +419,18 @@
<string name="cpu">CPU</string>
<string name="cpu_debug_mode">CPU Debugging</string>
<string name="cpu_debug_mode_description">Puts the CPU in a slow debugging mode.</string>
<string name="gpu">GPU</string>
<string name="renderer_api">API</string>
<string name="renderer_debug">Graphics debugging</string>
<string name="renderer_debug_description">Sets the graphics API to a slow debugging mode.</string>
<string name="fastmem">Fastmem</string>
<string name="log">Logging</string>
<string name="flush_by_line">Flush debug logs by line</string>
<string name="flush_by_line_description">Flushes debugging logs on each line written, making debugging easier in cases of crashing or freezing.</string>
<!-- Audio settings strings -->
<string name="audio_output_engine">Output engine</string>
<string name="audio_volume">Volume</string>
@ -678,6 +699,11 @@
<string name="region_korea">Korea</string>
<string name="region_taiwan">Taiwan</string>
<!-- Memory Layouts -->
<string name="memory_4gb">4GB (Recommended)</string>
<string name="memory_6gb">6GB (Unsafe)</string>
<string name="memory_8gb">8GB (Unsafe)</string>
<!-- Language Names -->
<string name="language_japanese" translatable="false">日本語</string>
<string name="language_english" translatable="false">English</string>
@ -749,10 +775,6 @@
<string name="resolution_three">3X (2160p/3240p) (Slow)</string>
<string name="resolution_four">4X (2880p/4320p) (Slow)</string>
<!-- LRU Cache -->
<string name="use_lru_cache">Enable LRU Cache</string>
<string name="use_lru_cache_description">Enable or disable the Least Recently Used (LRU) cache, increasing performance by saving CPU process usage. Some games have issue with it, notably TotK 1.2.1, so disable if the game doesn\'t boot or crashes randomly.</string>
<!-- Renderer VSync -->
<string name="renderer_vsync_immediate">Immediate (Off)</string>
<string name="renderer_vsync_mailbox">Mailbox</string>

View file

@ -202,7 +202,7 @@ RendererVulkan::~RendererVulkan() {
#ifdef __ANDROID__
class BooleanSetting {
public:
static BooleanSetting FRAME_SKIPPING;
// static BooleanSetting FRAME_SKIPPING;
static BooleanSetting FRAME_INTERPOLATION;
explicit BooleanSetting(bool initial_value = false) : value(initial_value) {}
@ -219,13 +219,13 @@ class BooleanSetting {
};
// Initialize static members
BooleanSetting BooleanSetting::FRAME_SKIPPING(false);
// BooleanSetting BooleanSetting::FRAME_SKIPPING(false);
BooleanSetting BooleanSetting::FRAME_INTERPOLATION(false);
extern "C" JNIEXPORT jboolean JNICALL
Java_org_uzuy_uzuy_1emu_features_settings_model_BooleanSetting_isFrameSkippingEnabled(JNIEnv* env, jobject /* this */) {
return static_cast<jboolean>(BooleanSetting::FRAME_SKIPPING.getBoolean());
}
// extern "C" JNIEXPORT jboolean JNICALL
// Java_org_uzuy_uzuy_1emu_features_settings_model_BooleanSetting_isFrameSkippingEnabled(JNIEnv* env, jobject /* this */) {
// return static_cast<jboolean>(BooleanSetting::FRAME_SKIPPING.getBoolean());
// }
extern "C" JNIEXPORT jboolean JNICALL
Java_org_uzuy_uzuy_1emu_features_settings_model_BooleanSetting_isFrameInterpolationEnabled(JNIEnv* env, jobject /* this */) {
@ -310,7 +310,7 @@ void RendererVulkan::Composite(std::span<const Tegra::FramebufferConfig> framebu
static int target_fps = 60; // Target FPS (30 or 60)
int frame_skip_threshold = 1;
bool frame_skipping = BooleanSetting::FRAME_SKIPPING.getBoolean();
bool frame_skipping = false; //BooleanSetting::FRAME_SKIPPING.getBoolean();
bool frame_interpolation = BooleanSetting::FRAME_INTERPOLATION.getBoolean();
#endif