aboutsummaryrefslogtreecommitdiff
path: root/src/GPU.h
diff options
context:
space:
mode:
Diffstat (limited to 'src/GPU.h')
-rw-r--r--src/GPU.h115
1 files changed, 85 insertions, 30 deletions
diff --git a/src/GPU.h b/src/GPU.h
index 1e24051..3d9d13c 100644
--- a/src/GPU.h
+++ b/src/GPU.h
@@ -82,11 +82,6 @@ extern int Renderer;
const u32 VRAMDirtyGranularity = 512;
-extern NonStupidBitField<512*1024/VRAMDirtyGranularity> VRAMWritten_ABG;
-extern NonStupidBitField<256*1024/VRAMDirtyGranularity> VRAMWritten_AOBJ;
-extern NonStupidBitField<128*1024/VRAMDirtyGranularity> VRAMWritten_BBG;
-extern NonStupidBitField<128*1024/VRAMDirtyGranularity> VRAMWritten_BOBJ;
-
extern NonStupidBitField<128*1024/VRAMDirtyGranularity> VRAMDirty[9];
template <u32 Size, u32 MappingGranularity>
@@ -350,15 +345,41 @@ void WriteVRAM_ABG(u32 addr, T val)
{
u32 mask = VRAMMap_ABG[(addr >> 14) & 0x1F];
- VRAMWritten_ABG[(addr & 0x7FFFF) / VRAMDirtyGranularity] = true;
-
- if (mask & (1<<0)) *(T*)&VRAM_A[addr & 0x1FFFF] = val;
- if (mask & (1<<1)) *(T*)&VRAM_B[addr & 0x1FFFF] = val;
- if (mask & (1<<2)) *(T*)&VRAM_C[addr & 0x1FFFF] = val;
- if (mask & (1<<3)) *(T*)&VRAM_D[addr & 0x1FFFF] = val;
- if (mask & (1<<4)) *(T*)&VRAM_E[addr & 0xFFFF] = val;
- if (mask & (1<<5)) *(T*)&VRAM_F[addr & 0x3FFF] = val;
- if (mask & (1<<6)) *(T*)&VRAM_G[addr & 0x3FFF] = val;
+ if (mask & (1<<0))
+ {
+ VRAMDirty[0][(addr & 0x1FFFF) / VRAMDirtyGranularity] = true;
+ *(T*)&VRAM_A[addr & 0x1FFFF] = val;
+ }
+ if (mask & (1<<1))
+ {
+ VRAMDirty[1][(addr & 0x1FFFF) / VRAMDirtyGranularity] = true;
+ *(T*)&VRAM_B[addr & 0x1FFFF] = val;
+ }
+ if (mask & (1<<2))
+ {
+ VRAMDirty[2][(addr & 0x1FFFF) / VRAMDirtyGranularity] = true;
+ *(T*)&VRAM_C[addr & 0x1FFFF] = val;
+ }
+ if (mask & (1<<3))
+ {
+ VRAMDirty[3][(addr & 0x1FFFF) / VRAMDirtyGranularity] = true;
+ *(T*)&VRAM_D[addr & 0x1FFFF] = val;
+ }
+ if (mask & (1<<4))
+ {
+ VRAMDirty[4][(addr & 0xFFFF) / VRAMDirtyGranularity] = true;
+ *(T*)&VRAM_E[addr & 0xFFFF] = val;
+ }
+ if (mask & (1<<5))
+ {
+ VRAMDirty[5][(addr & 0x3FFF) / VRAMDirtyGranularity] = true;
+ *(T*)&VRAM_F[addr & 0x3FFF] = val;
+ }
+ if (mask & (1<<6))
+ {
+ VRAMDirty[6][(addr & 0x3FFF) / VRAMDirtyGranularity] = true;
+ *(T*)&VRAM_G[addr & 0x3FFF] = val;
+ }
}
@@ -385,13 +406,31 @@ void WriteVRAM_AOBJ(u32 addr, T val)
{
u32 mask = VRAMMap_AOBJ[(addr >> 14) & 0xF];
- VRAMWritten_AOBJ[(addr & 0x3FFFF) / VRAMDirtyGranularity] = true;
-
- if (mask & (1<<0)) *(T*)&VRAM_A[addr & 0x1FFFF] = val;
- if (mask & (1<<1)) *(T*)&VRAM_B[addr & 0x1FFFF] = val;
- if (mask & (1<<4)) *(T*)&VRAM_E[addr & 0xFFFF] = val;
- if (mask & (1<<5)) *(T*)&VRAM_F[addr & 0x3FFF] = val;
- if (mask & (1<<6)) *(T*)&VRAM_G[addr & 0x3FFF] = val;
+ if (mask & (1<<0))
+ {
+ VRAMDirty[0][(addr & 0x1FFFF) / VRAMDirtyGranularity] = true;
+ *(T*)&VRAM_A[addr & 0x1FFFF] = val;
+ }
+ if (mask & (1<<1))
+ {
+ VRAMDirty[1][(addr & 0x1FFFF) / VRAMDirtyGranularity] = true;
+ *(T*)&VRAM_B[addr & 0x1FFFF] = val;
+ }
+ if (mask & (1<<4))
+ {
+ VRAMDirty[4][(addr & 0xFFFF) / VRAMDirtyGranularity] = true;
+ *(T*)&VRAM_E[addr & 0xFFFF] = val;
+ }
+ if (mask & (1<<5))
+ {
+ VRAMDirty[5][(addr & 0x3FFF) / VRAMDirtyGranularity] = true;
+ *(T*)&VRAM_F[addr & 0x3FFF] = val;
+ }
+ if (mask & (1<<6))
+ {
+ VRAMDirty[6][(addr & 0x3FFF) / VRAMDirtyGranularity] = true;
+ *(T*)&VRAM_G[addr & 0x3FFF] = val;
+ }
}
@@ -416,11 +455,21 @@ void WriteVRAM_BBG(u32 addr, T val)
{
u32 mask = VRAMMap_BBG[(addr >> 14) & 0x7];
- VRAMWritten_BBG[(addr & 0x1FFFF) / VRAMDirtyGranularity] = true;
-
- if (mask & (1<<2)) *(T*)&VRAM_C[addr & 0x1FFFF] = val;
- if (mask & (1<<7)) *(T*)&VRAM_H[addr & 0x7FFF] = val;
- if (mask & (1<<8)) *(T*)&VRAM_I[addr & 0x3FFF] = val;
+ if (mask & (1<<2))
+ {
+ VRAMDirty[2][(addr & 0x1FFFF) / VRAMDirtyGranularity] = true;
+ *(T*)&VRAM_C[addr & 0x1FFFF] = val;
+ }
+ if (mask & (1<<7))
+ {
+ VRAMDirty[7][(addr & 0x7FFF) / VRAMDirtyGranularity] = true;
+ *(T*)&VRAM_H[addr & 0x7FFF] = val;
+ }
+ if (mask & (1<<8))
+ {
+ VRAMDirty[8][(addr & 0x3FFF) / VRAMDirtyGranularity] = true;
+ *(T*)&VRAM_I[addr & 0x3FFF] = val;
+ }
}
@@ -444,10 +493,16 @@ void WriteVRAM_BOBJ(u32 addr, T val)
{
u32 mask = VRAMMap_BOBJ[(addr >> 14) & 0x7];
- VRAMWritten_BOBJ[(addr & 0x1FFFF) / VRAMDirtyGranularity] = true;
-
- if (mask & (1<<3)) *(T*)&VRAM_D[addr & 0x1FFFF] = val;
- if (mask & (1<<8)) *(T*)&VRAM_I[addr & 0x3FFF] = val;
+ if (mask & (1<<3))
+ {
+ VRAMDirty[3][(addr & 0x1FFFF) / VRAMDirtyGranularity] = true;
+ *(T*)&VRAM_D[addr & 0x1FFFF] = val;
+ }
+ if (mask & (1<<8))
+ {
+ VRAMDirty[8][(addr & 0x3FFF) / VRAMDirtyGranularity] = true;
+ *(T*)&VRAM_I[addr & 0x3FFF] = val;
+ }
}
template<typename T>