diff --git a/.ci/windows/build.bat b/.ci/windows/build.bat index 8535588fbc..e3386fd552 100755 --- a/.ci/windows/build.bat +++ b/.ci/windows/build.bat @@ -21,6 +21,6 @@ CALL cmake -S . -B build\%chain% ^ -DYUZU_ENABLE_LTO=ON ^ -G "Ninja" ^ -DYUZU_TESTS=OFF ^ --DQt6_DIR=C:\Qt\%qt_ver%\msvc2022_64 +-DQt6_DIR=C:\Qt\%qt_ver%\msvc2022_64 CALL cmake --build build\%chain% diff --git a/src/android/app/src/main/java/org/yuzu/yuzu_emu/NativeLibrary.kt b/src/android/app/src/main/java/org/yuzu/yuzu_emu/NativeLibrary.kt index 1848ca9ef9..0be943eb86 100644 --- a/src/android/app/src/main/java/org/yuzu/yuzu_emu/NativeLibrary.kt +++ b/src/android/app/src/main/java/org/yuzu/yuzu_emu/NativeLibrary.kt @@ -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. */ diff --git a/src/android/app/src/main/java/org/yuzu/yuzu_emu/features/settings/model/BooleanSetting.kt b/src/android/app/src/main/java/org/yuzu/yuzu_emu/features/settings/model/BooleanSetting.kt index cc494467d1..7598d77f46 100644 --- a/src/android/app/src/main/java/org/yuzu/yuzu_emu/features/settings/model/BooleanSetting.kt +++ b/src/android/app/src/main/java/org/yuzu/yuzu_emu/features/settings/model/BooleanSetting.kt @@ -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 diff --git a/src/android/app/src/main/java/org/yuzu/yuzu_emu/features/settings/model/IntSetting.kt b/src/android/app/src/main/java/org/yuzu/yuzu_emu/features/settings/model/IntSetting.kt index c56d44ee9f..8e71f13d25 100644 --- a/src/android/app/src/main/java/org/yuzu/yuzu_emu/features/settings/model/IntSetting.kt +++ b/src/android/app/src/main/java/org/yuzu/yuzu_emu/features/settings/model/IntSetting.kt @@ -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"), diff --git a/src/android/app/src/main/java/org/yuzu/yuzu_emu/features/settings/model/Settings.kt b/src/android/app/src/main/java/org/yuzu/yuzu_emu/features/settings/model/Settings.kt index f6879723fe..320436fb5f 100644 --- a/src/android/app/src/main/java/org/yuzu/yuzu_emu/features/settings/model/Settings.kt +++ b/src/android/app/src/main/java/org/yuzu/yuzu_emu/features/settings/model/Settings.kt @@ -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" diff --git a/src/android/app/src/main/java/org/yuzu/yuzu_emu/features/settings/model/view/SettingsItem.kt b/src/android/app/src/main/java/org/yuzu/yuzu_emu/features/settings/model/view/SettingsItem.kt index 71fb11c671..efe5de5291 100644 --- a/src/android/app/src/main/java/org/yuzu/yuzu_emu/features/settings/model/view/SettingsItem.kt +++ b/src/android/app/src/main/java/org/yuzu/yuzu_emu/features/settings/model/view/SettingsItem.kt @@ -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, diff --git a/src/android/app/src/main/java/org/yuzu/yuzu_emu/features/settings/ui/SettingsFragment.kt b/src/android/app/src/main/java/org/yuzu/yuzu_emu/features/settings/ui/SettingsFragment.kt index ec16f16c46..bac90eb4ef 100644 --- a/src/android/app/src/main/java/org/yuzu/yuzu_emu/features/settings/ui/SettingsFragment.kt +++ b/src/android/app/src/main/java/org/yuzu/yuzu_emu/features/settings/ui/SettingsFragment.kt @@ -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()) diff --git a/src/android/app/src/main/java/org/yuzu/yuzu_emu/features/settings/ui/SettingsFragmentPresenter.kt b/src/android/app/src/main/java/org/yuzu/yuzu_emu/features/settings/ui/SettingsFragmentPresenter.kt index 4fc1540d0e..69517ebd5a 100644 --- a/src/android/app/src/main/java/org/yuzu/yuzu_emu/features/settings/ui/SettingsFragmentPresenter.kt +++ b/src/android/app/src/main/java/org/yuzu/yuzu_emu/features/settings/ui/SettingsFragmentPresenter.kt @@ -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() @@ -66,7 +71,7 @@ class SettingsFragmentPresenter( } // Allows you to show/hide abstract settings based on the paired setting key - fun ArrayList.addAbstract(item: SettingsItem) { + private fun ArrayList.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) { 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) + } } } } diff --git a/src/android/app/src/main/java/org/yuzu/yuzu_emu/fragments/EmulationFragment.kt b/src/android/app/src/main/java/org/yuzu/yuzu_emu/fragments/EmulationFragment.kt index ddf3cb1fe1..2f5918b59a 100644 --- a/src/android/app/src/main/java/org/yuzu/yuzu_emu/fragments/EmulationFragment.kt +++ b/src/android/app/src/main/java/org/yuzu/yuzu_emu/fragments/EmulationFragment.kt @@ -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 -> { diff --git a/src/android/app/src/main/java/org/yuzu/yuzu_emu/ui/GamesFragment.kt b/src/android/app/src/main/java/org/yuzu/yuzu_emu/ui/GamesFragment.kt index dd5f8518c3..730c59e592 100644 --- a/src/android/app/src/main/java/org/yuzu/yuzu_emu/ui/GamesFragment.kt +++ b/src/android/app/src/main/java/org/yuzu/yuzu_emu/ui/GamesFragment.kt @@ -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 { + topToBottom = R.id.frame_search + } + } + } + binding.root.addView(preAlphaBanner) + binding.root.addView(closeButton) + binding.swipeRefresh.updateLayoutParams { 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 diff --git a/src/android/app/src/main/jni/android_settings.h b/src/android/app/src/main/jni/android_settings.h index ff569d1981..45e9618d3c 100644 --- a/src/android/app/src/main/jni/android_settings.h +++ b/src/android/app/src/main/jni/android_settings.h @@ -79,18 +79,20 @@ struct Values { Settings::Category::Overlay, Settings::Specialization::Default, true , true, &show_performance_overlay}; Settings::Setting show_frame_time{linkage, false, "show_frame_time", Settings::Category::Overlay, Settings::Specialization::Default, true , true, &show_performance_overlay}; - Settings::Setting show_speed{linkage, true, "show_speed", - Settings::Category::Overlay, Settings::Specialization::Default, true , true, &show_performance_overlay}; Settings::Setting show_app_ram_usage{linkage, false, "show_app_ram_usage", Settings::Category::Overlay, Settings::Specialization::Default, true , true, &show_performance_overlay}; Settings::Setting show_system_ram_usage{linkage, false, "show_system_ram_usage", Settings::Category::Overlay, Settings::Specialization::Default, true , true, &show_performance_overlay}; Settings::Setting show_bat_temperature{linkage, false, "show_bat_temperature", Settings::Category::Overlay, Settings::Specialization::Default, true , true, &show_performance_overlay}; + Settings::Setting show_shaders_building{linkage, true, "show_shaders_building", + Settings::Category::Overlay, Settings::Specialization::Default, true , true, &show_performance_overlay}; Settings::Setting show_input_overlay{linkage, true, "show_input_overlay", Settings::Category::Overlay}; Settings::Setting touchscreen{linkage, true, "touchscreen", Settings::Category::Overlay}; Settings::Setting lock_drawer{linkage, false, "lock_drawer", Settings::Category::Overlay}; + + Settings::Setting dont_show_eden_veil_warning{linkage, false, "dont_show_eden_veil_warning", Settings::Category::Miscellaneous}; }; extern Values values; diff --git a/src/android/app/src/main/jni/native.cpp b/src/android/app/src/main/jni/native.cpp index 6dac1ef84e..962fae126c 100644 --- a/src/android/app/src/main/jni/native.cpp +++ b/src/android/app/src/main/jni/native.cpp @@ -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"); diff --git a/src/android/app/src/main/jni/native.h b/src/android/app/src/main/jni/native.h index 6a4551ada2..dfbc8b2943 100644 --- a/src/android/app/src/main/jni/native.h +++ b/src/android/app/src/main/jni/native.h @@ -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 m_vfs; Core::SystemResultStatus m_load_result{Core::SystemResultStatus::ErrorNotInitialized}; std::atomic m_is_running = false; diff --git a/src/android/app/src/main/res/values-ar/strings.xml b/src/android/app/src/main/res/values-ar/strings.xml index 1ed93d123c..c05652f70a 100644 --- a/src/android/app/src/main/res/values-ar/strings.xml +++ b/src/android/app/src/main/res/values-ar/strings.xml @@ -7,7 +7,6 @@ (مُحسَّن) - (تخطي) النظام: عرض إحصائيات الأداء تخصيص diff --git a/src/android/app/src/main/res/values-ckb/strings.xml b/src/android/app/src/main/res/values-ckb/strings.xml index 89cbd511aa..b6aa73505b 100644 --- a/src/android/app/src/main/res/values-ckb/strings.xml +++ b/src/android/app/src/main/res/values-ckb/strings.xml @@ -8,7 +8,6 @@ (پێشکەوتوو) - (بازدان) سیستەم: پیشاندانی ستاتیستی کارایی خۆڕێکخستن diff --git a/src/android/app/src/main/res/values-cs/strings.xml b/src/android/app/src/main/res/values-cs/strings.xml index 4f43357a6f..ee1bcd6dc9 100644 --- a/src/android/app/src/main/res/values-cs/strings.xml +++ b/src/android/app/src/main/res/values-cs/strings.xml @@ -7,7 +7,6 @@ (Vylepšený) - (Přeskakování) Systém: Zobrazit překryv statistik výkonu Přizpůsobení diff --git a/src/android/app/src/main/res/values-de/strings.xml b/src/android/app/src/main/res/values-de/strings.xml index d2a1f89730..4e20ca069a 100644 --- a/src/android/app/src/main/res/values-de/strings.xml +++ b/src/android/app/src/main/res/values-de/strings.xml @@ -8,7 +8,6 @@ (Enhanced) - (Skipping) System: Leistungsstatistik Overlay anzeigen Anpassung diff --git a/src/android/app/src/main/res/values-es/strings.xml b/src/android/app/src/main/res/values-es/strings.xml index 0eb5932de2..dc8d2207cc 100644 --- a/src/android/app/src/main/res/values-es/strings.xml +++ b/src/android/app/src/main/res/values-es/strings.xml @@ -8,7 +8,6 @@ (Mejorado) - (Saltando) Sistema: Mostrar superposición de estadísticas de rendimiento Personalización diff --git a/src/android/app/src/main/res/values-fa/strings.xml b/src/android/app/src/main/res/values-fa/strings.xml index 758fa4995d..cc90431372 100644 --- a/src/android/app/src/main/res/values-fa/strings.xml +++ b/src/android/app/src/main/res/values-fa/strings.xml @@ -8,7 +8,6 @@ (بهبودیافته) - (رد کردن) سیستم: نمایش آمار عملکرد سفارشی‌سازی diff --git a/src/android/app/src/main/res/values-fr/strings.xml b/src/android/app/src/main/res/values-fr/strings.xml index 9e2069cd97..ff06bc8f90 100644 --- a/src/android/app/src/main/res/values-fr/strings.xml +++ b/src/android/app/src/main/res/values-fr/strings.xml @@ -8,7 +8,6 @@ (Amélioré) - (Saut) Système: Afficher les stats de performance Personnalisation diff --git a/src/android/app/src/main/res/values-he/strings.xml b/src/android/app/src/main/res/values-he/strings.xml index e712e9d267..61cc06a31e 100644 --- a/src/android/app/src/main/res/values-he/strings.xml +++ b/src/android/app/src/main/res/values-he/strings.xml @@ -8,7 +8,6 @@ (משופר) - (דילוג) מערכת: הצג סטטיסטיקות ביצועים התאמה אישית diff --git a/src/android/app/src/main/res/values-hu/strings.xml b/src/android/app/src/main/res/values-hu/strings.xml index 8c028fb8a8..fd0086039a 100644 --- a/src/android/app/src/main/res/values-hu/strings.xml +++ b/src/android/app/src/main/res/values-hu/strings.xml @@ -8,7 +8,6 @@ (Továbbfejlesztett) - (Kihagyás) Rendszer: Teljesítmény statisztikák megjelenítése Testreszabás diff --git a/src/android/app/src/main/res/values-id/strings.xml b/src/android/app/src/main/res/values-id/strings.xml index ee5c8db04e..22685207f1 100644 --- a/src/android/app/src/main/res/values-id/strings.xml +++ b/src/android/app/src/main/res/values-id/strings.xml @@ -8,7 +8,6 @@ (Ditingkatkan) - (Melewatkan) Sistem: Tampilkan Overlay Statistik Performa Kustomisasi diff --git a/src/android/app/src/main/res/values-it/strings.xml b/src/android/app/src/main/res/values-it/strings.xml index 3ed465d956..260b329e35 100644 --- a/src/android/app/src/main/res/values-it/strings.xml +++ b/src/android/app/src/main/res/values-it/strings.xml @@ -8,7 +8,6 @@ (Migliorato) - (Salto) Sistema: Mostra overlay prestazioni Personalizzazione diff --git a/src/android/app/src/main/res/values-ja/strings.xml b/src/android/app/src/main/res/values-ja/strings.xml index 6ce448998d..354d959f67 100644 --- a/src/android/app/src/main/res/values-ja/strings.xml +++ b/src/android/app/src/main/res/values-ja/strings.xml @@ -8,7 +8,6 @@ (強化) - (スキップ) システム: パフォーマンス統計オーバーレイを表示 カスタマイズ diff --git a/src/android/app/src/main/res/values-ko/strings.xml b/src/android/app/src/main/res/values-ko/strings.xml index 8f232711f6..f663d93d7b 100644 --- a/src/android/app/src/main/res/values-ko/strings.xml +++ b/src/android/app/src/main/res/values-ko/strings.xml @@ -8,7 +8,6 @@ (향상됨) - (건너뜀) 시스템: 성능 통계 오버레이 표시 사용자 지정 diff --git a/src/android/app/src/main/res/values-nb/strings.xml b/src/android/app/src/main/res/values-nb/strings.xml index b3864defcd..969dbbbf54 100644 --- a/src/android/app/src/main/res/values-nb/strings.xml +++ b/src/android/app/src/main/res/values-nb/strings.xml @@ -8,7 +8,6 @@ (Forbedret) - (Hopp) System: Vis ytelsesstatistikkoverlay Tilpasning diff --git a/src/android/app/src/main/res/values-pl/strings.xml b/src/android/app/src/main/res/values-pl/strings.xml index 934ee8d54d..3b022b2b20 100644 --- a/src/android/app/src/main/res/values-pl/strings.xml +++ b/src/android/app/src/main/res/values-pl/strings.xml @@ -8,7 +8,6 @@ (Ulepszony) - (Pomijanie) System: Pokaż nakładkę statystyk wydajności Dostosowanie diff --git a/src/android/app/src/main/res/values-pt-rBR/strings.xml b/src/android/app/src/main/res/values-pt-rBR/strings.xml index 682212ddee..44c8d4d98e 100644 --- a/src/android/app/src/main/res/values-pt-rBR/strings.xml +++ b/src/android/app/src/main/res/values-pt-rBR/strings.xml @@ -8,7 +8,6 @@ (Aprimorado) - (Pular) Sistema: Mostrar sobreposição de estatísticas de desempenho Personalização diff --git a/src/android/app/src/main/res/values-pt-rPT/strings.xml b/src/android/app/src/main/res/values-pt-rPT/strings.xml index 56d37faa55..57a8d74e46 100644 --- a/src/android/app/src/main/res/values-pt-rPT/strings.xml +++ b/src/android/app/src/main/res/values-pt-rPT/strings.xml @@ -8,7 +8,6 @@ (Melhorado) - (Saltar) Sistema: Mostrar Overlay de Desempenho Personalização diff --git a/src/android/app/src/main/res/values-ru/strings.xml b/src/android/app/src/main/res/values-ru/strings.xml index 4f18397c37..55a9826e06 100644 --- a/src/android/app/src/main/res/values-ru/strings.xml +++ b/src/android/app/src/main/res/values-ru/strings.xml @@ -8,7 +8,6 @@ (Улучшенный) - (Пропуск) Система: Показать оверлей статистики Настройки diff --git a/src/android/app/src/main/res/values-uk/strings.xml b/src/android/app/src/main/res/values-uk/strings.xml index 927efccded..41db237f0a 100644 --- a/src/android/app/src/main/res/values-uk/strings.xml +++ b/src/android/app/src/main/res/values-uk/strings.xml @@ -8,7 +8,6 @@ (Покращений) - (Пропуск) Система: Показати накладання статистики Налаштування diff --git a/src/android/app/src/main/res/values-vi/strings.xml b/src/android/app/src/main/res/values-vi/strings.xml index 8f861e3065..1d883e0e9a 100644 --- a/src/android/app/src/main/res/values-vi/strings.xml +++ b/src/android/app/src/main/res/values-vi/strings.xml @@ -8,7 +8,6 @@ (Nâng cao) - (Bỏ qua) Hệ thống: Hiển thị thống kê hiệu suất Tùy chỉnh diff --git a/src/android/app/src/main/res/values-zh-rCN/strings.xml b/src/android/app/src/main/res/values-zh-rCN/strings.xml index c2a69cc3aa..bfc7da1922 100644 --- a/src/android/app/src/main/res/values-zh-rCN/strings.xml +++ b/src/android/app/src/main/res/values-zh-rCN/strings.xml @@ -8,7 +8,6 @@ (增强) - (跳过) 系统: 显示性能统计悬浮窗 自定义 diff --git a/src/android/app/src/main/res/values-zh-rTW/strings.xml b/src/android/app/src/main/res/values-zh-rTW/strings.xml index b0da549dab..71030e941b 100644 --- a/src/android/app/src/main/res/values-zh-rTW/strings.xml +++ b/src/android/app/src/main/res/values-zh-rTW/strings.xml @@ -8,7 +8,6 @@ (增強) - (跳過) 系統: 顯示效能統計疊加層 自訂 diff --git a/src/android/app/src/main/res/values/arrays.xml b/src/android/app/src/main/res/values/arrays.xml index 04779469cc..e1db50c54e 100644 --- a/src/android/app/src/main/res/values/arrays.xml +++ b/src/android/app/src/main/res/values/arrays.xml @@ -21,6 +21,18 @@ 1 + + @string/memory_4gb + @string/memory_6gb + @string/memory_8gb + + + + 0 + 1 + 2 + + @string/language_brazilian_portuguese @string/language_british_english diff --git a/src/android/app/src/main/res/values/strings.xml b/src/android/app/src/main/res/values/strings.xml index 6a143e1a27..138957257c 100644 --- a/src/android/app/src/main/res/values/strings.xml +++ b/src/android/app/src/main/res/values/strings.xml @@ -11,9 +11,10 @@ (Enhanced) - (Skipping) + Building + Shader(s) System: - ShoW Performance Stats Overlay + Show Performance Stats Overlay Customization Visibility Overlay @@ -31,6 +32,8 @@ Display the amount of RAM used by the system Show Battery Temperature Display current Battery temperature in Celsius and Fahrenheit + Show Shaders Building + Display current number of shaders being built Overlay Position Choose where the performance stats overlay is displayed on the screen Top Left @@ -44,23 +47,35 @@ Eden’s Veil - Beyond default - Enhanced Frame Pacing - 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. + Experimental settings to improve performance and capability. These settings may cause black screens or other game issues. + Experimental Settings + 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. + + GPU Extensions Extended Dynamic State 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. - Synchronize Core Speed - Synchronize the core tick speed to the maximum speed percentage to improve performance without altering the game\'s actual speed. + Provoking Vertex + Improves lighting and vertex handling in certain games. Only supported on Vulkan 1.0+ GPUs. + Descriptor Indexing + 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. + + Renderer + Enhanced Frame Pacing + 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. Use Auto Stub Automatically stub missing services and functions. This may improve compatibility but can cause crashes and stability issues. Uninstall firmware Uninstalling the firmware will remove it from the device and may affect game compatibility. Uninstalling firmware Firmware uninstalled successfully - Provoking Vertex - Improves lighting and vertex handling in certain games. Only supported on Vulkan 1.0+ GPUs. - Descriptor Indexing - 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. + + Miscellaneous + Synchronize Core Speed + Synchronize the core tick speed to the maximum speed percentage to improve performance without altering the game\'s actual speed. + Enable LRU Cache + 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. + Memory Layout + (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. Shader Backend @@ -404,12 +419,18 @@ CPU CPU Debugging Puts the CPU in a slow debugging mode. + GPU API Graphics debugging Sets the graphics API to a slow debugging mode. Fastmem + Logging + Flush debug logs by line + Flushes debugging logs on each line written, making debugging easier in cases of crashing or freezing. + + Output engine Volume @@ -678,6 +699,11 @@ Korea Taiwan + + 4GB (Recommended) + 6GB (Unsafe) + 8GB (Unsafe) + 日本語 English @@ -749,10 +775,6 @@ 3X (2160p/3240p) (Slow) 4X (2880p/4320p) (Slow) - - Enable LRU Cache - 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. - Immediate (Off) Mailbox diff --git a/src/video_core/renderer_vulkan/renderer_vulkan.cpp b/src/video_core/renderer_vulkan/renderer_vulkan.cpp index 30f5ff7a75..dd22dadf42 100644 --- a/src/video_core/renderer_vulkan/renderer_vulkan.cpp +++ b/src/video_core/renderer_vulkan/renderer_vulkan.cpp @@ -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(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(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 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