mirror of
https://github.com/hrydgard/ppsspp.git
synced 2026-10-01 14:58:14 +00:00
Merge pull request #22284 from hrydgard/real-module-swap
Clean up and fix some issues with DisableHLE flags
This commit is contained in:
38 files changed
+174
-51
No files matched your search
+11
-1
@@ -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;
|
||||
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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
@@ -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;
|
||||
|
||||
@@ -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ч.
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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ωρο
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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ó
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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時間
|
||||
|
||||
@@ -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시간
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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-часовой
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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 ชั่วโมง
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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-годинний
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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小时制
|
||||
|
||||
@@ -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 小時制
|
||||
|
||||
Reference in new issue
Block a user