From 94dced7c418afb59f3b9cbd09cc257b557776162 Mon Sep 17 00:00:00 2001 From: StapleButter Date: Tue, 7 Mar 2017 22:05:38 +0100 Subject: [PATCH] * vecmatrix read * implement the missing texture formats --- GPU3D.cpp | 15 ++++--- GPU3D_Soft.cpp | 119 ++++++++++++++++++++++++++++++++----------------- 2 files changed, 87 insertions(+), 47 deletions(-) diff --git a/GPU3D.cpp b/GPU3D.cpp index d7c7f446..02055d53 100644 --- a/GPU3D.cpp +++ b/GPU3D.cpp @@ -1436,6 +1436,16 @@ u32 Read32(u32 addr) (fifolevel < 128 ? (1<<25) : 0) | (fifolevel == 0 ? (1<<26) : 0); } + + case 0x04000680: return VecMatrix[0]; + case 0x04000684: return VecMatrix[1]; + case 0x04000688: return VecMatrix[2]; + case 0x0400068C: return VecMatrix[4]; + case 0x04000690: return VecMatrix[5]; + case 0x04000694: return VecMatrix[6]; + case 0x04000698: return VecMatrix[8]; + case 0x0400069C: return VecMatrix[9]; + case 0x040006A0: return VecMatrix[10]; } if (addr >= 0x04000640 && addr < 0x04000680) @@ -1443,11 +1453,6 @@ u32 Read32(u32 addr) UpdateClipMatrix(); return ClipMatrix[(addr & 0x3C) >> 2]; } - if (addr >= 0x04000680 && addr < 0x040006A4) - { - printf("!! VECMTX READ\n"); - return 0; - } return 0; } diff --git a/GPU3D_Soft.cpp b/GPU3D_Soft.cpp index 8551aa57..64c64daa 100644 --- a/GPU3D_Soft.cpp +++ b/GPU3D_Soft.cpp @@ -48,7 +48,7 @@ void Reset() } -void TextureLookup(u32 texparam, u32 texpal, s16 s, s16 t, u8* r, u8* g, u8* b) +void TextureLookup(u32 texparam, u32 texpal, s16 s, s16 t, u16* color, u8* alpha) { u32 vramaddr = (texparam & 0xFFFF) << 3; @@ -93,8 +93,36 @@ void TextureLookup(u32 texparam, u32 texpal, s16 s, s16 t, u8* r, u8* g, u8* b) else if (t >= height) t = height-1; } + u8 alpha0; + if (texparam & (1<<29)) alpha0 = 0; + else alpha0 = 31; + switch ((texparam >> 26) & 0x7) { + case 1: // A3I5 + { + vramaddr += ((t * width) + s); + u8 pixel = GPU::ReadVRAM_Texture(vramaddr); + + texpal <<= 4; + *color = GPU::ReadVRAM_TexPal(texpal + ((pixel&0x1F)<<1)); + *alpha = ((pixel >> 3) & 0x1C) + (pixel >> 6); + } + break; + + case 2: // 4-color + { + vramaddr += (((t * width) + s) >> 2); + u8 pixel = GPU::ReadVRAM_Texture(vramaddr); + pixel >>= ((s & 0x3) << 1); + pixel &= 0x3; + + texpal <<= 3; + *color = GPU::ReadVRAM_TexPal(texpal + (pixel<<1)); + *alpha = (pixel==0) ? alpha0 : 31; + } + break; + case 3: // 16-color { vramaddr += (((t * width) + s) >> 1); @@ -103,11 +131,8 @@ void TextureLookup(u32 texparam, u32 texpal, s16 s, s16 t, u8* r, u8* g, u8* b) else pixel &= 0xF; texpal <<= 4; - u16 color = GPU::ReadVRAM_TexPal(texpal + (pixel<<1)); - - *r = (color << 1) & 0x3E; if (*r) *r++; - *g = (color >> 4) & 0x3E; if (*g) *g++; - *b = (color >> 9) & 0x3E; if (*b) *b++; + *color = GPU::ReadVRAM_TexPal(texpal + (pixel<<1)); + *alpha = (pixel==0) ? alpha0 : 31; } break; @@ -117,22 +142,8 @@ void TextureLookup(u32 texparam, u32 texpal, s16 s, s16 t, u8* r, u8* g, u8* b) u8 pixel = GPU::ReadVRAM_Texture(vramaddr); texpal <<= 4; - u16 color = GPU::ReadVRAM_TexPal(texpal + (pixel<<1)); - - *r = (color << 1) & 0x3E; if (*r) *r++; - *g = (color >> 4) & 0x3E; if (*g) *g++; - *b = (color >> 9) & 0x3E; if (*b) *b++; - } - break; - - case 7: // direct color - { - vramaddr += (((t * width) + s) << 1); - u16 color = GPU::ReadVRAM_Texture(vramaddr); - - *r = (color << 1) & 0x3E; if (*r) *r++; - *g = (color >> 4) & 0x3E; if (*g) *g++; - *b = (color >> 9) & 0x3E; if (*b) *b++; + *color = GPU::ReadVRAM_TexPal(texpal + (pixel<<1)); + *alpha = (pixel==0) ? alpha0 : 31; } break; @@ -152,15 +163,16 @@ void TextureLookup(u32 texparam, u32 texpal, s16 s, s16 t, u8* r, u8* g, u8* b) u32 paloffset = (palinfo & 0x3FFF) << 2; texpal <<= 4; - u16 color; switch (val & 0x3) { case 0: - color = GPU::ReadVRAM_TexPal(texpal + paloffset); + *color = GPU::ReadVRAM_TexPal(texpal + paloffset); + *alpha = 31; break; case 1: - color = GPU::ReadVRAM_TexPal(texpal + paloffset + 2); + *color = GPU::ReadVRAM_TexPal(texpal + paloffset + 2); + *alpha = 31; break; case 2: @@ -180,7 +192,7 @@ void TextureLookup(u32 texparam, u32 texpal, s16 s, s16 t, u8* r, u8* g, u8* b) u32 g = ((g0 + g1) >> 1) & 0x03E0; u32 b = ((b0 + b1) >> 1) & 0x7C00; - color = r | g | b; + *color = r | g | b; } else if ((palinfo >> 14) == 3) { @@ -198,15 +210,19 @@ void TextureLookup(u32 texparam, u32 texpal, s16 s, s16 t, u8* r, u8* g, u8* b) u32 g = ((g0*5 + g1*3) >> 3) & 0x03E0; u32 b = ((b0*5 + b1*3) >> 3) & 0x7C00; - color = r | g | b; + *color = r | g | b; } else - color = GPU::ReadVRAM_TexPal(texpal + paloffset + 4); + *color = GPU::ReadVRAM_TexPal(texpal + paloffset + 4); + *alpha = 31; break; case 3: if ((palinfo >> 14) == 2) - color = GPU::ReadVRAM_TexPal(texpal + paloffset + 6); + { + *color = GPU::ReadVRAM_TexPal(texpal + paloffset + 6); + *alpha = 31; + } else if ((palinfo >> 14) == 3) { u16 color0 = GPU::ReadVRAM_TexPal(texpal + paloffset); @@ -223,23 +239,36 @@ void TextureLookup(u32 texparam, u32 texpal, s16 s, s16 t, u8* r, u8* g, u8* b) u32 g = ((g0*3 + g1*5) >> 3) & 0x03E0; u32 b = ((b0*3 + b1*5) >> 3) & 0x7C00; - color = r | g | b; + *color = r | g | b; + *alpha = 31; } else - color = 0; // TODO transparent! + { + *color = 0; + *alpha = 0; + } break; } - - *r = (color << 1) & 0x3E; if (*r) *r++; - *g = (color >> 4) & 0x3E; if (*g) *g++; - *b = (color >> 9) & 0x3E; if (*b) *b++; } break; - default: - *r = (s)&0x3F; - *g = 0; - *b = (t)&0x3F; + case 6: // A5I3 + { + vramaddr += ((t * width) + s); + u8 pixel = GPU::ReadVRAM_Texture(vramaddr); + + texpal <<= 4; + *color = GPU::ReadVRAM_TexPal(texpal + ((pixel&0x7)<<1)); + *alpha = (pixel >> 3); + } + break; + + case 7: // direct color + { + vramaddr += (((t * width) + s) << 1); + *color = GPU::ReadVRAM_Texture(vramaddr); + *alpha = (*color & 0x8000) ? 31 : 0; + } break; } } @@ -264,14 +293,20 @@ void RenderPixel(Polygon* polygon, s32 x, s32 y, s32 z, u8 vr, u8 vg, u8 vb, s16 if (!passdepth) return; - u8 r, g, b; + u8 r, g, b, a; if (((polygon->TexParam >> 26) & 0x7) != 0) { // TODO: also take DISP3DCNT into account u8 tr, tg, tb; - TextureLookup(polygon->TexParam, polygon->TexPalette, s, t, &tr, &tg, &tb); + + u16 tcolor; u8 talpha; + TextureLookup(polygon->TexParam, polygon->TexPalette, s, t, &tcolor, &talpha); + + tr = (tcolor << 1) & 0x3E; if (tr) tr++; + tg = (tcolor >> 4) & 0x3E; if (tg) tg++; + tb = (tcolor >> 9) & 0x3E; if (tb) tb++; // TODO: other blending modes /*r = ((tr+1) * (vr+1) - 1) >> 6; @@ -288,7 +323,7 @@ void RenderPixel(Polygon* polygon, s32 x, s32 y, s32 z, u8 vr, u8 vg, u8 vb, s16 b = vb; } - u32 a = 31; // TODO + a = 31; *color = r | (g << 8) | (b << 16) | (a << 24);