mirror of
https://github.com/hrydgard/ppsspp.git
synced 2026-10-23 11:19:03 +02:00
Merge pull request #21243 from hrydgard/more-ui-changes
Some code cleanup and minor UI fixes
This commit is contained in:
86 files changed
+219
-841
No files matched your search
@@ -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
@@ -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
@@ -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; }
|
||||
|
||||
@@ -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>
|
||||
|
||||
@@ -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>
|
||||
|
||||
@@ -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));
|
||||
}
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
|
||||
|
||||
@@ -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();
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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.
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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.
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
|
||||
@@ -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); }
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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.
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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.
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
|
||||
@@ -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;
|
||||
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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;
|
||||
|
||||
|
||||
@@ -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();
|
||||
|
||||
@@ -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)
|
||||
@@ -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
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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
@@ -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
@@ -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); }
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
|
||||
@@ -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);
|
||||
|
||||
@@ -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) {
|
||||
|
||||
@@ -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
@@ -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
@@ -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_;
|
||||
}
|
||||
|
||||
|
||||
@@ -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
@@ -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_);
|
||||
|
||||
@@ -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
@@ -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)));
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -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.
|
||||
|
||||
@@ -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 = اللغة
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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 = Език
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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 = زبان
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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 = Γλώσσα
|
||||
|
||||
@@ -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 = שפה
|
||||
|
||||
@@ -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 = הפש
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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 = 言語
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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 = ພາສາ
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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ă
|
||||
|
||||
@@ -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 = Язык
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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 = ละเว้นการเข้าถึงหน่วยความจำที่ผิดพลาด
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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 = Мова
|
||||
|
||||
@@ -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ữ
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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 = 語言
|
||||
|
||||
@@ -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);
|
||||
|
||||
Reference in new issue
Block a user