diff --git a/cpmfile.json b/cpmfile.json index 1bb29afae4..c938e67e88 100644 --- a/cpmfile.json +++ b/cpmfile.json @@ -87,8 +87,8 @@ "bundled": true }, "llvm-mingw": { - "repo": "eden-emu/llvm-mingw", - "git_host": "git.eden-emu.dev", + "repo": "misc/llvm-mingw", + "git_host": "git.crueter.xyz", "tag": "%VERSION%", "version": "20250828", "artifact": "clang-rt-builtins.tar.zst", diff --git a/externals/cpmfile.json b/externals/cpmfile.json index d67348cd68..8209e431a3 100644 --- a/externals/cpmfile.json +++ b/externals/cpmfile.json @@ -246,13 +246,12 @@ }, "tzdb": { "package": "nx_tzdb", - "repo": "eden-emu/tzdb_to_nx", - "git_host": "git.eden-emu.dev", + "repo": "misc/tzdb_to_nx", + "git_host": "git.crueter.xyz", "artifact": "%VERSION%.tar.gz", "tag": "%VERSION%", - "hash": "cce65a12bf90f4ead43b24a0b95dfad77ac3d9bfbaaf66c55e6701346e7a1e44ca5d2f23f47ee35ee02271eb1082bf1762af207aad9fb236f1c8476812d008ed", - "version": "121125", - "git_version": "230326" + "hash": "dc37a189a44ce8b5c988ca550582431a6c7eadfd3c6e709bee6277116ee803e714333e85c9e6cbb5c69346a14d6f2cc7ed96e8aa09cc5fb8a89f945059651db6", + "version": "121125" }, "vulkan-headers": { "repo": "KhronosGroup/Vulkan-Headers", diff --git a/externals/renderdoc/renderdoc_app.h b/externals/renderdoc/renderdoc_app.h index c379f0ac40..e6c1511deb 100644 --- a/externals/renderdoc/renderdoc_app.h +++ b/externals/renderdoc/renderdoc_app.h @@ -7,7 +7,7 @@ /****************************************************************************** * The MIT License (MIT) * - * Copyright (c) 2015-2026 Baldur Karlsson + * Copyright (c) 2019-2025 Baldur Karlsson * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to deal @@ -72,10 +72,6 @@ extern "C" { // truncated version when only a uint64_t is available (e.g. Vulkan tags): #define RENDERDOC_ShaderDebugMagicValue_truncated 0x48656670eab25520ULL -// this is a magic value for vulkan user tags to indicate which dispatchable API objects are which -// for object annotations -#define RENDERDOC_APIObjectAnnotationHelper 0xfbb3b337b664d0adULL - ////////////////////////////////////////////////////////////////////////////////////////////////// // RenderDoc capture options // @@ -568,128 +564,6 @@ typedef uint32_t(RENDERDOC_CC *pRENDERDOC_DiscardFrameCapture)(RENDERDOC_DeviceP // multiple times only the last title will be used. typedef void(RENDERDOC_CC *pRENDERDOC_SetCaptureTitle)(const char *title); -// Annotations API: -// -// These functions allow you to specify annotations either on a per-command level, or a per-object -// level. -// -// Basic types of annotations are supported, as well as vector versions and references to API objects. -// -// The annotations are stored as keys, with the key being a dot-separated path allowing arbitrary -// nesting and user organisation. The keys are sorted in human order so `foo.2.bar` will be displayed -// before `foo.10.bar` to allow creation of arrays if desired. -// -// Deleting an annotation can be done by assigning an empty value to it. - -// the type of an annotation value, or Empty to delete an annotation -typedef enum RENDERDOC_AnnotationType -{ - eRENDERDOC_Empty, - eRENDERDOC_Bool, - eRENDERDOC_Int32, - eRENDERDOC_UInt32, - eRENDERDOC_Int64, - eRENDERDOC_UInt64, - eRENDERDOC_Float, - eRENDERDOC_Double, - eRENDERDOC_String, - eRENDERDOC_APIObject, - eRENDERDOC_AnnotationMax = 0x7FFFFFFF, -} RENDERDOC_AnnotationType; - -// a union with vector annotation value data -typedef union RENDERDOC_AnnotationVectorValue -{ - bool boolean[4]; - int32_t int32[4]; - int64_t int64[4]; - uint32_t uint32[4]; - uint64_t uint64[4]; - float float32[4]; - double float64[4]; -} RENDERDOC_AnnotationVectorValue; - -// a union with scalar annotation value data -typedef union RENDERDOC_AnnotationValue -{ - bool boolean; - int32_t int32; - int64_t int64; - uint32_t uint32; - uint64_t uint64; - float float32; - double float64; - - RENDERDOC_AnnotationVectorValue vector; - - const char *string; - void *apiObject; -} RENDERDOC_AnnotationValue; - -// a struct for specifying a GL object, as we don't have pointers we can use so instead we specify a -// pointer to this struct giving both the type and the name -typedef struct RENDERDOC_GLResourceReference -{ - // this is the same GLenum identifier as passed to glObjectLabel - uint32_t identifier; - uint32_t name; -} GLResourceReference; - -// simple C++ helpers to avoid the need for a temporary objects for value passing and GL object specification -#ifdef __cplusplus -struct RDGLObjectHelper -{ - RENDERDOC_GLResourceReference gl; - - RDGLObjectHelper(uint32_t identifier, uint32_t name) - { - gl.identifier = identifier; - gl.name = name; - } - - operator RENDERDOC_GLResourceReference *() { return ≷ } -}; - -struct RDAnnotationHelper -{ - RENDERDOC_AnnotationValue val; - - RDAnnotationHelper(bool b) { val.boolean = b; } - RDAnnotationHelper(int32_t i) { val.int32 = i; } - RDAnnotationHelper(int64_t i) { val.int64 = i; } - RDAnnotationHelper(uint32_t i) { val.uint32 = i; } - RDAnnotationHelper(uint64_t i) { val.uint64 = i; } - RDAnnotationHelper(float f) { val.float32 = f; } - RDAnnotationHelper(double d) { val.float64 = d; } - RDAnnotationHelper(const char *s) { val.string = s; } - - operator RENDERDOC_AnnotationValue *() { return &val; } -}; -#endif - -// The device is specified in the same way as other API calls that take a RENDERDOC_DevicePointer -// to specify the device. -// -// The object or queue/commandbuffer will depend on the graphics API in question. -// -// Return value: -// 0 - The annotation was applied successfully. -// 1 - The device is unknown/invalid -// 2 - The device is valid but the annotation is not supported for API-specific reasons, such as an -// unrecognised or invalid object or queue/commandbuffer -// 3 - The call is ill-formed or invalid e.g. empty is specified with a value pointer, or non-empty -// is specified with a NULL value pointer -typedef uint32_t(RENDERDOC_CC *pRENDERDOC_SetObjectAnnotation)(RENDERDOC_DevicePointer device, - void *object, const char *key, - RENDERDOC_AnnotationType valueType, - uint32_t valueVectorWidth, - const RENDERDOC_AnnotationValue *value); - -typedef uint32_t(RENDERDOC_CC *pRENDERDOC_SetCommandAnnotation)( - RENDERDOC_DevicePointer device, void *queueOrCommandBuffer, const char *key, - RENDERDOC_AnnotationType valueType, uint32_t valueVectorWidth, - const RENDERDOC_AnnotationValue *value); - ////////////////////////////////////////////////////////////////////////////////////////////////// // RenderDoc API versions // @@ -718,7 +592,6 @@ typedef enum RENDERDOC_Version eRENDERDOC_API_Version_1_4_2 = 10402, // RENDERDOC_API_1_4_2 = 1 04 02 eRENDERDOC_API_Version_1_5_0 = 10500, // RENDERDOC_API_1_5_0 = 1 05 00 eRENDERDOC_API_Version_1_6_0 = 10600, // RENDERDOC_API_1_6_0 = 1 06 00 - eRENDERDOC_API_Version_1_7_0 = 10700, // RENDERDOC_API_1_7_0 = 1 07 00 } RENDERDOC_Version; // API version changelog: @@ -749,10 +622,8 @@ typedef enum RENDERDOC_Version // 1.5.0 - Added feature: ShowReplayUI() to request that the replay UI show itself if connected // 1.6.0 - Added feature: SetCaptureTitle() which can be used to set a title for a // capture made with StartFrameCapture() or EndFrameCapture() -// 1.7.0 - Added feature: SetObjectAnnotation() / SetCommandAnnotation() for adding rich -// annotations to objects and command streams -typedef struct RENDERDOC_API_1_7_0 +typedef struct RENDERDOC_API_1_6_0 { pRENDERDOC_GetAPIVersion GetAPIVersion; @@ -830,25 +701,20 @@ typedef struct RENDERDOC_API_1_7_0 // new function in 1.6.0 pRENDERDOC_SetCaptureTitle SetCaptureTitle; +} RENDERDOC_API_1_6_0; - // new functions in 1.7.0 - pRENDERDOC_SetObjectAnnotation SetObjectAnnotation; - pRENDERDOC_SetCommandAnnotation SetCommandAnnotation; -} RENDERDOC_API_1_7_0; - -typedef RENDERDOC_API_1_7_0 RENDERDOC_API_1_0_0; -typedef RENDERDOC_API_1_7_0 RENDERDOC_API_1_0_1; -typedef RENDERDOC_API_1_7_0 RENDERDOC_API_1_0_2; -typedef RENDERDOC_API_1_7_0 RENDERDOC_API_1_1_0; -typedef RENDERDOC_API_1_7_0 RENDERDOC_API_1_1_1; -typedef RENDERDOC_API_1_7_0 RENDERDOC_API_1_1_2; -typedef RENDERDOC_API_1_7_0 RENDERDOC_API_1_2_0; -typedef RENDERDOC_API_1_7_0 RENDERDOC_API_1_3_0; -typedef RENDERDOC_API_1_7_0 RENDERDOC_API_1_4_0; -typedef RENDERDOC_API_1_7_0 RENDERDOC_API_1_4_1; -typedef RENDERDOC_API_1_7_0 RENDERDOC_API_1_4_2; -typedef RENDERDOC_API_1_7_0 RENDERDOC_API_1_5_0; -typedef RENDERDOC_API_1_7_0 RENDERDOC_API_1_6_0; +typedef RENDERDOC_API_1_6_0 RENDERDOC_API_1_0_0; +typedef RENDERDOC_API_1_6_0 RENDERDOC_API_1_0_1; +typedef RENDERDOC_API_1_6_0 RENDERDOC_API_1_0_2; +typedef RENDERDOC_API_1_6_0 RENDERDOC_API_1_1_0; +typedef RENDERDOC_API_1_6_0 RENDERDOC_API_1_1_1; +typedef RENDERDOC_API_1_6_0 RENDERDOC_API_1_1_2; +typedef RENDERDOC_API_1_6_0 RENDERDOC_API_1_2_0; +typedef RENDERDOC_API_1_6_0 RENDERDOC_API_1_3_0; +typedef RENDERDOC_API_1_6_0 RENDERDOC_API_1_4_0; +typedef RENDERDOC_API_1_6_0 RENDERDOC_API_1_4_1; +typedef RENDERDOC_API_1_6_0 RENDERDOC_API_1_4_2; +typedef RENDERDOC_API_1_6_0 RENDERDOC_API_1_5_0; ////////////////////////////////////////////////////////////////////////////////////////////////// // RenderDoc API entry point diff --git a/src/android/app/src/main/java/org/yuzu/yuzu_emu/dialogs/ChatDialog.kt b/src/android/app/src/main/java/org/yuzu/yuzu_emu/dialogs/ChatDialog.kt index 431125ca8e..5d6679bd28 100644 --- a/src/android/app/src/main/java/org/yuzu/yuzu_emu/dialogs/ChatDialog.kt +++ b/src/android/app/src/main/java/org/yuzu/yuzu_emu/dialogs/ChatDialog.kt @@ -1,4 +1,4 @@ -// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project +// SPDX-FileCopyrightText: Copyright 2025 Eden Emulator Project // SPDX-License-Identifier: GPL-3.0-or-later package org.yuzu.yuzu_emu.dialogs @@ -20,8 +20,6 @@ import org.yuzu.yuzu_emu.databinding.DialogChatBinding import org.yuzu.yuzu_emu.databinding.ItemChatMessageBinding import org.yuzu.yuzu_emu.features.settings.model.StringSetting import org.yuzu.yuzu_emu.network.NetPlayManager -import org.yuzu.yuzu_emu.utils.CompatUtils -import org.yuzu.yuzu_emu.utils.FullscreenHelper import java.text.SimpleDateFormat import java.util.* @@ -36,13 +34,6 @@ class ChatDialog(context: Context) : BottomSheetDialog(context) { private lateinit var binding: DialogChatBinding private lateinit var chatAdapter: ChatAdapter private val handler = Handler(Looper.getMainLooper()) - private val hideSystemBars: Boolean by lazy { - runCatching { - FullscreenHelper.shouldHideSystemBars(CompatUtils.findActivity(context)) - }.getOrElse { - FullscreenHelper.isFullscreenEnabled(context) - } - } // TODO(alekpop, crueter): Top drawer for message notifications, perhaps use system notifs? // TODO(alekpop, crueter): Context menu actions for chat users @@ -50,7 +41,6 @@ class ChatDialog(context: Context) : BottomSheetDialog(context) { @SuppressLint("NotifyDataSetChanged") override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) - setOnShowListener { applyFullscreenMode() } binding = DialogChatBinding.inflate(LayoutInflater.from(context)) setContentView(binding.root) @@ -85,11 +75,6 @@ class ChatDialog(context: Context) : BottomSheetDialog(context) { } } - override fun onStart() { - super.onStart() - applyFullscreenMode() - } - override fun dismiss() { NetPlayManager.setChatOpen(false) super.dismiss() @@ -123,12 +108,6 @@ class ChatDialog(context: Context) : BottomSheetDialog(context) { private fun scrollToBottom() { binding.chatRecyclerView.scrollToPosition(chatAdapter.itemCount - 1) } - - private fun applyFullscreenMode() { - window?.let { window -> - FullscreenHelper.applyToWindow(window, hideSystemBars) - } - } } class ChatAdapter(private val messages: List) : diff --git a/src/android/app/src/main/java/org/yuzu/yuzu_emu/dialogs/LobbyBrowser.kt b/src/android/app/src/main/java/org/yuzu/yuzu_emu/dialogs/LobbyBrowser.kt index 10ff2da6c7..6d5c6ef23f 100644 --- a/src/android/app/src/main/java/org/yuzu/yuzu_emu/dialogs/LobbyBrowser.kt +++ b/src/android/app/src/main/java/org/yuzu/yuzu_emu/dialogs/LobbyBrowser.kt @@ -31,25 +31,15 @@ import org.yuzu.yuzu_emu.databinding.DialogLobbyBrowserBinding import org.yuzu.yuzu_emu.databinding.ItemLobbyRoomBinding import org.yuzu.yuzu_emu.features.settings.model.StringSetting import org.yuzu.yuzu_emu.network.NetPlayManager -import org.yuzu.yuzu_emu.utils.CompatUtils -import org.yuzu.yuzu_emu.utils.FullscreenHelper import java.util.Locale class LobbyBrowser(context: Context) : BottomSheetDialog(context) { private lateinit var binding: DialogLobbyBrowserBinding private lateinit var adapter: LobbyRoomAdapter private val handler = Handler(Looper.getMainLooper()) - private val hideSystemBars: Boolean by lazy { - runCatching { - FullscreenHelper.shouldHideSystemBars(CompatUtils.findActivity(context)) - }.getOrElse { - FullscreenHelper.isFullscreenEnabled(context) - } - } override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) - setOnShowListener { applyFullscreenMode() } behavior.state = BottomSheetBehavior.STATE_EXPANDED behavior.skipCollapsed = @@ -91,7 +81,6 @@ class LobbyBrowser(context: Context) : BottomSheetDialog(context) { behavior.expandedOffset = 0 behavior.skipCollapsed = true behavior.state = BottomSheetBehavior.STATE_EXPANDED - applyFullscreenMode() } private fun setupRecyclerView() { @@ -285,10 +274,4 @@ class LobbyBrowser(context: Context) : BottomSheetDialog(context) { } private inner class ScoreItem(val score: Double, val item: NetPlayManager.RoomInfo) - - private fun applyFullscreenMode() { - window?.let { window -> - FullscreenHelper.applyToWindow(window, hideSystemBars) - } - } } diff --git a/src/android/app/src/main/java/org/yuzu/yuzu_emu/dialogs/NetPlayDialog.kt b/src/android/app/src/main/java/org/yuzu/yuzu_emu/dialogs/NetPlayDialog.kt index 45ce5fb0cf..73452b4b69 100644 --- a/src/android/app/src/main/java/org/yuzu/yuzu_emu/dialogs/NetPlayDialog.kt +++ b/src/android/app/src/main/java/org/yuzu/yuzu_emu/dialogs/NetPlayDialog.kt @@ -1,4 +1,4 @@ -// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project +// SPDX-FileCopyrightText: Copyright 2025 Eden Emulator Project // SPDX-License-Identifier: GPL-3.0-or-later package org.yuzu.yuzu_emu.dialogs @@ -36,7 +36,6 @@ import org.yuzu.yuzu_emu.features.settings.model.StringSetting import org.yuzu.yuzu_emu.network.NetDataValidators import org.yuzu.yuzu_emu.network.NetPlayManager import org.yuzu.yuzu_emu.utils.CompatUtils -import org.yuzu.yuzu_emu.utils.FullscreenHelper import org.yuzu.yuzu_emu.utils.GameHelper class NetPlayDialog(context: Context) : BottomSheetDialog(context) { @@ -44,17 +43,9 @@ class NetPlayDialog(context: Context) : BottomSheetDialog(context) { private val gameNameList: MutableList> = mutableListOf() private val gameIdList: MutableList> = mutableListOf() - private val hideSystemBars: Boolean by lazy { - runCatching { - FullscreenHelper.shouldHideSystemBars(CompatUtils.findActivity(context)) - }.getOrElse { - FullscreenHelper.isFullscreenEnabled(context) - } - } override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) - setOnShowListener { applyFullscreenMode() } behavior.state = BottomSheetBehavior.STATE_EXPANDED behavior.state = BottomSheetBehavior.STATE_EXPANDED @@ -127,11 +118,6 @@ class NetPlayDialog(context: Context) : BottomSheetDialog(context) { } } - override fun onStart() { - super.onStart() - applyFullscreenMode() - } - data class NetPlayItems( val option: Int, val name: String, @@ -366,11 +352,6 @@ class NetPlayDialog(context: Context) : BottomSheetDialog(context) { TextValidatorWatcher.validStates.clear() val activity = CompatUtils.findActivity(context) val dialog = BottomSheetDialog(activity) - dialog.setOnShowListener { - dialog.window?.let { window -> - FullscreenHelper.applyToWindow(window, hideSystemBars) - } - } dialog.behavior.state = BottomSheetBehavior.STATE_EXPANDED dialog.behavior.state = BottomSheetBehavior.STATE_EXPANDED @@ -601,12 +582,6 @@ class NetPlayDialog(context: Context) : BottomSheetDialog(context) { dialog.show() } - private fun applyFullscreenMode() { - window?.let { window -> - FullscreenHelper.applyToWindow(window, hideSystemBars) - } - } - private fun showModerationDialog() { val activity = CompatUtils.findActivity(context) val dialog = MaterialAlertDialogBuilder(activity) 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 b438812d58..0f89533d8e 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 @@ -104,8 +104,6 @@ object Settings { const val PREF_THEME_MODE = "ThemeMode" const val PREF_BLACK_BACKGROUNDS = "BlackBackgrounds" const val PREF_STATIC_THEME_COLOR = "StaticThemeColor" - const val PREF_APP_FULLSCREEN = "AppFullscreen" - const val APP_FULLSCREEN_DEFAULT = false enum class EmulationOrientation(val int: Int) { Unspecified(0), 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 6f25856cbf..a20858f0a9 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 @@ -670,6 +670,15 @@ abstract class SettingsItem( valuesId = R.array.dmaAccuracyValues ) ) + put( + SingleChoiceSetting( + IntSetting.FRAME_PACING_MODE, + titleId = R.string.frame_pacing_mode, + descriptionId = R.string.frame_pacing_mode_description, + choicesId = R.array.framePacingModeNames, + valuesId = R.array.framePacingModeValues + ) + ) put( SwitchSetting( BooleanSetting.RENDERER_ASYNCHRONOUS_SHADERS, diff --git a/src/android/app/src/main/java/org/yuzu/yuzu_emu/features/settings/ui/SettingsActivity.kt b/src/android/app/src/main/java/org/yuzu/yuzu_emu/features/settings/ui/SettingsActivity.kt index ad1ecba64c..d33bbc3d7d 100644 --- a/src/android/app/src/main/java/org/yuzu/yuzu_emu/features/settings/ui/SettingsActivity.kt +++ b/src/android/app/src/main/java/org/yuzu/yuzu_emu/features/settings/ui/SettingsActivity.kt @@ -103,7 +103,6 @@ class SettingsActivity : AppCompatActivity() { ) setInsets() - applyFullscreenPreference() } fun navigateBack() { @@ -123,18 +122,6 @@ class SettingsActivity : AppCompatActivity() { } } - override fun onResume() { - super.onResume() - applyFullscreenPreference() - } - - override fun onWindowFocusChanged(hasFocus: Boolean) { - super.onWindowFocusChanged(hasFocus) - if (hasFocus) { - applyFullscreenPreference() - } - } - override fun onStop() { super.onStop() Log.info("[SettingsActivity] Settings activity stopping. Saving settings to INI...") @@ -201,8 +188,4 @@ class SettingsActivity : AppCompatActivity() { windowInsets } } - - private fun applyFullscreenPreference() { - FullscreenHelper.applyToActivity(this) - } } 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 060a6fe9ae..ff25584c92 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 @@ -29,8 +29,6 @@ import org.yuzu.yuzu_emu.features.settings.model.view.* import org.yuzu.yuzu_emu.utils.InputHandler import org.yuzu.yuzu_emu.utils.NativeConfig import org.yuzu.yuzu_emu.utils.DirectoryInitialization -import org.yuzu.yuzu_emu.utils.FullscreenHelper -import androidx.core.content.edit import androidx.fragment.app.FragmentActivity import org.yuzu.yuzu_emu.fragments.MessageDialogFragment @@ -256,6 +254,7 @@ class SettingsFragmentPresenter( add(IntSetting.RENDERER_ACCURACY.key) add(IntSetting.DMA_ACCURACY.key) + add(IntSetting.FRAME_PACING_MODE.key) add(IntSetting.MAX_ANISOTROPY.key) add(IntSetting.RENDERER_VRAM_USAGE_MODE.key) add(IntSetting.RENDERER_ASTC_DECODE_METHOD.key) @@ -1188,39 +1187,6 @@ class SettingsFragmentPresenter( ) ) - val fullscreenSetting: AbstractBooleanSetting = object : AbstractBooleanSetting { - override fun getBoolean(needsGlobal: Boolean): Boolean = - FullscreenHelper.isFullscreenEnabled(context) - - override fun setBoolean(value: Boolean) { - FullscreenHelper.setFullscreenEnabled(context, value) - settingsViewModel.setShouldRecreate(true) - } - - override val key: String = Settings.PREF_APP_FULLSCREEN - override val isRuntimeModifiable: Boolean = true - override val pairedSettingKey: String = "" - override val isSwitchable: Boolean = false - override var global: Boolean = true - override val isSaveable: Boolean = true - override val defaultValue: Boolean = Settings.APP_FULLSCREEN_DEFAULT - - override fun getValueAsString(needsGlobal: Boolean): String = - getBoolean(needsGlobal).toString() - - override fun reset() { - setBoolean(defaultValue) - } - } - - add( - SwitchSetting( - fullscreenSetting, - titleId = R.string.fullscreen_mode, - descriptionId = R.string.fullscreen_mode_description - ) - ) - add(HeaderSetting(R.string.buttons)) add(BooleanSetting.ENABLE_FOLDER_BUTTON.key) add(BooleanSetting.ENABLE_QLAUNCH_BUTTON.key) diff --git a/src/android/app/src/main/java/org/yuzu/yuzu_emu/features/settings/ui/SettingsSubscreenActivity.kt b/src/android/app/src/main/java/org/yuzu/yuzu_emu/features/settings/ui/SettingsSubscreenActivity.kt index 91888dce12..11ecd355fb 100644 --- a/src/android/app/src/main/java/org/yuzu/yuzu_emu/features/settings/ui/SettingsSubscreenActivity.kt +++ b/src/android/app/src/main/java/org/yuzu/yuzu_emu/features/settings/ui/SettingsSubscreenActivity.kt @@ -20,7 +20,6 @@ import org.yuzu.yuzu_emu.R import org.yuzu.yuzu_emu.YuzuApplication import org.yuzu.yuzu_emu.databinding.ActivitySettingsBinding import org.yuzu.yuzu_emu.utils.DirectoryInitialization -import org.yuzu.yuzu_emu.utils.FullscreenHelper import org.yuzu.yuzu_emu.utils.InsetsHelper import org.yuzu.yuzu_emu.utils.ThemeHelper @@ -90,7 +89,6 @@ class SettingsSubscreenActivity : AppCompatActivity() { ) setInsets() - applyFullscreenPreference() } override fun onStart() { @@ -100,18 +98,6 @@ class SettingsSubscreenActivity : AppCompatActivity() { } } - override fun onResume() { - super.onResume() - applyFullscreenPreference() - } - - override fun onWindowFocusChanged(hasFocus: Boolean) { - super.onWindowFocusChanged(hasFocus) - if (hasFocus) { - applyFullscreenPreference() - } - } - fun navigateBack() { val navHostFragment = supportFragmentManager.findFragmentById(R.id.fragment_container) as NavHostFragment @@ -163,8 +149,4 @@ class SettingsSubscreenActivity : AppCompatActivity() { windowInsets } } - - private fun applyFullscreenPreference() { - FullscreenHelper.applyToActivity(this) - } } diff --git a/src/android/app/src/main/java/org/yuzu/yuzu_emu/fragments/DriverManagerFragment.kt b/src/android/app/src/main/java/org/yuzu/yuzu_emu/fragments/DriverManagerFragment.kt index 3aa55522e6..877097dc80 100644 --- a/src/android/app/src/main/java/org/yuzu/yuzu_emu/fragments/DriverManagerFragment.kt +++ b/src/android/app/src/main/java/org/yuzu/yuzu_emu/fragments/DriverManagerFragment.kt @@ -29,6 +29,7 @@ import org.yuzu.yuzu_emu.databinding.FragmentDriverManagerBinding import org.yuzu.yuzu_emu.features.settings.model.Settings import org.yuzu.yuzu_emu.features.settings.model.StringSetting import org.yuzu.yuzu_emu.features.settings.ui.SettingsSubscreen +import org.yuzu.yuzu_emu.model.Driver.Companion.toDriver import org.yuzu.yuzu_emu.model.DriverViewModel import org.yuzu.yuzu_emu.model.HomeViewModel import org.yuzu.yuzu_emu.utils.FileUtil @@ -215,23 +216,19 @@ class DriverManagerFragment : Fragment() { val driverData = GpuDriverHelper.getMetadataFromZip(driverFile) val driverInList = - driverViewModel.driverData.firstOrNull { - it.first == driverPath || it.second == driverData - } + driverViewModel.driverData.firstOrNull { it.second == driverData } if (driverInList != null) { return@newInstance getString(R.string.driver_already_installed) } else { driverViewModel.onDriverAdded(Pair(driverPath, driverData)) withContext(Dispatchers.Main) { if (_binding != null) { - refreshDriverList() val adapter = binding.listDrivers.adapter as DriverAdapter - val selectedPosition = adapter.currentList - .indexOfFirst { it.selected } - .let { if (it == -1) 0 else it } + adapter.addItem(driverData.toDriver()) + adapter.selectItem(adapter.currentList.indices.last) driverViewModel.showClearButton(!StringSetting.DRIVER_PATH.global) binding.listDrivers - .smoothScrollToPosition(selectedPosition) + .smoothScrollToPosition(adapter.currentList.indices.last) } } } diff --git a/src/android/app/src/main/java/org/yuzu/yuzu_emu/fragments/ProfileManagerFragment.kt b/src/android/app/src/main/java/org/yuzu/yuzu_emu/fragments/ProfileManagerFragment.kt index bd37c4c9c7..2786906f6b 100644 --- a/src/android/app/src/main/java/org/yuzu/yuzu_emu/fragments/ProfileManagerFragment.kt +++ b/src/android/app/src/main/java/org/yuzu/yuzu_emu/fragments/ProfileManagerFragment.kt @@ -9,7 +9,6 @@ import android.view.View import android.view.ViewGroup import androidx.core.view.ViewCompat import androidx.core.view.WindowInsetsCompat -import androidx.core.view.updatePadding import androidx.fragment.app.Fragment import androidx.fragment.app.activityViewModels import androidx.navigation.fragment.findNavController @@ -23,7 +22,6 @@ import org.yuzu.yuzu_emu.databinding.FragmentProfileManagerBinding import org.yuzu.yuzu_emu.model.HomeViewModel import org.yuzu.yuzu_emu.model.UserProfile import org.yuzu.yuzu_emu.utils.NativeConfig -import org.yuzu.yuzu_emu.utils.ViewUtils.updateMargins class ProfileManagerFragment : Fragment() { private var _binding: FragmentProfileManagerBinding? = null @@ -174,19 +172,11 @@ class ProfileManagerFragment : Fragment() { val leftInsets = barInsets.left + cutoutInsets.left val rightInsets = barInsets.right + cutoutInsets.right - binding.toolbarProfiles.updateMargins(left = leftInsets, right = rightInsets) - binding.listProfiles.updateMargins(left = leftInsets, right = rightInsets) - binding.listProfiles.updatePadding( - bottom = barInsets.bottom + - resources.getDimensionPixelSize(R.dimen.spacing_bottom_list_fab) - ) - - val fabSpacing = resources.getDimensionPixelSize(R.dimen.spacing_fab) - binding.buttonAddUser.updateMargins( - left = leftInsets + fabSpacing, - right = rightInsets + fabSpacing, - bottom = barInsets.bottom + fabSpacing - ) + val fabLayoutParams = binding.buttonAddUser.layoutParams as ViewGroup.MarginLayoutParams + fabLayoutParams.leftMargin = leftInsets + 24 + fabLayoutParams.rightMargin = rightInsets + 24 + fabLayoutParams.bottomMargin = barInsets.bottom + 24 + binding.buttonAddUser.layoutParams = fabLayoutParams windowInsets } diff --git a/src/android/app/src/main/java/org/yuzu/yuzu_emu/model/DriverViewModel.kt b/src/android/app/src/main/java/org/yuzu/yuzu_emu/model/DriverViewModel.kt index 3904f83279..fc7fbc9bfc 100644 --- a/src/android/app/src/main/java/org/yuzu/yuzu_emu/model/DriverViewModel.kt +++ b/src/android/app/src/main/java/org/yuzu/yuzu_emu/model/DriverViewModel.kt @@ -154,30 +154,15 @@ class DriverViewModel : ViewModel() { } fun onDriverRemoved(removedPosition: Int, selectedPosition: Int) { - val driverIndex = removedPosition - 1 - if (driverIndex !in driverData.indices) { - updateDriverList() - return - } - - driversToDelete.add(driverData[driverIndex].first) - driverData.removeAt(driverIndex) - val safeSelectedPosition = selectedPosition.coerceIn(0, driverData.size) - onDriverSelected(safeSelectedPosition) + driversToDelete.add(driverData[removedPosition - 1].first) + driverData.removeAt(removedPosition - 1) + onDriverSelected(selectedPosition) } fun onDriverAdded(driver: Pair) { if (driversToDelete.contains(driver.first)) { driversToDelete.remove(driver.first) } - - val existingDriverIndex = driverData.indexOfFirst { - it.first == driver.first || it.second == driver.second - } - if (existingDriverIndex != -1) { - onDriverSelected(existingDriverIndex + 1) - return - } driverData.add(driver) onDriverSelected(driverData.size) } diff --git a/src/android/app/src/main/java/org/yuzu/yuzu_emu/ui/main/MainActivity.kt b/src/android/app/src/main/java/org/yuzu/yuzu_emu/ui/main/MainActivity.kt index 584322df50..3a771edfcb 100644 --- a/src/android/app/src/main/java/org/yuzu/yuzu_emu/ui/main/MainActivity.kt +++ b/src/android/app/src/main/java/org/yuzu/yuzu_emu/ui/main/MainActivity.kt @@ -86,6 +86,8 @@ class MainActivity : AppCompatActivity(), ThemeProvider { binding = ActivityMainBinding.inflate(layoutInflater) + // Since Android 15, google automatically forces "games" to be 60 hrz + // This ensures the display's max refresh rate is actually used display?.let { val supportedModes = it.supportedModes val maxRefreshRate = supportedModes.maxByOrNull { mode -> mode.refreshRate } @@ -167,7 +169,6 @@ class MainActivity : AppCompatActivity(), ThemeProvider { checkForUpdates() } setInsets() - applyFullscreenPreference() } private fun checkForUpdates() { @@ -344,14 +345,6 @@ class MainActivity : AppCompatActivity(), ThemeProvider { override fun onResume() { ThemeHelper.setCorrectTheme(this) super.onResume() - applyFullscreenPreference() - } - - override fun onWindowFocusChanged(hasFocus: Boolean) { - super.onWindowFocusChanged(hasFocus) - if (hasFocus) { - applyFullscreenPreference() - } } private fun setInsets() = ViewCompat.setOnApplyWindowInsetsListener( @@ -371,10 +364,6 @@ class MainActivity : AppCompatActivity(), ThemeProvider { windowInsets } - private fun applyFullscreenPreference() { - FullscreenHelper.applyToActivity(this) - } - override fun setTheme(resId: Int) { super.setTheme(resId) themeId = resId diff --git a/src/android/app/src/main/java/org/yuzu/yuzu_emu/utils/FullscreenHelper.kt b/src/android/app/src/main/java/org/yuzu/yuzu_emu/utils/FullscreenHelper.kt deleted file mode 100644 index 62c83e1806..0000000000 --- a/src/android/app/src/main/java/org/yuzu/yuzu_emu/utils/FullscreenHelper.kt +++ /dev/null @@ -1,52 +0,0 @@ -// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project -// SPDX-License-Identifier: GPL-3.0-or-later - -package org.yuzu.yuzu_emu.utils - -import android.app.Activity -import android.content.Context -import android.view.Window -import androidx.core.content.edit -import androidx.core.view.ViewCompat -import androidx.core.view.WindowInsetsCompat -import androidx.core.view.WindowInsetsControllerCompat -import androidx.preference.PreferenceManager -import org.yuzu.yuzu_emu.features.settings.model.Settings - -object FullscreenHelper { - fun isFullscreenEnabled(context: Context): Boolean { - return PreferenceManager.getDefaultSharedPreferences(context).getBoolean( - Settings.PREF_APP_FULLSCREEN, - Settings.APP_FULLSCREEN_DEFAULT - ) - } - - fun setFullscreenEnabled(context: Context, enabled: Boolean) { - PreferenceManager.getDefaultSharedPreferences(context).edit { - putBoolean(Settings.PREF_APP_FULLSCREEN, enabled) - } - } - - fun shouldHideSystemBars(activity: Activity): Boolean { - val rootInsets = ViewCompat.getRootWindowInsets(activity.window.decorView) - val barsCurrentlyHidden = - rootInsets?.isVisible(WindowInsetsCompat.Type.systemBars())?.not() ?: false - return isFullscreenEnabled(activity) || barsCurrentlyHidden - } - - fun applyToWindow(window: Window, hideSystemBars: Boolean) { - val controller = WindowInsetsControllerCompat(window, window.decorView) - - if (hideSystemBars) { - controller.hide(WindowInsetsCompat.Type.systemBars()) - controller.systemBarsBehavior = - WindowInsetsControllerCompat.BEHAVIOR_SHOW_TRANSIENT_BARS_BY_SWIPE - } else { - controller.show(WindowInsetsCompat.Type.systemBars()) - } - } - - fun applyToActivity(activity: Activity) { - applyToWindow(activity.window, isFullscreenEnabled(activity)) - } -} diff --git a/src/android/app/src/main/jni/emu_window/emu_window.cpp b/src/android/app/src/main/jni/emu_window/emu_window.cpp index 6886dac172..4e6fd560f4 100644 --- a/src/android/app/src/main/jni/emu_window/emu_window.cpp +++ b/src/android/app/src/main/jni/emu_window/emu_window.cpp @@ -6,15 +6,8 @@ #include -#include -#include -#include -#include -#include - #include "common/android/id_cache.h" #include "common/logging.h" -#include "common/settings.h" #include "input_common/drivers/android.h" #include "input_common/drivers/touch_screen.h" #include "input_common/drivers/virtual_amiibo.h" @@ -29,12 +22,6 @@ void EmuWindow_Android::OnSurfaceChanged(ANativeWindow* surface) { m_window_width = 0; m_window_height = 0; window_info.render_surface = nullptr; - m_last_frame_rate_hint = -1.0f; - m_pending_frame_rate_hint = -1.0f; - m_pending_frame_rate_hint_votes = 0; - m_smoothed_present_rate = 0.0f; - m_last_frame_display_time = {}; - m_pending_frame_rate_since = {}; return; } @@ -45,7 +32,6 @@ void EmuWindow_Android::OnSurfaceChanged(ANativeWindow* surface) { UpdateCurrentFramebufferLayout(m_window_width, m_window_height); window_info.render_surface = reinterpret_cast(surface); - UpdateFrameRateHint(); } void EmuWindow_Android::OnTouchPressed(int id, float x, float y) { @@ -65,9 +51,6 @@ void EmuWindow_Android::OnTouchReleased(int id) { } void EmuWindow_Android::OnFrameDisplayed() { - UpdateObservedFrameRate(); - UpdateFrameRateHint(); - if (!m_first_frame) { Common::Android::RunJNIOnFiber( [&](JNIEnv* env) { EmulationSession::GetInstance().OnEmulationStarted(); }); @@ -75,175 +58,6 @@ void EmuWindow_Android::OnFrameDisplayed() { } } -void EmuWindow_Android::UpdateObservedFrameRate() { - const auto now = Clock::now(); - if (m_last_frame_display_time.time_since_epoch().count() != 0) { - const auto frame_time = std::chrono::duration(now - m_last_frame_display_time); - const float seconds = frame_time.count(); - if (seconds > 0.0f) { - const float instantaneous_rate = 1.0f / seconds; - if (std::isfinite(instantaneous_rate) && instantaneous_rate >= 1.0f && - instantaneous_rate <= 240.0f) { - constexpr float SmoothingFactor = 0.15f; - if (m_smoothed_present_rate <= 0.0f) { - m_smoothed_present_rate = instantaneous_rate; - } else { - m_smoothed_present_rate += - (instantaneous_rate - m_smoothed_present_rate) * SmoothingFactor; - } - } - } - } - m_last_frame_display_time = now; -} - -float EmuWindow_Android::QuantizeFrameRateHint(float frame_rate) { - if (!std::isfinite(frame_rate) || frame_rate <= 0.0f) { - return 0.0f; - } - - frame_rate = std::clamp(frame_rate, 1.0f, 240.0f); - - constexpr float Step = 0.5f; - return std::round(frame_rate / Step) * Step; -} - -float EmuWindow_Android::GetFrameTimeVerifiedHint() const { - if (!EmulationSession::GetInstance().IsRunning()) { - return 0.0f; - } - - const double frame_time_scale = - EmulationSession::GetInstance().System().GetPerfStats().GetLastFrameTimeScale(); - if (!std::isfinite(frame_time_scale) || frame_time_scale <= 0.0) { - return 0.0f; - } - - const float verified_rate = - std::clamp(60.0f / static_cast(frame_time_scale), 0.0f, 240.0f); - return QuantizeFrameRateHint(verified_rate); -} - -float EmuWindow_Android::GetFrameRateHint() const { - const float observed_rate = std::clamp(m_smoothed_present_rate, 0.0f, 240.0f); - const float frame_time_verified_hint = GetFrameTimeVerifiedHint(); - - if (m_last_frame_rate_hint > 0.0f && observed_rate > 0.0f) { - const float tolerance = std::max(m_last_frame_rate_hint * 0.12f, 4.0f); - if (std::fabs(observed_rate - m_last_frame_rate_hint) <= tolerance) { - return m_last_frame_rate_hint; - } - } - - const float observed_hint = QuantizeFrameRateHint(observed_rate); - if (observed_hint > 0.0f) { - if (frame_time_verified_hint > 0.0f) { - const float tolerance = std::max(observed_hint * 0.20f, 3.0f); - if (std::fabs(observed_hint - frame_time_verified_hint) <= tolerance) { - return QuantizeFrameRateHint((observed_hint + frame_time_verified_hint) * 0.5f); - } - } - return observed_hint; - } - - if (frame_time_verified_hint > 0.0f) { - return frame_time_verified_hint; - } - - constexpr float NominalFrameRate = 60.0f; - if (!Settings::values.use_speed_limit.GetValue()) { - return NominalFrameRate; - } - - const u16 speed_limit = Settings::SpeedLimit(); - if (speed_limit == 0) { - return 0.0f; - } - - const float speed_limited_rate = - NominalFrameRate * (static_cast(std::min(speed_limit, 100)) / 100.0f); - return QuantizeFrameRateHint(speed_limited_rate); -} - -void EmuWindow_Android::UpdateFrameRateHint() { - auto* const surface = reinterpret_cast(window_info.render_surface); - if (!surface) { - return; - } - - const auto now = Clock::now(); - const float frame_rate_hint = GetFrameRateHint(); - if (std::fabs(frame_rate_hint - m_last_frame_rate_hint) < 0.01f) { - m_pending_frame_rate_hint = frame_rate_hint; - m_pending_frame_rate_hint_votes = 0; - m_pending_frame_rate_since = {}; - return; - } - - if (frame_rate_hint == 0.0f) { - m_pending_frame_rate_hint = frame_rate_hint; - m_pending_frame_rate_hint_votes = 0; - m_pending_frame_rate_since = now; - } else if (m_last_frame_rate_hint >= 0.0f) { - if (std::fabs(frame_rate_hint - m_pending_frame_rate_hint) >= 0.01f) { - m_pending_frame_rate_hint = frame_rate_hint; - m_pending_frame_rate_hint_votes = 1; - m_pending_frame_rate_since = now; - return; - } - - ++m_pending_frame_rate_hint_votes; - if (m_pending_frame_rate_since.time_since_epoch().count() == 0) { - m_pending_frame_rate_since = now; - } - - const auto stable_for = now - m_pending_frame_rate_since; - const float reference_rate = std::max(frame_rate_hint, 1.0f); - const auto stable_duration = std::chrono::duration_cast( - std::chrono::duration(std::clamp(3.0f / reference_rate, 0.15f, 0.40f))); - constexpr std::uint32_t MinStableVotes = 3; - - if (m_pending_frame_rate_hint_votes < MinStableVotes || stable_for < stable_duration) { - return; - } - } else { - m_pending_frame_rate_since = now; - } - - using SetFrameRateWithChangeStrategyFn = - int32_t (*)(ANativeWindow*, float, int8_t, int8_t); - using SetFrameRateFn = int32_t (*)(ANativeWindow*, float, int8_t); - static const auto set_frame_rate_with_change_strategy = - reinterpret_cast( - dlsym(RTLD_DEFAULT, "ANativeWindow_setFrameRateWithChangeStrategy")); - static const auto set_frame_rate = reinterpret_cast( - dlsym(RTLD_DEFAULT, "ANativeWindow_setFrameRate")); - - constexpr int8_t FrameRateCompatibilityDefault = 0; - constexpr int8_t ChangeFrameRateOnlyIfSeamless = 0; - - int32_t result = -1; - if (set_frame_rate_with_change_strategy) { - result = set_frame_rate_with_change_strategy(surface, frame_rate_hint, - FrameRateCompatibilityDefault, - ChangeFrameRateOnlyIfSeamless); - } else if (set_frame_rate) { - result = set_frame_rate(surface, frame_rate_hint, FrameRateCompatibilityDefault); - } else { - return; - } - - if (result != 0) { - LOG_DEBUG(Frontend, "Failed to update Android surface frame rate hint: {}", result); - return; - } - - m_last_frame_rate_hint = frame_rate_hint; - m_pending_frame_rate_hint = frame_rate_hint; - m_pending_frame_rate_hint_votes = 0; - m_pending_frame_rate_since = {}; -} - EmuWindow_Android::EmuWindow_Android(ANativeWindow* surface, std::shared_ptr driver_library) : m_driver_library{driver_library} { diff --git a/src/android/app/src/main/jni/emu_window/emu_window.h b/src/android/app/src/main/jni/emu_window/emu_window.h index b73e8b9b4d..d7b5fc6dac 100644 --- a/src/android/app/src/main/jni/emu_window/emu_window.h +++ b/src/android/app/src/main/jni/emu_window/emu_window.h @@ -1,13 +1,8 @@ -// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project -// SPDX-License-Identifier: GPL-3.0-or-later - // SPDX-FileCopyrightText: 2023 yuzu Emulator Project // SPDX-License-Identifier: GPL-3.0-or-later #pragma once -#include -#include #include #include @@ -55,24 +50,10 @@ public: }; private: - using Clock = std::chrono::steady_clock; - - void UpdateFrameRateHint(); - void UpdateObservedFrameRate(); - [[nodiscard]] float GetFrameRateHint() const; - [[nodiscard]] float GetFrameTimeVerifiedHint() const; - [[nodiscard]] static float QuantizeFrameRateHint(float frame_rate); - float m_window_width{}; float m_window_height{}; std::shared_ptr m_driver_library; bool m_first_frame = false; - float m_last_frame_rate_hint = -1.0f; - float m_pending_frame_rate_hint = -1.0f; - float m_smoothed_present_rate = 0.0f; - Clock::time_point m_last_frame_display_time{}; - Clock::time_point m_pending_frame_rate_since{}; - std::uint32_t m_pending_frame_rate_hint_votes = 0; }; diff --git a/src/android/app/src/main/res/layout/fragment_profile_manager.xml b/src/android/app/src/main/res/layout/fragment_profile_manager.xml index 67828ca69e..e70a3f3da5 100644 --- a/src/android/app/src/main/res/layout/fragment_profile_manager.xml +++ b/src/android/app/src/main/res/layout/fragment_profile_manager.xml @@ -5,22 +5,21 @@ xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" - android:background="?attr/colorSurface"> + android:background="?attr/colorSurface" + android:fitsSystemWindows="true"> + android:fitsSystemWindows="true"> diff --git a/src/android/app/src/main/res/values/strings.xml b/src/android/app/src/main/res/values/strings.xml index 343cc4b21a..e9bd0f1d1c 100644 --- a/src/android/app/src/main/res/values/strings.xml +++ b/src/android/app/src/main/res/values/strings.xml @@ -1160,8 +1160,6 @@ Material You App Settings Theme And Color - Fullscreen mode - Hide Android system bars across app screens. Swipe from an edge to reveal them temporarily. Change theme mode diff --git a/src/core/hle/service/acc/acc.cpp b/src/core/hle/service/acc/acc.cpp index 43c569851d..d8767f9fed 100644 --- a/src/core/hle/service/acc/acc.cpp +++ b/src/core/hle/service/acc/acc.cpp @@ -712,8 +712,9 @@ public: private: void CheckAvailability(HLERequestContext& ctx) { LOG_DEBUG(Service_ACC, "(STUBBED) called"); - IPC::ResponseBuilder rb{ctx, 2}; + IPC::ResponseBuilder rb{ctx, 3}; rb.Push(ResultSuccess); + rb.Push(false); // TODO: Check when this is supposed to return true and when not } void GetAccountId(HLERequestContext& ctx) { diff --git a/src/core/hle/service/nifm/nifm.cpp b/src/core/hle/service/nifm/nifm.cpp index a0302a5841..710a95a455 100644 --- a/src/core/hle/service/nifm/nifm.cpp +++ b/src/core/hle/service/nifm/nifm.cpp @@ -183,8 +183,8 @@ struct NifmWirelessSettingData { static_assert(sizeof(NifmWirelessSettingData) == 0x70, "NifmWirelessSettingData has incorrect size."); -// This is nn::nifm::detail::sf::NetworkProfileData #pragma pack(push, 1) +// This is nn::nifm::detail::sf::NetworkProfileData struct SfNetworkProfileData { IpSettingData ip_setting_data{}; u128 uuid{}; @@ -196,11 +196,9 @@ struct SfNetworkProfileData { SfWirelessSettingData wireless_setting_data{}; INSERT_PADDING_BYTES(1); }; -#pragma pack(pop) static_assert(sizeof(SfNetworkProfileData) == 0x17C, "SfNetworkProfileData has incorrect size."); // This is nn::nifm::NetworkProfileData -#pragma pack(push, 1) struct NifmNetworkProfileData { u128 uuid{}; std::array network_name{}; @@ -212,8 +210,8 @@ struct NifmNetworkProfileData { NifmWirelessSettingData wireless_setting_data{}; IpSettingData ip_setting_data{}; }; -#pragma pack(pop) -static_assert(sizeof(NifmNetworkProfileData) == 0x18E, "NifmNetworkProfileData has incorrect size."); +static_assert(sizeof(NifmNetworkProfileData) == 0x18E, + "NifmNetworkProfileData has incorrect size."); struct PendingProfile { std::array ssid{}; diff --git a/src/core/hle/service/sockets/sfdnsres.cpp b/src/core/hle/service/sockets/sfdnsres.cpp index f9f0ee56eb..68d73f0a59 100644 --- a/src/core/hle/service/sockets/sfdnsres.cpp +++ b/src/core/hle/service/sockets/sfdnsres.cpp @@ -1,4 +1,4 @@ -// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project +// SPDX-FileCopyrightText: Copyright 2025 Eden Emulator Project // SPDX-License-Identifier: GPL-3.0-or-later // SPDX-FileCopyrightText: Copyright 2018 yuzu Emulator Project @@ -53,15 +53,12 @@ enum class NetDbError : s32 { NoData = 4, }; -static const constexpr std::array blockedDomains = { - "srv.nintendo.net", //obvious - "phoenix-api.wbagora.com", //hogwarts legacy - "battle.net", - "microsoft.com", //minecraft dungeons + other games - "mojang.com", - "xboxlive.com", - "minecraftservices.com" -}; +static const constexpr std::array blockedDomains = {"srv.nintendo.net", + "battle.net", + "microsoft.com", + "mojang.com", + "xboxlive.com", + "minecraftservices.com"}; static bool IsBlockedHost(const std::string& host) { return std::any_of( diff --git a/src/core/tools/renderdoc.h b/src/core/tools/renderdoc.h index 689b0a383a..0e5e43da5b 100644 --- a/src/core/tools/renderdoc.h +++ b/src/core/tools/renderdoc.h @@ -1,12 +1,9 @@ -// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project -// SPDX-License-Identifier: GPL-3.0-or-later - // SPDX-FileCopyrightText: Copyright 2023 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later #pragma once -struct RENDERDOC_API_1_7_0; +struct RENDERDOC_API_1_6_0; namespace Tools { @@ -18,7 +15,7 @@ public: void ToggleCapture(); private: - RENDERDOC_API_1_7_0* rdoc_api{}; + RENDERDOC_API_1_6_0* rdoc_api{}; bool is_capturing{false}; }; diff --git a/src/dynarmic/src/dynarmic/CMakeLists.txt b/src/dynarmic/src/dynarmic/CMakeLists.txt index 50bf5a4604..3d2ea4d42e 100644 --- a/src/dynarmic/src/dynarmic/CMakeLists.txt +++ b/src/dynarmic/src/dynarmic/CMakeLists.txt @@ -53,6 +53,7 @@ add_library(dynarmic STATIC common/fp/util.h common/llvm_disassemble.cpp common/llvm_disassemble.h + common/lut_from_list.h common/math_util.cpp common/math_util.h common/safe_ops.h diff --git a/src/dynarmic/src/dynarmic/backend/arm64/emit_arm64_vector_floating_point.cpp b/src/dynarmic/src/dynarmic/backend/arm64/emit_arm64_vector_floating_point.cpp index 431d51c081..4d11c62abd 100644 --- a/src/dynarmic/src/dynarmic/backend/arm64/emit_arm64_vector_floating_point.cpp +++ b/src/dynarmic/src/dynarmic/backend/arm64/emit_arm64_vector_floating_point.cpp @@ -1,4 +1,4 @@ -// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project +// SPDX-FileCopyrightText: Copyright 2025 Eden Emulator Project // SPDX-License-Identifier: GPL-3.0-or-later /* This file is part of the dynarmic project. @@ -31,6 +31,7 @@ #include "dynarmic/common/fp/info.h" #include "dynarmic/common/fp/op.h" #include "dynarmic/common/fp/rounding_mode.h" +#include "dynarmic/common/lut_from_list.h" #include "dynarmic/ir/basic_block.h" #include "dynarmic/ir/microinstruction.h" #include "dynarmic/ir/opcodes.h" diff --git a/src/dynarmic/src/dynarmic/backend/x64/emit_x64_floating_point.cpp b/src/dynarmic/src/dynarmic/backend/x64/emit_x64_floating_point.cpp index abe04b53ff..76c103ec6f 100644 --- a/src/dynarmic/src/dynarmic/backend/x64/emit_x64_floating_point.cpp +++ b/src/dynarmic/src/dynarmic/backend/x64/emit_x64_floating_point.cpp @@ -31,6 +31,7 @@ #include "dynarmic/common/fp/info.h" #include "dynarmic/common/fp/op.h" #include "dynarmic/common/fp/rounding_mode.h" +#include "dynarmic/common/lut_from_list.h" #include "dynarmic/interface/optimization_flags.h" #include "dynarmic/ir/basic_block.h" #include "dynarmic/ir/microinstruction.h" diff --git a/src/dynarmic/src/dynarmic/backend/x64/emit_x64_vector_floating_point.cpp b/src/dynarmic/src/dynarmic/backend/x64/emit_x64_vector_floating_point.cpp index ee9ec39f46..2247b18fcd 100644 --- a/src/dynarmic/src/dynarmic/backend/x64/emit_x64_vector_floating_point.cpp +++ b/src/dynarmic/src/dynarmic/backend/x64/emit_x64_vector_floating_point.cpp @@ -31,6 +31,7 @@ #include "dynarmic/common/fp/info.h" #include "dynarmic/common/fp/op.h" #include "dynarmic/common/fp/util.h" +#include "dynarmic/common/lut_from_list.h" #include "dynarmic/interface/optimization_flags.h" #include "dynarmic/ir/basic_block.h" #include "dynarmic/ir/microinstruction.h" @@ -2126,42 +2127,28 @@ void EmitFPVectorToFixed(BlockOfCode& code, EmitContext& ctx, IR::Inst* inst) { } } - using FPT = mcl::unsigned_integer_of_size; // WORKAROUND: For issue 678 on MSVC - auto const func = [rounding]() -> void(*)(VectorArray& output, const VectorArray& input, FP::FPCR fpcr, FP::FPSR& fpsr) { - switch (rounding) { - case FP::RoundingMode::ToNearest_TieEven: - return [](VectorArray& output, const VectorArray& input, FP::FPCR fpcr, FP::FPSR& fpsr) { + using fbits_list = mp::lift_sequence>; + using rounding_list = mp::list< + mp::lift_value, + mp::lift_value, + mp::lift_value, + mp::lift_value, + mp::lift_value>; + + static const auto lut = Common::GenerateLookupTableFromList([](I) { + using FPT = mcl::unsigned_integer_of_size; // WORKAROUND: For issue 678 on MSVC + return std::pair{ + mp::lower_to_tuple_v, + Common::FptrCast([](VectorArray& output, const VectorArray& input, FP::FPCR fpcr, FP::FPSR& fpsr) { + constexpr size_t fbits = mp::get<0, I>::value; + constexpr FP::RoundingMode rounding_mode = mp::get<1, I>::value; for (size_t i = 0; i < output.size(); ++i) - output[i] = FPT(FP::FPToFixed(fsize, input[i], fsize, unsigned_, fpcr, FP::RoundingMode::ToNearest_TieEven, fpsr)); - }; - case FP::RoundingMode::TowardsPlusInfinity: - return [](VectorArray& output, const VectorArray& input, FP::FPCR fpcr, FP::FPSR& fpsr) { - for (size_t i = 0; i < output.size(); ++i) - output[i] = FPT(FP::FPToFixed(fsize, input[i], fsize, unsigned_, fpcr, FP::RoundingMode::TowardsPlusInfinity, fpsr)); - }; - case FP::RoundingMode::TowardsMinusInfinity: - return [](VectorArray& output, const VectorArray& input, FP::FPCR fpcr, FP::FPSR& fpsr) { - for (size_t i = 0; i < output.size(); ++i) - output[i] = FPT(FP::FPToFixed(fsize, input[i], fsize, unsigned_, fpcr, FP::RoundingMode::TowardsMinusInfinity, fpsr)); - }; - case FP::RoundingMode::TowardsZero: - return [](VectorArray& output, const VectorArray& input, FP::FPCR fpcr, FP::FPSR& fpsr) { - for (size_t i = 0; i < output.size(); ++i) - output[i] = FPT(FP::FPToFixed(fsize, input[i], fsize, unsigned_, fpcr, FP::RoundingMode::TowardsZero, fpsr)); - }; - case FP::RoundingMode::ToNearest_TieAwayFromZero: - return [](VectorArray& output, const VectorArray& input, FP::FPCR fpcr, FP::FPSR& fpsr) { - for (size_t i = 0; i < output.size(); ++i) - output[i] = FPT(FP::FPToFixed(fsize, input[i], fsize, unsigned_, fpcr, FP::RoundingMode::ToNearest_TieAwayFromZero, fpsr)); - }; - case FP::RoundingMode::ToOdd: - return [](VectorArray& output, const VectorArray& input, FP::FPCR fpcr, FP::FPSR& fpsr) { - for (size_t i = 0; i < output.size(); ++i) - output[i] = FPT(FP::FPToFixed(fsize, input[i], fsize, unsigned_, fpcr, FP::RoundingMode::ToOdd, fpsr)); - }; - } - }(); - EmitTwoOpFallback<3>(code, ctx, inst, func); + output[i] = FPT(FP::FPToFixed(fsize, input[i], fbits, unsigned_, fpcr, rounding_mode, fpsr)); + }) + }; + }, mp::cartesian_product{}); + + EmitTwoOpFallback<3>(code, ctx, inst, lut.at(std::make_tuple(fbits, rounding))); } void EmitX64::EmitFPVectorToSignedFixed16(EmitContext& ctx, IR::Inst* inst) { diff --git a/src/dynarmic/src/dynarmic/common/lut_from_list.h b/src/dynarmic/src/dynarmic/common/lut_from_list.h new file mode 100644 index 0000000000..633b62aeda --- /dev/null +++ b/src/dynarmic/src/dynarmic/common/lut_from_list.h @@ -0,0 +1,55 @@ +// SPDX-FileCopyrightText: Copyright 2025 Eden Emulator Project +// SPDX-License-Identifier: GPL-3.0-or-later + +/* This file is part of the dynarmic project. + * Copyright (c) 2018 MerryMage + * SPDX-License-Identifier: 0BSD + */ + +#pragma once + +#include +#include +#include + +#include +#include +#include + +#ifdef _MSC_VER +# include +#endif + +namespace Dynarmic::Common { + +// prevents this function from printing 56,000 character warning messages +#ifdef __GNUC__ +#pragma GCC diagnostic push +#pragma GCC diagnostic ignored "-Wno-stack-usage" +#endif +#ifdef __clang__ +#pragma clang diagnostic push +#pragma clang diagnostic ignored "-Wno-stack-usage" +#endif + +template +inline auto GenerateLookupTableFromList(Function f, mcl::mp::list) { +#ifdef _MSC_VER + using PairT = std::invoke_result_t>>; +#else + using PairT = std::common_type_t...>; +#endif + using MapT = mcl::mp::apply; + static_assert(mcl::is_instance_of_template_v); + const std::initializer_list pair_array{f(Values{})...}; + return MapT(pair_array.begin(), pair_array.end()); +} + +#ifdef __GNUC__ +#pragma GCC diagnostic pop +#endif +#ifdef __clang__ +#pragma clang diagnostic pop +#endif + +} // namespace Dynarmic::Common diff --git a/src/dynarmic/tests/A32/fuzz_arm.cpp b/src/dynarmic/tests/A32/fuzz_arm.cpp index cd2eade884..fd17b3bd01 100644 --- a/src/dynarmic/tests/A32/fuzz_arm.cpp +++ b/src/dynarmic/tests/A32/fuzz_arm.cpp @@ -20,14 +20,15 @@ #include #include "dynarmic/common/common_types.h" -#include "dynarmic/tests/fuzz_util.h" -#include "dynarmic/tests/rand_int.h" -#include "dynarmic/tests/unicorn_emu/a32_unicorn.h" -#include "dynarmic/tests/A32/testenv.h" -#include "dynarmic/tests/native/testenv.h" +#include "../fuzz_util.h" +#include "../rand_int.h" +#include "../unicorn_emu/a32_unicorn.h" +#include "./testenv.h" +#include "../native/testenv.h" #include "dynarmic/common/fp/fpcr.h" #include "dynarmic/common/fp/fpsr.h" #include "dynarmic/common/llvm_disassemble.h" +#include "dynarmic/common/variant_util.h" #include "dynarmic/frontend/A32/ITState.h" #include "dynarmic/frontend/A32/a32_location_descriptor.h" #include "dynarmic/frontend/A32/a32_types.h" diff --git a/src/dynarmic/tests/A32/fuzz_thumb.cpp b/src/dynarmic/tests/A32/fuzz_thumb.cpp index f985e6f93d..3a561a18d9 100644 --- a/src/dynarmic/tests/A32/fuzz_thumb.cpp +++ b/src/dynarmic/tests/A32/fuzz_thumb.cpp @@ -19,10 +19,10 @@ #include #include "dynarmic/common/common_types.h" -#include "dynarmic/tests/rand_int.h" -#include "dynarmic/tests/unicorn_emu/a32_unicorn.h" -#include "dynarmic/tests/A32/testenv.h" -#include "dynarmic/tests/native/testenv.h" +#include "../rand_int.h" +#include "../unicorn_emu/a32_unicorn.h" +#include "./testenv.h" +#include "../native/testenv.h" #include "dynarmic/frontend/A32/FPSCR.h" #include "dynarmic/frontend/A32/PSR.h" #include "dynarmic/frontend/A32/a32_location_descriptor.h" @@ -107,7 +107,7 @@ static bool DoesBehaviorMatch(const A32Unicorn& uni, const A32::Ji return std::equal(interp_regs.begin(), interp_regs.end(), jit_regs.begin(), jit_regs.end()) && uni.GetCpsr() == jit.Cpsr() && interp_write_records == jit_write_records; } -static void RunInstance(size_t run_number, ThumbTestEnv& test_env, A32::UserConfig const& config, A32Unicorn& uni, A32::Jit& jit, const ThumbTestEnv::RegisterArray& initial_regs, size_t instruction_count, size_t instructions_to_execute_count) { +static void RunInstance(size_t run_number, ThumbTestEnv& test_env, A32Unicorn& uni, A32::Jit& jit, const ThumbTestEnv::RegisterArray& initial_regs, size_t instruction_count, size_t instructions_to_execute_count) { uni.ClearPageCache(); jit.ClearCache(); @@ -145,8 +145,9 @@ static void RunInstance(size_t run_number, ThumbTestEnv& test_env, A32::UserConf printf("Failed at execution number %zu\n", run_number); printf("\nInstruction Listing: \n"); - for (size_t i = 0; i < instruction_count; i++) - printf("%04x\n", test_env.code_mem[i]); + for (size_t i = 0; i < instruction_count; i++) { + printf("%04x %s\n", test_env.code_mem[i], A32::DisassembleThumb16(test_env.code_mem[i]).c_str()); + } printf("\nInitial Register Listing: \n"); for (size_t i = 0; i < initial_regs.size(); i++) { @@ -174,14 +175,11 @@ static void RunInstance(size_t run_number, ThumbTestEnv& test_env, A32::UserConf A32::PSR cpsr; cpsr.T(true); - IR::Block ir_block{A32::LocationDescriptor{0, {}, {}}}; - size_t num_insts = 0; while (num_insts < instructions_to_execute_count) { A32::LocationDescriptor descriptor = {u32(num_insts * 4), cpsr, A32::FPSCR{}}; - ir_block.Reset(descriptor); - A32::Translate(ir_block, descriptor, &test_env, {}); - Optimization::Optimize(ir_block, config, {}); + IR::Block ir_block = A32::Translate(descriptor, &test_env, {}); + Optimization::Optimize(ir_block, &test_env, {}); printf("\n\nIR:\n%s", IR::DumpBlock(ir_block).c_str()); printf("\n\nx86_64:\n"); printf("%s", jit.Disassemble().c_str()); @@ -203,9 +201,8 @@ void FuzzJitThumb16(const size_t instruction_count, const size_t instructions_to test_env.code_mem.back() = 0xE7FE; // b +#0 // Prepare test subjects - A32::UserConfig config{GetUserConfig(&test_env)}; A32Unicorn uni{test_env}; - A32::Jit jit{config}; + A32::Jit jit{GetUserConfig(&test_env)}; for (size_t run_number = 0; run_number < run_count; run_number++) { ThumbTestEnv::RegisterArray initial_regs; @@ -214,7 +211,7 @@ void FuzzJitThumb16(const size_t instruction_count, const size_t instructions_to std::generate_n(test_env.code_mem.begin(), instruction_count, instruction_generator); - RunInstance(run_number, test_env, config, uni, jit, initial_regs, instruction_count, instructions_to_execute_count); + RunInstance(run_number, test_env, uni, jit, initial_regs, instruction_count, instructions_to_execute_count); } } @@ -228,8 +225,7 @@ void FuzzJitThumb32(const size_t instruction_count, const size_t instructions_to // Prepare test subjects A32Unicorn uni{test_env}; - A32::UserConfig config{GetUserConfig(&test_env)}; - A32::Jit jit{config}; + A32::Jit jit{GetUserConfig(&test_env)}; for (size_t run_number = 0; run_number < run_count; run_number++) { ThumbTestEnv::RegisterArray initial_regs; @@ -245,7 +241,7 @@ void FuzzJitThumb32(const size_t instruction_count, const size_t instructions_to test_env.code_mem[i * 2 + 1] = first_halfword; } - RunInstance(run_number, test_env, config, uni, jit, initial_regs, instruction_count, instructions_to_execute_count); + RunInstance(run_number, test_env, uni, jit, initial_regs, instruction_count, instructions_to_execute_count); } } @@ -508,8 +504,7 @@ TEST_CASE("Verify fix for off by one error in MemoryRead32 worked", "[Thumb][Thu // Prepare test subjects A32Unicorn uni{test_env}; - A32::UserConfig config{GetUserConfig(&test_env)}; - A32::Jit jit{config}; + A32::Jit jit{GetUserConfig(&test_env)}; constexpr ThumbTestEnv::RegisterArray initial_regs{ 0xe90ecd70, @@ -539,5 +534,5 @@ TEST_CASE("Verify fix for off by one error in MemoryRead32 worked", "[Thumb][Thu 0xE7FE, // b +#0 }; - RunInstance(1, test_env, config, uni, jit, initial_regs, 5, 5); + RunInstance(1, test_env, uni, jit, initial_regs, 5, 5); } diff --git a/src/dynarmic/tests/A32/test_arm_instructions.cpp b/src/dynarmic/tests/A32/test_arm_instructions.cpp index 5a27cd499c..2e7e7dc5d8 100644 --- a/src/dynarmic/tests/A32/test_arm_instructions.cpp +++ b/src/dynarmic/tests/A32/test_arm_instructions.cpp @@ -1,4 +1,4 @@ -// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project +// SPDX-FileCopyrightText: Copyright 2025 Eden Emulator Project // SPDX-License-Identifier: GPL-3.0-or-later /* This file is part of the dynarmic project. @@ -8,8 +8,8 @@ #include -#include "dynarmic/tests/A32/testenv.h" -#include "dynarmic/tests/native/testenv.h" +#include "./testenv.h" +#include "../native/testenv.h" #include "dynarmic/frontend/A32/a32_location_descriptor.h" #include "dynarmic/interface/A32/a32.h" diff --git a/src/dynarmic/tests/A32/test_coprocessor.cpp b/src/dynarmic/tests/A32/test_coprocessor.cpp index 66ae6ebb09..3888d2c68b 100644 --- a/src/dynarmic/tests/A32/test_coprocessor.cpp +++ b/src/dynarmic/tests/A32/test_coprocessor.cpp @@ -1,4 +1,4 @@ -// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project +// SPDX-FileCopyrightText: Copyright 2025 Eden Emulator Project // SPDX-License-Identifier: GPL-3.0-or-later /* This file is part of the dynarmic project. @@ -10,8 +10,8 @@ #include -#include "dynarmic/tests/A32/testenv.h" -#include "dynarmic/tests/native/testenv.h" +#include "./testenv.h" +#include "../native/testenv.h" #include "dynarmic/frontend/A32/a32_location_descriptor.h" #include "dynarmic/interface/A32/a32.h" #include "dynarmic/interface/A32/coprocessor.h" diff --git a/src/dynarmic/tests/A32/test_svc.cpp b/src/dynarmic/tests/A32/test_svc.cpp index 0cfaf23ec5..0be2432c7b 100644 --- a/src/dynarmic/tests/A32/test_svc.cpp +++ b/src/dynarmic/tests/A32/test_svc.cpp @@ -1,4 +1,4 @@ -// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project +// SPDX-FileCopyrightText: Copyright 2025 Eden Emulator Project // SPDX-License-Identifier: GPL-3.0-or-later /* This file is part of the dynarmic project. @@ -10,8 +10,8 @@ #include -#include "dynarmic/tests/A32/testenv.h" -#include "dynarmic/tests/native/testenv.h" +#include "./testenv.h" +#include "../native/testenv.h" using namespace Dynarmic; diff --git a/src/dynarmic/tests/A32/test_thumb_instructions.cpp b/src/dynarmic/tests/A32/test_thumb_instructions.cpp index 6aa1b7389b..d509acdd8d 100644 --- a/src/dynarmic/tests/A32/test_thumb_instructions.cpp +++ b/src/dynarmic/tests/A32/test_thumb_instructions.cpp @@ -1,4 +1,4 @@ -// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project +// SPDX-FileCopyrightText: Copyright 2025 Eden Emulator Project // SPDX-License-Identifier: GPL-3.0-or-later /* This file is part of the dynarmic project. @@ -9,8 +9,8 @@ #include #include "dynarmic/common/common_types.h" -#include "dynarmic/tests/A32/testenv.h" -#include "dynarmic/tests/native/testenv.h" +#include "./testenv.h" +#include "../native/testenv.h" #include "dynarmic/interface/A32/a32.h" static Dynarmic::A32::UserConfig GetUserConfig(ThumbTestEnv* testenv) { diff --git a/src/dynarmic/tests/A64/a64.cpp b/src/dynarmic/tests/A64/a64.cpp index 4d4484e53e..d331c5e8a1 100644 --- a/src/dynarmic/tests/A64/a64.cpp +++ b/src/dynarmic/tests/A64/a64.cpp @@ -9,8 +9,8 @@ #include #include -#include "dynarmic/tests/A64/testenv.h" -#include "dynarmic/tests/native/testenv.h" +#include "./testenv.h" +#include "../native/testenv.h" #include "dynarmic/common/fp/fpsr.h" #include "dynarmic/interface/exclusive_monitor.h" #include "dynarmic/interface/optimization_flags.h" diff --git a/src/dynarmic/tests/A64/fp_min_max.cpp b/src/dynarmic/tests/A64/fp_min_max.cpp index 313b5e5117..1669b63071 100644 --- a/src/dynarmic/tests/A64/fp_min_max.cpp +++ b/src/dynarmic/tests/A64/fp_min_max.cpp @@ -1,4 +1,4 @@ -// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project +// SPDX-FileCopyrightText: Copyright 2025 Eden Emulator Project // SPDX-License-Identifier: GPL-3.0-or-later /* This file is part of the dynarmic project. @@ -11,8 +11,8 @@ #include #include "dynarmic/common/common_types.h" -#include "dynarmic/tests/A64/testenv.h" -#include "dynarmic/tests/native/testenv.h" +#include "./testenv.h" +#include "../native/testenv.h" using namespace Dynarmic; diff --git a/src/dynarmic/tests/A64/fuzz_with_unicorn.cpp b/src/dynarmic/tests/A64/fuzz_with_unicorn.cpp index 0c7a30a868..2cdf288eab 100644 --- a/src/dynarmic/tests/A64/fuzz_with_unicorn.cpp +++ b/src/dynarmic/tests/A64/fuzz_with_unicorn.cpp @@ -15,11 +15,11 @@ #include #include "dynarmic/common/common_types.h" -#include "dynarmic/tests/fuzz_util.h" -#include "dynarmic/tests/rand_int.h" -#include "dynarmic/tests/unicorn_emu/a64_unicorn.h" -#include "dynarmic/tests/A64/testenv.h" -#include "dynarmic/tests/native/testenv.h" +#include "../fuzz_util.h" +#include "../rand_int.h" +#include "../unicorn_emu/a64_unicorn.h" +#include "./testenv.h" +#include "../native/testenv.h" #include "dynarmic/common/fp/fpcr.h" #include "dynarmic/common/fp/fpsr.h" #include "dynarmic/common/llvm_disassemble.h" @@ -168,7 +168,7 @@ static Dynarmic::A64::UserConfig GetUserConfig(A64TestEnv& jit_env) { return jit_user_config; } -static void RunTestInstance(Dynarmic::A64::Jit& jit, A64Unicorn& uni, A64TestEnv& jit_env, A64TestEnv& uni_env, Dynarmic::A64::UserConfig& conf, const A64Unicorn::RegisterArray& regs, const A64Unicorn::VectorArray& vecs, const size_t instructions_start, const std::vector& instructions, const u32 pstate, const u32 fpcr) { +static void RunTestInstance(Dynarmic::A64::Jit& jit, A64Unicorn& uni, A64TestEnv& jit_env, A64TestEnv& uni_env, const A64Unicorn::RegisterArray& regs, const A64Unicorn::VectorArray& vecs, const size_t instructions_start, const std::vector& instructions, const u32 pstate, const u32 fpcr) { jit_env.code_mem = instructions; uni_env.code_mem = instructions; jit_env.code_mem.emplace_back(0x14000000); // B . @@ -269,13 +269,16 @@ static void RunTestInstance(Dynarmic::A64::Jit& jit, A64Unicorn& uni, A64TestEnv fmt::print("\n"); const auto get_code = [&jit_env](u64 vaddr) { return jit_env.MemoryReadCode(vaddr); }; - const A64::LocationDescriptor location{instructions_start, FP::FPCR{fpcr}}; - IR::Block ir_block{location}; - A64::Translate(ir_block, location, get_code, {}); - fmt::print("IR:\n{}\n", IR::DumpBlock(ir_block)); + IR::Block ir_block = A64::Translate({instructions_start, FP::FPCR{fpcr}}, get_code, {}); + fmt::print("IR:\n"); + fmt::print("{}\n", IR::DumpBlock(ir_block)); Optimization::Optimize(ir_block, conf, {}); - fmt::print("Optimized IR:\n{}\n", IR::DumpBlock(ir_block)); - fmt::print("x86_64:\n{}", jit.Disassemble()); + fmt::print("Optimized IR:\n"); + fmt::print("{}\n", IR::DumpBlock(ir_block)); + + fmt::print("x86_64:\n"); + fmt::print("{}", jit.Disassemble()); + fmt::print("Interrupts:\n"); for (auto& i : uni_env.interrupts) { puts(i.c_str()); @@ -301,8 +304,7 @@ TEST_CASE("A64: Single random instruction", "[a64][unicorn]") { A64TestEnv jit_env{}; A64TestEnv uni_env{}; - Dynarmic::A64::UserConfig conf{GetUserConfig(jit_env)}; - Dynarmic::A64::Jit jit{conf}; + Dynarmic::A64::Jit jit{GetUserConfig(jit_env)}; A64Unicorn uni{uni_env}; A64Unicorn::RegisterArray regs; @@ -321,7 +323,7 @@ TEST_CASE("A64: Single random instruction", "[a64][unicorn]") { INFO("Instruction: 0x" << std::hex << instructions[0]); - RunTestInstance(jit, uni, jit_env, uni_env, conf, regs, vecs, start_address, instructions, pstate, fpcr); + RunTestInstance(jit, uni, jit_env, uni_env, regs, vecs, start_address, instructions, pstate, fpcr); } } @@ -329,8 +331,7 @@ TEST_CASE("A64: Floating point instructions", "[a64][unicorn]") { A64TestEnv jit_env{}; A64TestEnv uni_env{}; - Dynarmic::A64::UserConfig conf{GetUserConfig(jit_env)}; - Dynarmic::A64::Jit jit{conf}; + Dynarmic::A64::Jit jit{GetUserConfig(jit_env)}; A64Unicorn uni{uni_env}; static constexpr std::array float_numbers{ @@ -447,7 +448,7 @@ TEST_CASE("A64: Floating point instructions", "[a64][unicorn]") { INFO("Instruction: 0x" << std::hex << instructions[0]); - RunTestInstance(jit, uni, jit_env, uni_env, conf, regs, vecs, start_address, instructions, pstate, fpcr); + RunTestInstance(jit, uni, jit_env, uni_env, regs, vecs, start_address, instructions, pstate, fpcr); } } @@ -455,8 +456,7 @@ TEST_CASE("A64: Small random block", "[a64][unicorn]") { A64TestEnv jit_env{}; A64TestEnv uni_env{}; - Dynarmic::A64::UserConfig conf{GetUserConfig(jit_env)}; - Dynarmic::A64::Jit jit{conf}; + Dynarmic::A64::Jit jit{GetUserConfig(jit_env)}; A64Unicorn uni{uni_env}; A64Unicorn::RegisterArray regs; @@ -483,7 +483,7 @@ TEST_CASE("A64: Small random block", "[a64][unicorn]") { INFO("Instruction 4: 0x" << std::hex << instructions[3]); INFO("Instruction 5: 0x" << std::hex << instructions[4]); - RunTestInstance(jit, uni, jit_env, uni_env, conf, regs, vecs, start_address, instructions, pstate, fpcr); + RunTestInstance(jit, uni, jit_env, uni_env, regs, vecs, start_address, instructions, pstate, fpcr); } } @@ -491,8 +491,7 @@ TEST_CASE("A64: Large random block", "[a64][unicorn]") { A64TestEnv jit_env{}; A64TestEnv uni_env{}; - Dynarmic::A64::UserConfig conf{GetUserConfig(jit_env)}; - Dynarmic::A64::Jit jit{conf}; + Dynarmic::A64::Jit jit{GetUserConfig(jit_env)}; A64Unicorn uni{uni_env}; A64Unicorn::RegisterArray regs; @@ -513,6 +512,6 @@ TEST_CASE("A64: Large random block", "[a64][unicorn]") { const u32 pstate = RandInt(0, 0xF) << 28; const u32 fpcr = RandomFpcr(); - RunTestInstance(jit, uni, jit_env, uni_env, conf, regs, vecs, start_address, instructions, pstate, fpcr); + RunTestInstance(jit, uni, jit_env, uni_env, regs, vecs, start_address, instructions, pstate, fpcr); } } diff --git a/src/dynarmic/tests/A64/misaligned_page_table.cpp b/src/dynarmic/tests/A64/misaligned_page_table.cpp index 99afba519d..fc0bc77428 100644 --- a/src/dynarmic/tests/A64/misaligned_page_table.cpp +++ b/src/dynarmic/tests/A64/misaligned_page_table.cpp @@ -1,4 +1,4 @@ -// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project +// SPDX-FileCopyrightText: Copyright 2025 Eden Emulator Project // SPDX-License-Identifier: GPL-3.0-or-later /* This file is part of the dynarmic project. @@ -8,8 +8,8 @@ #include -#include "dynarmic/tests/A64/testenv.h" -#include "dynarmic/tests/native/testenv.h" +#include "./testenv.h" +#include "../native/testenv.h" #include "dynarmic/interface/A64/a64.h" TEST_CASE("misaligned load/store do not use page_table when detect_misaligned_access_via_page_table is set", "[a64]") { diff --git a/src/dynarmic/tests/A64/real_world.cpp b/src/dynarmic/tests/A64/real_world.cpp index c15f307c3d..a083f16d61 100644 --- a/src/dynarmic/tests/A64/real_world.cpp +++ b/src/dynarmic/tests/A64/real_world.cpp @@ -1,11 +1,11 @@ -// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project +// SPDX-FileCopyrightText: Copyright 2025 Eden Emulator Project // SPDX-License-Identifier: GPL-3.0-or-later #include #include -#include "dynarmic/tests/A64/testenv.h" -#include "dynarmic/tests/native/testenv.h" +#include "./testenv.h" +#include "../native/testenv.h" #include "dynarmic/interface/A64/a64.h" using namespace Dynarmic; diff --git a/src/dynarmic/tests/A64/test_invalidation.cpp b/src/dynarmic/tests/A64/test_invalidation.cpp index 3b2d5fef98..0c92f5f606 100644 --- a/src/dynarmic/tests/A64/test_invalidation.cpp +++ b/src/dynarmic/tests/A64/test_invalidation.cpp @@ -1,4 +1,4 @@ -// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project +// SPDX-FileCopyrightText: Copyright 2025 Eden Emulator Project // SPDX-License-Identifier: GPL-3.0-or-later /* This file is part of the dynarmic project. @@ -8,8 +8,8 @@ #include -#include "dynarmic/tests/A64/testenv.h" -#include "dynarmic/tests/native/testenv.h" +#include "./testenv.h" +#include "../native/testenv.h" #include "dynarmic/interface/A64/a64.h" using namespace Dynarmic; diff --git a/src/dynarmic/tests/A64/verify_unicorn.cpp b/src/dynarmic/tests/A64/verify_unicorn.cpp index 5bdcd0dc3e..0c0ccc1609 100644 --- a/src/dynarmic/tests/A64/verify_unicorn.cpp +++ b/src/dynarmic/tests/A64/verify_unicorn.cpp @@ -1,6 +1,3 @@ -// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project -// SPDX-License-Identifier: GPL-3.0-or-later - /* This file is part of the dynarmic project. * Copyright (c) 2018 MerryMage * SPDX-License-Identifier: 0BSD @@ -10,9 +7,9 @@ #include -#include "dynarmic/tests/rand_int.h" -#include "dynarmic/tests/unicorn_emu/a64_unicorn.h" -#include "dynarmic/tests/A64/testenv.h" +#include "../rand_int.h" +#include "../unicorn_emu/a64_unicorn.h" +#include "./testenv.h" using namespace Dynarmic; diff --git a/src/dynarmic/tests/fp/FPToFixed.cpp b/src/dynarmic/tests/fp/FPToFixed.cpp index e16e4460ed..570ebcbbd7 100644 --- a/src/dynarmic/tests/fp/FPToFixed.cpp +++ b/src/dynarmic/tests/fp/FPToFixed.cpp @@ -1,4 +1,4 @@ -// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project +// SPDX-FileCopyrightText: Copyright 2025 Eden Emulator Project // SPDX-License-Identifier: GPL-3.0-or-later /* This file is part of the dynarmic project. @@ -12,7 +12,7 @@ #include #include "dynarmic/common/common_types.h" -#include "dynarmic/tests/rand_int.h" +#include "../rand_int.h" #include "dynarmic/common/fp/fpcr.h" #include "dynarmic/common/fp/fpsr.h" #include "dynarmic/common/fp/op.h" diff --git a/src/dynarmic/tests/fp/mantissa_util_tests.cpp b/src/dynarmic/tests/fp/mantissa_util_tests.cpp index 9d16c3624c..de29d51865 100644 --- a/src/dynarmic/tests/fp/mantissa_util_tests.cpp +++ b/src/dynarmic/tests/fp/mantissa_util_tests.cpp @@ -1,4 +1,4 @@ -// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project +// SPDX-FileCopyrightText: Copyright 2025 Eden Emulator Project // SPDX-License-Identifier: GPL-3.0-or-later /* This file is part of the dynarmic project. @@ -12,7 +12,7 @@ #include #include "dynarmic/common/common_types.h" -#include "dynarmic/tests/rand_int.h" +#include "../rand_int.h" #include "dynarmic/common/fp/mantissa_util.h" #include "dynarmic/common/safe_ops.h" diff --git a/src/dynarmic/tests/fp/unpacked_tests.cpp b/src/dynarmic/tests/fp/unpacked_tests.cpp index a4f10d1273..919f21bf2f 100644 --- a/src/dynarmic/tests/fp/unpacked_tests.cpp +++ b/src/dynarmic/tests/fp/unpacked_tests.cpp @@ -1,4 +1,4 @@ -// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project +// SPDX-FileCopyrightText: Copyright 2025 Eden Emulator Project // SPDX-License-Identifier: GPL-3.0-or-later /* This file is part of the dynarmic project. @@ -12,7 +12,7 @@ #include #include "dynarmic/common/common_types.h" -#include "dynarmic/tests/rand_int.h" +#include "../rand_int.h" #include "dynarmic/common/fp/fpcr.h" #include "dynarmic/common/fp/fpsr.h" #include "dynarmic/common/fp/unpacked.h" diff --git a/src/dynarmic/tests/fuzz_util.cpp b/src/dynarmic/tests/fuzz_util.cpp index 05f0a9e865..351eb1e10f 100644 --- a/src/dynarmic/tests/fuzz_util.cpp +++ b/src/dynarmic/tests/fuzz_util.cpp @@ -1,4 +1,4 @@ -// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project +// SPDX-FileCopyrightText: Copyright 2025 Eden Emulator Project // SPDX-License-Identifier: GPL-3.0-or-later /* This file is part of the dynarmic project. @@ -6,7 +6,7 @@ * SPDX-License-Identifier: 0BSD */ -#include "dynarmic/tests/fuzz_util.h" +#include "./fuzz_util.h" #include @@ -14,7 +14,7 @@ #include #include "dynarmic/common/assert.h" -#include "dynarmic/tests/rand_int.h" +#include "./rand_int.h" #include "dynarmic/common/fp/fpcr.h" #include "dynarmic/common/fp/rounding_mode.h" diff --git a/src/dynarmic/tests/native/preserve_xmm.cpp b/src/dynarmic/tests/native/preserve_xmm.cpp index 6369e1a74d..7421252063 100644 --- a/src/dynarmic/tests/native/preserve_xmm.cpp +++ b/src/dynarmic/tests/native/preserve_xmm.cpp @@ -1,12 +1,12 @@ -// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project +// SPDX-FileCopyrightText: Copyright 2025 Eden Emulator Project // SPDX-License-Identifier: GPL-3.0-or-later #include #include #include -#include "dynarmic/tests/A64/testenv.h" -#include "dynarmic/tests/native/testenv.h" +#include "../A64/testenv.h" +#include "../native/testenv.h" #include "dynarmic/common/fp/fpsr.h" #include "dynarmic/interface/exclusive_monitor.h" diff --git a/src/dynarmic/tests/test_generator.cpp b/src/dynarmic/tests/test_generator.cpp index 33e41099ff..4435e762ae 100644 --- a/src/dynarmic/tests/test_generator.cpp +++ b/src/dynarmic/tests/test_generator.cpp @@ -22,8 +22,8 @@ #include "./A32/testenv.h" #include "./A64/testenv.h" -#include "dynarmic/tests/fuzz_util.h" -#include "dynarmic/tests/rand_int.h" +#include "./fuzz_util.h" +#include "./rand_int.h" #include "dynarmic/common/fp/fpcr.h" #include "dynarmic/common/fp/fpsr.h" #include "dynarmic/common/llvm_disassemble.h" diff --git a/src/dynarmic/tests/unicorn_emu/a32_unicorn.cpp b/src/dynarmic/tests/unicorn_emu/a32_unicorn.cpp index 66c1e7fd24..1a4f1845d5 100644 --- a/src/dynarmic/tests/unicorn_emu/a32_unicorn.cpp +++ b/src/dynarmic/tests/unicorn_emu/a32_unicorn.cpp @@ -1,4 +1,4 @@ -// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project +// SPDX-FileCopyrightText: Copyright 2025 Eden Emulator Project // SPDX-License-Identifier: GPL-3.0-or-later /* This file is part of the dynarmic project. @@ -6,14 +6,22 @@ * SPDX-License-Identifier: 0BSD */ -#include -#include -#include -#include "dynarmic/tests/unicorn_emu/a32_unicorn.h" -#include "dynarmic/common/assert.h" -#include "dynarmic/tests/A32/testenv.h" +#include "./a32_unicorn.h" -#define CHECKED(expr) do if ((expr)) ASSERT(false && "Call " #expr " failed with error\n"); while (0) +#include + +#include "dynarmic/common/assert.h" +#include + +#include "../A32/testenv.h" + +#define CHECKED(expr) \ + do { \ + if (auto cerr_ = (expr)) { \ + ASSERT(false && "Call " #expr " failed with error: {} ({})\n", static_cast(cerr_), \ + uc_strerror(cerr_)); \ + } \ + } while (0) constexpr u32 BEGIN_ADDRESS = 0; constexpr u32 END_ADDRESS = ~u32(0); diff --git a/src/dynarmic/tests/unicorn_emu/a32_unicorn.h b/src/dynarmic/tests/unicorn_emu/a32_unicorn.h index d94724d9f2..79831b8111 100644 --- a/src/dynarmic/tests/unicorn_emu/a32_unicorn.h +++ b/src/dynarmic/tests/unicorn_emu/a32_unicorn.h @@ -1,4 +1,4 @@ -// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project +// SPDX-FileCopyrightText: Copyright 2025 Eden Emulator Project // SPDX-License-Identifier: GPL-3.0-or-later /* This file is part of the dynarmic project. @@ -21,7 +21,7 @@ #include "dynarmic/common/common_types.h" -#include "dynarmic/tests/A32/testenv.h" +#include "../A32/testenv.h" namespace Unicorn::A32 { static constexpr size_t num_gprs = 16; diff --git a/src/dynarmic/tests/unicorn_emu/a64_unicorn.cpp b/src/dynarmic/tests/unicorn_emu/a64_unicorn.cpp index c8aa404199..3f13377f71 100644 --- a/src/dynarmic/tests/unicorn_emu/a64_unicorn.cpp +++ b/src/dynarmic/tests/unicorn_emu/a64_unicorn.cpp @@ -1,4 +1,4 @@ -// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project +// SPDX-FileCopyrightText: Copyright 2025 Eden Emulator Project // SPDX-License-Identifier: GPL-3.0-or-later /* This file is part of the dynarmic project. @@ -6,11 +6,17 @@ * SPDX-License-Identifier: 0BSD */ -#include -#include "dynarmic/tests/unicorn_emu/a64_unicorn.h" +#include "./a64_unicorn.h" + #include "dynarmic/common/assert.h" -#define CHECKED(expr) do if ((expr)) ASSERT(false && "Call " #expr " failed with error\n"); while (0) +#define CHECKED(expr) \ + do { \ + if (auto cerr_ = (expr)) { \ + ASSERT(false && "Call " #expr " failed with error: {} ({})\n", static_cast(cerr_), \ + uc_strerror(cerr_)); \ + } \ + } while (0) constexpr u64 BEGIN_ADDRESS = 0; constexpr u64 END_ADDRESS = ~u64(0); @@ -166,7 +172,7 @@ void A64Unicorn::DumpMemoryInformation() { void A64Unicorn::InterruptHook(uc_engine* uc, u32 int_number, void* user_data) { auto* this_ = static_cast(user_data); - u32 esr = 0; + u32 esr; //CHECKED(uc_reg_read(uc, UC_ARM64_REG_ESR_EL0, &esr)); auto ec = esr >> 26; diff --git a/src/dynarmic/tests/unicorn_emu/a64_unicorn.h b/src/dynarmic/tests/unicorn_emu/a64_unicorn.h index 1bc5b1cb8e..54f09c3b28 100644 --- a/src/dynarmic/tests/unicorn_emu/a64_unicorn.h +++ b/src/dynarmic/tests/unicorn_emu/a64_unicorn.h @@ -1,4 +1,4 @@ -// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project +// SPDX-FileCopyrightText: Copyright 2025 Eden Emulator Project // SPDX-License-Identifier: GPL-3.0-or-later /* This file is part of the dynarmic project. @@ -21,7 +21,7 @@ #include "dynarmic/common/common_types.h" -#include "dynarmic/tests/A64/testenv.h" +#include "../A64/testenv.h" class A64Unicorn final { public: diff --git a/src/qt_common/config/uisettings.cpp b/src/qt_common/config/uisettings.cpp index f4f5688781..0b668c4bb1 100644 --- a/src/qt_common/config/uisettings.cpp +++ b/src/qt_common/config/uisettings.cpp @@ -1,4 +1,4 @@ -// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project +// SPDX-FileCopyrightText: Copyright 2025 Eden Emulator Project // SPDX-License-Identifier: GPL-3.0-or-later // SPDX-FileCopyrightText: 2016 Citra Emulator Project @@ -25,48 +25,6 @@ namespace FS = Common::FS; namespace UISettings { -// This shouldn't have anything except static initializers (no functions). So -// QKeySequence(...).toString() is NOT ALLOWED HERE. -// This must be in alphabetical order according to action name as it must have the same order as -// UISetting::values.shortcuts, which is alphabetically ordered. -// clang-format off -const std::array default_hotkeys{{ - {QStringLiteral(QT_TRANSLATE_NOOP("Hotkeys", "Audio Mute/Unmute")).toStdString(), QStringLiteral(QT_TRANSLATE_NOOP("Hotkeys", "Main Window")).toStdString(), {std::string("Ctrl+M"), std::string("Home+Dpad_Right"), Qt::WindowShortcut, false}}, - {QStringLiteral(QT_TRANSLATE_NOOP("Hotkeys", "Audio Volume Down")).toStdString(), QStringLiteral(QT_TRANSLATE_NOOP("Hotkeys", "Main Window")).toStdString(), {std::string("-"), std::string("Home+Dpad_Down"), Qt::ApplicationShortcut, true}}, - {QStringLiteral(QT_TRANSLATE_NOOP("Hotkeys", "Audio Volume Up")).toStdString(), QStringLiteral(QT_TRANSLATE_NOOP("Hotkeys", "Main Window")).toStdString(), {std::string("="), std::string("Home+Dpad_Up"), Qt::ApplicationShortcut, true}}, - {QStringLiteral(QT_TRANSLATE_NOOP("Hotkeys", "Capture Screenshot")).toStdString(), QStringLiteral(QT_TRANSLATE_NOOP("Hotkeys", "Main Window")).toStdString(), {std::string("Ctrl+P"), std::string("Screenshot"), Qt::WidgetWithChildrenShortcut, false}}, - {QStringLiteral(QT_TRANSLATE_NOOP("Hotkeys", "Change Adapting Filter")).toStdString(), QStringLiteral(QT_TRANSLATE_NOOP("Hotkeys", "Main Window")).toStdString(), {std::string("F8"), std::string("Home+L"), Qt::ApplicationShortcut, false}}, - {QStringLiteral(QT_TRANSLATE_NOOP("Hotkeys", "Change Docked Mode")).toStdString(), QStringLiteral(QT_TRANSLATE_NOOP("Hotkeys", "Main Window")).toStdString(), {std::string("F10"), std::string("Home+X"), Qt::ApplicationShortcut, false}}, - {QStringLiteral(QT_TRANSLATE_NOOP("Hotkeys", "Change GPU Mode")).toStdString(), QStringLiteral(QT_TRANSLATE_NOOP("Hotkeys", "Main Window")).toStdString(), {std::string("F9"), std::string("Home+R"), Qt::ApplicationShortcut, false}}, - {QStringLiteral(QT_TRANSLATE_NOOP("Hotkeys", "Configure")).toStdString(), QStringLiteral(QT_TRANSLATE_NOOP("Hotkeys", "Main Window")).toStdString(), {std::string("Ctrl+,"), std::string(""), Qt::WidgetWithChildrenShortcut, false}}, - {QStringLiteral(QT_TRANSLATE_NOOP("Hotkeys", "Configure Current Game")).toStdString(), QStringLiteral(QT_TRANSLATE_NOOP("Hotkeys", "Main Window")).toStdString(), {std::string("Ctrl+."), std::string(""), Qt::WidgetWithChildrenShortcut, false}}, - {QStringLiteral(QT_TRANSLATE_NOOP("Hotkeys", "Continue/Pause Emulation")).toStdString(), QStringLiteral(QT_TRANSLATE_NOOP("Hotkeys", "Main Window")).toStdString(), {std::string("F4"), std::string("Home+Plus"), Qt::WindowShortcut, false}}, - {QStringLiteral(QT_TRANSLATE_NOOP("Hotkeys", "Exit Fullscreen")).toStdString(), QStringLiteral(QT_TRANSLATE_NOOP("Hotkeys", "Main Window")).toStdString(), {std::string("Esc"), std::string(""), Qt::WindowShortcut, false}}, - {QStringLiteral(QT_TRANSLATE_NOOP("Hotkeys", "Exit Eden")).toStdString(), QStringLiteral(QT_TRANSLATE_NOOP("Hotkeys", "Main Window")).toStdString(), {std::string("Ctrl+Q"), std::string("Home+Minus"), Qt::WindowShortcut, false}}, - {QStringLiteral(QT_TRANSLATE_NOOP("Hotkeys", "Fullscreen")).toStdString(), QStringLiteral(QT_TRANSLATE_NOOP("Hotkeys", "Main Window")).toStdString(), {std::string("F11"), std::string("Home+B"), Qt::WindowShortcut, false}}, - {QStringLiteral(QT_TRANSLATE_NOOP("Hotkeys", "Load File")).toStdString(), QStringLiteral(QT_TRANSLATE_NOOP("Hotkeys", "Main Window")).toStdString(), {std::string("Ctrl+O"), std::string(""), Qt::WidgetWithChildrenShortcut, false}}, - {QStringLiteral(QT_TRANSLATE_NOOP("Hotkeys", "Load/Remove Amiibo")).toStdString(), QStringLiteral(QT_TRANSLATE_NOOP("Hotkeys", "Main Window")).toStdString(), {std::string("F2"), std::string("Home+A"), Qt::WidgetWithChildrenShortcut, false}}, - {QStringLiteral(QT_TRANSLATE_NOOP("Hotkeys", "Browse Public Game Lobby")).toStdString(), QStringLiteral(QT_TRANSLATE_NOOP("Hotkeys", "Main Window")).toStdString(), {std::string("Ctrl+B"), std::string(""), Qt::ApplicationShortcut, false}}, - {QStringLiteral(QT_TRANSLATE_NOOP("Hotkeys", "Create Room")).toStdString(), QStringLiteral(QT_TRANSLATE_NOOP("Hotkeys", "Main Window")).toStdString(), {std::string("Ctrl+N"), std::string(""), Qt::ApplicationShortcut, false}}, - {QStringLiteral(QT_TRANSLATE_NOOP("Hotkeys", "Direct Connect to Room")).toStdString(), QStringLiteral(QT_TRANSLATE_NOOP("Hotkeys", "Main Window")).toStdString(), {std::string("Ctrl+C"), std::string(""), Qt::ApplicationShortcut, false}}, - {QStringLiteral(QT_TRANSLATE_NOOP("Hotkeys", "Leave Room")).toStdString(), QStringLiteral(QT_TRANSLATE_NOOP("Hotkeys", "Main Window")).toStdString(), {std::string("Ctrl+L"), std::string(""), Qt::ApplicationShortcut, false}}, - {QStringLiteral(QT_TRANSLATE_NOOP("Hotkeys", "Show Current Room")).toStdString(), QStringLiteral(QT_TRANSLATE_NOOP("Hotkeys", "Main Window")).toStdString(), {std::string("Ctrl+R"), std::string(""), Qt::ApplicationShortcut, false}}, - {QStringLiteral(QT_TRANSLATE_NOOP("Hotkeys", "Restart Emulation")).toStdString(), QStringLiteral(QT_TRANSLATE_NOOP("Hotkeys", "Main Window")).toStdString(), {std::string("F6"), std::string("R+Plus+Minus"), Qt::WindowShortcut, false}}, - {QStringLiteral(QT_TRANSLATE_NOOP("Hotkeys", "Stop Emulation")).toStdString(), QStringLiteral(QT_TRANSLATE_NOOP("Hotkeys", "Main Window")).toStdString(), {std::string("F5"), std::string("L+Plus+Minus"), Qt::WindowShortcut, false}}, - {QStringLiteral(QT_TRANSLATE_NOOP("Hotkeys", "TAS Record")).toStdString(), QStringLiteral(QT_TRANSLATE_NOOP("Hotkeys", "Main Window")).toStdString(), {std::string("Ctrl+F7"), std::string(""), Qt::ApplicationShortcut, false}}, - {QStringLiteral(QT_TRANSLATE_NOOP("Hotkeys", "TAS Reset")).toStdString(), QStringLiteral(QT_TRANSLATE_NOOP("Hotkeys", "Main Window")).toStdString(), {std::string("Ctrl+F6"), std::string(""), Qt::ApplicationShortcut, false}}, - {QStringLiteral(QT_TRANSLATE_NOOP("Hotkeys", "TAS Start/Stop")).toStdString(), QStringLiteral(QT_TRANSLATE_NOOP("Hotkeys", "Main Window")).toStdString(), {std::string("Ctrl+F5"), std::string(""), Qt::ApplicationShortcut, false}}, - {QStringLiteral(QT_TRANSLATE_NOOP("Hotkeys", "Toggle Filter Bar")).toStdString(), QStringLiteral(QT_TRANSLATE_NOOP("Hotkeys", "Main Window")).toStdString(), {std::string("Ctrl+F"), std::string(""), Qt::WindowShortcut, false}}, - {QStringLiteral(QT_TRANSLATE_NOOP("Hotkeys", "Toggle Framerate Limit")).toStdString(), QStringLiteral(QT_TRANSLATE_NOOP("Hotkeys", "Main Window")).toStdString(), {std::string("Ctrl+U"), std::string("Home+Y"), Qt::ApplicationShortcut, false}}, - {QStringLiteral(QT_TRANSLATE_NOOP("Hotkeys", "Toggle Turbo Speed")).toStdString(), QStringLiteral(QT_TRANSLATE_NOOP("Hotkeys", "Main Window")).toStdString(), {std::string("Ctrl+Z"), std::string(""), Qt::ApplicationShortcut, false}}, - {QStringLiteral(QT_TRANSLATE_NOOP("Hotkeys", "Toggle Slow Speed")).toStdString(), QStringLiteral(QT_TRANSLATE_NOOP("Hotkeys", "Main Window")).toStdString(), {std::string("Ctrl+X"), std::string(""), Qt::ApplicationShortcut, false}}, - {QStringLiteral(QT_TRANSLATE_NOOP("Hotkeys", "Toggle Mouse Panning")).toStdString(), QStringLiteral(QT_TRANSLATE_NOOP("Hotkeys", "Main Window")).toStdString(), {std::string("Ctrl+F9"), std::string(""), Qt::ApplicationShortcut, false}}, - {QStringLiteral(QT_TRANSLATE_NOOP("Hotkeys", "Toggle Renderdoc Capture")).toStdString(), QStringLiteral(QT_TRANSLATE_NOOP("Hotkeys", "Main Window")).toStdString(), {std::string(""), std::string(""), Qt::ApplicationShortcut, false}}, - {QStringLiteral(QT_TRANSLATE_NOOP("Hotkeys", "Toggle Status Bar")).toStdString(), QStringLiteral(QT_TRANSLATE_NOOP("Hotkeys", "Main Window")).toStdString(), {std::string("Ctrl+S"), std::string(""), Qt::WindowShortcut, false}}, - {QStringLiteral(QT_TRANSLATE_NOOP("Hotkeys", "Toggle Performance Overlay")).toStdString(), QStringLiteral(QT_TRANSLATE_NOOP("Hotkeys", "Main Window")).toStdString(), {std::string("Ctrl+V"), std::string(""), Qt::WindowShortcut, false}}, -}}; -// clang-format on - const Themes themes{{ {"Default", "default"}, {"Default Colorful", "colorful"}, diff --git a/src/qt_common/config/uisettings.h b/src/qt_common/config/uisettings.h index 4549a36345..c2a14858dd 100644 --- a/src/qt_common/config/uisettings.h +++ b/src/qt_common/config/uisettings.h @@ -249,8 +249,47 @@ u32 CalculateWidth(u32 height, Settings::AspectRatio ratio); void SaveWindowState(); void RestoreWindowState(std::unique_ptr& qtConfig); -// sync with uisettings.cpp -extern const std::array default_hotkeys; +// This shouldn't have anything except static initializers (no functions). So +// QKeySequence(...).toString() is NOT ALLOWED HERE. +// This must be in alphabetical order according to action name as it must have the same order as +// UISetting::values.shortcuts, which is alphabetically ordered. +// clang-format off +const std::array default_hotkeys{{ + {QStringLiteral(QT_TRANSLATE_NOOP("Hotkeys", "Audio Mute/Unmute")).toStdString(), QStringLiteral(QT_TRANSLATE_NOOP("Hotkeys", "Main Window")).toStdString(), {std::string("Ctrl+M"), std::string("Home+Dpad_Right"), Qt::WindowShortcut, false}}, + {QStringLiteral(QT_TRANSLATE_NOOP("Hotkeys", "Audio Volume Down")).toStdString(), QStringLiteral(QT_TRANSLATE_NOOP("Hotkeys", "Main Window")).toStdString(), {std::string("-"), std::string("Home+Dpad_Down"), Qt::ApplicationShortcut, true}}, + {QStringLiteral(QT_TRANSLATE_NOOP("Hotkeys", "Audio Volume Up")).toStdString(), QStringLiteral(QT_TRANSLATE_NOOP("Hotkeys", "Main Window")).toStdString(), {std::string("="), std::string("Home+Dpad_Up"), Qt::ApplicationShortcut, true}}, + {QStringLiteral(QT_TRANSLATE_NOOP("Hotkeys", "Capture Screenshot")).toStdString(), QStringLiteral(QT_TRANSLATE_NOOP("Hotkeys", "Main Window")).toStdString(), {std::string("Ctrl+P"), std::string("Screenshot"), Qt::WidgetWithChildrenShortcut, false}}, + {QStringLiteral(QT_TRANSLATE_NOOP("Hotkeys", "Change Adapting Filter")).toStdString(), QStringLiteral(QT_TRANSLATE_NOOP("Hotkeys", "Main Window")).toStdString(), {std::string("F8"), std::string("Home+L"), Qt::ApplicationShortcut, false}}, + {QStringLiteral(QT_TRANSLATE_NOOP("Hotkeys", "Change Docked Mode")).toStdString(), QStringLiteral(QT_TRANSLATE_NOOP("Hotkeys", "Main Window")).toStdString(), {std::string("F10"), std::string("Home+X"), Qt::ApplicationShortcut, false}}, + {QStringLiteral(QT_TRANSLATE_NOOP("Hotkeys", "Change GPU Mode")).toStdString(), QStringLiteral(QT_TRANSLATE_NOOP("Hotkeys", "Main Window")).toStdString(), {std::string("F9"), std::string("Home+R"), Qt::ApplicationShortcut, false}}, + {QStringLiteral(QT_TRANSLATE_NOOP("Hotkeys", "Configure")).toStdString(), QStringLiteral(QT_TRANSLATE_NOOP("Hotkeys", "Main Window")).toStdString(), {std::string("Ctrl+,"), std::string(""), Qt::WidgetWithChildrenShortcut, false}}, + {QStringLiteral(QT_TRANSLATE_NOOP("Hotkeys", "Configure Current Game")).toStdString(), QStringLiteral(QT_TRANSLATE_NOOP("Hotkeys", "Main Window")).toStdString(), {std::string("Ctrl+."), std::string(""), Qt::WidgetWithChildrenShortcut, false}}, + {QStringLiteral(QT_TRANSLATE_NOOP("Hotkeys", "Continue/Pause Emulation")).toStdString(), QStringLiteral(QT_TRANSLATE_NOOP("Hotkeys", "Main Window")).toStdString(), {std::string("F4"), std::string("Home+Plus"), Qt::WindowShortcut, false}}, + {QStringLiteral(QT_TRANSLATE_NOOP("Hotkeys", "Exit Fullscreen")).toStdString(), QStringLiteral(QT_TRANSLATE_NOOP("Hotkeys", "Main Window")).toStdString(), {std::string("Esc"), std::string(""), Qt::WindowShortcut, false}}, + {QStringLiteral(QT_TRANSLATE_NOOP("Hotkeys", "Exit Eden")).toStdString(), QStringLiteral(QT_TRANSLATE_NOOP("Hotkeys", "Main Window")).toStdString(), {std::string("Ctrl+Q"), std::string("Home+Minus"), Qt::WindowShortcut, false}}, + {QStringLiteral(QT_TRANSLATE_NOOP("Hotkeys", "Fullscreen")).toStdString(), QStringLiteral(QT_TRANSLATE_NOOP("Hotkeys", "Main Window")).toStdString(), {std::string("F11"), std::string("Home+B"), Qt::WindowShortcut, false}}, + {QStringLiteral(QT_TRANSLATE_NOOP("Hotkeys", "Load File")).toStdString(), QStringLiteral(QT_TRANSLATE_NOOP("Hotkeys", "Main Window")).toStdString(), {std::string("Ctrl+O"), std::string(""), Qt::WidgetWithChildrenShortcut, false}}, + {QStringLiteral(QT_TRANSLATE_NOOP("Hotkeys", "Load/Remove Amiibo")).toStdString(), QStringLiteral(QT_TRANSLATE_NOOP("Hotkeys", "Main Window")).toStdString(), {std::string("F2"), std::string("Home+A"), Qt::WidgetWithChildrenShortcut, false}}, + {QStringLiteral(QT_TRANSLATE_NOOP("Hotkeys", "Browse Public Game Lobby")).toStdString(), QStringLiteral(QT_TRANSLATE_NOOP("Hotkeys", "Main Window")).toStdString(), {std::string("Ctrl+B"), std::string(""), Qt::ApplicationShortcut, false}}, + {QStringLiteral(QT_TRANSLATE_NOOP("Hotkeys", "Create Room")).toStdString(), QStringLiteral(QT_TRANSLATE_NOOP("Hotkeys", "Main Window")).toStdString(), {std::string("Ctrl+N"), std::string(""), Qt::ApplicationShortcut, false}}, + {QStringLiteral(QT_TRANSLATE_NOOP("Hotkeys", "Direct Connect to Room")).toStdString(), QStringLiteral(QT_TRANSLATE_NOOP("Hotkeys", "Main Window")).toStdString(), {std::string("Ctrl+C"), std::string(""), Qt::ApplicationShortcut, false}}, + {QStringLiteral(QT_TRANSLATE_NOOP("Hotkeys", "Leave Room")).toStdString(), QStringLiteral(QT_TRANSLATE_NOOP("Hotkeys", "Main Window")).toStdString(), {std::string("Ctrl+L"), std::string(""), Qt::ApplicationShortcut, false}}, + {QStringLiteral(QT_TRANSLATE_NOOP("Hotkeys", "Show Current Room")).toStdString(), QStringLiteral(QT_TRANSLATE_NOOP("Hotkeys", "Main Window")).toStdString(), {std::string("Ctrl+R"), std::string(""), Qt::ApplicationShortcut, false}}, + {QStringLiteral(QT_TRANSLATE_NOOP("Hotkeys", "Restart Emulation")).toStdString(), QStringLiteral(QT_TRANSLATE_NOOP("Hotkeys", "Main Window")).toStdString(), {std::string("F6"), std::string("R+Plus+Minus"), Qt::WindowShortcut, false}}, + {QStringLiteral(QT_TRANSLATE_NOOP("Hotkeys", "Stop Emulation")).toStdString(), QStringLiteral(QT_TRANSLATE_NOOP("Hotkeys", "Main Window")).toStdString(), {std::string("F5"), std::string("L+Plus+Minus"), Qt::WindowShortcut, false}}, + {QStringLiteral(QT_TRANSLATE_NOOP("Hotkeys", "TAS Record")).toStdString(), QStringLiteral(QT_TRANSLATE_NOOP("Hotkeys", "Main Window")).toStdString(), {std::string("Ctrl+F7"), std::string(""), Qt::ApplicationShortcut, false}}, + {QStringLiteral(QT_TRANSLATE_NOOP("Hotkeys", "TAS Reset")).toStdString(), QStringLiteral(QT_TRANSLATE_NOOP("Hotkeys", "Main Window")).toStdString(), {std::string("Ctrl+F6"), std::string(""), Qt::ApplicationShortcut, false}}, + {QStringLiteral(QT_TRANSLATE_NOOP("Hotkeys", "TAS Start/Stop")).toStdString(), QStringLiteral(QT_TRANSLATE_NOOP("Hotkeys", "Main Window")).toStdString(), {std::string("Ctrl+F5"), std::string(""), Qt::ApplicationShortcut, false}}, + {QStringLiteral(QT_TRANSLATE_NOOP("Hotkeys", "Toggle Filter Bar")).toStdString(), QStringLiteral(QT_TRANSLATE_NOOP("Hotkeys", "Main Window")).toStdString(), {std::string("Ctrl+F"), std::string(""), Qt::WindowShortcut, false}}, + {QStringLiteral(QT_TRANSLATE_NOOP("Hotkeys", "Toggle Framerate Limit")).toStdString(), QStringLiteral(QT_TRANSLATE_NOOP("Hotkeys", "Main Window")).toStdString(), {std::string("Ctrl+U"), std::string("Home+Y"), Qt::ApplicationShortcut, false}}, + {QStringLiteral(QT_TRANSLATE_NOOP("Hotkeys", "Toggle Turbo Speed")).toStdString(), QStringLiteral(QT_TRANSLATE_NOOP("Hotkeys", "Main Window")).toStdString(), {std::string("Ctrl+Z"), std::string(""), Qt::ApplicationShortcut, false}}, + {QStringLiteral(QT_TRANSLATE_NOOP("Hotkeys", "Toggle Slow Speed")).toStdString(), QStringLiteral(QT_TRANSLATE_NOOP("Hotkeys", "Main Window")).toStdString(), {std::string("Ctrl+X"), std::string(""), Qt::ApplicationShortcut, false}}, + {QStringLiteral(QT_TRANSLATE_NOOP("Hotkeys", "Toggle Mouse Panning")).toStdString(), QStringLiteral(QT_TRANSLATE_NOOP("Hotkeys", "Main Window")).toStdString(), {std::string("Ctrl+F9"), std::string(""), Qt::ApplicationShortcut, false}}, + {QStringLiteral(QT_TRANSLATE_NOOP("Hotkeys", "Toggle Renderdoc Capture")).toStdString(), QStringLiteral(QT_TRANSLATE_NOOP("Hotkeys", "Main Window")).toStdString(), {std::string(""), std::string(""), Qt::ApplicationShortcut, false}}, + {QStringLiteral(QT_TRANSLATE_NOOP("Hotkeys", "Toggle Status Bar")).toStdString(), QStringLiteral(QT_TRANSLATE_NOOP("Hotkeys", "Main Window")).toStdString(), {std::string("Ctrl+S"), std::string(""), Qt::WindowShortcut, false}}, + {QStringLiteral(QT_TRANSLATE_NOOP("Hotkeys", "Toggle Performance Overlay")).toStdString(), QStringLiteral(QT_TRANSLATE_NOOP("Hotkeys", "Main Window")).toStdString(), {std::string("Ctrl+V"), std::string(""), Qt::WindowShortcut, false}}, +}}; +// clang-format on } // namespace UISettings diff --git a/src/video_core/renderer_vulkan/vk_swapchain.cpp b/src/video_core/renderer_vulkan/vk_swapchain.cpp index 0e4c274d94..5d55cf551b 100644 --- a/src/video_core/renderer_vulkan/vk_swapchain.cpp +++ b/src/video_core/renderer_vulkan/vk_swapchain.cpp @@ -9,10 +9,6 @@ #include #include -#ifdef __ANDROID__ -#include -#endif - #include "common/logging.h" #include "common/settings.h" #include "common/settings_enums.h" @@ -174,7 +170,6 @@ bool Swapchain::AcquireNextImage() { break; } - const auto wait_with_frame_pacing = [this] { switch (Settings::values.frame_pacing_mode.GetValue()) { case Settings::FramePacingMode::Target_Auto: scheduler.Wait(resource_ticks[image_index]); @@ -192,17 +187,6 @@ bool Swapchain::AcquireNextImage() { scheduler.Wait(resource_ticks[image_index], 120.0); break; } - }; - -#ifdef __ANDROID__ - if (android_get_device_api_level() >= 30) { - scheduler.Wait(resource_ticks[image_index]); - } else { - wait_with_frame_pacing(); - } -#else - wait_with_frame_pacing(); -#endif resource_ticks[image_index] = scheduler.CurrentTick();