Merge pull request #21243 from hrydgard/more-ui-changes

Some code cleanup and minor UI fixes
This commit is contained in:
Henrik Rydgård authored and GitHub committed 2026-02-12 09:44:56 +01:00
commit a7d0abba32
86 files changed
+219 -841

No files matched your search

-5
View File
@@ -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
+2 -2
View File
@@ -71,8 +71,8 @@ static const std::string_view logSectionName = "LogDebug";
static const std::string_view logSectionName = "Log";
#endif
static const std::vector<std::string_view> defaultProAdhocServerList = {
"socom.cc", "psp.gameplayer.club", // TODO: Add some saved recent history too?
const std::vector<std::string_view> defaultProAdhocServerList = {
"socom.cc", "psp.gameplayer.club",
};
std::string GPUBackendToString(GPUBackend backend) {
+1 -1
View File
@@ -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; }
-16
View File
@@ -847,14 +847,6 @@
<ClCompile Include="MIPS\MIPSTables.cpp" />
<ClCompile Include="MIPS\MIPSVFPUUtils.cpp" />
<ClCompile Include="MIPS\MIPSTracer.cpp" />
<ClCompile Include="MIPS\MIPS\MipsJit.cpp">
<ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">true</ExcludedFromBuild>
<ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">true</ExcludedFromBuild>
<ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">true</ExcludedFromBuild>
<ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Debug|ARM64'">true</ExcludedFromBuild>
<ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Release|x64'">true</ExcludedFromBuild>
<ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Release|ARM64'">true</ExcludedFromBuild>
</ClCompile>
<ClCompile Include="MIPS\x86\Asm.cpp">
<ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Debug|ARM64'">true</ExcludedFromBuild>
<ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Release|ARM64'">true</ExcludedFromBuild>
@@ -1236,14 +1228,6 @@
<ClInclude Include="MIPS\MIPSTables.h" />
<ClInclude Include="MIPS\MIPSVFPUUtils.h" />
<ClInclude Include="MIPS\MIPSTracer.h" />
<ClInclude Include="MIPS\MIPS\MipsJit.h">
<ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">true</ExcludedFromBuild>
<ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">true</ExcludedFromBuild>
<ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">true</ExcludedFromBuild>
<ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Debug|ARM64'">true</ExcludedFromBuild>
<ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Release|x64'">true</ExcludedFromBuild>
<ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Release|ARM64'">true</ExcludedFromBuild>
</ClInclude>
<ClInclude Include="MIPS\x86\JitSafeMem.h">
<ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Debug|ARM64'">true</ExcludedFromBuild>
<ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Release|ARM64'">true</ExcludedFromBuild>
-9
View File
@@ -13,9 +13,6 @@
<Filter Include="MIPS\ARM">
<UniqueIdentifier>{8a5bebeb-575f-483d-8bd2-4b7eac163a7d}</UniqueIdentifier>
</Filter>
<Filter Include="MIPS\MIPS">
<UniqueIdentifier>{aaaaaaaa-575f-483d-8bd2-4b7eac163a7d}</UniqueIdentifier>
</Filter>
<Filter Include="MIPS\JitCommon">
<UniqueIdentifier>{37896407-c373-44a3-b6ec-b57bceb2c4a3}</UniqueIdentifier>
</Filter>
@@ -438,9 +435,6 @@
<ClCompile Include="MIPS\ARM\ArmJit.cpp">
<Filter>MIPS\ARM</Filter>
</ClCompile>
<ClCompile Include="MIPS\MIPS\MipsJit.cpp">
<Filter>MIPS\MIPS</Filter>
</ClCompile>
<ClCompile Include="MIPS\ARM\ArmRegCache.cpp">
<Filter>MIPS\ARM</Filter>
</ClCompile>
@@ -1722,9 +1716,6 @@
<ClInclude Include="MIPS\ARM\ArmJit.h">
<Filter>MIPS\ARM</Filter>
</ClInclude>
<ClInclude Include="MIPS\MIPS\MipsJit.h">
<Filter>MIPS\MIPS</Filter>
</ClInclude>
<ClInclude Include="MIPS\ARM\ArmRegCache.h">
<Filter>MIPS\ARM</Filter>
</ClInclude>
+3
View File
@@ -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));
}
+7 -22
View File
@@ -299,20 +299,8 @@ MIPSOpcode ArmJit::GetOffsetInstruction(int offset) {
return Memory::Read_Instruction(GetCompilerPC() + 4 * offset);
}
const u8 *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();
void ArmJit::DoJit(u32 em_address, JitBlock *b) {
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.
@@ -345,11 +333,9 @@ const u8 *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)
@@ -424,10 +410,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 +421,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 +529,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;
}
+1 -1
View File
@@ -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();
+2 -3
View File
@@ -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;
+1 -5
View File
@@ -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.
+1 -1
View File
@@ -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;
+1 -5
View File
@@ -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.
+9 -25
View File
@@ -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()) {
@@ -257,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();
@@ -304,19 +303,8 @@ MIPSOpcode Arm64Jit::GetOffsetInstruction(int offset) {
return Memory::Read_Instruction(GetCompilerPC() + 4 * offset);
}
const u8 *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();
void Arm64Jit::DoJit(u32 em_address, JitBlock *b) {
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.
@@ -347,11 +335,9 @@ const u8 *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) {
@@ -392,7 +378,7 @@ const u8 *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);
}
@@ -412,11 +398,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) {
@@ -424,7 +408,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;
}
@@ -550,7 +534,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;
}
+1 -1
View File
@@ -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); }
+1 -1
View File
@@ -40,7 +40,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;
+1 -5
View File
@@ -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.
+1 -1
View File
@@ -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;
+1 -5
View File
@@ -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.
+17 -19
View File
@@ -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<int> *block_numbers) {
void JitBlockCache::GetBlockNumbersFromAddress(u32 em_address, std::vector<int> *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);
}
+14 -9
View File
@@ -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<u32> *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<int> *block_numbers);
void GetBlockNumbersFromAddress(u32 em_address, std::vector<int> *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;
-4
View File
@@ -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)
+18
View File
@@ -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;
+6 -8
View File
@@ -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();
-369
View File
@@ -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)
-199
View File
@@ -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<u32> SaveAndClearEmuHackOps() override { return blocks.SaveAndClearEmuHackOps(); }
void RestoreSavedEmuHackOps(std::vector<u32> 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
+1 -2
View File
@@ -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)
+1 -1
View File
@@ -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); }
+9 -23
View File
@@ -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();
@@ -359,20 +359,8 @@ MIPSOpcode Jit::GetOffsetInstruction(int offset) {
return Memory::Read_Instruction(GetCompilerPC() + 4 * offset);
}
const u8 *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();
void Jit::DoJit(u32 em_address, JitBlock *b) {
js.Begin(b);
// We add a check before the block, used when entering from a linked block.
b->checkedEntry = GetCodePtr();
@@ -384,10 +372,8 @@ const u8 *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,14 +428,14 @@ const u8 *Jit::DoJit(u32 em_address, JitBlock *b) {
b->codeSize = (u32)(GetCodePtr() - b->normalEntry);
NOP();
AlignCode4();
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, (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 +443,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 +577,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;
}
+1 -1
View File
@@ -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); }
+1 -17
View File
@@ -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;
}
+1 -5
View File
@@ -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);
+1 -2
View File
@@ -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) {
+1 -5
View File
@@ -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) {
+3 -2
View File
@@ -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;
+10 -3
View File
@@ -202,7 +202,6 @@ void GameScreen::CreateContentViews(UI::ViewGroup *parent) {
}
mainGameInfo->SetSpacing(3.0f);
GameDBInfo dbInfo;
std::vector<GameDBInfo> 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_;
}
+4 -3
View File
@@ -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.
@@ -1037,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);
+1 -12
View File
@@ -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_);
+2
View File
@@ -1381,6 +1381,8 @@ bool NativeKey(const KeyInput &key) {
std::vector<File::FileInfo> 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;
+1 -1
View File
@@ -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)));
}
}
+2 -1
View File
@@ -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<wchar_t> buffer(menuInfo.cch + 1);
menuInfo.cch++; // account for null terminator
std::vector<wchar_t> buffer(menuInfo.cch);
menuInfo.dwTypeData = buffer.data();
GetMenuItemInfo(menu, menuID, MF_BYCOMMAND, &menuInfo);
retVal = ConvertWStringToUTF8(menuInfo.dwTypeData); // note, this is buffer.
+2 -1
View File
@@ -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 = ‎اللغة
+2 -1
View File
@@ -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
+2 -1
View File
@@ -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
+2 -1
View File
@@ -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 = Език
+2 -1
View File
@@ -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
+2 -1
View File
@@ -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
+2 -1
View File
@@ -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
+2 -1
View File
@@ -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
+2 -1
View File
@@ -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
+2 -1
View File
@@ -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
+2 -1
View File
@@ -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
+2 -1
View File
@@ -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
+2 -1
View File
@@ -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 = ‎زبان
+2 -1
View File
@@ -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
+2 -1
View File
@@ -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
+2 -1
View File
@@ -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
+2 -1
View File
@@ -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 = Γλώσσα
+2 -1
View File
@@ -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 = שפה
+2 -1
View File
@@ -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 = הפש
+2 -1
View File
@@ -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
+2 -1
View File
@@ -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
+2 -1
View File
@@ -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
+2 -1
View File
@@ -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
+2 -1
View File
@@ -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 = 言語
+2 -1
View File
@@ -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
+2 -1
View File
@@ -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
+2 -1
View File
@@ -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
+2 -1
View File
@@ -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 = ພາສາ
+2 -1
View File
@@ -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
+2 -1
View File
@@ -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
+2 -1
View File
@@ -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
+2 -1
View File
@@ -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
+2 -1
View File
@@ -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
+2 -1
View File
@@ -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
+2 -1
View File
@@ -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
+2 -1
View File
@@ -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ă
+2 -1
View File
@@ -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 = Язык
+2 -1
View File
@@ -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
+2 -1
View File
@@ -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
+2 -1
View File
@@ -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 = ละเว้นการเข้าถึงหน่วยความจำที่ผิดพลาด
+2 -1
View File
@@ -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
+2 -1
View File
@@ -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 = Мова
+2 -1
View File
@@ -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ữ
+2 -1
View File
@@ -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
+2 -1
View File
@@ -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 = 語言
+2 -2
View File
@@ -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);