Skip to content

Commit 9d279df

Browse files
committed
Allow specification of no clamping blocks in GameConfig.
1 parent 3cf6b55 commit 9d279df

4 files changed

Lines changed: 66 additions & 8 deletions

File tree

GameConfig.xml

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,11 @@
11
<GameConfigs>
2+
<GameConfig Executable="SCUS_973.16;1" Title="Sly 2: Band of Thieves">
3+
<Vu1BlockNoClamping BlockKey="36605D29AD96FFFE30895C24E0016A2B;40" />
4+
<Vu1BlockNoClamping BlockKey="D28BFBE4C726F016DCA80BECE7C4114B;40" />
5+
<Vu1BlockNoClamping BlockKey="4E7ED78F963A2076ECF775BFAA3D8AFB;40" />
6+
<Vu1BlockNoClamping BlockKey="2BBED1DEDFAAA676D34A4B8975CFD17D;40" />
7+
<Vu1BlockNoClamping BlockKey="C2A5656FA61988893D4F67239AB837FC;64" />
8+
</GameConfig>
29
<GameConfig Executable="SLUS_200.18;1" Title="Onimusha: Warlords">
310
<BlockFpRoundingMode Address="0x001025D8" Mode="NEAREST" Description="Fixes inability to go inside the hole." />
411
</GameConfig>

Source/GameConfig.cpp

Lines changed: 41 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -10,11 +10,30 @@
1010
#include "Log.h"
1111
#include "PS2VM.h"
1212
#include "ee/EeExecutor.h"
13+
#include "ee/VuExecutor.h"
1314

1415
#define LOG_NAME "GameConfig"
1516

1617
#define GAMECONFIG_FILENAME "GameConfig.xml"
1718

19+
template <typename BlockKeyType>
20+
static std::optional<BlockKeyType> ParseBlockKey(const char* blockKeyString)
21+
{
22+
BlockKeyType blockKey;
23+
int parseCount = sscanf(blockKeyString, "%08X%08X%08X%08X;%d",
24+
&blockKey.first.nV[3], &blockKey.first.nV[2],
25+
&blockKey.first.nV[1], &blockKey.first.nV[0],
26+
&blockKey.second);
27+
if(parseCount == 5)
28+
{
29+
return std::optional<BlockKeyType>(blockKey);
30+
}
31+
else
32+
{
33+
return std::optional<BlockKeyType>();
34+
}
35+
}
36+
1837
void CGameConfig::ApplyGameConfig(CPS2VM& virtualMachine)
1938
{
2039
std::unique_ptr<Framework::Xml::CNode> document;
@@ -44,9 +63,11 @@ void CGameConfig::ApplyGameConfig(CPS2VM& virtualMachine)
4463
CEeExecutor::BlockFpRoundingModeMap blockFpRoundingModes;
4564
CEeExecutor::BlockFpUseAccurateAddSubSet blockFpUseAccurateAddSub;
4665
CEeExecutor::IdleLoopBlockMap idleLoopBlocks;
66+
CVuExecutor::BlockNoClampingSet blockNoClamping;
4767

4868
const char* executableName = virtualMachine.m_ee->m_os->GetExecutableName();
4969
auto eeExecutor = static_cast<CEeExecutor*>(virtualMachine.m_ee->m_EE.m_executor.get());
70+
auto vu1Executor = static_cast<CVuExecutor*>(virtualMachine.m_ee->m_vpu1->GetContext().m_executor.get());
5071
auto eeRam = virtualMachine.m_ee->m_ram;
5172

5273
for(Framework::Xml::CFilteringNodeIterator itNode(gameConfigsNode, "GameConfig");
@@ -149,25 +170,38 @@ void CGameConfig::ApplyGameConfig(CPS2VM& virtualMachine)
149170
if(sscanf(addressString, "%x", &address) == 0) continue;
150171
if(checkBlockKeyString)
151172
{
152-
CEeExecutor::CachedBlockKey blockKey;
153-
int parseCount = sscanf(checkBlockKeyString, "%08X%08X%08X%08X;%d",
154-
&blockKey.first.nV[3], &blockKey.first.nV[2],
155-
&blockKey.first.nV[1], &blockKey.first.nV[0],
156-
&blockKey.second);
157-
if(parseCount != 5)
173+
auto blockKey = ParseBlockKey<CEeExecutor::CachedBlockKey>(checkBlockKeyString);
174+
if(!blockKey.has_value())
158175
{
159176
continue;
160177
}
161-
checkBlockKey = blockKey;
178+
checkBlockKey = blockKey.value();
162179
}
163180

164181
idleLoopBlocks.insert(std::make_pair(address, checkBlockKey));
165182
}
166183

184+
for(Framework::Xml::CFilteringNodeIterator itNode(gameConfigNode, "Vu1BlockNoClamping");
185+
!itNode.IsEnd(); itNode++)
186+
{
187+
auto node = (*itNode);
188+
189+
const char* blockKeyString = node->GetAttribute("BlockKey");
190+
if(!blockKeyString) continue;
191+
192+
auto blockKey = ParseBlockKey<CVuExecutor::CachedBlockKey>(blockKeyString);
193+
if(blockKey.has_value())
194+
{
195+
blockNoClamping.insert(blockKey.value());
196+
}
197+
}
198+
167199
eeExecutor->SetBlockFpRoundingModes(std::move(blockFpRoundingModes));
168200
eeExecutor->SetBlockFpUseAccurateAddSub(std::move(blockFpUseAccurateAddSub));
169201
eeExecutor->SetIdleLoopBlocks(std::move(idleLoopBlocks));
170202

203+
vu1Executor->SetBlockNoClamping(std::move(blockNoClamping));
204+
171205
break;
172206
}
173207
}

Source/ee/VuExecutor.cpp

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -16,9 +16,15 @@ CVuExecutor::CVuExecutor(CMIPS& context, uint32 maxAddress)
1616
{
1717
}
1818

19+
void CVuExecutor::SetBlockNoClamping(BlockNoClampingSet blockNoClamping)
20+
{
21+
m_blockNoClamping = std::move(blockNoClamping);
22+
}
23+
1924
void CVuExecutor::Reset()
2025
{
2126
m_cachedBlocks.clear();
27+
m_blockNoClamping.clear();
2228
CGenericMipsExecutor::Reset();
2329
}
2430

@@ -72,6 +78,11 @@ BasicBlockPtr CVuExecutor::BlockFactory(CMIPS& context, uint32 begin, uint32 end
7278
{
7379
result->AddBlockCompileHints(blockCompileHintsIterator->hints);
7480
}
81+
if(auto blockNoClamping = m_blockNoClamping.find(blockKey);
82+
blockNoClamping != std::end(m_blockNoClamping))
83+
{
84+
result->AddBlockCompileHints(VUShared::COMPILEHINT_NO_CLAMPING);
85+
}
7586

7687
result->Compile();
7788
if(!hasBreakpoint)

Source/ee/VuExecutor.h

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,13 +6,17 @@
66
class CVuExecutor : public CGenericMipsExecutor<BlockLookupOneWay, 8>
77
{
88
public:
9+
using CachedBlockKey = std::pair<uint128, uint32>;
10+
using BlockNoClampingSet = std::set<CachedBlockKey>;
11+
912
CVuExecutor(CMIPS&, uint32);
1013
virtual ~CVuExecutor() = default;
1114

15+
void SetBlockNoClamping(BlockNoClampingSet);
16+
1217
void Reset() override;
1318

1419
protected:
15-
typedef std::pair<uint128, uint32> CachedBlockKey;
1620
typedef std::multimap<CachedBlockKey, BasicBlockPtr> CachedBlockMap;
1721

1822
struct BLOCK_COMPILE_HINTS
@@ -26,4 +30,6 @@ class CVuExecutor : public CGenericMipsExecutor<BlockLookupOneWay, 8>
2630

2731
static const BLOCK_COMPILE_HINTS g_blockCompileHints[];
2832
CachedBlockMap m_cachedBlocks;
33+
34+
BlockNoClampingSet m_blockNoClamping;
2935
};

0 commit comments

Comments
 (0)