aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorRSDuck <RSDuck@users.noreply.github.com>2022-08-22 00:39:08 +0200
committerRSDuck <RSDuck@users.noreply.github.com>2022-08-22 00:39:08 +0200
commit32609bbc980d2a496b40f29c41ac2e39f7651230 (patch)
tree9a43296ecad29084439ca32d39b4c36111224925 /src
parentd56219c33c1e59d5975b5c0c72d2b5dd230c1d7f (diff)
invalidate JIT blocks in ARM7 WVRAM when it's remapped
Diffstat (limited to 'src')
-rw-r--r--src/ARMJIT.cpp29
-rw-r--r--src/ARMJIT.h1
-rw-r--r--src/CP15.cpp3
-rw-r--r--src/GPU.cpp2
4 files changed, 32 insertions, 3 deletions
diff --git a/src/ARMJIT.cpp b/src/ARMJIT.cpp
index 99e5a3f..32f20d5 100644
--- a/src/ARMJIT.cpp
+++ b/src/ARMJIT.cpp
@@ -1086,11 +1086,34 @@ void InvalidateByAddr(u32 localAddr)
void CheckAndInvalidateITCM()
{
- for (u32 i = 0; i < ITCMPhysicalSize; i+=16)
+ for (u32 i = 0; i < ITCMPhysicalSize; i+=512)
{
- if (CodeIndexITCM[i / 512].Code & (1 << ((i & 0x1FF) / 16)))
+ if (CodeIndexITCM[i / 512].Code)
{
- InvalidateByAddr(i | (ARMJIT_Memory::memregion_ITCM << 27));
+ // maybe using bitscan would be better here?
+ // The thing is that in densely populated sets
+ // The old fashioned way can actually be faster
+ for (u32 j = 0; j < 512; j += 16)
+ {
+ if (CodeIndexITCM[i / 512].Code & (1 << ((j & 0x1FF) / 16)))
+ InvalidateByAddr((i+j) | (ARMJIT_Memory::memregion_ITCM << 27));
+ }
+ }
+ }
+}
+
+void CheckAndInvalidateWVRAM(int bank)
+{
+ u32 start = bank == 1 ? 0x20000 : 0;
+ for (u32 i = start; i < start+0x20000; i+=512)
+ {
+ if (CodeIndexARM7WVRAM[i / 512].Code)
+ {
+ for (u32 j = 0; j < 512; j += 16)
+ {
+ if (CodeIndexARM7WVRAM[i / 512].Code & (1 << ((j & 0x1FF) / 16)))
+ InvalidateByAddr((i+j) | (ARMJIT_Memory::memregion_VWRAM << 27));
+ }
}
}
}
diff --git a/src/ARMJIT.h b/src/ARMJIT.h
index ec2161a..97c79cd 100644
--- a/src/ARMJIT.h
+++ b/src/ARMJIT.h
@@ -44,6 +44,7 @@ void DeInit();
void Reset();
void CheckAndInvalidateITCM();
+void CheckAndInvalidateWVRAM(int bank);
void InvalidateByAddr(u32 pseudoPhysical);
diff --git a/src/CP15.cpp b/src/CP15.cpp
index 2548ece..4fe91cf 100644
--- a/src/CP15.cpp
+++ b/src/CP15.cpp
@@ -134,6 +134,9 @@ void ARMv5::UpdateITCMSetting()
if (CP15Control & (1<<18))
{
ITCMSize = 0x200 << ((ITCMSetting >> 1) & 0x1F);
+#ifdef JIT_ENABLED
+ FastBlockLookupSize = 0;
+#endif
}
else
{
diff --git a/src/GPU.cpp b/src/GPU.cpp
index 47a69cc..cf7adc8 100644
--- a/src/GPU.cpp
+++ b/src/GPU.cpp
@@ -20,6 +20,7 @@
#include <string.h>
#include "NDS.h"
#include "GPU.h"
+#include "ARMJIT.h"
#include "GPU2D_Soft.h"
@@ -653,6 +654,7 @@ void MapVRAM_CD(u32 bank, u8 cnt)
VRAMMap_ARM7[ofs] |= bankmask;
memset(VRAMDirty[bank].Data, 0xFF, sizeof(VRAMDirty[bank].Data));
VRAMSTAT |= (1 << (bank-2));
+ ARMJIT::CheckAndInvalidateWVRAM(ofs);
break;
case 3: // texture