aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorStapleButter <thetotalworm@gmail.com>2017-03-07 22:05:38 +0100
committerStapleButter <thetotalworm@gmail.com>2017-03-07 22:05:38 +0100
commit94dced7c418afb59f3b9cbd09cc257b557776162 (patch)
tree555d7b19c2edfdf021a6aba1f0d6b0cc084de400
parentc24245c59a20e0ceee0dd457dabec85616697626 (diff)
* vecmatrix read
* implement the missing texture formats
-rw-r--r--GPU3D.cpp15
-rw-r--r--GPU3D_Soft.cpp117
2 files changed, 86 insertions, 46 deletions
diff --git a/GPU3D.cpp b/GPU3D.cpp
index d7c7f44..02055d5 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 8551aa5..64c64da 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,46 +93,57 @@ 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 3: // 16-color
+ case 1: // A3I5
{
- vramaddr += (((t * width) + s) >> 1);
+ vramaddr += ((t * width) + s);
u8 pixel = GPU::ReadVRAM_Texture<u8>(vramaddr);
- if (s & 0x1) pixel >>= 4;
- else pixel &= 0xF;
texpal <<= 4;
- u16 color = GPU::ReadVRAM_TexPal<u16>(texpal + (pixel<<1));
+ *color = GPU::ReadVRAM_TexPal<u16>(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<u8>(vramaddr);
+ pixel >>= ((s & 0x3) << 1);
+ pixel &= 0x3;
- *r = (color << 1) & 0x3E; if (*r) *r++;
- *g = (color >> 4) & 0x3E; if (*g) *g++;
- *b = (color >> 9) & 0x3E; if (*b) *b++;
+ texpal <<= 3;
+ *color = GPU::ReadVRAM_TexPal<u16>(texpal + (pixel<<1));
+ *alpha = (pixel==0) ? alpha0 : 31;
}
break;
- case 4: // 256-color
+ case 3: // 16-color
{
- vramaddr += ((t * width) + s);
+ vramaddr += (((t * width) + s) >> 1);
u8 pixel = GPU::ReadVRAM_Texture<u8>(vramaddr);
+ if (s & 0x1) pixel >>= 4;
+ else pixel &= 0xF;
texpal <<= 4;
- u16 color = GPU::ReadVRAM_TexPal<u16>(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<u16>(texpal + (pixel<<1));
+ *alpha = (pixel==0) ? alpha0 : 31;
}
break;
- case 7: // direct color
+ case 4: // 256-color
{
- vramaddr += (((t * width) + s) << 1);
- u16 color = GPU::ReadVRAM_Texture<u16>(vramaddr);
+ vramaddr += ((t * width) + s);
+ u8 pixel = GPU::ReadVRAM_Texture<u8>(vramaddr);
- *r = (color << 1) & 0x3E; if (*r) *r++;
- *g = (color >> 4) & 0x3E; if (*g) *g++;
- *b = (color >> 9) & 0x3E; if (*b) *b++;
+ texpal <<= 4;
+ *color = GPU::ReadVRAM_TexPal<u16>(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<u16>(texpal + paloffset);
+ *color = GPU::ReadVRAM_TexPal<u16>(texpal + paloffset);
+ *alpha = 31;
break;
case 1:
- color = GPU::ReadVRAM_TexPal<u16>(texpal + paloffset + 2);
+ *color = GPU::ReadVRAM_TexPal<u16>(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<u16>(texpal + paloffset + 4);
+ *color = GPU::ReadVRAM_TexPal<u16>(texpal + paloffset + 4);
+ *alpha = 31;
break;
case 3:
if ((palinfo >> 14) == 2)
- color = GPU::ReadVRAM_TexPal<u16>(texpal + paloffset + 6);
+ {
+ *color = GPU::ReadVRAM_TexPal<u16>(texpal + paloffset + 6);
+ *alpha = 31;
+ }
else if ((palinfo >> 14) == 3)
{
u16 color0 = GPU::ReadVRAM_TexPal<u16>(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;
}
+ }
+ break;
+
+ case 6: // A5I3
+ {
+ vramaddr += ((t * width) + s);
+ u8 pixel = GPU::ReadVRAM_Texture<u8>(vramaddr);
- *r = (color << 1) & 0x3E; if (*r) *r++;
- *g = (color >> 4) & 0x3E; if (*g) *g++;
- *b = (color >> 9) & 0x3E; if (*b) *b++;
+ texpal <<= 4;
+ *color = GPU::ReadVRAM_TexPal<u16>(texpal + ((pixel&0x7)<<1));
+ *alpha = (pixel >> 3);
}
break;
- default:
- *r = (s)&0x3F;
- *g = 0;
- *b = (t)&0x3F;
+ case 7: // direct color
+ {
+ vramaddr += (((t * width) + s) << 1);
+ *color = GPU::ReadVRAM_Texture<u16>(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);