diff --git a/Core/HLE/HLE.cpp b/Core/HLE/HLE.cpp index 4633f3ddcd..cdc7d40ed8 100644 --- a/Core/HLE/HLE.cpp +++ b/Core/HLE/HLE.cpp @@ -337,7 +337,17 @@ static void hleDelayResultFinish(u64 userdata, int cycleslate) { WARN_LOG(Log::HLE, "Someone else woke up HLE-blocked thread %d?", threadID); } -// Which firmware files a flag needs before it can be honoured. +// Which files need to be present for a disable-hle-flag to be honoured. +// +// Two shapes end up here. sceMp4 because libmp4.prx and mp4msv.prx are firmware libraries no game +// ships, so without a dump there is nothing to run at all. sceFont because the module is on the +// disc like any other but reads its fonts from flash0:/font with nothing to fall back on. Either +// way the HLE is the only thing that can serve, so the flag comes off. +// +// sceMpeg, sceMp3 and sceAtrac are deliberately not here: plenty of discs carry their own copy +// (Death Jr. has MPEG.PRX and LIBATRAC3PLUS.PRX under PSP_GAME/USRDIR/MODULES), and dropping the +// flag for want of a dump would replace a perfectly good disc module with our HLE. Those check for +// a real module at the point they would load one, and warn there if neither source has it. static void CheckDisableHLEAvailability() { g_unavailableDisableFlags = (DisableHLEFlags)0; diff --git a/Core/HLE/sceKernelModule.cpp b/Core/HLE/sceKernelModule.cpp index 641d150f05..35d4a9fe2f 100644 --- a/Core/HLE/sceKernelModule.cpp +++ b/Core/HLE/sceKernelModule.cpp @@ -2026,6 +2026,21 @@ static PSPModule *__KernelLoadELFFromPtr(const u8 *ptr, size_t elfSize, u32 load return module; } +bool KernelModuleIsLoaded(std::string_view name) { + u32 error; + for (SceUID moduleId : loadedModules) { + PSPModule *module = kernelObjects.Get(moduleId, error); + // A fake module is our own HLE stand-in, which isn't the real library being asked about. + if (!module || module->isFake) { + continue; + } + if (equals(name, module->nm.name)) { + return true; + } + } + return false; +} + SceUID KernelLoadModule(const std::string &filename, std::string *error_string, bool fromTop) { std::vector buffer; if (pspFileSystem.ReadEntireFile(filename, buffer) < 0) diff --git a/Core/HLE/sceKernelModule.h b/Core/HLE/sceKernelModule.h index c1f0c5d359..0ba6fc39a7 100644 --- a/Core/HLE/sceKernelModule.h +++ b/Core/HLE/sceKernelModule.h @@ -252,6 +252,10 @@ void __KernelReturnFromModuleFunc(); // up, which shifts every address in it and invalidates cheats and achievements, and outright // fails for a game like Tekken 6 whose EBOOT must load at a fixed low address. SceUID KernelLoadModule(const std::string &filename, std::string *error_string, bool fromTop = false); + +// Whether a real (non-HLE-stub) module calling itself this is loaded. Lets a caller tell whether a +// library is already provided before bringing in another copy of it. +bool KernelModuleIsLoaded(std::string_view name); int __KernelStartModule(SceUID moduleId, u32 argsize, u32 argAddr, u32 returnValueAddr, SceKernelSMOption *smoption, bool *needsWait); u32 __KernelStopUnloadSelfModuleWithOrWithoutStatus(u32 exitCode, u32 argSize, u32 argp, u32 statusAddr, u32 optionAddr, bool WithStatus); u32 sceKernelFindModuleByUID(u32 uid); diff --git a/Core/HLE/sceUtility.cpp b/Core/HLE/sceUtility.cpp index 2eb935507d..3f16d40a3d 100644 --- a/Core/HLE/sceUtility.cpp +++ b/Core/HLE/sceUtility.cpp @@ -25,6 +25,10 @@ #include "Common/Serialize/SerializeMap.h" #include "Common/Serialize/SerializeSet.h" #include "Common/File/VFS/VFS.h" +#include "Common/Data/Text/I18n.h" +#include "Common/StringUtils.h" +#include "Common/System/OSD.h" +#include "Core/FileSystems/MetaFileSystem.h" #include "Core/Config.h" #include "Core/CoreTiming.h" #include "Core/HLE/HLE.h" @@ -81,62 +85,105 @@ static const int atrac3PlusModuleDeps[] = {0x0300, 0}; static const int mpegBaseModuleDeps[] = {0x0300, 0}; static const int mp4ModuleDeps[] = {0x0300, 0}; +// Loading the firmware's module for a library we've been told not to HLE. +// +// This is the path for a game that brings no copy of its own. One that does loads it directly and +// never comes here: a third of the checked games ship an AV library, and of the twelve seen doing both, +// not one asked sceUtility for a library it had already loaded - only for the ones it hadn't +// brought. Toca Race Driver ships LIBMP3.PRX and asks for 0x300 to 0x303. +// +// So the module-list check below is a guard rather than the normal path, and it costs nothing: +// asking the list rather than remembering what we loaded means this needs no state of its own. It +// is right after a savestate load, across games, and if a game unloads a library and asks again. +struct FirmwareModule { + const char *path; // in the firmware + const char *moduleName; // what the module calls itself once loaded +}; + +static void LoadFirmwareModules(const char *library, const FirmwareModule *modules, size_t count) { + for (size_t i = 0; i < count; i++) { + if (KernelModuleIsLoaded(modules[i].moduleName)) { + DEBUG_LOG(Log::sceUtility, "%s is already loaded - not loading %s on top of it", + modules[i].moduleName, modules[i].path); + continue; + } + if (!pspFileSystem.GetFileInfo(modules[i].path).exists) { + // Nothing to fall back to: the game's imports were resolved against the real module + // when it loaded, so putting our HLE back now is not an option. + ERROR_LOG(Log::sceUtility, "%s HLE is disabled, but %s isn't in the firmware and the " + "game didn't bring its own - it will get unresolved imports", library, modules[i].path); + auto sy = GetI18NCategory(I18NCat::SYSTEM); + // Keyed per library, so a game that asks for the module again replaces the message + // rather than stacking another copy of it, and two missing libraries still both show. + char osdId[64]; + snprintf(osdId, sizeof(osdId), "hle_no_module_%s", library); + g_OSD.Show(OSDType::MESSAGE_WARNING, ApplySafeSubstitutions( + sy->T("%1 needs a firmware installed to run without HLE. Install one, or re-enable HLE for it."), + library), 6.0f, osdId); + return; + } + std::string error; + SceUID id = KernelLoadModule(modules[i].path, &error, false); + if (id < 0) { + ERROR_LOG(Log::sceUtility, "Couldn't load %s: %s", modules[i].path, error.c_str()); + return; + } + const int result = __KernelStartModule(id, 0, 0, 0, nullptr, nullptr); + if (result < 0) { + ERROR_LOG(Log::sceUtility, "Failed to start %s (%08x)", modules[i].path, result); + return; + } + INFO_LOG(Log::sceUtility, "Loaded the real %s", modules[i].path); + } +} + +// libmp3.prx imports nothing but the kernel and sceAudiocodec, which we have. +static void NotifyLoadStatusMp3(int state, u32 loadAddr, u32 totalSize) { + // The effective flags, not the raw setting: those also account for the compat flags, for a + // firmware dump that isn't there, and for the boundary a savestate restored - resolving + // imports one way and loading modules the other is how a game ends up with neither. + if (state != 1 || !(GetEffectiveDisableHLEFlags() & DisableHLEFlags::sceMp3)) { + return; + } + static const FirmwareModule modules[] = { + { "flash0:/kd/libmp3.prx", "sceMp3_Library" }, + }; + LoadFirmwareModules("sceMp3", modules, ARRAY_SIZE(modules)); +} + static void NotifyLoadStatusAvcodec(int state, u32 loadAddr, u32 totalSize) { JpegNotifyLoadStatus(state); } // The MP4 libraries are a good candidate for running the real thing: libmp4.prx needs only two // functions from sceAudiocodec (Init and Decode) plus ordinary kernel calls, and mp4msv.prx - the -// 41 functions libmp4 leans on - imports nothing at all. So with a firmware dump present, the pair -// can be loaded for real and left to decode through our sceAudiocodec HLE. -static SceUID g_mp4RealModules[2] = { 0, 0 }; - +// 41 functions libmp4 leans on - imports nothing at all. static void NotifyLoadStatusMp4(int state, u32 loadAddr, u32 totalSize) { - // The effective flags, not the raw setting: those also account for a firmware dump that isn't - // there or is too old to have sceMp4 (which is the whole point of CheckDisableHLEAvailability), - // for the compat flags. - if (!(GetEffectiveDisableHLEFlags() & DisableHLEFlags::sceMp4)) { + if (state != 1 || !(GetEffectiveDisableHLEFlags() & DisableHLEFlags::sceMp4)) { return; } - - if (state == 1) { - // mp4msv first - libmp4 imports from it, and an import can only resolve to a module that - // is already loaded. - static const char *const paths[2] = { - "flash0:/kd/mp4msv.prx", - "flash0:/kd/libmp4.prx", - }; - for (int i = 0; i < 2; i++) { - if (g_mp4RealModules[i]) { - continue; - } - std::string error; - SceUID id = KernelLoadModule(paths[i], &error, true); - if (id < 0) { - ERROR_LOG(Log::sceUtility, "sceMp4 HLE is disabled, but %s wouldn't load (%s) - " - "the game will get unresolved imports", paths[i], error.c_str()); - return; - } - int result = __KernelStartModule(id, 0, 0, 0, nullptr, nullptr); - if (result < 0) { - ERROR_LOG(Log::sceUtility, "Failed to start %s (%08x)", paths[i], result); - return; - } - g_mp4RealModules[i] = id; - INFO_LOG(Log::sceUtility, "Loaded the real %s", paths[i]); - } - } + // mp4msv first - libmp4 imports from it, and an import can only resolve to a module that is + // already loaded. + static const FirmwareModule modules[] = { + { "flash0:/kd/mp4msv.prx", "mp4msv_module" }, + { "flash0:/kd/libmp4.prx", "sceMp4_library" }, + }; + LoadFirmwareModules("sceMp4", modules, ARRAY_SIZE(modules)); } static void NotifyLoadStatusAtrac(int state, u32 loadAddr, u32 totalSize) { if (state == 1) { - // If HLE of sceAtrac is disabled, things will break! - // For now we do angry logging and a debug assert. - if ((DisableHLEFlags)g_Config.iDisableHLE & DisableHLEFlags::sceAtrac) { - ERROR_LOG(Log::ME, "sceAtrac HLE is disabled, and the game tries to load sceAtrac from firmware - this won't work!"); - _dbg_assert_(false); - - // Actually, if the user has an F0 (psardumper) dump, we could go look for the file there. + // The effective flags, for the same reason the loads above use them. + if (GetEffectiveDisableHLEFlags() & DisableHLEFlags::sceAtrac) { + // libatrac3plus.prx imports only Kernel_Library and sceAudiocodec, both of which we + // have, so the real module runs against our HLE the same way libmp3.prx does. Nothing + // below applies once it does: the atrac contexts then live in that module's own bss, + // not in the block we hand out here, and the game's calls go to it rather than to us. + static const FirmwareModule modules[] = { + { "flash0:/kd/libatrac3plus.prx", "sceATRAC3plus_Library" }, + }; + LoadFirmwareModules("sceAtrac", modules, ARRAY_SIZE(modules)); + return; } // We try to imitate a recent version of the prx. @@ -146,11 +193,22 @@ static void NotifyLoadStatusAtrac(int state, u32 loadAddr, u32 totalSize) { _dbg_assert_(bssSize <= totalSize); __AtracNotifyLoadModule(version, 0, loadAddr, bssSize); } else if (state == -1) { - // Unload. + // Unload. Harmless when the firmware's module took over - there was no load to undo. __AtracNotifyUnloadModule(); } } +// Which library each AV utility module provides, for the ones a real module can take over when +// HLE is disabled for it. See LoadModuleInternal. +static DisableHLEFlags UtilityModuleLibraryFlag(u32 module) { + switch (module) { + case 0x302: return DisableHLEFlags::sceAtrac; // av_atrac3plus + case 0x304: return DisableHLEFlags::sceMp3; // av_mp3 + case 0x308: return DisableHLEFlags::sceMp4; // av_mp4 + default: return (DisableHLEFlags)0; + } +} + ModuleLoadInfo::ModuleLoadInfo(int m, u32 s, const char *_name, ModuleLoadCallback n) : name(_name), mod(m), size(s), dependencies(noDeps), notify(n) {} ModuleLoadInfo::ModuleLoadInfo(int m, u32 s, const char *_name, const int *d, ModuleLoadCallback n) @@ -178,7 +236,7 @@ static const ModuleLoadInfo moduleLoadInfo[] = { // Changing this breaks some bad cheats though.. ModuleLoadInfo(0x302, 0x00008000, "av_atrac3plus", atrac3PlusModuleDeps, &NotifyLoadStatusAtrac), ModuleLoadInfo(0x303, 0x0000c000, "av_mpegbase", mpegBaseModuleDeps), - ModuleLoadInfo(0x304, 0x00004000, "av_mp3"), + ModuleLoadInfo(0x304, 0x00004000, "av_mp3", &NotifyLoadStatusMp3), ModuleLoadInfo(0x305, 0x0000a300, "av_vaudio"), ModuleLoadInfo(0x306, 0x00004000, "av_aac"), ModuleLoadInfo(0x307, 0x00000000, "av_g729"), @@ -364,9 +422,6 @@ void __UtilityInit() { DeactivateDialog(); SavedataParam::Init(); currentlyLoadedModules.clear(); - // Vital to reset these between games, otherwise we might think they're already loaded. - g_mp4RealModules[0] = 0; - g_mp4RealModules[1] = 0; volatileUnlockEvent = CoreTiming::RegisterEvent("UtilityVolatileUnlock", UtilityVolatileUnlock); ResetSecondsSinceLastGameSave(); @@ -719,10 +774,15 @@ static int LoadModuleInternal(u32 module, bool av) { } u32 allocSize = info->size; + const DisableHLEFlags libraryFlag = UtilityModuleLibraryFlag(module); + if (libraryFlag != (DisableHLEFlags)0 && (GetEffectiveDisableHLEFlags() & libraryFlag)) { + allocSize = 0; + } + u32 address = 0; - char name[128]; - snprintf(name, sizeof(name), "UtilityModule/%3x_%s", module, info->name); if (allocSize != 0) { + char name[128]; + snprintf(name, sizeof(name), "UtilityModule/%3x_%s", module, info->name); address = userMemory.Alloc(allocSize, false, name); } currentlyLoadedModules[module] = address; diff --git a/assets/lang/bg_BG.ini b/assets/lang/bg_BG.ini index f3a4682302..eeccc93cad 100644 --- a/assets/lang/bg_BG.ini +++ b/assets/lang/bg_BG.ini @@ -1393,6 +1393,7 @@ Vulkan Extensions = Vulkan extensions Vulkan Features = Vulkan features [System] +%1 needs a firmware installed to run without HLE. Install one, or re-enable HLE for it. = %1 се нуждае от инсталиран фърмуер, за да работи без HLE. Инсталирайте го или включете отново HLE за тази библиотека. # AI translated (broken) = (broken) 12HR = 12ч. 24HR = 24ч. diff --git a/assets/lang/ca_ES.ini b/assets/lang/ca_ES.ini index 300a2dea17..7b0b05eb37 100644 --- a/assets/lang/ca_ES.ini +++ b/assets/lang/ca_ES.ini @@ -1393,6 +1393,7 @@ Vulkan Extensions = Vulkan extensions Vulkan Features = Vulkan features [System] +%1 needs a firmware installed to run without HLE. Install one, or re-enable HLE for it. = %1 necessita un firmware instal·lat per funcionar sense HLE. Instal·leu-ne un o torneu a activar l'HLE per a aquesta biblioteca. # AI translated (broken) = (broken) 12HR = 12HR 24HR = 24HR diff --git a/assets/lang/cz_CZ.ini b/assets/lang/cz_CZ.ini index b8e2741c0b..76495fede0 100644 --- a/assets/lang/cz_CZ.ini +++ b/assets/lang/cz_CZ.ini @@ -1393,6 +1393,7 @@ Vulkan Extensions = Vulkan extensions Vulkan Features = Vulkan features [System] +%1 needs a firmware installed to run without HLE. Install one, or re-enable HLE for it. = %1 vyžaduje nainstalovaný firmware, aby fungovala bez HLE. Nainstalujte jej nebo pro tuto knihovnu znovu zapněte HLE. # AI translated (broken) = (rozbité) 12HR = 12HOD 24HR = 24HOD diff --git a/assets/lang/da_DK.ini b/assets/lang/da_DK.ini index ca66089883..76ae18a9a7 100644 --- a/assets/lang/da_DK.ini +++ b/assets/lang/da_DK.ini @@ -1393,6 +1393,7 @@ Vulkan Extensions = Vulkan extensions Vulkan Features = Vulkan features [System] +%1 needs a firmware installed to run without HLE. Install one, or re-enable HLE for it. = %1 kræver installeret firmware for at køre uden HLE. Installer en, eller aktivér HLE for den igen. # AI translated (broken) = (ødelagt) 12HR = 12 timer 24HR = 24 timer diff --git a/assets/lang/de_DE.ini b/assets/lang/de_DE.ini index 8d1ebad992..1d47cb92af 100644 --- a/assets/lang/de_DE.ini +++ b/assets/lang/de_DE.ini @@ -1392,6 +1392,7 @@ Vulkan Extensions = Vulkan-Erweiterungen Vulkan Features = Vulkan-Funktionen [System] +%1 needs a firmware installed to run without HLE. Install one, or re-enable HLE for it. = %1 benötigt eine installierte Firmware, um ohne HLE zu laufen. Installiere eine, oder aktiviere HLE dafür wieder. # AI translated (broken) = (kaputt) 12HR = 12 Std 24HR = 24 Std diff --git a/assets/lang/en_US.ini b/assets/lang/en_US.ini index 7e067edb12..d3e8433fd5 100644 --- a/assets/lang/en_US.ini +++ b/assets/lang/en_US.ini @@ -1411,6 +1411,7 @@ Vulkan Features = Vulkan features Display Color Formats = Display Color Formats [System] +%1 needs a firmware installed to run without HLE. Install one, or re-enable HLE for it. = %1 needs a firmware installed to run without HLE. Install one, or re-enable HLE for it. (broken) = (broken) 12HR = 12HR 24HR = 24HR diff --git a/assets/lang/es_ES.ini b/assets/lang/es_ES.ini index 047798ab8b..d95a9a0670 100644 --- a/assets/lang/es_ES.ini +++ b/assets/lang/es_ES.ini @@ -1394,6 +1394,7 @@ Vulkan Extensions = Extensiones Vulkan Vulkan Features = Funciones Vulkan [System] +%1 needs a firmware installed to run without HLE. Install one, or re-enable HLE for it. = %1 necesita un firmware instalado para funcionar sin HLE. Instala uno o vuelve a activar el HLE para esta biblioteca. # AI translated (broken) = (roto) 12HR = 12 horas 24HR = 24 horas diff --git a/assets/lang/es_LA.ini b/assets/lang/es_LA.ini index 57283c14e0..ad31584108 100644 --- a/assets/lang/es_LA.ini +++ b/assets/lang/es_LA.ini @@ -1395,6 +1395,7 @@ Vulkan Extensions = Extensiones Vulkan Vulkan Features = Funciones Vulkan [System] +%1 needs a firmware installed to run without HLE. Install one, or re-enable HLE for it. = %1 necesita un firmware instalado para funcionar sin HLE. Instala uno o vuelve a activar el HLE para esta biblioteca. # AI translated (broken) = (dañado) 12HR = 12HR 24HR = 24HR diff --git a/assets/lang/fi_FI.ini b/assets/lang/fi_FI.ini index fdade8089e..a1e0d3e649 100644 --- a/assets/lang/fi_FI.ini +++ b/assets/lang/fi_FI.ini @@ -1393,6 +1393,7 @@ Vulkan Extensions = Vulkan extensions Vulkan Features = Vulkan features [System] +%1 needs a firmware installed to run without HLE. Install one, or re-enable HLE for it. = %1 vaatii asennetun laiteohjelmiston toimiakseen ilman HLE:tä. Asenna se tai ota HLE uudelleen käyttöön tälle kirjastolle. # AI translated (broken) = (rikki) 12HR = 12HR 24HR = 24HR diff --git a/assets/lang/fr_FR.ini b/assets/lang/fr_FR.ini index 676b6d2433..8bec5c1481 100644 --- a/assets/lang/fr_FR.ini +++ b/assets/lang/fr_FR.ini @@ -1412,6 +1412,7 @@ Vulkan Features = Fonctionnalités Vulkan Display Color Formats = Formats de couleurs d'affichage [System] +%1 needs a firmware installed to run without HLE. Install one, or re-enable HLE for it. = %1 nécessite un firmware installé pour fonctionner sans HLE. Installez-en un, ou réactivez le HLE pour cette bibliothèque. # AI translated (broken) = (cassé) 12HR = 12h 24HR = 24h diff --git a/assets/lang/gl_ES.ini b/assets/lang/gl_ES.ini index 9a616da17c..946cb64abd 100644 --- a/assets/lang/gl_ES.ini +++ b/assets/lang/gl_ES.ini @@ -1392,6 +1392,7 @@ Vulkan Extensions = Vulkan extensions Vulkan Features = Vulkan features [System] +%1 needs a firmware installed to run without HLE. Install one, or re-enable HLE for it. = %1 necesita un firmware instalado para funcionar sen HLE. Instala un ou volve activar o HLE para esta biblioteca. # AI translated (broken) = (broken) 12HR = 12 hrs 24HR = 24 hrs diff --git a/assets/lang/gr_EL.ini b/assets/lang/gr_EL.ini index 574ce132ac..ebfd0f9a88 100644 --- a/assets/lang/gr_EL.ini +++ b/assets/lang/gr_EL.ini @@ -1392,6 +1392,7 @@ Vulkan Extensions = Επεκτάσεις Vulkan Vulkan Features = Δυνατότητες Vulkan [System] +%1 needs a firmware installed to run without HLE. Install one, or re-enable HLE for it. = Το %1 χρειάζεται εγκατεστημένο υλικολογισμικό για να λειτουργήσει χωρίς HLE. Εγκαταστήστε ένα ή ενεργοποιήστε ξανά το HLE για αυτήν τη βιβλιοθήκη. # AI translated (broken) = (εσφαλμένο) 12HR = 12ωρο 24HR = 24ωρο diff --git a/assets/lang/hr_HR.ini b/assets/lang/hr_HR.ini index 938ad02452..9545833719 100644 --- a/assets/lang/hr_HR.ini +++ b/assets/lang/hr_HR.ini @@ -1393,6 +1393,7 @@ Vulkan Extensions = Vulkan nastavci Vulkan Features = Vulkan svojstva [System] +%1 needs a firmware installed to run without HLE. Install one, or re-enable HLE for it. = %1 zahtijeva instalirani firmver za rad bez HLE-a. Instalirajte ga ili ponovno uključite HLE za ovu biblioteku. # AI translated (broken) = (broken) 12HR = 12HR 24HR = 24HR diff --git a/assets/lang/hu_HU.ini b/assets/lang/hu_HU.ini index fc66bc4254..a9667e3090 100644 --- a/assets/lang/hu_HU.ini +++ b/assets/lang/hu_HU.ini @@ -1393,6 +1393,7 @@ Vulkan Extensions = Vulkan kiterjesztések Vulkan Features = Vulkan funkciók [System] +%1 needs a firmware installed to run without HLE. Install one, or re-enable HLE for it. = A(z) %1 működéséhez HLE nélkül telepített firmware szükséges. Telepítsen egyet, vagy kapcsolja vissza a HLE-t ehhez a könyvtárhoz. # AI translated (broken) = (nem működik) 12HR = 12ó 24HR = 24ó diff --git a/assets/lang/id_ID.ini b/assets/lang/id_ID.ini index 301ffc8424..8ef957b994 100644 --- a/assets/lang/id_ID.ini +++ b/assets/lang/id_ID.ini @@ -1393,6 +1393,7 @@ Vulkan Extensions = Ekstensi Vulkan Vulkan Features = Fitur-fitur Vulkan [System] +%1 needs a firmware installed to run without HLE. Install one, or re-enable HLE for it. = %1 memerlukan firmware yang terpasang untuk berjalan tanpa HLE. Pasang firmware, atau aktifkan kembali HLE untuk pustaka ini. # AI translated (broken) = (rusak) 12HR = 12 jam 24HR = 24 jam diff --git a/assets/lang/it_IT.ini b/assets/lang/it_IT.ini index 6b45b62d33..c858b0a399 100644 --- a/assets/lang/it_IT.ini +++ b/assets/lang/it_IT.ini @@ -1396,6 +1396,7 @@ Vulkan Extensions = Estensioni Vulkan Vulkan Features = Funzionalità Vulkan [System] +%1 needs a firmware installed to run without HLE. Install one, or re-enable HLE for it. = %1 richiede un firmware installato per funzionare senza HLE. Installane uno o riattiva l'HLE per questa libreria. # AI translated (broken) = (rotto) 12HR = 12 ore 24HR = 24 ore diff --git a/assets/lang/ja_JP.ini b/assets/lang/ja_JP.ini index c6ae4292fe..ad3e7c1e20 100644 --- a/assets/lang/ja_JP.ini +++ b/assets/lang/ja_JP.ini @@ -1393,6 +1393,7 @@ Vulkan Extensions = Vulkan拡張 Vulkan Features = Vulkanの機能 [System] +%1 needs a firmware installed to run without HLE. Install one, or re-enable HLE for it. = %1 を HLE なしで動作させるにはファームウェアのインストールが必要です。インストールするか、このライブラリの HLE を再度有効にしてください。 # AI translated (broken) = (壊れています) 12HR = 12時間 24HR = 24時間 diff --git a/assets/lang/ko_KR.ini b/assets/lang/ko_KR.ini index acbedd62a2..4afb063280 100644 --- a/assets/lang/ko_KR.ini +++ b/assets/lang/ko_KR.ini @@ -1385,6 +1385,7 @@ Vulkan Features = Vulkan 기능 Display Color Formats = 디스플레이 색상 형식 [System] +%1 needs a firmware installed to run without HLE. Install one, or re-enable HLE for it. = %1 을(를) HLE 없이 실행하려면 펌웨어가 설치되어 있어야 합니다. 펌웨어를 설치하거나 이 라이브러리의 HLE를 다시 활성화하세요. # AI translated (broken) = (고장) 12HR = 12시간 24HR = 24시간 diff --git a/assets/lang/ms_MY.ini b/assets/lang/ms_MY.ini index a0d3a5e90a..1f2d531651 100644 --- a/assets/lang/ms_MY.ini +++ b/assets/lang/ms_MY.ini @@ -1393,6 +1393,7 @@ Vulkan Extensions = Sambungan Vulkan Vulkan Features = Ciri-ciri Vulkan [System] +%1 needs a firmware installed to run without HLE. Install one, or re-enable HLE for it. = %1 memerlukan firmware yang dipasang untuk berjalan tanpa HLE. Pasang satu, atau aktifkan semula HLE untuk pustaka ini. # AI translated (broken) = (rosak) 12HR = 12 JAM 24HR = 24 JAM diff --git a/assets/lang/nl_NL.ini b/assets/lang/nl_NL.ini index 0ed5929846..b28f86f4cd 100644 --- a/assets/lang/nl_NL.ini +++ b/assets/lang/nl_NL.ini @@ -1393,6 +1393,7 @@ Vulkan Extensions = Vulkan-extensies Vulkan Features = Vulkan-functies [System] +%1 needs a firmware installed to run without HLE. Install one, or re-enable HLE for it. = %1 heeft een geïnstalleerde firmware nodig om zonder HLE te werken. Installeer er een of schakel HLE hiervoor weer in. # AI translated (broken) = (defect) 12HR = 12-uursweergave 24HR = 24-uursweergave diff --git a/assets/lang/nn_NO.ini b/assets/lang/nn_NO.ini index 9ac8843336..b0da5f4f8b 100644 --- a/assets/lang/nn_NO.ini +++ b/assets/lang/nn_NO.ini @@ -1410,6 +1410,7 @@ Vulkan Features = Vulkan-funksjonar Display Color Formats = Skjermfargeformat [System] +%1 needs a firmware installed to run without HLE. Install one, or re-enable HLE for it. = %1 krev installert fastvare for å køyre utan HLE. Installer ein, eller slå på HLE for han igjen. # AI translated (broken) = (øydelagt) 12HR = 12T 24HR = 24T diff --git a/assets/lang/no_NO.ini b/assets/lang/no_NO.ini index e070deed0a..fe095230c8 100644 --- a/assets/lang/no_NO.ini +++ b/assets/lang/no_NO.ini @@ -1410,6 +1410,7 @@ Vulkan Features = Vulkan-funksjoner Display Color Formats = Skjermfargeformater [System] +%1 needs a firmware installed to run without HLE. Install one, or re-enable HLE for it. = %1 krever installert fastvare for å kjøre uten HLE. Installer en, eller slå på HLE for den igjen. # AI translated (broken) = (ødelagt) 12HR = 12T 24HR = 24T diff --git a/assets/lang/pl_PL.ini b/assets/lang/pl_PL.ini index 338ced6e20..042b77eba1 100644 --- a/assets/lang/pl_PL.ini +++ b/assets/lang/pl_PL.ini @@ -1401,6 +1401,7 @@ Vulkan Extensions = Rozszerzenia Vulkan Vulkan Features = Funkcje Vulkan [System] +%1 needs a firmware installed to run without HLE. Install one, or re-enable HLE for it. = %1 wymaga zainstalowanego firmware'u, aby działać bez HLE. Zainstaluj go lub ponownie włącz HLE dla tej biblioteki. # AI translated (broken) = (nie działa) 12HR = 12 godzinny 24HR = 24 godzinny diff --git a/assets/lang/pt_BR.ini b/assets/lang/pt_BR.ini index 4819a50da4..ed55ca5053 100644 --- a/assets/lang/pt_BR.ini +++ b/assets/lang/pt_BR.ini @@ -1410,6 +1410,7 @@ Vulkan Features = Funções do Vulkan Display Color Formats = Exibir Formatos das Cores [System] +%1 needs a firmware installed to run without HLE. Install one, or re-enable HLE for it. = %1 precisa de um firmware instalado para funcionar sem HLE. Instale um ou reative o HLE para esta biblioteca. # AI translated (broken) = (quebrado) 12HR = 12 HRs 24HR = 24 HRs diff --git a/assets/lang/pt_PT.ini b/assets/lang/pt_PT.ini index 2c93a6eb76..d92125ad12 100644 --- a/assets/lang/pt_PT.ini +++ b/assets/lang/pt_PT.ini @@ -1410,6 +1410,7 @@ Vulkan Features = Características do vulkan Display Color Formats = Mostrar formatos de cores [System] +%1 needs a firmware installed to run without HLE. Install one, or re-enable HLE for it. = %1 precisa de um firmware instalado para funcionar sem HLE. Instale um ou reative o HLE para esta biblioteca. # AI translated (broken) = (inoperacional) 12HR = 12 HRs 24HR = 24 HRs diff --git a/assets/lang/ro_RO.ini b/assets/lang/ro_RO.ini index f59f46b4d8..47199ab0de 100644 --- a/assets/lang/ro_RO.ini +++ b/assets/lang/ro_RO.ini @@ -1393,6 +1393,7 @@ Vulkan Extensions = Vulkan extensions Vulkan Features = Vulkan features [System] +%1 needs a firmware installed to run without HLE. Install one, or re-enable HLE for it. = %1 are nevoie de un firmware instalat pentru a rula fără HLE. Instalați unul sau reactivați HLE pentru această bibliotecă. # AI translated (broken) = (broken) 12HR = 12HR 24HR = 24HR diff --git a/assets/lang/ru_RU.ini b/assets/lang/ru_RU.ini index ad8479ea8a..57826b8bb4 100644 --- a/assets/lang/ru_RU.ini +++ b/assets/lang/ru_RU.ini @@ -1393,6 +1393,7 @@ Vulkan Extensions = Расширения Vulkan Vulkan Features = Возможности Vulkan [System] +%1 needs a firmware installed to run without HLE. Install one, or re-enable HLE for it. = Для работы %1 без HLE нужна установленная прошивка. Установите её или снова включите HLE для этой библиотеки. # AI translated (broken) = (сломано) 12HR = 12-часовой 24HR = 24-часовой diff --git a/assets/lang/sv_SE.ini b/assets/lang/sv_SE.ini index 3d0b501e5a..21c6110a4f 100644 --- a/assets/lang/sv_SE.ini +++ b/assets/lang/sv_SE.ini @@ -1394,6 +1394,7 @@ Vulkan Extensions = Vulkan-utökningar Vulkan Features = Vulkan-funktioner [System] +%1 needs a firmware installed to run without HLE. Install one, or re-enable HLE for it. = %1 kräver installerad systemprogramvara för att köras utan HLE. Installera en, eller aktivera HLE för den igen. # AI translated (broken) = (trasig) 12HR = 12 timmar 24HR = 24 timmar diff --git a/assets/lang/th_TH.ini b/assets/lang/th_TH.ini index 829d166bc3..7aa46851cc 100644 --- a/assets/lang/th_TH.ini +++ b/assets/lang/th_TH.ini @@ -1433,6 +1433,7 @@ Vulkan Features = ฟีเจอร์วัลแคน Warning = คำเตือน [System] +%1 needs a firmware installed to run without HLE. Install one, or re-enable HLE for it. = %1 ต้องติดตั้งเฟิร์มแวร์จึงจะทำงานได้โดยไม่ใช้ HLE กรุณาติดตั้งเฟิร์มแวร์ หรือเปิดใช้งาน HLE สำหรับไลบรารีนี้อีกครั้ง # AI translated (broken) = (เสียหาย) 12HR = 12 ชั่วโมง 24HR = 24 ชั่วโมง diff --git a/assets/lang/tr_TR.ini b/assets/lang/tr_TR.ini index de1b5fe2b0..7c0eda16d5 100644 --- a/assets/lang/tr_TR.ini +++ b/assets/lang/tr_TR.ini @@ -1394,6 +1394,7 @@ Vulkan Extensions = Vulkan Eklentileri Vulkan Features = Vulkan Özellikleri [System] +%1 needs a firmware installed to run without HLE. Install one, or re-enable HLE for it. = %1, HLE olmadan çalışmak için kurulu bir yazılım gerektirir. Bir tane kurun veya bu kitaplık için HLE'yi yeniden etkinleştirin. # AI translated (broken) = (bozuk) 12HR = 12 saat 24HR = 24 saat diff --git a/assets/lang/uk_UA.ini b/assets/lang/uk_UA.ini index 527d94f3c1..1c87d96b4d 100644 --- a/assets/lang/uk_UA.ini +++ b/assets/lang/uk_UA.ini @@ -1392,6 +1392,7 @@ Vulkan Extensions = Розширення Vulkan Vulkan Features = Особливості Vulkan [System] +%1 needs a firmware installed to run without HLE. Install one, or re-enable HLE for it. = Щоб %1 працювала без HLE, потрібна встановлена прошивка. Встановіть її або знову увімкніть HLE для цієї бібліотеки. # AI translated (broken) = (зламано) 12HR = 12-годинний 24HR = 24-годинний diff --git a/assets/lang/vi_VN.ini b/assets/lang/vi_VN.ini index b957111771..1f740807ac 100644 --- a/assets/lang/vi_VN.ini +++ b/assets/lang/vi_VN.ini @@ -1392,6 +1392,7 @@ Vulkan Extensions = Tiên ích Vulkan Vulkan Features = Tính năng Vulkan [System] +%1 needs a firmware installed to run without HLE. Install one, or re-enable HLE for it. = %1 cần có firmware đã cài để chạy mà không dùng HLE. Hãy cài firmware, hoặc bật lại HLE cho thư viện này. # AI translated (broken) = (Bị hỏng) 12HR = 12H 24HR = 24H diff --git a/assets/lang/zh_CN.ini b/assets/lang/zh_CN.ini index baef03d121..28235154bf 100644 --- a/assets/lang/zh_CN.ini +++ b/assets/lang/zh_CN.ini @@ -1386,6 +1386,7 @@ Driver bugs = 驱动检测 No GPU driver bugs detected = GPU驱动运行良好 [System] +%1 needs a firmware installed to run without HLE. Install one, or re-enable HLE for it. = %1 需要已安装的固件才能在不使用 HLE 的情况下运行。请安装固件,或重新为该库启用 HLE。 # AI translated (broken) = (损坏) 12HR = 12小时制 24HR = 24小时制 diff --git a/assets/lang/zh_TW.ini b/assets/lang/zh_TW.ini index e61a193515..91d73f61d2 100644 --- a/assets/lang/zh_TW.ini +++ b/assets/lang/zh_TW.ini @@ -1385,6 +1385,7 @@ Vulkan Features = Vulkan 功能 Display Color Formats = 顯示器色彩格式 [System] +%1 needs a firmware installed to run without HLE. Install one, or re-enable HLE for it. = %1 需要已安裝的韌體才能在不使用 HLE 的情況下執行。請安裝韌體,或重新為該程式庫啟用 HLE。 # AI translated (broken) = (已損毀) 12HR = 12 小時制 24HR = 24 小時制