port: fix textureconfig-related texture corruption

explosions are still miscolored, but no longer garbage
This commit is contained in:
fgsfds 2023-08-14 18:30:02 +02:00
parent a31e2209c5
commit f5bcc25e10
2 changed files with 57 additions and 9 deletions

View File

@ -53,9 +53,6 @@ void texReset(void)
g_TextureConfigSegment = mempAlloc(len, MEMPOOL_STAGE);
dmaExec(g_TextureConfigSegment, (romptr_t)&_textureconfigSegmentRomStart, len);
g_TexBase = (uintptr_t)g_TextureConfigSegment - ROM_SIZE * 1024 * 1024;
#else
g_TexBase = 0;
#endif
g_TexGdl1 = (Gfx *)(g_TexBase + (uintptr_t)g_TcGdl1);
g_TexGdl2 = (Gfx *)(g_TexBase + (uintptr_t)g_TcGdl2);
@ -78,12 +75,63 @@ void texReset(void)
g_TexGeneralConfigs = (struct textureconfig *)(g_TexBase + (uintptr_t)g_TcGeneralConfigs);
g_TexRadarConfigs = (struct textureconfig *)(g_TexBase + (uintptr_t)g_TcRadarConfigs);
#ifdef PLATFORM_N64
g_TexNumConfigs = (len - (uintptr_t)&g_TcWallhitConfigs + ROM_SIZE * 1024 * 1024) / sizeof(struct textureconfig);
#else
// TODO: load this shit externally for fuck's sake
g_TexNumConfigs = 18 + 5 + 6 + 2 + 96 + 3 + 6 + 10 + 1 + 56 + 1;
// HACK: define a big table of pointers we need to fill and sizes of the textureconfig data that goes there
#define DEFINE_TCPTR(ptr, data) { (void **)&ptr, (const void *)data, sizeof(data), ARRAYCOUNT(data) }
static const struct {
void **dst;
const void *src;
u32 size;
s32 count;
} tcptrs[] = {
DEFINE_TCPTR(g_TexGdl1, g_TcGdl1),
DEFINE_TCPTR(g_TexGdl2, g_TcGdl2),
DEFINE_TCPTR(g_TexGdl3, g_TcGdl3),
DEFINE_TCPTR(g_ExplosionTexturePairs, g_TcExplosionTexturePairs),
DEFINE_TCPTR(g_TexWallhitConfigs, g_TcWallhitConfigs),
DEFINE_TCPTR(g_TexBeamConfigs, g_TcBeamConfigs),
DEFINE_TCPTR(g_TexLaserConfigs, g_TcLaserConfigs),
DEFINE_TCPTR(g_TexGroup03Configs, g_TcGroup03Configs),
DEFINE_TCPTR(g_TexGeCrosshairConfigs, g_TcGeCrosshairConfigs),
DEFINE_TCPTR(g_TexRedLinesConfigs, g_TcRedLineConfigs),
DEFINE_TCPTR(g_TexShadowConfigs, g_TcShadowConfigs),
DEFINE_TCPTR(g_TexShieldConfigs, g_TcShieldConfigs),
DEFINE_TCPTR(g_TexShardConfigs, g_TcShardConfigs),
DEFINE_TCPTR(g_TexScreenConfigs, g_TcScreenConfigs),
DEFINE_TCPTR(g_TexSkyWaterConfigs, g_TcSkyWaterConfigs),
DEFINE_TCPTR(g_TexGroup11Configs, g_TcGroup11Configs),
DEFINE_TCPTR(g_TexLightGlareConfigs, g_TcLightGlareConfigs),
DEFINE_TCPTR(g_TexSparkConfigs, g_TcSparkConfigs),
DEFINE_TCPTR(g_TexGeneralConfigs, g_TcGeneralConfigs),
DEFINE_TCPTR(g_TexRadarConfigs, g_TcRadarConfigs),
};
#undef DEFINE_TCPTR
// calculate total length, should be 0xb50 on a 32-bit platform with an unmodified textureconfig.c
u32 len = 0;
for (s32 i = 0; i < ARRAYCOUNT(tcptrs); ++i) {
len += tcptrs[i].size;
}
g_TextureConfigSegment = mempAlloc(len, MEMPOOL_STAGE);
g_TexBase = 0; // unused
// set up pointers and fill them in
u32 tcofs = 0;
for (s32 i = 0; i < ARRAYCOUNT(tcptrs); ++i) {
*tcptrs[i].dst = g_TextureConfigSegment + tcofs;
bcopy(tcptrs[i].src, *tcptrs[i].dst, tcptrs[i].size);
tcofs += tcptrs[i].size;
}
// calculate tc count, skipping the gdls and explosion pairs
g_TexNumConfigs = 0;
for (s32 i = 4; i < ARRAYCOUNT(tcptrs); ++i) {
g_TexNumConfigs += tcptrs[i].count;
}
#endif
g_TexWords = mempAlloc(ALIGN16(g_TexNumConfigs * 4), MEMPOOL_STAGE);
for (i = 0; i < g_TexNumConfigs; i++) {

View File

@ -2,9 +2,9 @@
#define IN_TEXTURECONFIG_H
#include <ultra64.h>
extern Gfx g_TcGdl1[];
extern Gfx g_TcGdl2[];
extern Gfx g_TcGdl3[];
extern Gfx g_TcGdl1[14];
extern Gfx g_TcGdl2[13];
extern Gfx g_TcGdl3[14];
extern struct texturepair g_TcExplosionTexturePairs[15];
extern struct textureconfig g_TcWallhitConfigs[18];
extern struct textureconfig g_TcBeamConfigs[5];