Merge pull request #22284 from hrydgard/real-module-swap

Clean up and fix some issues with DisableHLE flags
This commit is contained in:
Henrik Rydgård authored and GitHub committed 2026-09-12 11:36:43 -06:00
commit 90a85e235b
38 files changed
+174 -51

No files matched your search

+11 -1
View File
@@ -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;
+15
View File
@@ -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<PSPModule>(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<uint8_t> buffer;
if (pspFileSystem.ReadEntireFile(filename, buffer) < 0)
+4
View File
@@ -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);
+110 -50
View File
@@ -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;
+1
View File
@@ -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ч.
+1
View File
@@ -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
+1
View File
@@ -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
+1
View File
@@ -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
+1
View File
@@ -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
+1
View File
@@ -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
+1
View File
@@ -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
+1
View File
@@ -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
+1
View File
@@ -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
+1
View File
@@ -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
+1
View File
@@ -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
+1
View File
@@ -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ωρο
+1
View File
@@ -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
+1
View File
@@ -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ó
+1
View File
@@ -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
+1
View File
@@ -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
+1
View File
@@ -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時間
+1
View File
@@ -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시간
+1
View File
@@ -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
+1
View File
@@ -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
+1
View File
@@ -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
+1
View File
@@ -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
+1
View File
@@ -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
+1
View File
@@ -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
+1
View File
@@ -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
+1
View File
@@ -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
+1
View File
@@ -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-часовой
+1
View File
@@ -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
+1
View File
@@ -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 ชั่วโมง
+1
View File
@@ -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
+1
View File
@@ -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-годинний
+1
View File
@@ -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
+1
View File
@@ -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小时制
+1
View File
@@ -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 小時制