mirror of
https://github.com/RetroDECK/Duckstation.git
synced 2024-11-26 23:55:40 +00:00
CPU/CodeCache: Add InvalidateAll() method
This commit is contained in:
parent
fe2062ff9f
commit
c440593788
|
@ -836,44 +836,61 @@ void InvalidCodeFunction()
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
static void InvalidateBlock(CodeBlock* block)
|
||||||
|
{
|
||||||
|
// Invalidate forces the block to be checked again.
|
||||||
|
Log_DebugPrintf("Invalidating block at 0x%08X", block->GetPC());
|
||||||
|
block->invalidated = true;
|
||||||
|
|
||||||
|
if (block->can_link)
|
||||||
|
{
|
||||||
|
const u32 frame_number = System::GetFrameNumber();
|
||||||
|
const u32 frame_diff = frame_number - block->invalidate_frame_number;
|
||||||
|
if (frame_diff <= INVALIDATE_THRESHOLD_TO_DISABLE_LINKING)
|
||||||
|
{
|
||||||
|
Log_DevPrintf("Block 0x%08X has been invalidated in %u frames, disabling linking", block->GetPC(), frame_diff);
|
||||||
|
block->can_link = false;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
// It's been a while since this block was modified, so it's all good.
|
||||||
|
block->invalidate_frame_number = frame_number;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
UnlinkBlock(block);
|
||||||
|
|
||||||
|
#ifdef WITH_RECOMPILER
|
||||||
|
SetFastMap(block->GetPC(), FastCompileBlockFunction);
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
|
||||||
void InvalidateBlocksWithPageIndex(u32 page_index)
|
void InvalidateBlocksWithPageIndex(u32 page_index)
|
||||||
{
|
{
|
||||||
DebugAssert(page_index < Bus::RAM_8MB_CODE_PAGE_COUNT);
|
DebugAssert(page_index < Bus::RAM_8MB_CODE_PAGE_COUNT);
|
||||||
auto& blocks = m_ram_block_map[page_index];
|
auto& blocks = m_ram_block_map[page_index];
|
||||||
for (CodeBlock* block : blocks)
|
for (CodeBlock* block : blocks)
|
||||||
{
|
InvalidateBlock(block);
|
||||||
// Invalidate forces the block to be checked again.
|
|
||||||
Log_DebugPrintf("Invalidating block at 0x%08X", block->GetPC());
|
|
||||||
block->invalidated = true;
|
|
||||||
|
|
||||||
if (block->can_link)
|
|
||||||
{
|
|
||||||
const u32 frame_number = System::GetFrameNumber();
|
|
||||||
const u32 frame_diff = frame_number - block->invalidate_frame_number;
|
|
||||||
if (frame_diff <= INVALIDATE_THRESHOLD_TO_DISABLE_LINKING)
|
|
||||||
{
|
|
||||||
Log_DevPrintf("Block 0x%08X has been invalidated in %u frames, disabling linking", block->GetPC(), frame_diff);
|
|
||||||
block->can_link = false;
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
// It's been a while since this block was modified, so it's all good.
|
|
||||||
block->invalidate_frame_number = frame_number;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
UnlinkBlock(block);
|
|
||||||
|
|
||||||
#ifdef WITH_RECOMPILER
|
|
||||||
SetFastMap(block->GetPC(), FastCompileBlockFunction);
|
|
||||||
#endif
|
|
||||||
}
|
|
||||||
|
|
||||||
// Block will be re-added next execution.
|
// Block will be re-added next execution.
|
||||||
blocks.clear();
|
blocks.clear();
|
||||||
Bus::ClearRAMCodePage(page_index);
|
Bus::ClearRAMCodePage(page_index);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void InvalidateAll()
|
||||||
|
{
|
||||||
|
for (auto& it : s_blocks)
|
||||||
|
{
|
||||||
|
CodeBlock* block = it.second;
|
||||||
|
if (block && !block->invalidated)
|
||||||
|
InvalidateBlock(block);
|
||||||
|
}
|
||||||
|
|
||||||
|
Bus::ClearRAMCodePageFlags();
|
||||||
|
for (auto& it : m_ram_block_map)
|
||||||
|
it.clear();
|
||||||
|
}
|
||||||
|
|
||||||
void RemoveReferencesToBlock(CodeBlock* block)
|
void RemoveReferencesToBlock(CodeBlock* block)
|
||||||
{
|
{
|
||||||
BlockMap::iterator iter = s_blocks.find(block->key.GetPC());
|
BlockMap::iterator iter = s_blocks.find(block->key.GetPC());
|
||||||
|
|
|
@ -140,6 +140,9 @@ void Reinitialize();
|
||||||
/// Invalidates all blocks which are in the range of the specified code page.
|
/// Invalidates all blocks which are in the range of the specified code page.
|
||||||
void InvalidateBlocksWithPageIndex(u32 page_index);
|
void InvalidateBlocksWithPageIndex(u32 page_index);
|
||||||
|
|
||||||
|
/// Invalidates all blocks in the cache.
|
||||||
|
void InvalidateAll();
|
||||||
|
|
||||||
template<PGXPMode pgxp_mode>
|
template<PGXPMode pgxp_mode>
|
||||||
void InterpretCachedBlock(const CodeBlock& block);
|
void InterpretCachedBlock(const CodeBlock& block);
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue