mirror of
https://github.com/melonDS-emu/melonDS.git
synced 2025-07-23 14:19:55 -06:00
directly set VRAMDirty for VRAM BG/OAM writes
This commit is contained in:
115
src/GPU.h
115
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>
|
||||
|
Reference in New Issue
Block a user