From 60f0f79273bd3fa69ed1b4a77529c1f91d16e8a2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Henrik=20Rydg=C3=A5rd?= Date: Wed, 11 Feb 2026 17:34:49 +0100 Subject: [PATCH 1/6] On Android, rename "Full screen" to "Hide navigation bar" --- Core/Config.h | 2 +- UI/GameSettingsScreen.cpp | 5 +++-- UI/NativeApp.cpp | 2 ++ assets/lang/ar_AE.ini | 3 ++- assets/lang/az_AZ.ini | 3 ++- assets/lang/be_BY.ini | 3 ++- assets/lang/bg_BG.ini | 3 ++- assets/lang/ca_ES.ini | 3 ++- assets/lang/cz_CZ.ini | 3 ++- assets/lang/da_DK.ini | 3 ++- assets/lang/de_DE.ini | 3 ++- assets/lang/dr_ID.ini | 3 ++- assets/lang/en_US.ini | 3 ++- assets/lang/es_ES.ini | 3 ++- assets/lang/es_LA.ini | 3 ++- assets/lang/fa_IR.ini | 3 ++- assets/lang/fi_FI.ini | 3 ++- assets/lang/fr_FR.ini | 3 ++- assets/lang/gl_ES.ini | 3 ++- assets/lang/gr_EL.ini | 3 ++- assets/lang/he_IL.ini | 3 ++- assets/lang/he_IL_invert.ini | 3 ++- assets/lang/hr_HR.ini | 3 ++- assets/lang/hu_HU.ini | 3 ++- assets/lang/id_ID.ini | 3 ++- assets/lang/it_IT.ini | 3 ++- assets/lang/ja_JP.ini | 3 ++- assets/lang/jv_ID.ini | 3 ++- assets/lang/ko_KR.ini | 3 ++- assets/lang/ku_SO.ini | 3 ++- assets/lang/lo_LA.ini | 3 ++- assets/lang/lt-LT.ini | 3 ++- assets/lang/ms_MY.ini | 3 ++- assets/lang/nl_NL.ini | 3 ++- assets/lang/no_NO.ini | 3 ++- assets/lang/pl_PL.ini | 3 ++- assets/lang/pt_BR.ini | 3 ++- assets/lang/pt_PT.ini | 3 ++- assets/lang/ro_RO.ini | 3 ++- assets/lang/ru_RU.ini | 3 ++- assets/lang/sv_SE.ini | 3 ++- assets/lang/tg_PH.ini | 3 ++- assets/lang/th_TH.ini | 3 ++- assets/lang/tr_TR.ini | 3 ++- assets/lang/uk_UA.ini | 3 ++- assets/lang/vi_VN.ini | 3 ++- assets/lang/zh_CN.ini | 3 ++- assets/lang/zh_TW.ini | 3 ++- 48 files changed, 96 insertions(+), 48 deletions(-) diff --git a/Core/Config.h b/Core/Config.h index ce1dfc1c5d..46faa3a45c 100644 --- a/Core/Config.h +++ b/Core/Config.h @@ -90,7 +90,7 @@ struct DisplayLayoutConfig : public ConfigBlock { int iCardboardScreenSize = 50; // Screen Size (in %) int iCardboardXShift = 0; // X-Shift of Screen (in %) int iCardboardYShift = 0; // Y-Shift of Screen (in %) - bool bImmersiveMode = false; // Mode on Android Kitkat 4.4 and later that hides the back button etc. + bool bImmersiveMode = true; // Mode on Android Kitkat 4.4 and later that hides the back button etc. bool InternalRotationIsPortrait() const; bool CanResetToDefault() const override { return true; } diff --git a/UI/GameSettingsScreen.cpp b/UI/GameSettingsScreen.cpp index c1dfee3260..a51f117870 100644 --- a/UI/GameSettingsScreen.cpp +++ b/UI/GameSettingsScreen.cpp @@ -308,6 +308,7 @@ void GameSettingsScreen::CreateTabs() { // Graphics void GameSettingsScreen::CreateGraphicsSettings(UI::ViewGroup *graphicsSettings) { auto gr = GetI18NCategory(I18NCat::GRAPHICS); + auto sy = GetI18NCategory(I18NCat::SYSTEM); auto vr = GetI18NCategory(I18NCat::VR); auto dev = GetI18NCategory(I18NCat::DEVELOPER); @@ -421,7 +422,7 @@ void GameSettingsScreen::CreateGraphicsSettings(UI::ViewGroup *graphicsSettings) if (deviceType != DEVICE_TYPE_VR) { #if !defined(MOBILE_DEVICE) - CheckBox *fullscreenCheckbox = graphicsSettings->Add(new CheckBox(&g_Config.bFullScreen, gr->T("FullScreen", "Full Screen"))); + CheckBox *fullscreenCheckbox = graphicsSettings->Add(new CheckBox(&g_Config.bFullScreen, gr->T("Full screen"))); fullscreenCheckbox->OnClick.Add([](UI::EventParams &e) { System_ApplyFullscreenState(); }); @@ -440,7 +441,7 @@ void GameSettingsScreen::CreateGraphicsSettings(UI::ViewGroup *graphicsSettings) // Hide Immersive Mode on pre-kitkat Android if (System_GetPropertyInt(SYSPROP_SYSTEMVERSION) >= 19) { // Let's reuse the Fullscreen translation string from desktop. - graphicsSettings->Add(new CheckBox(&config.bImmersiveMode, gr->T("FullScreen", "Full Screen")))->OnClick.Handle(this, &GameSettingsScreen::OnImmersiveModeChange); + graphicsSettings->Add(new CheckBox(&config.bImmersiveMode, sy->T("Hide navigation bar")))->OnClick.Handle(this, &GameSettingsScreen::OnImmersiveModeChange); } #endif // Display Layout Editor: To avoid overlapping touch controls on large tablets, meet geeky demands for integer zoom/unstretched image etc. diff --git a/UI/NativeApp.cpp b/UI/NativeApp.cpp index 6345bdd639..c19a0805e5 100644 --- a/UI/NativeApp.cpp +++ b/UI/NativeApp.cpp @@ -1381,6 +1381,8 @@ bool NativeKey(const KeyInput &key) { std::vector tempLangs; g_VFS.GetFileListing("lang", &tempLangs, "ini"); int x = rand() % tempLangs.size(); + + g_Config.DoNotSaveSetting(&g_Config.sLanguageIni); std::string_view code, part2; if (SplitStringOnce(tempLangs[x].name, &code, &part2, '.')) { g_Config.sLanguageIni = code; diff --git a/assets/lang/ar_AE.ini b/assets/lang/ar_AE.ini index 7a24cb4b9d..01db3daba5 100644 --- a/assets/lang/ar_AE.ini +++ b/assets/lang/ar_AE.ini @@ -685,7 +685,7 @@ Frame presentation mode = وضع عرض الإطارات Frame Rate Control = ‎التحكم في معدل الإطارات Frame Skipping = ‎تخطي الإطارات Framerate mode = وضع معدل الإطارات -FullScreen = ‎الشاشة الكاملة +Full screen = ‎الشاشة الكاملة Geometry shader culling = Geometry shader culling GPU texture upscaler (fast) = GPU texture upscaler (fast) GPUReadbackRequired = Warning: This game requires "Skip GPU Readbacks" to be set to Off. @@ -1387,6 +1387,7 @@ Failed to load state for load undo. Error in the file system. = Failed to load s Final processed image = Final processed image Floating symbols = Floating symbols Game crashed = Game crashed +Hide navigation bar = إخفاء شريط التنقل # AI translated I/O timing method = I/O timing method JIT using IR = JIT using IR Language = ‎اللغة diff --git a/assets/lang/az_AZ.ini b/assets/lang/az_AZ.ini index 748fea9795..e22bfb1a6f 100644 --- a/assets/lang/az_AZ.ini +++ b/assets/lang/az_AZ.ini @@ -681,7 +681,7 @@ Frame Rate Control = Kadr yönəldilişi Frame Skipping = Kadr buraxılışı Frame Skipping Type = Kadr buraxılış biçimi Framerate mode = Kadr tezliyi modu -FullScreen = Bütün ekran +Full screen = Bütün ekran Geometry shader culling = Həndəsə kölgəl-sinin ayıqlanışı GPU texture upscaler (fast) = GİB toxumalarının böyüdülüşü (sürətli) GPUReadbackRequired = Xəbərdarlıq: Bu oyun, "GİB Gerioxuşlarının Buraxılmasının" söndürülməsini istəyir. @@ -1382,6 +1382,7 @@ Failed to load state for load undo. Error in the file system. = Geri yükləniş Final processed image = Son işlənmiş görüntü Floating symbols = Üzən simgələr Game crashed = Oyun çökdü +Hide navigation bar = Naviqasiya çubuğunu gizlət # AI translated I/O timing method = G/Ç zamanlama yöntəmi JIT using IR = IR işlədən JIT Language = Dil diff --git a/assets/lang/be_BY.ini b/assets/lang/be_BY.ini index 61bfdba64f..cbb9f3b280 100644 --- a/assets/lang/be_BY.ini +++ b/assets/lang/be_BY.ini @@ -655,6 +655,7 @@ FIFO: relaxed = FIFO: расслаблены Force 60 Hz = Force 60 Hz Frame presentation mode = Рэжым паказу кадра Framerate mode = Режым частаты кадраў +Full screen = Поўнаэкранны рэжым GPU texture upscaler (fast) = GPU texture upscaler (fast) GPUReadbackRequired = Warning: This game requires "Skip GPU Readbacks" to be set to Off. Both = Абодва @@ -679,7 +680,6 @@ Enable Cardboard VR = Enable Cardboard VR FPS = FPS Frame Rate Control = Кіраванне частатой кадраў Frame Skipping = Прапуск кадраў -FullScreen = Поўнаэкранны рэжым Geometry shader culling = Выклік геаметрычных шэйдараў Hack Settings = Hack settings (may cause glitches) Hardware Tessellation = Апаратная тэселяцыя @@ -1366,6 +1366,7 @@ Daylight savings = Летні час Default tab = Укладка па змаўчанні Dynarec/JIT (recommended) = Dynarec/JIT (рэкамендуецца) Final processed image = Канчаткова апрацаванае выява +Hide navigation bar = Схаваць панэль навігацыі # AI translated I/O timing method = Метад сінхранізацыі ўводу-вываду JIT using IR = JIT з выкарыстаннем IR Loaded plugin: %1 = Загружаны плагін: %1 diff --git a/assets/lang/bg_BG.ini b/assets/lang/bg_BG.ini index 43485e2c5e..77ba17b3d4 100644 --- a/assets/lang/bg_BG.ini +++ b/assets/lang/bg_BG.ini @@ -677,7 +677,7 @@ Frame presentation mode = Режим показ на кадър Frame Rate Control = Контрол на честотата на кадрите Frame Skipping = Прескачане на кадри Framerate mode = Режим на кадрите -FullScreen = Цял екран +Full screen = Цял екран Geometry shader culling = Изключване на геометрични шейдъри GPU texture upscaler (fast) = GPU texture upscaler (fast) GPUReadbackRequired = Warning: This game requires "Skip GPU Readbacks" to be set to Off. @@ -1379,6 +1379,7 @@ Failed to load state for load undo. Error in the file system. = Failed to load s Final processed image = Final processed image Floating symbols = Floating symbols Game crashed = Game crashed +Hide navigation bar = Скрий навигационната лента # AI translated I/O timing method = I/O timing method JIT using IR = JIT using IR Language = Език diff --git a/assets/lang/ca_ES.ini b/assets/lang/ca_ES.ini index 6a8d7480d4..a8ec9323c7 100644 --- a/assets/lang/ca_ES.ini +++ b/assets/lang/ca_ES.ini @@ -677,7 +677,7 @@ Frame presentation mode = Mode de presentació de fotograma Frame Rate Control = Control de taxa de quadres (FPS) Frame Skipping = Saltar quadres Framerate mode = Mode de fotogrames -FullScreen = Pantalla completa +Full screen = Pantalla completa Geometry shader culling = Geometry shader culling GPU texture upscaler (fast) = Shader de textura (GPU) GPUReadbackRequired = AVÍS: Aquest joc requereix "Saltar la lectura de GPU" desactivat. @@ -1379,6 +1379,7 @@ Failed to load state for load undo. Error in the file system. = Failed to load s Final processed image = Final processed image Floating symbols = Floating symbols Game crashed = Game crashed +Hide navigation bar = Amaga la barra de navegació # AI translated I/O timing method = I/O timing method JIT using IR = JIT using IR Language = Llengua diff --git a/assets/lang/cz_CZ.ini b/assets/lang/cz_CZ.ini index fa4806cd53..c1aa26c629 100644 --- a/assets/lang/cz_CZ.ini +++ b/assets/lang/cz_CZ.ini @@ -677,7 +677,7 @@ Frame presentation mode = Režim zobrazování snímků Frame Rate Control = Kontrola frekvence snímků Frame Skipping = Přeskakování snímků Framerate mode = Režim snímkové frekvence -FullScreen = Režim celé obrazovky +Full screen = Režim celé obrazovky Geometry shader culling = Geometry shader culling GPU texture upscaler (fast) = GPU texture upscaler (fast) GPUReadbackRequired = Warning: This game requires "Skip GPU Readbacks" to be set to Off. @@ -1379,6 +1379,7 @@ Failed to load state for load undo. Error in the file system. = Failed to load s Final processed image = Final processed image Floating symbols = Floating symbols Game crashed = Game crashed +Hide navigation bar = Skrýt navigační lištu # AI translated I/O timing method = Metoda časování vstupu/výstupu JIT using IR = JIT using IR Language = Jazyk diff --git a/assets/lang/da_DK.ini b/assets/lang/da_DK.ini index d387a05a73..feb8d979eb 100644 --- a/assets/lang/da_DK.ini +++ b/assets/lang/da_DK.ini @@ -677,7 +677,7 @@ Frame presentation mode = Rammevisningstilstand Frame Rate Control = Frameratekontrol Frame Skipping = Frameskipping Framerate mode = Billedfrekvens tilstand -FullScreen = Fuldskærm +Full screen = Fuldskærm Geometry shader culling = Geometry shader culling GPU texture upscaler (fast) = GPU texture upscaler (fast) GPUReadbackRequired = Warning: This game requires "Skip GPU Readbacks" to be set to Off. @@ -1379,6 +1379,7 @@ Failed to load state for load undo. Error in the file system. = Failed to load s Final processed image = Final processed image Floating symbols = Floating symbols Game crashed = Game crashed +Hide navigation bar = Skjul navigationslinjen # AI translated I/O timing method = I/O timing metode JIT using IR = JIT using IR Language = Sprog diff --git a/assets/lang/de_DE.ini b/assets/lang/de_DE.ini index 6aa6629345..f2ed52549a 100644 --- a/assets/lang/de_DE.ini +++ b/assets/lang/de_DE.ini @@ -667,7 +667,7 @@ Frame presentation mode = Bildwiedergabemodus Frame Rate Control = Bildratensteuerung Frame Skipping = Einzelbilder überspringen Framerate mode = Bildfrequenzmodus -FullScreen = Vollbild +Full screen = Vollbild Geometry shader culling = Aussortieren von Geometrie-Schattierern GPU texture upscaler (fast) = GPU-Textur-Hochskalierer (schnell) GPUReadbackRequired = Warnung: Für dieses Spiel muss „GPU-Rücklesungen überspringen“ auf „Aus“ gesetzt sein @@ -1367,6 +1367,7 @@ Failed to load state for load undo. Error in the file system. = Der Status zum R Final processed image = Endgültig verarbeitetes Bild Floating symbols = Schwebende Symbole Game crashed = Spiel abgestürzt +Hide navigation bar = Navigationsleiste ausblenden # AI translated I/O timing method = I/O Timing Methode JIT using IR = JIT benutzt IR Language = Sprache diff --git a/assets/lang/dr_ID.ini b/assets/lang/dr_ID.ini index 09409e0e1b..c4baf8cf11 100644 --- a/assets/lang/dr_ID.ini +++ b/assets/lang/dr_ID.ini @@ -677,7 +677,7 @@ Frame presentation mode = Mode penyajian bingkai Frame Rate Control = Atoro'i FRna Frame Skipping = Frameskip Framerate mode = Mode Frame Rate -FullScreen = Layar pol +Full screen = Layar pol Geometry shader culling = Geometry shader culling GPU texture upscaler (fast) = GPU texture upscaler (fast) GPUReadbackRequired = Warning: This game requires "Skip GPU Readbacks" to be set to Off. @@ -1379,6 +1379,7 @@ Failed to load state for load undo. Error in the file system. = Failed to load s Final processed image = Final processed image Floating symbols = Floating symbols Game crashed = Game crashed +Hide navigation bar = Sembunyikan bilah navigasi # AI translated I/O timing method = I/O timing method JIT using IR = JIT using IR Language = Bahasa diff --git a/assets/lang/en_US.ini b/assets/lang/en_US.ini index 6264e5fab2..b363b25416 100644 --- a/assets/lang/en_US.ini +++ b/assets/lang/en_US.ini @@ -679,6 +679,7 @@ FIFO: relaxed = FIFO: relaxed Force 60 Hz = Force 60 Hz Frame presentation mode = Frame presentation mode Framerate mode = Framerate mode +Full screen = Fullscreen GPU texture upscaler (fast) = GPU texture upscaler (fast) GPUReadbackRequired = Warning: This game requires "Skip GPU Readbacks" to be set to Off. Both = Both @@ -703,7 +704,6 @@ Enable Cardboard VR = Enable Cardboard VR FPS = FPS Frame Rate Control = Framerate control Frame Skipping = Frame skipping -FullScreen = Fullscreen Geometry shader culling = Geometry shader culling Hack Settings = Hack settings (may cause glitches) Hardware Tessellation = Hardware tessellation @@ -1389,6 +1389,7 @@ Daylight savings = Daylight savings Default tab = Default tab Dynarec/JIT (recommended) = Dynarec/JIT (recommended) Final processed image = Final processed image +Hide navigation bar = Hide navigation bar I/O timing method = I/O timing method JIT using IR = JIT using IR Loaded plugin: %1 = Loaded plugin: %1 diff --git a/assets/lang/es_ES.ini b/assets/lang/es_ES.ini index 5e0d0da31c..5a9e0a6b84 100644 --- a/assets/lang/es_ES.ini +++ b/assets/lang/es_ES.ini @@ -678,7 +678,7 @@ Frame presentation mode = Modo de presentación de fotogramas Frame Rate Control = Control de tasa de fotogramas (FPS) Frame Skipping = Salto de fotogramas Framerate mode = Modo de frecuencia de fotogramas -FullScreen = Pantalla completa +Full screen = Pantalla completa Geometry shader culling = Eliminación de sombreadores de geométria GPU texture upscaler (fast) = Escalador de texturas de GPU (rápido) GPUReadbackRequired = AVISO: Este juego requiere que la opción "Omitir lecturas retroactivas de GPU" esté desactivada. @@ -1408,6 +1408,7 @@ Games list settings = Ajustes de lista de juegos General = General Grid icon size = Tamaño de iconos Help the PPSSPP team = Ayuda al equipo de PPSSPP +Hide navigation bar = Ocultar barra de navegación # AI translated Host (bugs, less lag) = Anfitrión (errores, menos retraso) I/O timing method = Método de sincronización de E/S Ignore bad memory accesses = Ignorar accesos erróneos a memoria diff --git a/assets/lang/es_LA.ini b/assets/lang/es_LA.ini index 705185b30e..e5aa190158 100644 --- a/assets/lang/es_LA.ini +++ b/assets/lang/es_LA.ini @@ -677,7 +677,7 @@ Frame presentation mode = Modo de presentación de fotogramas Frame Rate Control = Control de Framerate Frame Skipping = Salto de cuadros Framerate mode = Modo de frecuencia de fotogramas -FullScreen = Pantalla completa +Full screen = Pantalla completa Geometry shader culling = Geometry shader culling GPU texture upscaler (fast) = Shader de texturas GPUReadbackRequired = Warning: Este juego requiere que "Omitir lecturas de GPU" esté desactivado. @@ -1381,6 +1381,7 @@ Failed to load state for load undo. Error in the file system. = Falló la revers Final processed image = Final processed image Floating symbols = Símbolos flotantes Game crashed = El juego crasheo +Hide navigation bar = Ocultar barra de navegación # AI translated I/O timing method = Método de sincronización de E/S JIT using IR = JIT using IR Language = Idioma diff --git a/assets/lang/fa_IR.ini b/assets/lang/fa_IR.ini index 7277805fc8..724955e39b 100644 --- a/assets/lang/fa_IR.ini +++ b/assets/lang/fa_IR.ini @@ -677,7 +677,7 @@ Frame presentation mode = حالت نمایش فریم Frame Rate Control = ‎کنترل سرعت فریم Frame Skipping = ‎ردکردن فریم Framerate mode = حالت فریم -FullScreen = ‎تمام صفحه +Full screen = ‎تمام صفحه Geometry shader culling = Geometry shader culling GPU texture upscaler (fast) = GPU texture upscaler (fast) GPUReadbackRequired = Warning: This game requires "Skip GPU Readbacks" to be set to Off. @@ -1379,6 +1379,7 @@ Failed to load state for load undo. Error in the file system. = Failed to load s Final processed image = Final processed image Floating symbols = Floating symbols Game crashed = Game crashed +Hide navigation bar = مخفی کردن نوار ناوبری # AI translated I/O timing method = ‎(ورودی/خروجی) I/O روش زمان بندی JIT using IR = JIT using IR Language = ‎زبان diff --git a/assets/lang/fi_FI.ini b/assets/lang/fi_FI.ini index b300fd2a8d..3f318ddb9a 100644 --- a/assets/lang/fi_FI.ini +++ b/assets/lang/fi_FI.ini @@ -677,7 +677,7 @@ Frame presentation mode = Ruudun esitystila Frame Rate Control = Kuvataajuuden hallinta Frame Skipping = Kuvan ohitus Framerate mode = Kehyksen nopeus tila -FullScreen = Koko näyttö +Full screen = Koko näyttö Geometry shader culling = Geometria-varjostimen karsinta GPU texture upscaler (fast) = Tekstuurin varjostin (GPU) GPUReadbackRequired = Varoitus: Tämä peli vaatii, että "Ohita näytönohjaimen lukemat" on pois päältä. @@ -1379,6 +1379,7 @@ Failed to load state for load undo. Error in the file system. = Failed to load s Final processed image = Final processed image Floating symbols = Leijuvat symbolit Game crashed = Peli kaatui +Hide navigation bar = Piilota navigointipalkki # AI translated I/O timing method = I/O-aikamenetelmä JIT using IR = JIT using IR Language = Kieli diff --git a/assets/lang/fr_FR.ini b/assets/lang/fr_FR.ini index 9af99aed68..58a4fdc38b 100644 --- a/assets/lang/fr_FR.ini +++ b/assets/lang/fr_FR.ini @@ -677,7 +677,7 @@ Frame presentation mode = Mode de présentation des images Frame Rate Control = Contrôle de la fréquence de rafraîchissement des images Frame Skipping = Saut d'images Framerate mode = Mode de fréquence d'images -FullScreen = Plein écran +Full screen = Plein écran Geometry shader culling = Geometry shader culling GPU texture upscaler (fast) = Shader de textures (GPU) GPUReadbackRequired = Warning: This game requires "Skip GPU Readbacks" to be set to Off. @@ -1370,6 +1370,7 @@ Failed to load state for load undo. Error in the file system. = Failed to load s Final processed image = Final processed image Floating symbols = Floating symbols Game crashed = Game crashed +Hide navigation bar = Masquer la barre de navigation # AI translated I/O timing method = Méthode synchro. E/S JIT using IR = JIT using IR Language = Langue diff --git a/assets/lang/gl_ES.ini b/assets/lang/gl_ES.ini index 895882edde..99fa3792a5 100644 --- a/assets/lang/gl_ES.ini +++ b/assets/lang/gl_ES.ini @@ -677,7 +677,7 @@ Frame presentation mode = Modo de presentación do fotograma Frame Rate Control = Control de tasa de cadros (FPS) Frame Skipping = Saltar cadros Framerate mode = Modo de frecuencia de fotogramas -FullScreen = Pantalla completa +Full screen = Pantalla completa Geometry shader culling = Geometry shader culling GPU texture upscaler (fast) = GPU texture upscaler (fast) GPUReadbackRequired = Warning: This game requires "Skip GPU Readbacks" to be set to Off. @@ -1379,6 +1379,7 @@ Failed to load state for load undo. Error in the file system. = Failed to load s Final processed image = Final processed image Floating symbols = Floating symbols Game crashed = Game crashed +Hide navigation bar = Ocultar a barra de navegación # AI translated I/O timing method = Método de sincronización de E/S JIT using IR = JIT using IR Language = Idioma diff --git a/assets/lang/gr_EL.ini b/assets/lang/gr_EL.ini index b0baf37237..9f87283452 100644 --- a/assets/lang/gr_EL.ini +++ b/assets/lang/gr_EL.ini @@ -677,7 +677,7 @@ Frame presentation mode = Λειτουργία παρουσίασης καρέ Frame Rate Control = Ρυθμίσεις Ρυθμού Καρέ Frame Skipping = Παράκαμψη Καρέ Framerate mode = Λειτουργία ρυθμού καρέ -FullScreen = Πλήρης Οθόνη +Full screen = Πλήρης Οθόνη Geometry shader culling = Geometry shader culling GPU texture upscaler (fast) = GPU texture upscaler (fast) GPUReadbackRequired = Warning: This game requires "Skip GPU Readbacks" to be set to Off. @@ -1379,6 +1379,7 @@ Failed to load state for load undo. Error in the file system. = Failed to load s Final processed image = Final processed image Floating symbols = Floating symbols Game crashed = Game crashed +Hide navigation bar = Απόκρυψη γραμμής πλοήγησης # AI translated I/O timing method = Μέθοδος χρονισμού I/O JIT using IR = JIT using IR Language = Γλώσσα diff --git a/assets/lang/he_IL.ini b/assets/lang/he_IL.ini index cef409e514..d6b145339c 100644 --- a/assets/lang/he_IL.ini +++ b/assets/lang/he_IL.ini @@ -677,7 +677,7 @@ Frame presentation mode = מצב הצגת פריים Frame Rate Control = שליטה על קצב פריימים Frame Skipping = דלג על פריימים Framerate mode = מצב קצב פריימים -FullScreen = מסך מלא +Full screen = מסך מלא Geometry shader culling = Geometry shader culling GPU texture upscaler (fast) = GPU texture upscaler (fast) GPUReadbackRequired = Warning: This game requires "Skip GPU Readbacks" to be set to Off. @@ -1379,6 +1379,7 @@ Failed to load state for load undo. Error in the file system. = Failed to load s Final processed image = Final processed image Floating symbols = Floating symbols Game crashed = Game crashed +Hide navigation bar = להסתיר את סרגל הניווט # AI translated I/O timing method = I/O timing method JIT using IR = JIT using IR Language = שפה diff --git a/assets/lang/he_IL_invert.ini b/assets/lang/he_IL_invert.ini index 431e2b84a4..68189d6508 100644 --- a/assets/lang/he_IL_invert.ini +++ b/assets/lang/he_IL_invert.ini @@ -674,7 +674,7 @@ Frame presentation mode = מצב הצגת פריים Frame Rate Control = םימיירפ בצק לע הטילש Frame Skipping = םימיירפ לע גלד Framerate mode = מצב פריימים -FullScreen = אלמ ךסמ +Full screen = אלמ ךסמ Geometry shader culling = Geometry shader culling GPU texture upscaler (fast) = GPU texture upscaler (fast) GPUReadbackRequired = Warning: This game requires "Skip GPU Readbacks" to be set to Off. @@ -1376,6 +1376,7 @@ Failed to load state for load undo. Error in the file system. = Failed to load s Final processed image = Final processed image Floating symbols = Floating symbols Game crashed = Game crashed +Hide navigation bar = להסתיר את סרגל הניווט # AI translated I/O timing method = I/O timing method JIT using IR = JIT using IR Language = הפש diff --git a/assets/lang/hr_HR.ini b/assets/lang/hr_HR.ini index 27c579f3df..bb34ac97d0 100644 --- a/assets/lang/hr_HR.ini +++ b/assets/lang/hr_HR.ini @@ -677,7 +677,7 @@ Frame presentation mode = Način prikaza kadra Frame Rate Control = Framerate kontrole Frame Skipping = Preskakanje sličica Framerate mode = Modus brzine okvira -FullScreen = Puni zaslon +Full screen = Puni zaslon Geometry shader culling = Geometry shader culling GPU texture upscaler (fast) = GPU texture upscaler (fast) GPUReadbackRequired = Warning: This game requires "Skip GPU Readbacks" to be set to Off. @@ -1379,6 +1379,7 @@ Failed to load state for load undo. Error in the file system. = Failed to load s Final processed image = Final processed image Floating symbols = Floating symbols Game crashed = Game crashed +Hide navigation bar = Sakrij navigacijski trak # AI translated I/O timing method = I/O metoda timing-a JIT using IR = JIT using IR Language = Jezik diff --git a/assets/lang/hu_HU.ini b/assets/lang/hu_HU.ini index 18c6baf383..12847c5fbc 100644 --- a/assets/lang/hu_HU.ini +++ b/assets/lang/hu_HU.ini @@ -677,7 +677,7 @@ Frame presentation mode = Képkocka megjelenítési mód Frame Rate Control = Képkocka sebesség szabályozása Frame Skipping = Képkocka átugrás Framerate mode = Keretfrissítési mód -FullScreen = Teljes képernyő +Full screen = Teljes képernyő Geometry shader culling = Geometry shader culling GPU texture upscaler (fast) = Textúra shader (GPU) GPUReadbackRequired = Warning: This game requires "Skip GPU Readbacks" to be set to Off. @@ -1379,6 +1379,7 @@ Failed to load state for load undo. Error in the file system. = Nem sikerült be Final processed image = Final processed image Floating symbols = Lebegő szimbólumok Game crashed = A játék összeomlott +Hide navigation bar = Navigációs sáv elrejtése # AI translated I/O timing method = I/O időzítési metódus JIT using IR = JIT using IR Language = Nyelv diff --git a/assets/lang/id_ID.ini b/assets/lang/id_ID.ini index 6d13fd1ff3..43646c0de2 100644 --- a/assets/lang/id_ID.ini +++ b/assets/lang/id_ID.ini @@ -677,7 +677,7 @@ Frame presentation mode = Mode presentasi frame Frame Rate Control = Kontrol Frame Rate Frame Skipping = Frame Skipping Framerate mode = Mode Frame Rate -FullScreen = Layar penuh +Full screen = Layar penuh Geometry shader culling = Pemusnahan shader geometri GPU texture upscaler (fast) = Tekstur shader (GPU) GPUReadbackRequired = Peringatan: Game ini mengharuskan "Lewati Pembacaan Ulang GPU" diatur ke Nonaktif. @@ -1379,6 +1379,7 @@ Failed to load state for load undo. Error in the file system. = Gagal untuk memu Final processed image = Gambar final yang terproses Floating symbols = Simbol mengambang Game crashed = Game Macet +Hide navigation bar = Sembunyikan bilah navigasi # AI translated I/O timing method = Metode timing I/O JIT using IR = JIT menggunakan IR Language = Bahasa diff --git a/assets/lang/it_IT.ini b/assets/lang/it_IT.ini index 8a8cceb7a0..05c2d24296 100644 --- a/assets/lang/it_IT.ini +++ b/assets/lang/it_IT.ini @@ -678,7 +678,7 @@ Frame presentation mode = Modalità di presentazione del fotogramma Frame Rate Control = Controllo Framerate Frame Skipping = Salto frame Framerate mode = Modalità framerate -FullScreen = Schermo Intero +Full screen = Schermo Intero Geometry shader culling = Eliminazione dello shader geometrico GPU texture upscaler (fast) = Shader delle texture (GPU) GPUReadbackRequired = Attenzione: Questo gioco richiede che "Salta le letture della GPU" sia impostato su Off. @@ -1381,6 +1381,7 @@ Failed to load state for load undo. Error in the file system. = Impossibile cari Final processed image = Immagine finale elaborata Floating symbols = Simboli fluttuanti Game crashed = Il gioco è andato in crash +Hide navigation bar = Nascondi barra di navigazione # AI translated I/O timing method = Metodo di temporizzazione I/O JIT using IR = JIT utilizzando IR Language = Lingua diff --git a/assets/lang/ja_JP.ini b/assets/lang/ja_JP.ini index 862dc34ce5..515541f850 100644 --- a/assets/lang/ja_JP.ini +++ b/assets/lang/ja_JP.ini @@ -677,7 +677,7 @@ Frame presentation mode = フレーム表示モード Frame Rate Control = フレームレートのコントロール Frame Skipping = フレームスキップ Framerate mode = フレームレートモード -FullScreen = フルスクリーン +Full screen = フルスクリーン Geometry shader culling = ジオメトリシェーダーのカリング GPU texture upscaler (fast) = テクスチャシェーダ GPUReadbackRequired = 警告: このゲームは"GPUリードバックのスキップ"をオフにする必要があります。 @@ -1379,6 +1379,7 @@ Failed to load state for load undo. Error in the file system. = ロードを元 Final processed image = 最後に処理された画像形式 Floating symbols = フローティングシンボル(○✕△□アイコン) Game crashed = ゲームがクラッシュしました +Hide navigation bar = ナビゲーションバーを隠す # AI translated I/O timing method = 入出力のタイミング JIT using IR = IRを使用したJIT Language = 言語 diff --git a/assets/lang/jv_ID.ini b/assets/lang/jv_ID.ini index 96fcc04e6f..e23899badb 100644 --- a/assets/lang/jv_ID.ini +++ b/assets/lang/jv_ID.ini @@ -677,7 +677,7 @@ Frame presentation mode = Mode tampilan bingkai Frame Rate Control = Kontrol Frame-rate Frame Skipping = Frame-skip Framerate mode = Mode Framerate -FullScreen = Layar Penuh +Full screen = Layar Penuh Geometry shader culling = Geometry shader culling GPU texture upscaler (fast) = GPU texture upscaler (fast) GPUReadbackRequired = Warning: This game requires "Skip GPU Readbacks" to be set to Off. @@ -1379,6 +1379,7 @@ Failed to load state for load undo. Error in the file system. = Failed to load s Final processed image = Final processed image Floating symbols = Floating symbols Game crashed = Game crashed +Hide navigation bar = Sembunyikan bilah navigasi # AI translated I/O timing method = IO wektu method JIT using IR = JIT using IR Language = Basa diff --git a/assets/lang/ko_KR.ini b/assets/lang/ko_KR.ini index de76ace11f..3022119d4b 100644 --- a/assets/lang/ko_KR.ini +++ b/assets/lang/ko_KR.ini @@ -655,6 +655,7 @@ FIFO: relaxed = FIFO: 느슨함 Force 60 Hz = 강제 60 Hz Frame presentation mode = 프레임 표시 모드 Framerate mode = 프레임 속도 모드 +Full screen = 전체화면 GPU texture upscaler (fast) = 텍스처 쉐이더 (GPU) GPUReadbackRequired = 경고: 이 게임을 하려면 "GPU 리드백 건너뛰기"를 끄기로 설정해야 합니다. Both = 둘 다 @@ -679,7 +680,6 @@ Enable Cardboard VR = 카드보드 VR 활성화 FPS = FPS Frame Rate Control = 프레임속도 제어 Frame Skipping = 프레임 생략 -FullScreen = 전체화면 Geometry shader culling = 기하학 쉐이더 삭제 Hack Settings = 핵 설정 (결함을 일으킬 수 있음) Hardware Tessellation = 하드웨어 조각화 @@ -1366,6 +1366,7 @@ Daylight savings = 서머 타임 Default tab = 기본 탭 Dynarec/JIT (recommended) = 동적 재컴파일/JIT (추천) Final processed image = 최종 처리된 이미지 +Hide navigation bar = 탐색 모음 숨기기 # AI translated I/O timing method = I/O 타이밍 방식 JIT using IR = IR을 이용한 JIT Loaded plugin: %1 = 로드된 플러그인: %1 diff --git a/assets/lang/ku_SO.ini b/assets/lang/ku_SO.ini index c9c7c20b84..e7a777f72b 100644 --- a/assets/lang/ku_SO.ini +++ b/assets/lang/ku_SO.ini @@ -669,6 +669,7 @@ FIFO: relaxed = FIFO: aram Force 60 Hz = Force 60 Hz Frame presentation mode = Moda nîşandina frame Framerate mode = Rejîma Framerate +Full screen = Fullscreen GPU texture upscaler (fast) = GPU texture upscaler (fast) GPUReadbackRequired = Warning: This game requires "Skip GPU Readbacks" to be set to Off. Both = Both @@ -693,7 +694,6 @@ Enable Cardboard VR = Enable Cardboard VR FPS = FPS Frame Rate Control = Framerate control Frame Skipping = Frame skipping -FullScreen = Fullscreen Geometry shader culling = Geometry shader culling Hack Settings = Hack settings (may cause glitches) Hardware Tessellation = Hardware tessellation @@ -1381,6 +1381,7 @@ Default tab = Default tab Dynarec/JIT (recommended) = Dynarec/JIT (recommended) Enable plugins = Enable plugins Final processed image = Final processed image +Hide navigation bar = Şopandina barê navegerê # AI translated I/O timing method = I/O timing method JIT using IR = JIT using IR Loaded plugin: %1 = Loaded plugin: %1 diff --git a/assets/lang/lo_LA.ini b/assets/lang/lo_LA.ini index 2aa9613118..172ab249b0 100644 --- a/assets/lang/lo_LA.ini +++ b/assets/lang/lo_LA.ini @@ -677,7 +677,7 @@ Frame presentation mode = ຮູບແບບການສະແດງແຟຣມ Frame Rate Control = ຄວບຄຸມເຟຣມເຣດ Frame Skipping = ຂ້າມເຟຣມ Framerate mode = ສະຖານທີ່ອະນຸມັດລະດັບ -FullScreen = ເຕັມໜ້າຈໍ +Full screen = ເຕັມໜ້າຈໍ Geometry shader culling = Geometry shader culling GPU texture upscaler (fast) = GPU texture upscaler (fast) GPUReadbackRequired = Warning: This game requires "Skip GPU Readbacks" to be set to Off. @@ -1379,6 +1379,7 @@ Failed to load state for load undo. Error in the file system. = Failed to load s Final processed image = Final processed image Floating symbols = Floating symbols Game crashed = Game crashed +Hide navigation bar = ເຊື່ອນບານນິບນໍາ # AI translated I/O timing method = ທາງເລືອກຄຳນວນເວລາ ຮັບ/ສົ່ງ (I/O) JIT using IR = JIT using IR Language = ພາສາ diff --git a/assets/lang/lt-LT.ini b/assets/lang/lt-LT.ini index b3bfe76106..727078dd9b 100644 --- a/assets/lang/lt-LT.ini +++ b/assets/lang/lt-LT.ini @@ -677,7 +677,7 @@ Frame presentation mode = Kadro pateikimo režimas Frame Rate Control = Kadrų kontrolė Frame Skipping = Kadrų praleidimas Framerate mode = Kadrų dažnio režimas -FullScreen = Pilnas ekranas +Full screen = Pilnas ekranas Geometry shader culling = Geometry shader culling GPU texture upscaler (fast) = GPU texture upscaler (fast) GPUReadbackRequired = Warning: This game requires "Skip GPU Readbacks" to be set to Off. @@ -1379,6 +1379,7 @@ Failed to load state for load undo. Error in the file system. = Failed to load s Final processed image = Final processed image Floating symbols = Floating symbols Game crashed = Game crashed +Hide navigation bar = Paslėpti navigacijos juostą # AI translated I/O timing method = I/O timing method JIT using IR = JIT using IR Language = Kalba diff --git a/assets/lang/ms_MY.ini b/assets/lang/ms_MY.ini index 410446279a..01d4242f62 100644 --- a/assets/lang/ms_MY.ini +++ b/assets/lang/ms_MY.ini @@ -677,7 +677,7 @@ Frame presentation mode = Mod paparan bingkai Frame Rate Control = Kawalan kadar Frame Frame Skipping = Pelompatan Frame Framerate mode = Mod Framerate -FullScreen = Skrin penuh +Full screen = Skrin penuh Geometry shader culling = Geometry shader culling GPU texture upscaler (fast) = GPU texture upscaler (fast) GPUReadbackRequired = Warning: This game requires "Skip GPU Readbacks" to be set to Off. @@ -1379,6 +1379,7 @@ Failed to load state for load undo. Error in the file system. = Failed to load s Final processed image = Final processed image Floating symbols = Floating symbols Game crashed = Game crashed +Hide navigation bar = Sembunyikan bar navigasi # AI translated I/O timing method = I/O timing method JIT using IR = JIT using IR Language = Bahasa diff --git a/assets/lang/nl_NL.ini b/assets/lang/nl_NL.ini index 3b0a439cd8..493c7ce29b 100644 --- a/assets/lang/nl_NL.ini +++ b/assets/lang/nl_NL.ini @@ -677,7 +677,7 @@ Frame presentation mode = Weergavemodus voor frames Frame Rate Control = Framerateinstellingen Frame Skipping = Frames overslaan Framerate mode = Framesnelheidsmodus -FullScreen = Volledig scherm +Full screen = Volledig scherm Geometry shader culling = Geometry shader culling GPU texture upscaler (fast) = GPU texture upscaler (fast) GPUReadbackRequired = Warning: This game requires "Skip GPU Readbacks" to be set to Off. @@ -1379,6 +1379,7 @@ Failed to load state for load undo. Error in the file system. = Failed to load s Final processed image = Final processed image Floating symbols = Floating symbols Game crashed = Game crashed +Hide navigation bar = Verberg navigatiebalk # AI translated I/O timing method = I/O-timingmethode JIT using IR = JIT using IR Language = Taal diff --git a/assets/lang/no_NO.ini b/assets/lang/no_NO.ini index faacbf8495..5a6665f439 100644 --- a/assets/lang/no_NO.ini +++ b/assets/lang/no_NO.ini @@ -677,7 +677,7 @@ Frame presentation mode = Rammevisningsmodus Frame Rate Control = Framerate control Frame Skipping = Ramme Hoppe over Framerate mode = Bildehastighetsmodus -FullScreen = Fullskjerm +Full screen = Fullskjerm Geometry shader culling = Geometry shader culling GPU texture upscaler (fast) = GPU texture upscaler (fast) GPUReadbackRequired = Warning: This game requires "Skip GPU Readbacks" to be set to Off. @@ -1379,6 +1379,7 @@ Failed to load state for load undo. Error in the file system. = Failed to load s Final processed image = Final processed image Floating symbols = Floating symbols Game crashed = Spillet krasjet +Hide navigation bar = Skjul navigasjonslinjen # AI translated I/O timing method = I/O timing method JIT using IR = JIT using IR Language = Språk diff --git a/assets/lang/pl_PL.ini b/assets/lang/pl_PL.ini index e0aa21107d..0e7ee9bc06 100644 --- a/assets/lang/pl_PL.ini +++ b/assets/lang/pl_PL.ini @@ -674,7 +674,7 @@ FPS = Tylko FPS Frame Rate Control = Kontrola klatek na sekundę Frame Skipping = Pomijanie klatek Framerate mode = Tryb liczby klatek -FullScreen = Pełny ekran +Full screen = Pełny ekran Geometry shader culling = Przycinanie shaderów geometrii GPU texture upscaler (fast) = Shadery tekstur GPUReadbackRequired = Uwaga: Ta gra wymaga wyłączenia opcji "Pomiń odczyty zwrotne GPU". @@ -1376,6 +1376,7 @@ Failed to load state for load undo. Error in the file system. = Błąd podczas Final processed image = Obraz końcowy Floating symbols = Przepływ symboli Game crashed = Gra uległa awarii +Hide navigation bar = Ukryj pasek nawigacji # AI translated JIT using IR = JIT używając IR Language = Język Loaded plugin: %1 = Załadowano wtyczek: %1 diff --git a/assets/lang/pt_BR.ini b/assets/lang/pt_BR.ini index 8869f4db08..0650799bc7 100644 --- a/assets/lang/pt_BR.ini +++ b/assets/lang/pt_BR.ini @@ -679,6 +679,7 @@ FIFO: relaxed = FIFO: relaxado Force 60 Hz = Forçar 60 Hz Frame presentation mode = Modo de apresentação dos frames Framerate mode = Modo da taxa dos frames +Full screen = Tela Cheia GPU texture upscaler (fast) = Ampliador de texturas da GPU (rápido) GPUReadbackRequired = Aviso: Este jogo requer que o "Ignorar Leituras da GPU" esteja definido como Desligado. Both = Ambos @@ -703,7 +704,6 @@ Enable Cardboard VR = Ativar a realidade virtual do Cardboard FPS = FPS Frame Rate Control = Controle da taxa dos frames Frame Skipping = Pulo dos frames -FullScreen = Tela Cheia Geometry shader culling = Abate do shader da geometria Hack Settings = Configurações dos hacks (pode causar erros gráficos) Hardware Tessellation = Tesselação por hardware @@ -1389,6 +1389,7 @@ Daylight savings = Horário de verão Default tab = Aba padrão Dynarec/JIT (recommended) = Dynarec/JIT (recomendado) Final processed image = Imagem final processada +Hide navigation bar = Ocultar barra de navegação # AI translated I/O timing method = Método de cronometragem da E/S JIT using IR = JIT usando o IR Loaded plugin: %1 = Plugin carregado: %1 diff --git a/assets/lang/pt_PT.ini b/assets/lang/pt_PT.ini index dcbd0e7af4..5cea2aee2d 100644 --- a/assets/lang/pt_PT.ini +++ b/assets/lang/pt_PT.ini @@ -701,7 +701,7 @@ Frame presentation mode = Modo de apresentação de quadros Frame Rate Control = Controlo da taxa dos frames Frame Skipping = Salto de frames Framerate mode = Modo de taxa de quadros -FullScreen = Ecrã Cheio +Full screen = Ecrã Cheio Geometry shader culling = Abate do Shader Geométric GPU texture upscaler (fast) = Shader das texturas (GPU) GPUReadbackRequired = AVISO: Este jogo requer que "Saltar Readbacks da GPU" esteja desativado. @@ -1394,6 +1394,7 @@ Dynarec/JIT (recommended) = Dynarec/JIT (recomendado) Enable plugins = Enable plugins Final processed image = Final processed image Game crashed = O jogo crashou +Hide navigation bar = Ocultar barra de navegação # AI translated I/O timing method = Método de cronometragem da E/S JIT using IR = JIT using IR Language = Idioma diff --git a/assets/lang/ro_RO.ini b/assets/lang/ro_RO.ini index bb74f0be05..ebf960a440 100644 --- a/assets/lang/ro_RO.ini +++ b/assets/lang/ro_RO.ini @@ -678,7 +678,7 @@ Frame presentation mode = Mod prezentare cadru Frame Rate Control = Control rată de cadre Frame Skipping = Cadre Omise Framerate mode = Mod de cadru -FullScreen = Ecran intreg +Full screen = Ecran intreg Geometry shader culling = Geometry shader culling GPU texture upscaler (fast) = GPU texture upscaler (fast) GPUReadbackRequired = Warning: This game requires "Skip GPU Readbacks" to be set to Off. @@ -1380,6 +1380,7 @@ Failed to load state for load undo. Error in the file system. = Failed to load s Final processed image = Final processed image Floating symbols = Floating symbols Game crashed = Game crashed +Hide navigation bar = Ascunde bara de navigare # AI translated I/O timing method = Metodă de temporizare I/O JIT using IR = JIT using IR Language = Limbă diff --git a/assets/lang/ru_RU.ini b/assets/lang/ru_RU.ini index 171ac5c866..b5fdbde618 100644 --- a/assets/lang/ru_RU.ini +++ b/assets/lang/ru_RU.ini @@ -677,7 +677,7 @@ Frame presentation mode = Режим отображения кадров Frame Rate Control = Управление частотой кадров Frame Skipping = Пропуск кадров Framerate mode = Режим частоты кадров -FullScreen = Полноэкранный режим +Full screen = Полноэкранный режим Geometry shader culling = Вызов геометрических шейдеров GPU texture upscaler (fast) = Масштабирование текстур с помощью ГП (быстро) GPUReadbackRequired = Внимание: Для данной игры нужно отключить настройку "Пропускать чтение данных ГП". @@ -1376,6 +1376,7 @@ Dynarec/JIT (recommended) = Динамическая рекомпиляция/JI Enable plugins = Включить плагины Final processed image = Окончательно обработанное изображение Game crashed = Игра вылетела +Hide navigation bar = Скрыть панель навигации # AI translated I/O timing method = Метод тайминга ввода-вывода JIT using IR = JIT с использованием IR Language = Язык diff --git a/assets/lang/sv_SE.ini b/assets/lang/sv_SE.ini index 2626c06351..6932dc5561 100644 --- a/assets/lang/sv_SE.ini +++ b/assets/lang/sv_SE.ini @@ -678,7 +678,7 @@ Frame presentation mode = Presentationsläge för bildrutor Frame Rate Control = Framerate-kontroll Frame Skipping = Frame-skipping Framerate mode = Bildrutemod -FullScreen = Fullskärm +Full screen = Fullskärm Geometry shader culling = Geoshader-klippning GPU texture upscaler (fast) = GPU-baserad texturuppskalare (snabb) GPUReadbackRequired = Varning: Detta spel kräver att 'Skippa dataläsningar från GPU:n' är avstängt. @@ -1380,6 +1380,7 @@ Failed to load state for load undo. Error in the file system. = Misslyckades med Final processed image = Slutgiltig bearbetad bild Floating symbols = Flytande symboler Game crashed = Spelet kraschade +Hide navigation bar = Dölj navigationsfältet # AI translated I/O timing method = IO-timingsmetod JIT using IR = JIT, med IR Loaded plugin: %1 = Laddad insticksmodul: %1 diff --git a/assets/lang/tg_PH.ini b/assets/lang/tg_PH.ini index 82f109b34f..c18343e47e 100644 --- a/assets/lang/tg_PH.ini +++ b/assets/lang/tg_PH.ini @@ -678,7 +678,7 @@ Frame presentation mode = Mode ng pagpapakita ng frame Frame Rate Control = Pag kontrol ng frame rate Frame Skipping = Frame Skipping Framerate mode = Режими кадр -FullScreen = Isakto sa Sukat ng iyong Iskrin +Full screen = Isakto sa Sukat ng iyong Iskrin Geometry shader culling = Geometry shader culling GPU texture upscaler (fast) = GPU texture upscaler (fast) GPUReadbackRequired = Babala: This game requires "Skip GPU Readbacks" to be set to Off. @@ -1382,6 +1382,7 @@ Failed to load state for load undo. Error in the file system. = Nabigong i-load Final processed image = Final processed image Floating symbols = Lumulutang na mga simbolo Game crashed = Na-crash ang laro +Hide navigation bar = Пӯшида кардан бари муҳити навигатсионӣ # AI translated I/O timing method = I/O timing method JIT using IR = JIT gamit ang IR Language = Wika diff --git a/assets/lang/th_TH.ini b/assets/lang/th_TH.ini index 7fac699760..1f7e0d3544 100644 --- a/assets/lang/th_TH.ini +++ b/assets/lang/th_TH.ini @@ -695,7 +695,7 @@ Frame presentation mode = โหมดการแสดงเฟรม Frame Rate Control = การควบคุมเฟรมเรท Frame Skipping = ข้ามเฟรม Framerate mode = โหมดเฟรมเรท -FullScreen = เต็มหน้าจอ +Full screen = เต็มหน้าจอ Geometry shader culling = การคัดแยกเฉดสีเชิงเรขาคณิต GPU texture upscaler (fast) = รูปแบบอัพสเกลพื้นผิวโดยใช้ GPU (เร็ว) GPUReadbackRequired = คำเตือน: เกมนี้จำเป็นต้องติ๊กตั้งค่า "ข้ามการอ่านข้อมูลส่งกลับไปยัง GPU" ออกด้วย @@ -1442,6 +1442,7 @@ Games list settings = การตั้งค่าในรายการเ General = ทั่วไป Grid icon size = ขนาดของไอคอนเกม Help the PPSSPP team = ช่วยเหลือทีมงาน PPSSPP +Hide navigation bar = ซ่อนแถบการนำทาง # AI translated Host (bugs, less lag) = โฮสต์ (อาจเกิดบั๊ก, แล็กน้อยลง) I/O timing method = ทางเลือกคำนวณเวลา รับ/ส่ง ข้อมูล Ignore bad memory accesses = ละเว้นการเข้าถึงหน่วยความจำที่ผิดพลาด diff --git a/assets/lang/tr_TR.ini b/assets/lang/tr_TR.ini index 90b79da48f..33dbb7f2b0 100644 --- a/assets/lang/tr_TR.ini +++ b/assets/lang/tr_TR.ini @@ -679,7 +679,7 @@ Frame presentation mode = Kare sunum modu Frame Rate Control = Kare Hızı Denetimi Frame Skipping = Kare Atla Framerate mode = Kare Hızı Modu -FullScreen = Tam Ekran +Full screen = Tam Ekran Geometry shader culling = Geometri gölgelendiricisi ayıklama GPU texture upscaler (fast) = Doku gölgelendiricisi (GPU) GPUReadbackRequired = Uyarı: Bu oyun "GPU Okumalarını Atla" seçeneğinin Kapalı olarak ayarlanmasını gerektirir. @@ -1380,6 +1380,7 @@ Failed to load state for load undo. Error in the file system. = Yüklü durum ge Final processed image = Son işlenmiş görüntü Floating symbols = Kayan Simgeler Game crashed = Oyun çöktü +Hide navigation bar = Gezinti çubuğunu gizle # AI translated I/O timing method = IO Zamanlama Yöntemi JIT using IR = IR kullanarak JIT Language = Dil diff --git a/assets/lang/uk_UA.ini b/assets/lang/uk_UA.ini index 2bccace875..69a4911b7b 100644 --- a/assets/lang/uk_UA.ini +++ b/assets/lang/uk_UA.ini @@ -677,7 +677,7 @@ Frame presentation mode = Режим відображення кадру Frame Rate Control = Управління частотою кадрів Frame Skipping = Пропуск кадрів Framerate mode = Режим частоти кадрів -FullScreen = Повноекранний режим +Full screen = Повноекранний режим Geometry shader culling = Вибракування шейдерів геометрії GPU texture upscaler (fast) = Шейдер текстур (GPU) GPUReadbackRequired = Увага: Ця гра вимагає "Пропустити зворотні зчитування GPU" встановити значення вимкнути. @@ -1379,6 +1379,7 @@ Failed to load state for load undo. Error in the file system. = Failed to load s Final processed image = Остаточне оброблене зображення Floating symbols = Пари символи Game crashed = Гра вийшла з ладу +Hide navigation bar = Сховати панель навігації # AI translated I/O timing method = Метод таймінгу введення-виведення JIT using IR = JIT використовуючи IR Language = Мова diff --git a/assets/lang/vi_VN.ini b/assets/lang/vi_VN.ini index edce2b5d46..957e83d8ba 100644 --- a/assets/lang/vi_VN.ini +++ b/assets/lang/vi_VN.ini @@ -677,7 +677,7 @@ Frame presentation mode = Chế độ hiển thị khung Frame Rate Control = Điều khiển tốc độ khung hình Frame Skipping = Nhảy khuôn hình Framerate mode = Chế độ tần suất khung hình -FullScreen = Toàn màn hình +Full screen = Toàn màn hình Geometry shader culling = Geometry shader culling GPU texture upscaler (fast) = GPU texture upscaler (fast) GPUReadbackRequired = Warning: This game requires "Skip GPU Readbacks" to be set to Off. @@ -1379,6 +1379,7 @@ Failed to load state for load undo. Error in the file system. = Failed to load s Final processed image = Final processed image Floating symbols = Floating symbols Game crashed = Game crashed +Hide navigation bar = Ẩn thanh điều hướng # AI translated I/O timing method = I/O phương pháp thời gian JIT using IR = JIT using IR Language = Ngôn ngữ diff --git a/assets/lang/zh_CN.ini b/assets/lang/zh_CN.ini index 99813a4ad8..8ddf886b96 100644 --- a/assets/lang/zh_CN.ini +++ b/assets/lang/zh_CN.ini @@ -677,7 +677,7 @@ Frame presentation mode = 帧呈现模式 Frame Rate Control = 帧率控制 Frame Skipping = 跳帧 Framerate mode = 帧率模式 -FullScreen = 全屏幕 +Full screen = 全屏幕 Geometry shader culling = 几何着色器剔除 GPU texture upscaler (fast) = 纹理着色器 (GPU加速) GPUReadbackRequired = 警告:此游戏需要关闭“跳过GPU块传输”。 @@ -1368,6 +1368,7 @@ Default tab = 默认选项卡 Dynarec/JIT (recommended) = 动态重编译 (推荐) Enable plugins = 启用插件 Final processed image = 最终处理图像 +Hide navigation bar = 隐藏导航栏 # AI translated I/O timing method = I/O时序方法 JIT using IR = 动态重编译 (IR模式) Loaded plugin: %1 = 已加载插件: %1 diff --git a/assets/lang/zh_TW.ini b/assets/lang/zh_TW.ini index 2741f6483b..ce6338055c 100644 --- a/assets/lang/zh_TW.ini +++ b/assets/lang/zh_TW.ini @@ -677,7 +677,7 @@ Frame presentation mode = 幀呈現模式 Frame Rate Control = 影格速率控制 Frame Skipping = 影格跳過 Framerate mode = 幀率模式 -FullScreen = 全螢幕 +Full screen = 全螢幕 Geometry shader culling = 幾何著色器揀選 GPU texture upscaler (fast) = 紋理著色器 (GPU) GPUReadbackRequired = 警告:此遊戲需要關閉「跳過 GPU 讀回」 @@ -1368,6 +1368,7 @@ Dynarec/JIT (recommended) = 動態重新編譯/JIT (建議) Enable plugins = 啟用外掛程式 Final processed image = 處理後影像 Game crashed = 遊戲已當機 +Hide navigation bar = 隱藏導航欄 # AI translated I/O timing method = I/O 計時方法 JIT using IR = JIT 使用 IR Language = 語言 From e1b638aaab52fe129e23bff6c0bf94bebe76d02d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Henrik=20Rydg=C3=A5rd?= Date: Wed, 11 Feb 2026 18:14:26 +0100 Subject: [PATCH 2/6] Minor UI tweaks --- Core/Config.cpp | 4 ++-- UI/EmuScreen.cpp | 5 +++-- UI/GameSettingsScreen.cpp | 2 +- UI/PauseScreen.cpp | 2 +- Windows/MainWindowMenu.cpp | 3 ++- 5 files changed, 9 insertions(+), 7 deletions(-) diff --git a/Core/Config.cpp b/Core/Config.cpp index 23e273e392..26607420e5 100644 --- a/Core/Config.cpp +++ b/Core/Config.cpp @@ -71,8 +71,8 @@ static const std::string_view logSectionName = "LogDebug"; static const std::string_view logSectionName = "Log"; #endif -static const std::vector defaultProAdhocServerList = { - "socom.cc", "psp.gameplayer.club", // TODO: Add some saved recent history too? +const std::vector defaultProAdhocServerList = { + "socom.cc", "psp.gameplayer.club", }; std::string GPUBackendToString(GPUBackend backend) { diff --git a/UI/EmuScreen.cpp b/UI/EmuScreen.cpp index 36a52f11a5..2b26d72287 100644 --- a/UI/EmuScreen.cpp +++ b/UI/EmuScreen.cpp @@ -2018,10 +2018,11 @@ void EmuScreen::AutoLoadSaveState() { SaveState::LoadSlot(gamePrefix, autoSlot, [this, autoSlot](SaveState::Status status, std::string_view message) { AfterSaveStateAction(status, message); auto sy = GetI18NCategory(I18NCat::SYSTEM); - std::string msg = std::string(sy->T("Auto Load Savestate")) + ": " + StringFromFormat("%d", autoSlot); - g_OSD.Show(OSDType::MESSAGE_SUCCESS, msg); if (status == SaveState::Status::FAILURE) { autoLoadFailed_ = true; + } else { + std::string msg = std::string(sy->T("Auto Load Savestate")) + ": " + StringFromFormat("%d", autoSlot); + g_OSD.Show(OSDType::MESSAGE_SUCCESS, msg, 2.0f, "autoload"); } }); g_Config.iCurrentStateSlot = autoSlot; diff --git a/UI/GameSettingsScreen.cpp b/UI/GameSettingsScreen.cpp index a51f117870..17709986d4 100644 --- a/UI/GameSettingsScreen.cpp +++ b/UI/GameSettingsScreen.cpp @@ -1038,7 +1038,7 @@ void GameSettingsScreen::CreateNetworkingSettings(UI::ViewGroup *networkingSetti networkingSettings->Add(new CheckBox(&g_Config.bEnableWlan, n->T("Enable networking", "Enable networking/wlan (beta)"))); networkingSettings->Add(new MacAddressChooser(GetRequesterToken(), gamePath_, &g_Config.sMACAddress, n->T("Change Mac Address"), screenManager())); - static const char* wlanChannels[] = { "Auto", "1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11" }; + static const char *wlanChannels[] = { "Auto", "1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11" }; auto wlanChannelChoice = networkingSettings->Add(new PopupMultiChoice(&g_Config.iWlanAdhocChannel, n->T("WLAN Channel"), wlanChannels, 0, ARRAY_SIZE(wlanChannels), I18NCat::NETWORKING, screenManager())); for (int i = 0; i < 4; i++) { wlanChannelChoice->HideChoice(i + 2); diff --git a/UI/PauseScreen.cpp b/UI/PauseScreen.cpp index 29ab95cfaa..3c19b77913 100644 --- a/UI/PauseScreen.cpp +++ b/UI/PauseScreen.cpp @@ -526,7 +526,7 @@ void GamePauseScreen::CreateViews() { if (NetAdhocctl_GetState() >= ADHOCCTL_STATE_CONNECTED) { // Awkwardly re-using a string here - saveDataScrollItems->Add(new TextView(std::string(nw->T("AdHoc server")) + ": " + std::string(nw->T("Connected")))); + saveDataScrollItems->Add(new TextView(ApplySafeSubstitutions("%1: %2 (%3)", nw->T("AdHoc server"), nw->T("Connected"), g_Config.sProAdhocServer))); } } diff --git a/Windows/MainWindowMenu.cpp b/Windows/MainWindowMenu.cpp index 3eddc6cef0..f1861b8719 100644 --- a/Windows/MainWindowMenu.cpp +++ b/Windows/MainWindowMenu.cpp @@ -135,7 +135,8 @@ namespace MainWindow { MENUITEMINFO menuInfo{ sizeof(menuInfo), MIIM_STRING }; std::string retVal; if (GetMenuItemInfo(menu, menuID, MF_BYCOMMAND, &menuInfo) != FALSE) { - std::vector buffer(menuInfo.cch + 1); + menuInfo.cch++; // account for null terminator + std::vector buffer(menuInfo.cch); menuInfo.dwTypeData = buffer.data(); GetMenuItemInfo(menu, menuID, MF_BYCOMMAND, &menuInfo); retVal = ConvertWStringToUTF8(menuInfo.dwTypeData); // note, this is buffer. From d5444a7f46e186dc6a8a46324b75927ab1397171 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Henrik=20Rydg=C3=A5rd?= Date: Wed, 11 Feb 2026 22:50:04 +0100 Subject: [PATCH 3/6] Remove old rudimentary start at a MIPS->MIPS jit --- CMakeLists.txt | 5 - Core/Core.vcxproj | 16 -- Core/Core.vcxproj.filters | 9 - Core/MIPS/ARM64/Arm64Jit.cpp | 1 - Core/MIPS/JitCommon/JitCommon.cpp | 4 - Core/MIPS/MIPS/MipsJit.cpp | 369 ------------------------------ Core/MIPS/MIPS/MipsJit.h | 199 ---------------- Core/MIPS/x86/Jit.cpp | 2 +- Core/MIPS/x86/Jit.h | 2 +- 9 files changed, 2 insertions(+), 605 deletions(-) delete mode 100644 Core/MIPS/MIPS/MipsJit.cpp delete mode 100644 Core/MIPS/MIPS/MipsJit.h diff --git a/CMakeLists.txt b/CMakeLists.txt index 43030de041..094e03d9de 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -1862,11 +1862,6 @@ list(APPEND CoreExtra GPU/Software/SamplerX86.cpp ) -list(APPEND CoreExtra - Core/MIPS/MIPS/MipsJit.cpp - Core/MIPS/MIPS/MipsJit.h -) - list(APPEND CoreExtra Core/MIPS/RiscV/RiscVAsm.cpp Core/MIPS/RiscV/RiscVCompALU.cpp diff --git a/Core/Core.vcxproj b/Core/Core.vcxproj index 68866c0808..5a007cbdb5 100644 --- a/Core/Core.vcxproj +++ b/Core/Core.vcxproj @@ -847,14 +847,6 @@ - - true - true - true - true - true - true - true true @@ -1236,14 +1228,6 @@ - - true - true - true - true - true - true - true true diff --git a/Core/Core.vcxproj.filters b/Core/Core.vcxproj.filters index d244bfb99c..b6dcbc79b5 100644 --- a/Core/Core.vcxproj.filters +++ b/Core/Core.vcxproj.filters @@ -13,9 +13,6 @@ {8a5bebeb-575f-483d-8bd2-4b7eac163a7d} - - {aaaaaaaa-575f-483d-8bd2-4b7eac163a7d} - {37896407-c373-44a3-b6ec-b57bceb2c4a3} @@ -438,9 +435,6 @@ MIPS\ARM - - MIPS\MIPS - MIPS\ARM @@ -1722,9 +1716,6 @@ MIPS\ARM - - MIPS\MIPS - MIPS\ARM diff --git a/Core/MIPS/ARM64/Arm64Jit.cpp b/Core/MIPS/ARM64/Arm64Jit.cpp index b24527a2e5..63fbd4e90d 100644 --- a/Core/MIPS/ARM64/Arm64Jit.cpp +++ b/Core/MIPS/ARM64/Arm64Jit.cpp @@ -240,7 +240,6 @@ void Arm64Jit::CompileDelaySlot(int flags) { _MSR(FIELD_NZCV, FLAGTEMPREG); // Restore flags register } - void Arm64Jit::Compile(u32 em_address) { PROFILE_THIS_SCOPE("jitc"); if (GetSpaceLeft() < 0x10000 || blocks.IsFull()) { diff --git a/Core/MIPS/JitCommon/JitCommon.cpp b/Core/MIPS/JitCommon/JitCommon.cpp index 79b2ab7699..fb43c3a92f 100644 --- a/Core/MIPS/JitCommon/JitCommon.cpp +++ b/Core/MIPS/JitCommon/JitCommon.cpp @@ -47,8 +47,6 @@ #elif PPSSPP_ARCH(X86) || PPSSPP_ARCH(AMD64) #include "../x86/Jit.h" #include "../x86/X64IRJit.h" -#elif PPSSPP_ARCH(MIPS) -#include "../MIPS/MipsJit.h" #elif PPSSPP_ARCH(RISCV64) #include "../RiscV/RiscVJit.h" #elif PPSSPP_ARCH(LOONGARCH64) @@ -118,8 +116,6 @@ namespace MIPSComp { if (useIR) return new MIPSComp::X64IRJit(mipsState); return new MIPSComp::Jit(mipsState); -#elif PPSSPP_ARCH(MIPS) - return new MIPSComp::MipsJit(mipsState); #elif PPSSPP_ARCH(RISCV64) return new MIPSComp::RiscVJit(mipsState); #elif PPSSPP_ARCH(LOONGARCH64) diff --git a/Core/MIPS/MIPS/MipsJit.cpp b/Core/MIPS/MIPS/MipsJit.cpp deleted file mode 100644 index 4086ef847d..0000000000 --- a/Core/MIPS/MIPS/MipsJit.cpp +++ /dev/null @@ -1,369 +0,0 @@ -// Copyright (c) 2012- PPSSPP Project. - -// This program is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, version 2.0 or later versions. - -// This program is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License 2.0 for more details. - -// A copy of the GPL 2.0 should have been included with the program. -// If not, see http://www.gnu.org/licenses/ - -// Official git repository and contact information can be found at -// https://github.com/hrydgard/ppsspp and http://www.ppsspp.org/. - -#include "ppsspp_config.h" -#if PPSSPP_ARCH(MIPS) - -#include "Common/Profiler/Profiler.h" -#include "Common/Serialize/Serializer.h" -#include "Common/Serialize/SerializeFuncs.h" -#include "Core/Reporting.h" -#include "Core/Config.h" -#include "Core/Core.h" -#include "Core/CoreTiming.h" -#include "Core/Debugger/SymbolMap.h" -#include "Core/MemMap.h" -#include "Core/MIPS/MIPS.h" -#include "Core/MIPS/MIPSCodeUtils.h" -#include "Core/MIPS/MIPSInt.h" -#include "Core/MIPS/MIPSTables.h" -#include "Core/HLE/ReplaceTables.h" - -#include "MipsJit.h" -#include "CPUDetect.h" - -void DisassembleMIPS(const u8 *data, int size) { -} - -namespace MIPSComp -{ - -MipsJit::MipsJit(MIPSState *mipsState) : blocks(mipsState, this), mips_(mipsState) -{ - logBlocks = 0; - dontLogBlocks = 0; - blocks.Init(); - AllocCodeSpace(1024 * 1024 * 16); - js.startDefaultPrefix = mips_->HasDefaultPrefix(); -} - -void MipsJit::DoState(PointerWrap &p) -{ - auto s = p.Section("Jit", 1, 2); - if (!s) - return; - - Do(p, js.startDefaultPrefix); - if (s >= 2) { - Do(p, js.hasSetRounding); - if (p.mode == PointerWrap::MODE_READ) { - js.lastSetRounding = 0; - } - } else { - js.hasSetRounding = 1; - } -} - -void MipsJit::UpdateFCR31() { -} - -void MipsJit::FlushAll() -{ - //gpr.FlushAll(); - //fpr.FlushAll(); - FlushPrefixV(); -} - -void MipsJit::FlushPrefixV() -{ -} - -MIPSOpcode MipsJit::GetOriginalOp(MIPSOpcode op) { - JitBlockCache *bc = GetBlockCache(); - int block_num = bc->GetBlockNumberFromEmuHackOp(op, true); - if (block_num >= 0) { - return bc->GetOriginalFirstOp(block_num); - } else { - return op; - } -} - -void MipsJit::ClearCache() -{ - blocks.Clear(); - ClearCodeSpace(0); - //GenerateFixedCode(); -} - -void MipsJit::InvalidateCacheAt(u32 em_address, int length) { - if (blocks.RangeMayHaveEmuHacks(em_address, em_address + length)) { - blocks.InvalidateICache(em_address, length); - } -} - -void MipsJit::EatInstruction(MIPSOpcode op) { - MIPSInfo info = MIPSGetInfo(op); - if (info & DELAYSLOT) { - ERROR_LOG_REPORT_ONCE(ateDelaySlot, JIT, "Ate a branch op."); - } - if (js.inDelaySlot) { - ERROR_LOG_REPORT_ONCE(ateInDelaySlot, JIT, "Ate an instruction inside a delay slot."); - } - - js.numInstructions++; - js.compilerPC += 4; - js.downcountAmount += MIPSGetInstructionCycleEstimate(op); -} - -void MipsJit::CompileDelaySlot(int flags) -{ - //if (flags & DELAYSLOT_SAFE) - // Save flags here - - js.inDelaySlot = true; - MIPSOpcode op = Memory::Read_Opcode_JIT(js.compilerPC + 4); - MIPSCompileOp(op, this); - js.inDelaySlot = false; - - if (flags & DELAYSLOT_FLUSH) - FlushAll(); - //if (flags & DELAYSLOT_SAFE) - // Restore flags here -} - - -void MipsJit::Compile(u32 em_address) { - PROFILE_THIS_SCOPE("jitc"); - if (GetSpaceLeft() < 0x10000 || blocks.IsFull()) { - ClearCache(); - } - int block_num = blocks.AllocateBlock(em_address); - JitBlock *b = blocks.GetBlock(block_num); - DoJit(em_address, b); - blocks.FinalizeBlock(block_num, jo.enableBlocklink); - - bool cleanSlate = false; - - if (js.hasSetRounding && !js.lastSetRounding) { - WARN_LOG(Log::JIT, "Detected rounding mode usage, rebuilding jit with checks"); - // Won't loop, since hasSetRounding is only ever set to 1. - js.lastSetRounding = js.hasSetRounding; - cleanSlate = true; - } - - if (cleanSlate) { - // Our assumptions are all wrong so it's clean-slate time. - ClearCache(); - Compile(em_address); - } -} - -void MipsJit::RunLoopUntil(u64 globalticks) -{ - PROFILE_THIS_SCOPE("jit"); - ((void (*)())enterCode)(); -} - -const u8 *MipsJit::DoJit(u32 em_address, JitBlock *b) -{ - js.cancel = false; - js.blockStart = js.compilerPC = mips_->pc; - js.lastContinuedPC = 0; - js.initialBlockSize = 0; - js.nextExit = 0; - js.downcountAmount = 0; - js.curBlock = b; - js.compiling = true; - js.inDelaySlot = false; - js.PrefixStart(); - b->normalEntry = GetCodePtr(); - js.numInstructions = 0; - while (js.compiling) - { - MIPSOpcode inst = Memory::Read_Opcode_JIT(js.compilerPC); - js.downcountAmount += MIPSGetInstructionCycleEstimate(inst); - - MIPSCompileOp(inst, this); - - js.compilerPC += 4; - js.numInstructions++; - - // Safety check, in case we get a bunch of really large jit ops without a lot of branching. - if (GetSpaceLeft() < 0x800 || js.numInstructions >= JitBlockCache::MAX_BLOCK_INSTRUCTIONS) - { - FlushAll(); - WriteExit(js.compilerPC, js.nextExit++); - js.compiling = false; - } - } - - b->codeSize = GetCodePtr() - b->normalEntry; - - // Don't forget to zap the newly written instructions in the instruction cache! - FlushIcache(); - - if (js.lastContinuedPC == 0) - b->originalSize = js.numInstructions; - else - { - // We continued at least once. Add the last proxy and set the originalSize correctly. - blocks.ProxyBlock(js.blockStart, js.lastContinuedPC, (js.compilerPC - js.lastContinuedPC) / sizeof(u32), GetCodePtr()); - b->originalSize = js.initialBlockSize; - } - - return b->normalEntry; -} - -void MipsJit::AddContinuedBlock(u32 dest) -{ - // The first block is the root block. When we continue, we create proxy blocks after that. - if (js.lastContinuedPC == 0) - js.initialBlockSize = js.numInstructions; - else - blocks.ProxyBlock(js.blockStart, js.lastContinuedPC, (js.compilerPC - js.lastContinuedPC) / sizeof(u32), GetCodePtr()); - js.lastContinuedPC = dest; -} - -bool MipsJit::DescribeCodePtr(const u8 *ptr, std::string &name) -{ - // TODO: Not used by anything yet. - return false; -} - -void MipsJit::Comp_RunBlock(MIPSOpcode op) -{ - // This shouldn't be necessary, the dispatcher should catch us before we get here. - ERROR_LOG(Log::JIT, "Comp_RunBlock should never be reached!"); -} - -void MipsJit::LinkBlock(u8 *exitPoint, const u8 *checkedEntry) { - // TODO -} - -void MipsJit::UnlinkBlock(u8 *checkedEntry, u32 originalAddress) { - // TODO -} - -bool MipsJit::ReplaceJalTo(u32 dest) { - const ReplacementTableEntry *entry = nullptr; - u32 funcSize = 0; - if (!CanReplaceJalTo(dest, &entry, &funcSize)) { - return false; - } - return false; -} - -void MipsJit::Comp_ReplacementFunc(MIPSOpcode op) -{ -} - -void MipsJit::Comp_Generic(MIPSOpcode op) -{ - FlushAll(); - MIPSInterpretFunc func = MIPSGetInterpretFunc(op); - if (func) - { - //SaveDowncount(); - RestoreRoundingMode(); - // Move Imm32(js.compilerPC) in to M(&mips_->pc) - QuickCallFunction(V1, (void *)func); - ApplyRoundingMode(); - //RestoreDowncount(); - } - - const MIPSInfo info = MIPSGetInfo(op); - if ((info & IS_VFPU) != 0 && (info & VFPU_NO_PREFIX) == 0) - { - // If it does eat them, it'll happen in MIPSCompileOp(). - if ((info & OUT_EAT_PREFIX) == 0) - js.PrefixUnknown(); - } -} - -void MipsJit::MovFromPC(MIPSReg r) { -} - -void MipsJit::MovToPC(MIPSReg r) { -} - -void MipsJit::SaveDowncount() { -} - -void MipsJit::RestoreDowncount() { -} - -void MipsJit::WriteDownCount(int offset) { -} - -void MipsJit::WriteDownCountR(MIPSReg reg) { -} - -void MipsJit::RestoreRoundingMode(bool force) { -} - -void MipsJit::ApplyRoundingMode(bool force) { -} - -void MipsJit::UpdateRoundingMode() { -} - -void MipsJit::WriteExit(u32 destination, int exit_num) -{ - //WriteDownCount(); - JitBlock *b = js.curBlock; - b->exitAddress[exit_num] = destination; - b->exitPtrs[exit_num] = GetWritableCodePtr(); - - // Link opportunity! - int block = blocks.GetBlockNumberFromStartAddress(destination); - if (block >= 0 && jo.enableBlocklink) { - // It exists! Joy of joy! - B(blocks.GetBlock(block)->checkedEntry); - b->linkStatus[exit_num] = true; - } else { - //gpr.SetRegImm(V0, destination); - //B((const void *)dispatcherPCInV0); - } -} - -void MipsJit::WriteExitDestInR(MIPSReg Reg) -{ - MovToPC(Reg); - //WriteDownCount(); - // TODO: shouldn't need an indirect branch here... - B((const void *)dispatcher); -} - -void MipsJit::WriteSyscallExit() -{ - //WriteDownCount(); - B((const void *)dispatcherCheckCoreState); -} - -#define _RS ((op>>21) & 0x1F) -#define _RT ((op>>16) & 0x1F) -#define _RD ((op>>11) & 0x1F) -#define _FS ((op>>11) & 0x1F) -#define _FT ((op>>16) & 0x1F) -#define _FD ((op>>6) & 0x1F) -#define _POS ((op>>6) & 0x1F) -#define _SIZE ((op>>11) & 0x1F) - -//memory regions: -// -// 08-0A -// 48-4A -// 04-05 -// 44-45 -// mov eax, addrreg - // shr eax, 28 -// mov eax, [table+eax] -// mov dreg, [eax+offreg] - -} - -#endif // PPSSPP_ARCH(MIPS) diff --git a/Core/MIPS/MIPS/MipsJit.h b/Core/MIPS/MIPS/MipsJit.h deleted file mode 100644 index 9026ac185c..0000000000 --- a/Core/MIPS/MIPS/MipsJit.h +++ /dev/null @@ -1,199 +0,0 @@ -// Copyright (c) 2012- PPSSPP Project. - -// This program is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, version 2.0 or later versions. - -// This program is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License 2.0 for more details. - -// A copy of the GPL 2.0 should have been included with the program. -// If not, see http://www.gnu.org/licenses/ - -// Official git repository and contact information can be found at -// https://github.com/hrydgard/ppsspp and http://www.ppsspp.org/. - -#pragma once - -#include "Common/MipsEmitter.h" -using namespace MIPSGen; - -#include "Core/MIPS/JitCommon/JitCommon.h" -#include "Core/MIPS/JitCommon/JitState.h" -#include "Core/MIPS/JitCommon/JitBlockCache.h" -#include "../MIPSVFPUUtils.h" - -#ifndef offsetof -#include "stddef.h" -#endif - -namespace MIPSComp -{ - -class MipsJit : public MIPSGen::MIPSCodeBlock, public JitInterface, public MIPSFrontendInterface -{ -public: - MipsJit(MIPSState *mipsState); - - void DoState(PointerWrap &p) override; - - // Compiled ops should ignore delay slots - // the compiler will take care of them by itself - // OR NOT - void Comp_Generic(MIPSOpcode op) override; - - void RunLoopUntil(u64 globalticks) override; - - void Compile(u32 em_address) override; // Compiles a block at current MIPS PC - const u8 *DoJit(u32 em_address, JitBlock *b); - - const u8 *GetCrashHandler() const override { return nullptr; } - bool CodeInRange(const u8 *ptr) const override { return IsInSpace(ptr); } - bool DescribeCodePtr(const u8 *ptr, std::string &name); - - void CompileDelaySlot(int flags); - void EatInstruction(MIPSOpcode op); - void AddContinuedBlock(u32 dest); - - void Comp_RunBlock(MIPSOpcode op) override; - void Comp_ReplacementFunc(MIPSOpcode op) override; - - // Ops - void Comp_ITypeMem(MIPSOpcode op) override {} - void Comp_StoreSync(MIPSOpcode op) override {} - void Comp_Cache(MIPSOpcode op) override {} - - void Comp_RelBranch(MIPSOpcode op) override {} - void Comp_RelBranchRI(MIPSOpcode op) override {} - void Comp_FPUBranch(MIPSOpcode op) override {} - void Comp_FPULS(MIPSOpcode op) override {} - void Comp_FPUComp(MIPSOpcode op) override {} - void Comp_Jump(MIPSOpcode op) override {} - void Comp_JumpReg(MIPSOpcode op) override {} - void Comp_Syscall(MIPSOpcode op) override {} - void Comp_Break(MIPSOpcode op) override {} - - void Comp_IType(MIPSOpcode op) override {} - void Comp_RType2(MIPSOpcode op) override {} - void Comp_RType3(MIPSOpcode op) override {} - void Comp_ShiftType(MIPSOpcode op) override {} - void Comp_Allegrex(MIPSOpcode op) override {} - void Comp_Allegrex2(MIPSOpcode op) override {} - void Comp_VBranch(MIPSOpcode op) override {} - void Comp_MulDivType(MIPSOpcode op) override {} - void Comp_Special3(MIPSOpcode op) override {} - - void Comp_FPU3op(MIPSOpcode op) override {} - void Comp_FPU2op(MIPSOpcode op) override {} - void Comp_mxc1(MIPSOpcode op) override {} - - void Comp_DoNothing(MIPSOpcode op) override {} - - void Comp_SV(MIPSOpcode op) override {} - void Comp_SVQ(MIPSOpcode op) override {} - void Comp_VPFX(MIPSOpcode op) override {} - void Comp_VVectorInit(MIPSOpcode op) override {} - void Comp_VMatrixInit(MIPSOpcode op) override {} - void Comp_VDot(MIPSOpcode op) override {} - void Comp_VecDo3(MIPSOpcode op) override {} - void Comp_VV2Op(MIPSOpcode op) override {} - void Comp_Mftv(MIPSOpcode op) override {} - void Comp_Vmfvc(MIPSOpcode op) override {} - void Comp_Vmtvc(MIPSOpcode op) override {} - void Comp_Vmmov(MIPSOpcode op) override {} - void Comp_VScl(MIPSOpcode op) override {} - void Comp_Vmmul(MIPSOpcode op) override {} - void Comp_Vmscl(MIPSOpcode op) override {} - void Comp_Vtfm(MIPSOpcode op) override {} - void Comp_VHdp(MIPSOpcode op) override {} - void Comp_VCrs(MIPSOpcode op) override {} - void Comp_VDet(MIPSOpcode op) override {} - void Comp_Vi2x(MIPSOpcode op) override {} - void Comp_Vx2i(MIPSOpcode op) override {} - void Comp_Vf2i(MIPSOpcode op) override {} - void Comp_Vi2f(MIPSOpcode op) override {} - void Comp_Vh2f(MIPSOpcode op) override {} - void Comp_Vcst(MIPSOpcode op) override {} - void Comp_Vhoriz(MIPSOpcode op) override {} - void Comp_VRot(MIPSOpcode op) override {} - void Comp_VIdt(MIPSOpcode op) override {} - void Comp_Vcmp(MIPSOpcode op) override {} - void Comp_Vcmov(MIPSOpcode op) override {} - void Comp_Viim(MIPSOpcode op) override {} - void Comp_Vfim(MIPSOpcode op) override {} - void Comp_VCrossQuat(MIPSOpcode op) override {} - void Comp_Vsgn(MIPSOpcode op) override {} - void Comp_Vocp(MIPSOpcode op) override {} - void Comp_ColorConv(MIPSOpcode op) override {} - int Replace_fabsf() override { return 0; } - - void Comp_Vbfy(MIPSOpcode op) {} - - JitBlockCache *GetBlockCache() override { return &blocks; } - JitBlockCacheDebugInterface *GetBlockCacheDebugInterface() override { return &blocks; } - - MIPSOpcode GetOriginalOp(MIPSOpcode op) override; - - std::vector SaveAndClearEmuHackOps() override { return blocks.SaveAndClearEmuHackOps(); } - void RestoreSavedEmuHackOps(std::vector saved) override { blocks.RestoreSavedEmuHackOps(saved); } - - void ClearCache() override; - void InvalidateCacheAt(u32 em_address, int length = 4) override; - void UpdateFCR31() override; - - const u8 *GetDispatcher() const override { - return dispatcher; - } - - void LinkBlock(u8 *exitPoint, const u8 *checkedEntry) override; - void UnlinkBlock(u8 *checkedEntry, u32 originalAddress) override; - - void EatPrefix() override { js.EatPrefix(); } - -private: - void GenerateFixedCode(); - void FlushAll(); - void FlushPrefixV(); - - void WriteDownCount(int offset = 0); - void WriteDownCountR(MIPSReg reg); - void RestoreRoundingMode(bool force = false); - void ApplyRoundingMode(bool force = false); - void UpdateRoundingMode(); - void MovFromPC(MIPSReg r); - void MovToPC(MIPSReg r); - - bool ReplaceJalTo(u32 dest); - - void SaveDowncount(); - void RestoreDowncount(); - - void WriteExit(u32 destination, int exit_num); - void WriteExitDestInR(MIPSReg Reg); - void WriteSyscallExit(); - - JitBlockCache blocks; - JitOptions jo; - JitState js; - - MIPSState *mips_; - - int dontLogBlocks; - int logBlocks; - -public: - // Code pointers - const u8 *enterCode; - - const u8 *outerLoop; - const u8 *outerLoopPCInR0; - const u8 *dispatcherCheckCoreState; - const u8 *dispatcherPCInR0; - const u8 *dispatcher; - const u8 *dispatcherNoCheck; -}; - -} // namespace MIPSComp - diff --git a/Core/MIPS/x86/Jit.cpp b/Core/MIPS/x86/Jit.cpp index d16b97ddd3..829c80c794 100644 --- a/Core/MIPS/x86/Jit.cpp +++ b/Core/MIPS/x86/Jit.cpp @@ -359,7 +359,7 @@ MIPSOpcode Jit::GetOffsetInstruction(int offset) { return Memory::Read_Instruction(GetCompilerPC() + 4 * offset); } -const u8 *Jit::DoJit(u32 em_address, JitBlock *b) { +void Jit::DoJit(u32 em_address, JitBlock *b) { js.cancel = false; js.blockStart = em_address; js.compilerPC = em_address; diff --git a/Core/MIPS/x86/Jit.h b/Core/MIPS/x86/Jit.h index e359f7c715..87463ad522 100644 --- a/Core/MIPS/x86/Jit.h +++ b/Core/MIPS/x86/Jit.h @@ -58,7 +58,7 @@ public: void RunLoopUntil(u64 globalticks) override; void Compile(u32 em_address) override; // Compiles a block at current MIPS PC - const u8 *DoJit(u32 em_address, JitBlock *b); + void DoJit(u32 em_address, JitBlock *b); const u8 *GetCrashHandler() const override { return crashHandler; } bool CodeInRange(const u8 *ptr) const override { return IsInSpace(ptr); } From 44a2585753d2a0051712e451c7a7ff029df56e6e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Henrik=20Rydg=C3=A5rd?= Date: Wed, 11 Feb 2026 22:53:35 +0100 Subject: [PATCH 4/6] Rename some function, remove an unused return value --- Core/HLE/sceUtility.cpp | 3 +++ Core/MIPS/ARM/ArmJit.cpp | 10 +++----- Core/MIPS/ARM/ArmJit.h | 2 +- Core/MIPS/ARM64/Arm64Jit.cpp | 12 ++++----- Core/MIPS/ARM64/Arm64Jit.h | 2 +- Core/MIPS/JitCommon/JitBlockCache.cpp | 36 +++++++++++++-------------- Core/MIPS/JitCommon/JitBlockCache.h | 23 ++++++++++------- Core/MIPS/fake/FakeJit.cpp | 3 +-- Core/MIPS/fake/FakeJit.h | 2 +- Core/MIPS/x86/Jit.cpp | 7 +++--- 10 files changed, 50 insertions(+), 50 deletions(-) diff --git a/Core/HLE/sceUtility.cpp b/Core/HLE/sceUtility.cpp index 7d8843f347..af4984c221 100644 --- a/Core/HLE/sceUtility.cpp +++ b/Core/HLE/sceUtility.cpp @@ -525,6 +525,9 @@ static int sceUtilitySavedataInitStart(u32 paramAddr) { } } + // TODO: In issue #19957, we're looking at NFL Street 3 which gets stuck. Possibly if a dialog is already open here, + // we should block until it's done? + ActivateDialog(UtilityDialogType::SAVEDATA); return hleLogDebug(Log::sceUtility, saveDialog->Init(paramAddr)); } diff --git a/Core/MIPS/ARM/ArmJit.cpp b/Core/MIPS/ARM/ArmJit.cpp index 78ec6164bb..1173592d3b 100644 --- a/Core/MIPS/ARM/ArmJit.cpp +++ b/Core/MIPS/ARM/ArmJit.cpp @@ -299,8 +299,7 @@ MIPSOpcode ArmJit::GetOffsetInstruction(int offset) { return Memory::Read_Instruction(GetCompilerPC() + 4 * offset); } -const u8 *ArmJit::DoJit(u32 em_address, JitBlock *b) -{ +void ArmJit::DoJit(u32 em_address, JitBlock *b) { js.cancel = false; js.blockStart = em_address; js.compilerPC = em_address; @@ -424,10 +423,9 @@ const u8 *ArmJit::DoJit(u32 em_address, JitBlock *b) else { // We continued at least once. Add the last proxy and set the originalSize correctly. - blocks.ProxyBlock(js.blockStart, js.lastContinuedPC, (GetCompilerPC() - js.lastContinuedPC) / sizeof(u32), GetCodePtr()); + blocks.CreateProxyBlock(js.blockStart, js.lastContinuedPC, (GetCompilerPC() - js.lastContinuedPC) / sizeof(u32), GetCodePtr()); b->originalSize = js.initialBlockSize; } - return b->normalEntry; } void ArmJit::AddContinuedBlock(u32 dest) @@ -436,7 +434,7 @@ void ArmJit::AddContinuedBlock(u32 dest) if (js.lastContinuedPC == 0) js.initialBlockSize = js.numInstructions; else - blocks.ProxyBlock(js.blockStart, js.lastContinuedPC, (GetCompilerPC() - js.lastContinuedPC) / sizeof(u32), GetCodePtr()); + blocks.CreateProxyBlock(js.blockStart, js.lastContinuedPC, (GetCompilerPC() - js.lastContinuedPC) / sizeof(u32), GetCodePtr()); js.lastContinuedPC = dest; } @@ -544,7 +542,7 @@ bool ArmJit::ReplaceJalTo(u32 dest) { } // Add a trigger so that if the inlined code changes, we invalidate this block. - blocks.ProxyBlock(js.blockStart, dest, funcSize / sizeof(u32), GetCodePtr()); + blocks.CreateProxyBlock(js.blockStart, dest, funcSize / sizeof(u32), GetCodePtr()); return true; } diff --git a/Core/MIPS/ARM/ArmJit.h b/Core/MIPS/ARM/ArmJit.h index 04f1ac79d3..292a107d1c 100644 --- a/Core/MIPS/ARM/ArmJit.h +++ b/Core/MIPS/ARM/ArmJit.h @@ -193,7 +193,7 @@ public: void UnlinkBlock(u8 *checkedEntry, u32 originalAddress) override; private: - const u8 *DoJit(u32 em_address, JitBlock *b); + void DoJit(u32 em_address, JitBlock *b); void GenerateFixedCode(); void FlushAll(); diff --git a/Core/MIPS/ARM64/Arm64Jit.cpp b/Core/MIPS/ARM64/Arm64Jit.cpp index 63fbd4e90d..6929aef95a 100644 --- a/Core/MIPS/ARM64/Arm64Jit.cpp +++ b/Core/MIPS/ARM64/Arm64Jit.cpp @@ -256,7 +256,7 @@ void Arm64Jit::Compile(u32 em_address) { JitBlock *b = blocks.GetBlock(block_num); DoJit(em_address, b); - _assert_msg_(b->originalAddress == em_address, "original %08x != em_address %08x (block %d)", b->originalAddress, em_address, b->blockNum); + b->DoIntegrityCheck(em_address, block_num); blocks.FinalizeBlock(block_num, jo.enableBlocklink); EndWrite(); @@ -303,7 +303,7 @@ MIPSOpcode Arm64Jit::GetOffsetInstruction(int offset) { return Memory::Read_Instruction(GetCompilerPC() + 4 * offset); } -const u8 *Arm64Jit::DoJit(u32 em_address, JitBlock *b) { +void Arm64Jit::DoJit(u32 em_address, JitBlock *b) { js.cancel = false; js.blockStart = em_address; js.compilerPC = em_address; @@ -411,11 +411,9 @@ const u8 *Arm64Jit::DoJit(u32 em_address, JitBlock *b) { b->originalSize = js.numInstructions; } else { // We continued at least once. Add the last proxy and set the originalSize correctly. - blocks.ProxyBlock(js.blockStart, js.lastContinuedPC, (GetCompilerPC() - js.lastContinuedPC) / sizeof(u32), GetCodePtr()); + blocks.CreateProxyBlock(js.blockStart, js.lastContinuedPC, (GetCompilerPC() - js.lastContinuedPC) / sizeof(u32), GetCodePtr()); b->originalSize = js.initialBlockSize; } - - return b->normalEntry; } void Arm64Jit::AddContinuedBlock(u32 dest) { @@ -423,7 +421,7 @@ void Arm64Jit::AddContinuedBlock(u32 dest) { if (js.lastContinuedPC == 0) js.initialBlockSize = js.numInstructions; else - blocks.ProxyBlock(js.blockStart, js.lastContinuedPC, (GetCompilerPC() - js.lastContinuedPC) / sizeof(u32), GetCodePtr()); + blocks.CreateProxyBlock(js.blockStart, js.lastContinuedPC, (GetCompilerPC() - js.lastContinuedPC) / sizeof(u32), GetCodePtr()); js.lastContinuedPC = dest; } @@ -549,7 +547,7 @@ bool Arm64Jit::ReplaceJalTo(u32 dest) { } // Add a trigger so that if the inlined code changes, we invalidate this block. - blocks.ProxyBlock(js.blockStart, dest, funcSize / sizeof(u32), GetCodePtr()); + blocks.CreateProxyBlock(js.blockStart, dest, funcSize / sizeof(u32), GetCodePtr()); #endif return true; } diff --git a/Core/MIPS/ARM64/Arm64Jit.h b/Core/MIPS/ARM64/Arm64Jit.h index f3d6acc6a7..15ff701c81 100644 --- a/Core/MIPS/ARM64/Arm64Jit.h +++ b/Core/MIPS/ARM64/Arm64Jit.h @@ -50,7 +50,7 @@ public: void RunLoopUntil(u64 globalticks) override; void Compile(u32 em_address) override; // Compiles a block at current MIPS PC - const u8 *DoJit(u32 em_address, JitBlock *b); + void DoJit(u32 em_address, JitBlock *b); const u8 *GetCrashHandler() const override { return crashHandler; } bool CodeInRange(const u8 *ptr) const override { return IsInSpace(ptr); } diff --git a/Core/MIPS/JitCommon/JitBlockCache.cpp b/Core/MIPS/JitCommon/JitBlockCache.cpp index e192195760..4a08353d2a 100644 --- a/Core/MIPS/JitCommon/JitBlockCache.cpp +++ b/Core/MIPS/JitCommon/JitBlockCache.cpp @@ -41,6 +41,7 @@ #include "Core/MIPS/JitCommon/JitCommon.h" constexpr u32 INVALID_EXIT = 0xFFFFFFFF; +constexpr u32 SENTINEL_VAL = 0xc0ffeefe; static uint64_t HashJitBlock(const JitBlock &b) { PROFILE_THIS_SCOPE("jithash"); @@ -56,6 +57,17 @@ static uint64_t HashJitBlock(const JitBlock &b) { return 0; } +bool JitBlock::ContainsAddress(u32 address) const { + // WARNING - THIS DOES NOT WORK WITH JIT INLINING ENABLED. + // However, that doesn't exist yet so meh. + return address >= originalAddress && address < originalAddress + 4 * originalSize; +} + +void JitBlock::DoIntegrityCheck(u32 em_address, int blockNum) const { + _assert_msg_(sentinel == SENTINEL_VAL, "Block %d sentinel got corrupted: %08x (origAddr: %08x)", blockNum, sentinel, originalAddress); + _assert_msg_(originalAddress == em_address, "Block %d address got corrupted: %08x != %08x", blockNum, em_address, originalAddress); +} + JitBlockCache::JitBlockCache(MIPSState *mipsState, CodeBlockCommon *codeBlock) : codeBlock_(codeBlock) { } @@ -64,12 +76,6 @@ JitBlockCache::~JitBlockCache() { Shutdown(); } -bool JitBlock::ContainsAddress(u32 em_address) const { - // WARNING - THIS DOES NOT WORK WITH JIT INLINING ENABLED. - // However, that doesn't exist yet so meh. - return em_address >= originalAddress && em_address < originalAddress + 4 * originalSize; -} - bool JitBlockCache::IsFull() const { // Subtract some amount to safely leave space for some proxy blocks, which we don't check before we allocate (not ideal, but should be enough). return num_blocks_ >= MAX_NUM_BLOCKS - 512; @@ -109,14 +115,6 @@ void JitBlockCache::Reset() { Init(); } -JitBlock *JitBlockCache::GetBlock(int no) { - return &blocks_[no]; -} - -const JitBlock *JitBlockCache::GetBlock(int no) const { - return &blocks_[no]; -} - int JitBlockCache::AllocateBlock(u32 startAddress) { _assert_(num_blocks_ < MAX_NUM_BLOCKS); @@ -146,11 +144,12 @@ int JitBlockCache::AllocateBlock(u32 startAddress) { b.linkStatus[i] = false; } b.blockNum = num_blocks_; + b.sentinel = SENTINEL_VAL; num_blocks_++; //commit the current block return num_blocks_ - 1; } -void JitBlockCache::ProxyBlock(u32 rootAddress, u32 startAddress, u32 size, const u8 *codePtr) { +void JitBlockCache::CreateProxyBlock(u32 rootAddress, u32 startAddress, u32 size, const u8 *codePtr) { _assert_(num_blocks_ < MAX_NUM_BLOCKS); // If there's an existing block at the startAddress, add rootAddress as a proxy root of that block @@ -333,18 +332,17 @@ int JitBlockCache::GetBlockNumberFromStartAddress(u32 addr, bool realBlocksOnly) return bl; } -void JitBlockCache::GetBlockNumbersFromAddress(u32 em_address, std::vector *block_numbers) { +void JitBlockCache::GetBlockNumbersFromAddress(u32 em_address, std::vector *block_numbers) const { for (int i = 0; i < num_blocks_; i++) if (blocks_[i].ContainsAddress(em_address)) block_numbers->push_back(i); } -int JitBlockCache::GetBlockNumberFromAddress(u32 em_address) { +int JitBlockCache::GetBlockNumberFromAddress(u32 em_address) const { for (int i = 0; i < num_blocks_; i++) { if (blocks_[i].ContainsAddress(em_address)) return i; } - return -1; } @@ -363,7 +361,7 @@ u32 JitBlockCache::GetAddressFromBlockPtr(const u8 *ptr) const { return 0; } -MIPSOpcode JitBlockCache::GetOriginalFirstOp(int block_num) { +MIPSOpcode JitBlockCache::GetOriginalFirstOp(int block_num) const { if (block_num >= num_blocks_ || block_num < 0) { return MIPSOpcode(block_num); } diff --git a/Core/MIPS/JitCommon/JitBlockCache.h b/Core/MIPS/JitCommon/JitBlockCache.h index 1bcd5ba3ab..b461e2a362 100644 --- a/Core/MIPS/JitCommon/JitBlockCache.h +++ b/Core/MIPS/JitCommon/JitBlockCache.h @@ -33,6 +33,7 @@ const int MAX_JIT_BLOCK_EXITS = 4; #else const int MAX_JIT_BLOCK_EXITS = 8; #endif + constexpr bool JIT_USE_COMPILEDHASH = true; struct BlockCacheStats { @@ -54,17 +55,21 @@ enum class DestroyType { // We should be careful not to access these block structures during runtime as they are large. // Fine to mess with them at block compile time though. struct JitBlock { - bool ContainsAddress(u32 em_address) const; + bool ContainsAddress(u32 address) const; + void DoIntegrityCheck(u32 emAddress, int blockNum) const; const u8 *checkedEntry; // const, we have to translate to writable. const u8 *normalEntry; u8 *exitPtrs[MAX_JIT_BLOCK_EXITS]; // to be able to rewrite the exit jump u32 exitAddress[MAX_JIT_BLOCK_EXITS]; // 0xFFFFFFFF == unknown + u32 sentinel; u32 originalAddress; MIPSOpcode originalFirstOpcode; //to be able to restore + uint64_t compiledHash; + u16 codeSize; u16 originalSize; u16 blockNum; @@ -72,8 +77,8 @@ struct JitBlock { bool invalid; bool linkStatus[MAX_JIT_BLOCK_EXITS]; - // By having a pointer, we avoid a constructor/destructor being generated and dog slow - // performance in debug. + // By having a pointer, we avoid a constructor/destructor call being generated if unused, + // thus avoiding dog slow performance in debug build. std::vector *proxyFor; bool IsPureProxy() const { @@ -127,7 +132,7 @@ public: int AllocateBlock(u32 em_address); // When a proxy block is invalidated, the block located at the rootAddress is invalidated too. - void ProxyBlock(u32 rootAddress, u32 startAddress, u32 size, const u8 *codePtr); + void CreateProxyBlock(u32 rootAddress, u32 startAddress, u32 size, const u8 *codePtr); void FinalizeBlock(int block_num, bool block_link); void Clear(); @@ -139,8 +144,8 @@ public: void ComputeStats(BlockCacheStats &bcStats) const override; // Code Cache - JitBlock *GetBlock(int block_num); - const JitBlock *GetBlock(int block_num) const; + JitBlock *GetBlock(int no) { return &blocks_[no]; } + const JitBlock *GetBlock(int no) const { return &blocks_[no]; } // Fast way to get a block. Only works on the first source-cpu instruction of a block. int GetBlockNumberFromStartAddress(u32 em_address, bool realBlocksOnly = true) const override; @@ -149,14 +154,14 @@ public: // WARNING! WILL NOT WORK WITH JIT INLINING ENABLED (not yet a feature but will be soon) // Returns a list of block numbers - only one block can start at a particular address, but they CAN overlap. // This one is slow so should only be used for one-shots from the debugger UI, not for anything during runtime. - void GetBlockNumbersFromAddress(u32 em_address, std::vector *block_numbers); + void GetBlockNumbersFromAddress(u32 em_address, std::vector *block_numbers) const; // Similar to above, but only the first matching address. - int GetBlockNumberFromAddress(u32 em_address); + int GetBlockNumberFromAddress(u32 em_address) const; int GetBlockNumberFromEmuHackOp(MIPSOpcode inst, bool ignoreBad = false) const; u32 GetAddressFromBlockPtr(const u8 *ptr) const; - MIPSOpcode GetOriginalFirstOp(int block_num); + MIPSOpcode GetOriginalFirstOp(int block_num) const; bool RangeMayHaveEmuHacks(u32 start, u32 end) const; diff --git a/Core/MIPS/fake/FakeJit.cpp b/Core/MIPS/fake/FakeJit.cpp index 088f4d50d8..82011bb55e 100644 --- a/Core/MIPS/fake/FakeJit.cpp +++ b/Core/MIPS/fake/FakeJit.cpp @@ -132,9 +132,8 @@ void FakeJit::RunLoopUntil(u64 globalticks) { MIPSInterpret_RunUntil(globalticks); } -const u8 *FakeJit::DoJit(u32 em_address, JitBlock *b) { +void FakeJit::DoJit(u32 em_address, JitBlock *b) { _assert_(false); - return nullptr; } void FakeJit::AddContinuedBlock(u32 dest) diff --git a/Core/MIPS/fake/FakeJit.h b/Core/MIPS/fake/FakeJit.h index bce7fe92d3..1b88fb37d3 100644 --- a/Core/MIPS/fake/FakeJit.h +++ b/Core/MIPS/fake/FakeJit.h @@ -45,7 +45,7 @@ public: void RunLoopUntil(u64 globalticks) override; void Compile(u32 em_address) override; // Compiles a block at current MIPS PC - const u8 *DoJit(u32 em_address, JitBlock *b); + void DoJit(u32 em_address, JitBlock *b); const u8 *GetCrashHandler() const override { return nullptr; } bool CodeInRange(const u8 *ptr) const override { return IsInSpace(ptr); } diff --git a/Core/MIPS/x86/Jit.cpp b/Core/MIPS/x86/Jit.cpp index 829c80c794..8c9b175754 100644 --- a/Core/MIPS/x86/Jit.cpp +++ b/Core/MIPS/x86/Jit.cpp @@ -446,10 +446,9 @@ void Jit::DoJit(u32 em_address, JitBlock *b) { b->originalSize = js.numInstructions; } else { // We continued at least once. Add the last proxy and set the originalSize correctly. - blocks.ProxyBlock(js.blockStart, js.lastContinuedPC, (GetCompilerPC() - js.lastContinuedPC) / sizeof(u32), GetCodePtr()); + blocks.CreateProxyBlock(js.blockStart, js.lastContinuedPC, (GetCompilerPC() - js.lastContinuedPC) / sizeof(u32), GetCodePtr()); b->originalSize = js.initialBlockSize; } - return b->normalEntry; } void Jit::AddContinuedBlock(u32 dest) { @@ -457,7 +456,7 @@ void Jit::AddContinuedBlock(u32 dest) { if (js.lastContinuedPC == 0) js.initialBlockSize = js.numInstructions; else - blocks.ProxyBlock(js.blockStart, js.lastContinuedPC, (GetCompilerPC() - js.lastContinuedPC) / sizeof(u32), GetCodePtr()); + blocks.CreateProxyBlock(js.blockStart, js.lastContinuedPC, (GetCompilerPC() - js.lastContinuedPC) / sizeof(u32), GetCodePtr()); js.lastContinuedPC = dest; } @@ -591,7 +590,7 @@ bool Jit::ReplaceJalTo(u32 dest) { } // Add a trigger so that if the inlined code changes, we invalidate this block. - blocks.ProxyBlock(js.blockStart, dest, funcSize / sizeof(u32), GetCodePtr()); + blocks.CreateProxyBlock(js.blockStart, dest, funcSize / sizeof(u32), GetCodePtr()); return true; } From 2797cfca5674140203e4ba8f265b345d5ed4a3fe Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Henrik=20Rydg=C3=A5rd?= Date: Wed, 11 Feb 2026 23:34:18 +0100 Subject: [PATCH 5/6] Remove more vestiges of old experiments --- Core/MIPS/ARM/ArmJit.cpp | 19 +++---------------- Core/MIPS/ARM/ArmRegCache.cpp | 5 ++--- Core/MIPS/ARM/ArmRegCache.h | 6 +----- Core/MIPS/ARM/ArmRegCacheFPU.cpp | 2 +- Core/MIPS/ARM/ArmRegCacheFPU.h | 6 +----- Core/MIPS/ARM64/Arm64Jit.cpp | 21 ++++----------------- Core/MIPS/ARM64/Arm64RegCache.cpp | 3 +-- Core/MIPS/ARM64/Arm64RegCache.h | 6 +----- Core/MIPS/ARM64/Arm64RegCacheFPU.cpp | 2 +- Core/MIPS/ARM64/Arm64RegCacheFPU.h | 6 +----- Core/MIPS/JitCommon/JitState.cpp | 18 ++++++++++++++++++ Core/MIPS/JitCommon/JitState.h | 14 ++++++-------- Core/MIPS/x86/Jit.cpp | 23 +++++------------------ Core/MIPS/x86/RegCache.cpp | 18 +----------------- Core/MIPS/x86/RegCache.h | 6 +----- Core/MIPS/x86/RegCacheFPU.cpp | 3 +-- Core/MIPS/x86/RegCacheFPU.h | 6 +----- unittest/TestArmEmitter.cpp | 4 ++-- 18 files changed, 51 insertions(+), 117 deletions(-) diff --git a/Core/MIPS/ARM/ArmJit.cpp b/Core/MIPS/ARM/ArmJit.cpp index 1173592d3b..189c3949f1 100644 --- a/Core/MIPS/ARM/ArmJit.cpp +++ b/Core/MIPS/ARM/ArmJit.cpp @@ -300,18 +300,7 @@ MIPSOpcode ArmJit::GetOffsetInstruction(int offset) { } void ArmJit::DoJit(u32 em_address, JitBlock *b) { - js.cancel = false; - js.blockStart = em_address; - js.compilerPC = em_address; - js.lastContinuedPC = 0; - js.initialBlockSize = 0; - js.nextExit = 0; - js.downcountAmount = 0; - js.curBlock = b; - js.compiling = true; - js.inDelaySlot = false; - js.blockWrotePrefixes = false; - js.PrefixStart(); + js.Begin(b); // We add a downcount flag check before the block, used when entering from a linked block. // The last block decremented downcounter, and the flag should still be available. @@ -344,11 +333,9 @@ void ArmJit::DoJit(u32 em_address, JitBlock *b) { } b->normalEntry = GetCodePtr(); - // TODO: this needs work - MIPSAnalyst::AnalysisResults analysis; // = MIPSAnalyst::Analyze(em_address); - gpr.Start(analysis); - fpr.Start(analysis); + gpr.Start(); + fpr.Start(); js.numInstructions = 0; while (js.compiling) diff --git a/Core/MIPS/ARM/ArmRegCache.cpp b/Core/MIPS/ARM/ArmRegCache.cpp index 40369d82cf..2471a44829 100644 --- a/Core/MIPS/ARM/ArmRegCache.cpp +++ b/Core/MIPS/ARM/ArmRegCache.cpp @@ -32,14 +32,13 @@ using namespace ArmGen; using namespace ArmJitConstants; -ArmRegCache::ArmRegCache(MIPSState *mipsState, MIPSComp::JitState *js, MIPSComp::JitOptions *jo) : mips_(mipsState), js_(js), jo_(jo) { -} +ArmRegCache::ArmRegCache(MIPSState *mipsState, MIPSComp::JitState *js, MIPSComp::JitOptions *jo) : mips_(mipsState), js_(js), jo_(jo) {} void ArmRegCache::Init(ARMXEmitter *emitter) { emit_ = emitter; } -void ArmRegCache::Start(MIPSAnalyst::AnalysisResults &stats) { +void ArmRegCache::Start() { for (int i = 0; i < NUM_ARMREG; i++) { ar[i].mipsReg = MIPS_REG_INVALID; ar[i].isDirty = false; diff --git a/Core/MIPS/ARM/ArmRegCache.h b/Core/MIPS/ARM/ArmRegCache.h index 0a405a7158..e06953d60a 100644 --- a/Core/MIPS/ARM/ArmRegCache.h +++ b/Core/MIPS/ARM/ArmRegCache.h @@ -51,10 +51,6 @@ enum { } -namespace MIPSAnalyst { -struct AnalysisResults; -}; - // R1 to R6: mapped MIPS regs // R8 = flags (maybe we could do better here?) // R9 = code pointers @@ -91,7 +87,7 @@ public: ~ArmRegCache() {} void Init(ArmGen::ARMXEmitter *emitter); - void Start(MIPSAnalyst::AnalysisResults &stats); + void Start(); // Protect the arm register containing a MIPS register from spilling, to ensure that // it's being kept allocated. diff --git a/Core/MIPS/ARM/ArmRegCacheFPU.cpp b/Core/MIPS/ARM/ArmRegCacheFPU.cpp index 012dc3131b..181d575f52 100644 --- a/Core/MIPS/ARM/ArmRegCacheFPU.cpp +++ b/Core/MIPS/ARM/ArmRegCacheFPU.cpp @@ -29,7 +29,7 @@ using namespace ArmJitConstants; ArmRegCacheFPU::ArmRegCacheFPU(MIPSState *mipsState, MIPSComp::JitState *js, MIPSComp::JitOptions *jo) : mips_(mipsState), js_(js), jo_(jo), vr(mr + 32) {} -void ArmRegCacheFPU::Start(MIPSAnalyst::AnalysisResults &stats) { +void ArmRegCacheFPU::Start() { if (!initialReady) { SetupInitialRegs(); initialReady = true; diff --git a/Core/MIPS/ARM/ArmRegCacheFPU.h b/Core/MIPS/ARM/ArmRegCacheFPU.h index f572c84a97..5551833aa4 100644 --- a/Core/MIPS/ARM/ArmRegCacheFPU.h +++ b/Core/MIPS/ARM/ArmRegCacheFPU.h @@ -45,10 +45,6 @@ enum { } -namespace MIPSAnalyst { -struct AnalysisResults; -}; - struct FPURegARM { int mipsReg; // if -1, no mipsreg attached. bool isDirty; // Should the register be written back? @@ -87,7 +83,7 @@ public: void Init(ArmGen::ARMXEmitter *emitter); - void Start(MIPSAnalyst::AnalysisResults &stats); + void Start(); // Protect the arm register containing a MIPS register from spilling, to ensure that // it's being kept allocated. diff --git a/Core/MIPS/ARM64/Arm64Jit.cpp b/Core/MIPS/ARM64/Arm64Jit.cpp index 6929aef95a..318de0c074 100644 --- a/Core/MIPS/ARM64/Arm64Jit.cpp +++ b/Core/MIPS/ARM64/Arm64Jit.cpp @@ -304,18 +304,7 @@ MIPSOpcode Arm64Jit::GetOffsetInstruction(int offset) { } void Arm64Jit::DoJit(u32 em_address, JitBlock *b) { - js.cancel = false; - js.blockStart = em_address; - js.compilerPC = em_address; - js.lastContinuedPC = 0; - js.initialBlockSize = 0; - js.nextExit = 0; - js.downcountAmount = 0; - js.curBlock = b; - js.compiling = true; - js.inDelaySlot = false; - js.blockWrotePrefixes = false; - js.PrefixStart(); + js.Begin(b); // We add a downcount flag check before the block, used when entering from a linked block. // The last block decremented downcounter, and the flag should still be available. @@ -346,11 +335,9 @@ void Arm64Jit::DoJit(u32 em_address, JitBlock *b) { } b->normalEntry = GetCodePtr(); - // TODO: this needs work - MIPSAnalyst::AnalysisResults analysis; // = MIPSAnalyst::Analyze(em_address); - gpr.Start(analysis); - fpr.Start(analysis); + gpr.Start(); + fpr.Start(); js.numInstructions = 0; while (js.compiling) { @@ -391,7 +378,7 @@ void Arm64Jit::DoJit(u32 em_address, JitBlock *b) { char temp[256]; if (logBlocks > 0 && dontLogBlocks == 0) { INFO_LOG(Log::JIT, "=============== mips %d ===============", blocks.GetNumBlocks()); - for (u32 cpc = em_address; cpc != GetCompilerPC() + 4; cpc += 4) { + for (u32 cpc = b->originalAddress; cpc != GetCompilerPC() + 4; cpc += 4) { MIPSDisAsm(Memory::Read_Opcode_JIT(cpc), cpc, temp, sizeof(temp), true); INFO_LOG(Log::JIT, "M: %08x %s", cpc, temp); } diff --git a/Core/MIPS/ARM64/Arm64RegCache.cpp b/Core/MIPS/ARM64/Arm64RegCache.cpp index 8f1a13ca3a..d83d7c1755 100644 --- a/Core/MIPS/ARM64/Arm64RegCache.cpp +++ b/Core/MIPS/ARM64/Arm64RegCache.cpp @@ -22,7 +22,6 @@ #include "Core/MemMap.h" #include "Core/MIPS/ARM64/Arm64RegCache.h" #include "Core/MIPS/ARM64/Arm64Jit.h" -#include "Core/MIPS/MIPSAnalyst.h" #include "Core/Reporting.h" #include "Common/Arm64Emitter.h" @@ -40,7 +39,7 @@ void Arm64RegCache::Init(ARM64XEmitter *emitter) { emit_ = emitter; } -void Arm64RegCache::Start(MIPSAnalyst::AnalysisResults &stats) { +void Arm64RegCache::Start() { for (int i = 0; i < NUM_ARMREG; i++) { ar[i].mipsReg = MIPS_REG_INVALID; ar[i].isDirty = false; diff --git a/Core/MIPS/ARM64/Arm64RegCache.h b/Core/MIPS/ARM64/Arm64RegCache.h index 9eb4d15356..640fd80e26 100644 --- a/Core/MIPS/ARM64/Arm64RegCache.h +++ b/Core/MIPS/ARM64/Arm64RegCache.h @@ -54,10 +54,6 @@ enum { } // namespace -namespace MIPSAnalyst { -struct AnalysisResults; -}; - typedef int MIPSReg; struct RegARM64 { @@ -89,7 +85,7 @@ public: ~Arm64RegCache() {} void Init(Arm64Gen::ARM64XEmitter *emitter); - void Start(MIPSAnalyst::AnalysisResults &stats); + void Start(); // Protect the arm register containing a MIPS register from spilling, to ensure that // it's being kept allocated. diff --git a/Core/MIPS/ARM64/Arm64RegCacheFPU.cpp b/Core/MIPS/ARM64/Arm64RegCacheFPU.cpp index 1f82c1d351..3eb1dfb4f5 100644 --- a/Core/MIPS/ARM64/Arm64RegCacheFPU.cpp +++ b/Core/MIPS/ARM64/Arm64RegCacheFPU.cpp @@ -40,7 +40,7 @@ void Arm64RegCacheFPU::Init(Arm64Gen::ARM64XEmitter *emit, Arm64Gen::ARM64FloatE fp_ = fp; } -void Arm64RegCacheFPU::Start(MIPSAnalyst::AnalysisResults &stats) { +void Arm64RegCacheFPU::Start() { if (!initialReady) { SetupInitialRegs(); initialReady = true; diff --git a/Core/MIPS/ARM64/Arm64RegCacheFPU.h b/Core/MIPS/ARM64/Arm64RegCacheFPU.h index 40b7647448..b07c55ef21 100644 --- a/Core/MIPS/ARM64/Arm64RegCacheFPU.h +++ b/Core/MIPS/ARM64/Arm64RegCacheFPU.h @@ -43,10 +43,6 @@ enum { } -namespace MIPSAnalyst { -struct AnalysisResults; -}; - struct FPURegARM64 { int mipsReg; // if -1, no mipsreg attached. bool isDirty; // Should the register be written back? @@ -85,7 +81,7 @@ public: void Init(Arm64Gen::ARM64XEmitter *emitter, Arm64Gen::ARM64FloatEmitter *fp); - void Start(MIPSAnalyst::AnalysisResults &stats); + void Start(); // Protect the arm register containing a MIPS register from spilling, to ensure that // it's being kept allocated. diff --git a/Core/MIPS/JitCommon/JitState.cpp b/Core/MIPS/JitCommon/JitState.cpp index a36321b328..a33628ae6e 100644 --- a/Core/MIPS/JitCommon/JitState.cpp +++ b/Core/MIPS/JitCommon/JitState.cpp @@ -19,9 +19,27 @@ #include "Common/CPUDetect.h" #include "Core/Config.h" #include "Core/MIPS/JitCommon/JitState.h" +#include "Core/MIPS/JitCommon/JitBlockCache.h" #include "Common/MemoryUtil.h" namespace MIPSComp { + +void JitState::Begin(JitBlock *block) { + cancel = false; + blockStart = block->originalAddress; + compilerPC = block->originalAddress; + lastContinuedPC = 0; + initialBlockSize = 0; + nextExit = 0; + downcountAmount = 0; + curBlock = block; + compiling = true; + inDelaySlot = false; + blockWrotePrefixes = false; + afterOp = JitState::AFTER_NONE; + PrefixStart(); +} + JitOptions::JitOptions() { disableFlags = (JitDisable)g_Config.uJitDisableFlags; diff --git a/Core/MIPS/JitCommon/JitState.h b/Core/MIPS/JitCommon/JitState.h index 50ac0cf6a9..5d8893cccb 100644 --- a/Core/MIPS/JitCommon/JitState.h +++ b/Core/MIPS/JitCommon/JitState.h @@ -28,8 +28,7 @@ class JitBlockCache; namespace MIPSComp { - enum CompileDelaySlotFlags - { + enum CompileDelaySlotFlags { // Easy, nothing extra. DELAYSLOT_NICE = 0, // Flush registers after delay slot. @@ -40,18 +39,15 @@ namespace MIPSComp { DELAYSLOT_SAFE_FLUSH = DELAYSLOT_FLUSH | DELAYSLOT_SAFE, }; - struct JitState - { - enum PrefixState - { + struct JitState { + enum PrefixState { PREFIX_UNKNOWN = 0x00, PREFIX_KNOWN = 0x01, PREFIX_DIRTY = 0x10, PREFIX_KNOWN_DIRTY = 0x11, }; - enum AfterOp - { + enum AfterOp { AFTER_NONE = 0x00, AFTER_CORE_STATE = 0x01, }; @@ -85,6 +81,8 @@ namespace MIPSComp { PrefixState prefixTFlag = PREFIX_UNKNOWN; PrefixState prefixDFlag = PREFIX_UNKNOWN; + void Begin(JitBlock *block); + void PrefixStart() { if (startDefaultPrefix) { EatPrefix(); diff --git a/Core/MIPS/x86/Jit.cpp b/Core/MIPS/x86/Jit.cpp index 8c9b175754..46dd4ec9cd 100644 --- a/Core/MIPS/x86/Jit.cpp +++ b/Core/MIPS/x86/Jit.cpp @@ -315,7 +315,7 @@ void Jit::Compile(u32 em_address) { int block_num = blocks.AllocateBlock(em_address); JitBlock *b = blocks.GetBlock(block_num); DoJit(em_address, b); - _assert_msg_(b->originalAddress == em_address, "original %08x != em_address %08x (block %d)", b->originalAddress, em_address, b->blockNum); + b->DoIntegrityCheck(em_address, block_num); blocks.FinalizeBlock(block_num, jo.enableBlocklink); EndWrite(); @@ -360,19 +360,7 @@ MIPSOpcode Jit::GetOffsetInstruction(int offset) { } void Jit::DoJit(u32 em_address, JitBlock *b) { - js.cancel = false; - js.blockStart = em_address; - js.compilerPC = em_address; - js.lastContinuedPC = 0; - js.initialBlockSize = 0; - js.nextExit = 0; - js.downcountAmount = 0; - js.curBlock = b; - js.compiling = true; - js.inDelaySlot = false; - js.blockWrotePrefixes = false; - js.afterOp = JitState::AFTER_NONE; - js.PrefixStart(); + js.Begin(b); // We add a check before the block, used when entering from a linked block. b->checkedEntry = GetCodePtr(); @@ -384,10 +372,8 @@ void Jit::DoJit(u32 em_address, JitBlock *b) { b->normalEntry = GetCodePtr(); - MIPSAnalyst::AnalysisResults analysis = MIPSAnalyst::Analyze(em_address); - - gpr.Start(mips_, &js, &jo, analysis); - fpr.Start(mips_, &js, &jo, analysis, RipAccessible(&mips_->v[0])); + gpr.Start(mips_, &js, &jo); + fpr.Start(mips_, &js, &jo, RipAccessible(&mips_->v[0])); js.numInstructions = 0; while (js.compiling) { @@ -442,6 +428,7 @@ void Jit::DoJit(u32 em_address, JitBlock *b) { b->codeSize = (u32)(GetCodePtr() - b->normalEntry); NOP(); AlignCode4(); + if (js.lastContinuedPC == 0) { b->originalSize = js.numInstructions; } else { diff --git a/Core/MIPS/x86/RegCache.cpp b/Core/MIPS/x86/RegCache.cpp index fdf0228786..06a298bf46 100644 --- a/Core/MIPS/x86/RegCache.cpp +++ b/Core/MIPS/x86/RegCache.cpp @@ -57,7 +57,7 @@ void GPRRegCache::FlushBeforeCall() { GPRRegCache::GPRRegCache() { } -void GPRRegCache::Start(MIPSState *mipsState, MIPSComp::JitState *js, MIPSComp::JitOptions *jo, MIPSAnalyst::AnalysisResults &stats) { +void GPRRegCache::Start(MIPSState *mipsState, MIPSComp::JitState *js, MIPSComp::JitOptions *jo) { #if PPSSPP_ARCH(AMD64) if (allocationOrderR15[0] == INVALID_REG) { memcpy(allocationOrderR15, allocationOrder, sizeof(allocationOrder)); @@ -82,22 +82,6 @@ void GPRRegCache::Start(MIPSState *mipsState, MIPSComp::JitState *js, MIPSComp:: } SetImm(MIPS_REG_ZERO, 0); - // todo: sort to find the most popular regs - /* - int maxPreload = 2; - for (int i = 0; i < NUM_MIPS_GPRS; i++) - { - if (stats.numReads[i] > 2 || stats.numWrites[i] >= 2) - { - LoadToX64(i, true, false); //stats.firstRead[i] <= stats.firstWrite[i], false); - maxPreload--; - if (!maxPreload) - break; - } - }*/ - //Find top regs - preload them (load bursts ain't bad) - //But only preload IF written OR reads >= 3 - js_ = js; jo_ = jo; } diff --git a/Core/MIPS/x86/RegCache.h b/Core/MIPS/x86/RegCache.h index f852401f8d..ec8a913ea1 100644 --- a/Core/MIPS/x86/RegCache.h +++ b/Core/MIPS/x86/RegCache.h @@ -41,10 +41,6 @@ namespace X64JitConstants { #endif } -namespace MIPSAnalyst { -struct AnalysisResults; -}; - struct MIPSCachedReg { Gen::OpArg location; bool away; // value not in source register @@ -73,7 +69,7 @@ class GPRRegCache public: GPRRegCache(); ~GPRRegCache() {} - void Start(MIPSState *mipsState, MIPSComp::JitState *js, MIPSComp::JitOptions *jo, MIPSAnalyst::AnalysisResults &stats); + void Start(MIPSState *mipsState, MIPSComp::JitState *js, MIPSComp::JitOptions *jo); void DiscardRegContentsIfCached(MIPSGPReg preg); void DiscardR(MIPSGPReg preg); diff --git a/Core/MIPS/x86/RegCacheFPU.cpp b/Core/MIPS/x86/RegCacheFPU.cpp index 44c0e27ca6..4940bf78c1 100644 --- a/Core/MIPS/x86/RegCacheFPU.cpp +++ b/Core/MIPS/x86/RegCacheFPU.cpp @@ -22,7 +22,6 @@ #include "Common/Math/SIMDHeaders.h" #include "Common/Log.h" #include "Common/x64Emitter.h" -#include "Core/MIPS/MIPSAnalyst.h" #include "Core/MIPS/x86/Jit.h" #include "Core/MIPS/x86/RegCache.h" #include "Core/MIPS/x86/RegCacheFPU.h" @@ -34,7 +33,7 @@ FPURegCache::FPURegCache() { vregs = regs + 32; } -void FPURegCache::Start(MIPSState *mipsState, MIPSComp::JitState *js, MIPSComp::JitOptions *jo, MIPSAnalyst::AnalysisResults &stats, bool useRip) { +void FPURegCache::Start(MIPSState *mipsState, MIPSComp::JitState *js, MIPSComp::JitOptions *jo, bool useRip) { mips_ = mipsState; useRip_ = useRip; if (!initialReady) { diff --git a/Core/MIPS/x86/RegCacheFPU.h b/Core/MIPS/x86/RegCacheFPU.h index 0e63de5a68..69cc412270 100644 --- a/Core/MIPS/x86/RegCacheFPU.h +++ b/Core/MIPS/x86/RegCacheFPU.h @@ -55,10 +55,6 @@ enum { #define NUM_X_FPREGS 8 #endif -namespace MIPSAnalyst { -struct AnalysisResults; -}; - struct X64CachedFPReg { union { int mipsReg; @@ -102,7 +98,7 @@ public: FPURegCache(); ~FPURegCache() {} - void Start(MIPSState *mipsState, MIPSComp::JitState *js, MIPSComp::JitOptions *jo, MIPSAnalyst::AnalysisResults &stats, bool useRip); + void Start(MIPSState *mipsState, MIPSComp::JitState *js, MIPSComp::JitOptions *jo, bool useRip); void MapReg(int preg, bool doLoad = true, bool makeDirty = true); void StoreFromRegister(int preg); void StoreFromRegisterV(int preg) { diff --git a/unittest/TestArmEmitter.cpp b/unittest/TestArmEmitter.cpp index 96d96cf66e..2083e88a90 100644 --- a/unittest/TestArmEmitter.cpp +++ b/unittest/TestArmEmitter.cpp @@ -251,7 +251,7 @@ bool TestArmEmitter() { using namespace ArmJitConstants; - fpr.Start(results); + fpr.Start(); fpr.QMapReg(C000, V_Quad, MAP_DIRTY); fpr.QMapReg(C010, V_Quad, MAP_DIRTY); fpr.QMapReg(C020, V_Quad, MAP_DIRTY); @@ -260,7 +260,7 @@ bool TestArmEmitter() { fpr.QMapReg(R000, V_Quad, MAP_DIRTY); fpr.FlushAll(); - fpr.Start(results); + fpr.Start(); emitter.ORR(R0, R0, R0); fpr.QMapReg(R000, V_Quad, MAP_DIRTY); fpr.QMapReg(R001, V_Quad, MAP_DIRTY); From ca127b0e5b09bddda9f6a5d03deeb6924be9cd43 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Henrik=20Rydg=C3=A5rd?= Date: Thu, 12 Feb 2026 01:35:57 +0100 Subject: [PATCH 6/6] More fixes, more gamescreen button fixes --- Core/MIPS/ARM64/Arm64RegCache.cpp | 1 + UI/GameScreen.cpp | 13 ++++++++++--- UI/MainScreen.cpp | 13 +------------ 3 files changed, 12 insertions(+), 15 deletions(-) diff --git a/Core/MIPS/ARM64/Arm64RegCache.cpp b/Core/MIPS/ARM64/Arm64RegCache.cpp index d83d7c1755..1904cc2286 100644 --- a/Core/MIPS/ARM64/Arm64RegCache.cpp +++ b/Core/MIPS/ARM64/Arm64RegCache.cpp @@ -22,6 +22,7 @@ #include "Core/MemMap.h" #include "Core/MIPS/ARM64/Arm64RegCache.h" #include "Core/MIPS/ARM64/Arm64Jit.h" +#include "Core/MIPS/MIPSAnalyst.h" #include "Core/Reporting.h" #include "Common/Arm64Emitter.h" diff --git a/UI/GameScreen.cpp b/UI/GameScreen.cpp index 004191fce2..744343d67a 100644 --- a/UI/GameScreen.cpp +++ b/UI/GameScreen.cpp @@ -202,7 +202,6 @@ void GameScreen::CreateContentViews(UI::ViewGroup *parent) { } mainGameInfo->SetSpacing(3.0f); - GameDBInfo dbInfo; std::vector dbInfos; const bool inGameDB = g_gameDB.GetGameInfos(info_->id_version, &dbInfos); @@ -482,10 +481,18 @@ void GameScreen::OnCreateConfig(UI::EventParams &e) { } std::string_view GameScreen::GetTitle() const { - if (knownFlags_ & GameInfoFlags::PARAM_SFO) { - titleCache_ = info_->GetDBTitle(); + if (!info_->Ready(GameInfoFlags::PARAM_SFO)) { + return ""; } + // Don't look up homebrew in the database, sometimes they take IDs from games. + if (info_->fileType != IdentifiedFileType::PSP_PBP_DIRECTORY) { + if (knownFlags_ & GameInfoFlags::PARAM_SFO) { + titleCache_ = info_->GetDBTitle(); + } + } else { + titleCache_ = info_->GetTitle(); + } return titleCache_; } diff --git a/UI/MainScreen.cpp b/UI/MainScreen.cpp index d2823aaa9a..a754d77577 100644 --- a/UI/MainScreen.cpp +++ b/UI/MainScreen.cpp @@ -416,7 +416,6 @@ void GameButton::Draw(UIContext &dc) { if (overlayColor) { dc.FillRect(Drawable(overlayColor), overlayBounds); } - return; } char discNumInfo[8]; @@ -428,17 +427,7 @@ void GameButton::Draw(UIContext &dc) { dc.Draw()->Flush(); dc.RebindTexture(); dc.SetFontStyle(dc.GetTheme().uiFont); - if (gridStyle_ && ginfo->fileType == IdentifiedFileType::PPSSPP_GE_DUMP) { - // Super simple drawing for GE dumps (no icon, just the filename). - dc.PushScissor(bounds_); - const std::string currentTitle = ginfo->GetTitle(); - dc.SetFontStyle(*GetTextStyle(dc, UI::TextSize::Small)); - dc.DrawText(title_, bounds_.x + 4.0f, bounds_.centerY(), style.fgColor, ALIGN_VCENTER | ALIGN_LEFT); - dc.SetFontStyle(dc.GetTheme().uiFont); - title_ = currentTitle; - dc.Draw()->Flush(); - dc.PopScissor(); - } else if (!gridStyle_) { + if (!gridStyle_) { float tw, th; dc.Draw()->Flush(); dc.PushScissor(bounds_);