diff options
Diffstat (limited to 'src/GPU.h')
-rw-r--r-- | src/GPU.h | 115 |
1 files changed, 85 insertions, 30 deletions
@@ -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> |