Video_Software: Implement texture preloading
This commit is contained in:
parent
d13163380d
commit
6f21f5eb34
|
@ -112,6 +112,24 @@ void SWBPWritten(int address, int newvalue)
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
case BPMEM_PRELOAD_MODE:
|
||||||
|
if (newvalue != 0)
|
||||||
|
{
|
||||||
|
// NOTE(neobrain): Apparently tmemodd doesn't affect hardware behavior at all (libogc uses it just as a buffe$
|
||||||
|
BPS_TmemConfig& tmem_cfg = bpmem.tmem_config;
|
||||||
|
u8* ram_ptr = Memory::GetPointer(tmem_cfg.preload_addr << 5);
|
||||||
|
u32 tmem_addr = tmem_cfg.preload_tmem_even * TMEM_LINE_SIZE;
|
||||||
|
u32 size = tmem_cfg.preload_tile_info.count * 32;
|
||||||
|
|
||||||
|
// Check if the game has overflowed TMEM, and copy up to the limit.
|
||||||
|
// Paper Mario does this when entering the Great Boogly Tree (Chap 2)
|
||||||
|
if ((tmem_addr + size) > TMEM_SIZE)
|
||||||
|
size = TMEM_SIZE - tmem_addr;
|
||||||
|
|
||||||
|
memcpy(texMem + tmem_addr, ram_ptr, size);
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
|
||||||
case BPMEM_TEV_REGISTER_L: // Reg 1
|
case BPMEM_TEV_REGISTER_L: // Reg 1
|
||||||
case BPMEM_TEV_REGISTER_L+2: // Reg 2
|
case BPMEM_TEV_REGISTER_L+2: // Reg 2
|
||||||
case BPMEM_TEV_REGISTER_L+4: // Reg 3
|
case BPMEM_TEV_REGISTER_L+4: // Reg 3
|
||||||
|
|
|
@ -120,8 +120,16 @@ void SampleMip(s32 s, s32 t, s32 mip, bool linear, u8 texmap, u8 *sample)
|
||||||
TexImage0& ti0 = texUnit.texImage0[subTexmap];
|
TexImage0& ti0 = texUnit.texImage0[subTexmap];
|
||||||
TexTLUT& texTlut = texUnit.texTlut[subTexmap];
|
TexTLUT& texTlut = texUnit.texTlut[subTexmap];
|
||||||
|
|
||||||
u32 imageBase = texUnit.texImage3[subTexmap].image_base << 5;
|
u8 *imageSrc;
|
||||||
u8 *imageSrc = Memory::GetPointer(imageBase);
|
if (texUnit.texImage1[subTexmap].image_type)
|
||||||
|
{
|
||||||
|
imageSrc = &texMem[texUnit.texImage1[subTexmap].tmem_even * TMEM_LINE_SIZE];
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
u32 imageBase = texUnit.texImage3[subTexmap].image_base << 5;
|
||||||
|
imageSrc = Memory::GetPointer(imageBase);
|
||||||
|
}
|
||||||
|
|
||||||
int imageWidth = ti0.width;
|
int imageWidth = ti0.width;
|
||||||
int imageHeight = ti0.height;
|
int imageHeight = ti0.height;
|
||||||
|
|
Loading…
Reference in New Issue