Naomi renderer: cleanups and renaming before I go nuts.

This commit is contained in:
Olivier Galibert 2009-05-06 21:43:41 +00:00
parent 63cd0a8f45
commit b696ed9b88

View File

@ -14,7 +14,6 @@
#define DEBUG_PVRTA (0) #define DEBUG_PVRTA (0)
#define DEBUG_PVRTA_REGS (0) #define DEBUG_PVRTA_REGS (0)
#define DEBUG_PVRDLIST (1) #define DEBUG_PVRDLIST (1)
#define DEBUG_VERTICES (1)
#define DEBUG_PALRAM (1) #define DEBUG_PALRAM (1)
#define NUM_BUFFERS 4 #define NUM_BUFFERS 4
@ -43,57 +42,30 @@ static int scanline;
static bitmap_t *fakeframebuffer_bitmap; static bitmap_t *fakeframebuffer_bitmap;
static void testdrawscreen(const running_machine *machine,bitmap_t *bitmap,const rectangle *cliprect); static void testdrawscreen(const running_machine *machine,bitmap_t *bitmap,const rectangle *cliprect);
typedef struct
{
float x;
float y;
float z;
float u;
float v;
} vert;
typedef struct texinfo { typedef struct texinfo {
UINT32 address, mipoffset; UINT32 address, vqbase;
int sizex, sizey, sizes, pf, palette, mode, mipmapped; int sizex, sizey, sizes, pf, palette, mode, mipmapped;
UINT32 (*r)(struct texinfo *t, float x, float y); UINT32 (*r)(struct texinfo *t, float x, float y);
int palbase, cd; int palbase, cd;
} texinfo; } texinfo;
typedef struct
{
texinfo ti;
int positionx, positiony;
int sizex, sizey;
float u, v, du, dv;
vert a,b,c,d;
} testsprites;
#if DEBUG_VERTICES
typedef struct typedef struct
{ {
float x, y, w, u, v; float x, y, w, u, v;
int endofstrip; } vert;
} testvertices;
typedef struct typedef struct
{ {
int svert, evert; int svert, evert;
texinfo ti; texinfo ti;
} teststrips; } strip;
#endif
typedef struct { typedef struct {
testsprites showsprites[2048]; vert verts[65536];
strip strips[65536];
#if DEBUG_VERTICES int verts_size, strips_size;
testvertices showvertices[65536];
teststrips showstrips[65536];
#endif
int testsprites_size, testsprites_toerase, testvertices_size, teststrips_size;
UINT32 ispbase; UINT32 ispbase;
UINT32 fbwsof1; UINT32 fbwsof1;
UINT32 fbwsof2; UINT32 fbwsof2;
@ -131,6 +103,15 @@ INLINE UINT32 cv_1555(UINT16 c)
((c << 3) & 0x000000f8) | ((c >> 2) & 0x00000007); ((c << 3) & 0x000000f8) | ((c >> 2) & 0x00000007);
} }
INLINE UINT32 cv_1555z(UINT16 c)
{
return
(c & 0x8000 ? 0xff000000 : 0) |
((c << 9) & 0x00f80000) |
((c << 6) & 0x0000f800) |
((c << 3) & 0x000000f8);
}
INLINE UINT32 cv_565(UINT16 c) INLINE UINT32 cv_565(UINT16 c)
{ {
return return
@ -140,6 +121,15 @@ INLINE UINT32 cv_565(UINT16 c)
((c << 3) & 0x000000f8) | ((c >> 2) & 0x00000007); ((c << 3) & 0x000000f8) | ((c >> 2) & 0x00000007);
} }
INLINE UINT32 cv_565z(UINT16 c)
{
return
0xff000000 |
((c << 8) & 0x00f80000) |
((c << 5) & 0x0000fc00) |
((c << 3) & 0x000000f8);
}
INLINE UINT32 cv_4444(UINT16 c) INLINE UINT32 cv_4444(UINT16 c)
{ {
return return
@ -149,6 +139,15 @@ INLINE UINT32 cv_4444(UINT16 c)
((c << 4) & 0x000000f0) | ((c ) & 0x0000000f); ((c << 4) & 0x000000f0) | ((c ) & 0x0000000f);
} }
INLINE UINT32 cv_4444z(UINT16 c)
{
return
((c << 16) & 0xf0000000) |
((c << 12) & 0x00f00000) |
((c << 8) & 0x0000f000) |
((c << 4) & 0x000000f0);
}
INLINE UINT32 cv_yuv(UINT16 c1, UINT16 c2, int x) INLINE UINT32 cv_yuv(UINT16 c1, UINT16 c2, int x)
{ {
int u = 11*((c1 & 0xff) - 128); int u = 11*((c1 & 0xff) - 128);
@ -179,7 +178,7 @@ static UINT32 tex_r_1555_n(texinfo *t, float x, float y)
int xt = ((int)x) & (t->sizex-1); int xt = ((int)x) & (t->sizex-1);
int yt = ((int)y) & (t->sizey-1); int yt = ((int)y) & (t->sizey-1);
int addrp = t->address + (t->sizex*yt + xt)*2; int addrp = t->address + (t->sizex*yt + xt)*2;
return cv_1555(*(UINT16 *)(((UINT8 *)dc_texture_ram) + WORD_XOR_LE(addrp))); return cv_1555z(*(UINT16 *)(((UINT8 *)dc_texture_ram) + WORD_XOR_LE(addrp)));
} }
static UINT32 tex_r_1555_tw(texinfo *t, float x, float y) static UINT32 tex_r_1555_tw(texinfo *t, float x, float y)
@ -194,8 +193,8 @@ static UINT32 tex_r_1555_vq(texinfo *t, float x, float y)
{ {
int xt = ((int)x) & (t->sizex-1); int xt = ((int)x) & (t->sizex-1);
int yt = ((int)y) & (t->sizey-1); int yt = ((int)y) & (t->sizey-1);
int idx = ((UINT8 *)dc_texture_ram)[BYTE_XOR_LE(t->address + 0x800 + t->mipoffset + dilated1[t->cd][xt >> 1] + dilated0[t->cd][yt >> 1])]; int idx = ((UINT8 *)dc_texture_ram)[BYTE_XOR_LE(t->address + dilated1[t->cd][xt >> 1] + dilated0[t->cd][yt >> 1])];
int addrp = t->address + 8*idx + (dilated1[t->cd][xt & 1] + dilated0[t->cd][yt & 1])*2; int addrp = t->vqbase + 8*idx + (dilated1[t->cd][xt & 1] + dilated0[t->cd][yt & 1])*2;
return cv_1555(*(UINT16 *)(((UINT8 *)dc_texture_ram) + WORD_XOR_LE(addrp))); return cv_1555(*(UINT16 *)(((UINT8 *)dc_texture_ram) + WORD_XOR_LE(addrp)));
} }
@ -204,7 +203,7 @@ static UINT32 tex_r_565_n(texinfo *t, float x, float y)
int xt = ((int)x) & (t->sizex-1); int xt = ((int)x) & (t->sizex-1);
int yt = ((int)y) & (t->sizey-1); int yt = ((int)y) & (t->sizey-1);
int addrp = t->address + (t->sizex*yt + xt)*2; int addrp = t->address + (t->sizex*yt + xt)*2;
return cv_565(*(UINT16 *)(((UINT8 *)dc_texture_ram) + WORD_XOR_LE(addrp))); return cv_565z(*(UINT16 *)(((UINT8 *)dc_texture_ram) + WORD_XOR_LE(addrp)));
} }
static UINT32 tex_r_565_tw(texinfo *t, float x, float y) static UINT32 tex_r_565_tw(texinfo *t, float x, float y)
@ -219,8 +218,8 @@ static UINT32 tex_r_565_vq(texinfo *t, float x, float y)
{ {
int xt = ((int)x) & (t->sizex-1); int xt = ((int)x) & (t->sizex-1);
int yt = ((int)y) & (t->sizey-1); int yt = ((int)y) & (t->sizey-1);
int idx = ((UINT8 *)dc_texture_ram)[BYTE_XOR_LE(t->address + 0x800 + t->mipoffset + dilated1[t->cd][xt >> 1] + dilated0[t->cd][yt >> 1])]; int idx = ((UINT8 *)dc_texture_ram)[BYTE_XOR_LE(t->address + dilated1[t->cd][xt >> 1] + dilated0[t->cd][yt >> 1])];
int addrp = t->address + 8*idx + (dilated1[t->cd][xt & 1] + dilated0[t->cd][yt & 1])*2; int addrp = t->vqbase + 8*idx + (dilated1[t->cd][xt & 1] + dilated0[t->cd][yt & 1])*2;
return cv_565(*(UINT16 *)(((UINT8 *)dc_texture_ram) + WORD_XOR_LE(addrp))); return cv_565(*(UINT16 *)(((UINT8 *)dc_texture_ram) + WORD_XOR_LE(addrp)));
} }
@ -229,7 +228,7 @@ static UINT32 tex_r_4444_n(texinfo *t, float x, float y)
int xt = ((int)x) & (t->sizex-1); int xt = ((int)x) & (t->sizex-1);
int yt = ((int)y) & (t->sizey-1); int yt = ((int)y) & (t->sizey-1);
int addrp = t->address + (t->sizex*yt + xt)*2; int addrp = t->address + (t->sizex*yt + xt)*2;
return cv_4444(*(UINT16 *)(((UINT8 *)dc_texture_ram) + WORD_XOR_LE(addrp))); return cv_4444z(*(UINT16 *)(((UINT8 *)dc_texture_ram) + WORD_XOR_LE(addrp)));
} }
static UINT32 tex_r_4444_tw(texinfo *t, float x, float y) static UINT32 tex_r_4444_tw(texinfo *t, float x, float y)
@ -244,8 +243,8 @@ static UINT32 tex_r_4444_vq(texinfo *t, float x, float y)
{ {
int xt = ((int)x) & (t->sizex-1); int xt = ((int)x) & (t->sizex-1);
int yt = ((int)y) & (t->sizey-1); int yt = ((int)y) & (t->sizey-1);
int idx = ((UINT8 *)dc_texture_ram)[BYTE_XOR_LE(t->address + 0x800 + t->mipoffset + dilated1[t->cd][xt >> 1] + dilated0[t->cd][yt >> 1])]; int idx = ((UINT8 *)dc_texture_ram)[BYTE_XOR_LE(t->address + dilated1[t->cd][xt >> 1] + dilated0[t->cd][yt >> 1])];
int addrp = t->address + 8*idx + (dilated1[t->cd][xt & 1] + dilated0[t->cd][yt & 1])*2; int addrp = t->vqbase + 8*idx + (dilated1[t->cd][xt & 1] + dilated0[t->cd][yt & 1])*2;
return cv_4444(*(UINT16 *)(((UINT8 *)dc_texture_ram) + WORD_XOR_LE(addrp))); return cv_4444(*(UINT16 *)(((UINT8 *)dc_texture_ram) + WORD_XOR_LE(addrp)));
} }
@ -255,7 +254,7 @@ static UINT32 tex_r_p4_1555_tw(texinfo *t, float x, float y)
int yt = ((int)y) & (t->sizey-1); int yt = ((int)y) & (t->sizey-1);
int off = dilated1[t->cd][xt] + dilated0[t->cd][yt]; int off = dilated1[t->cd][xt] + dilated0[t->cd][yt];
int addrp = t->address + (off >> 1); int addrp = t->address + (off >> 1);
int c = (((UINT8 *)dc_texture_ram)[BYTE_XOR_LE(addrp)] >> ((off & 1) << 2))& 0xf; int c = (((UINT8 *)dc_texture_ram)[BYTE_XOR_LE(addrp)] >> ((off & 1) << 2)) & 0xf;
return cv_1555(pvrta_regs[t->palbase + c]); return cv_1555(pvrta_regs[t->palbase + c]);
} }
@ -263,8 +262,8 @@ static UINT32 tex_r_p4_1555_vq(texinfo *t, float x, float y)
{ {
int xt = ((int)x) & (t->sizex-1); int xt = ((int)x) & (t->sizex-1);
int yt = ((int)y) & (t->sizey-1); int yt = ((int)y) & (t->sizey-1);
int idx = ((UINT8 *)dc_texture_ram)[BYTE_XOR_LE(t->address + 0x800 + t->mipoffset + dilated1[t->cd][xt >> 1] + dilated0[t->cd][yt >> 1])]; int idx = ((UINT8 *)dc_texture_ram)[BYTE_XOR_LE(t->address + dilated1[t->cd][xt >> 1] + dilated0[t->cd][yt >> 1])];
int addrp = t->address + 8*idx + dilated1[t->cd][xt & 1] + dilated0[t->cd][yt & 3]; int addrp = t->vqbase + 8*idx + dilated1[t->cd][xt & 1] + dilated0[t->cd][yt & 3];
int c = ((UINT8 *)dc_texture_ram)[BYTE_XOR_LE(addrp)] & 0xf; int c = ((UINT8 *)dc_texture_ram)[BYTE_XOR_LE(addrp)] & 0xf;
return cv_1555(pvrta_regs[t->palbase + c]); return cv_1555(pvrta_regs[t->palbase + c]);
} }
@ -275,7 +274,7 @@ static UINT32 tex_r_p4_565_tw(texinfo *t, float x, float y)
int yt = ((int)y) & (t->sizey-1); int yt = ((int)y) & (t->sizey-1);
int off = dilated1[t->cd][xt] + dilated0[t->cd][yt]; int off = dilated1[t->cd][xt] + dilated0[t->cd][yt];
int addrp = t->address + (off >> 1); int addrp = t->address + (off >> 1);
int c = (((UINT8 *)dc_texture_ram)[BYTE_XOR_LE(addrp)] >> ((off & 1) << 2))& 0xf; int c = (((UINT8 *)dc_texture_ram)[BYTE_XOR_LE(addrp)] >> ((off & 1) << 2)) & 0xf;
return cv_565(pvrta_regs[t->palbase + c]); return cv_565(pvrta_regs[t->palbase + c]);
} }
@ -283,8 +282,8 @@ static UINT32 tex_r_p4_565_vq(texinfo *t, float x, float y)
{ {
int xt = ((int)x) & (t->sizex-1); int xt = ((int)x) & (t->sizex-1);
int yt = ((int)y) & (t->sizey-1); int yt = ((int)y) & (t->sizey-1);
int idx = ((UINT8 *)dc_texture_ram)[BYTE_XOR_LE(t->address + 0x800 + t->mipoffset + dilated1[t->cd][xt >> 1] + dilated0[t->cd][yt >> 1])]; int idx = ((UINT8 *)dc_texture_ram)[BYTE_XOR_LE(t->address + dilated1[t->cd][xt >> 1] + dilated0[t->cd][yt >> 1])];
int addrp = t->address + 8*idx + dilated1[t->cd][xt & 1] + dilated0[t->cd][yt & 3]; int addrp = t->vqbase + 8*idx + dilated1[t->cd][xt & 1] + dilated0[t->cd][yt & 3];
int c = ((UINT8 *)dc_texture_ram)[BYTE_XOR_LE(addrp)] & 0xf; int c = ((UINT8 *)dc_texture_ram)[BYTE_XOR_LE(addrp)] & 0xf;
return cv_565(pvrta_regs[t->palbase + c]); return cv_565(pvrta_regs[t->palbase + c]);
} }
@ -295,7 +294,7 @@ static UINT32 tex_r_p4_4444_tw(texinfo *t, float x, float y)
int yt = ((int)y) & (t->sizey-1); int yt = ((int)y) & (t->sizey-1);
int off = dilated1[t->cd][xt] + dilated0[t->cd][yt]; int off = dilated1[t->cd][xt] + dilated0[t->cd][yt];
int addrp = t->address + (off >> 1); int addrp = t->address + (off >> 1);
int c = (((UINT8 *)dc_texture_ram)[BYTE_XOR_LE(addrp)] >> ((off & 1) << 2))& 0xf; int c = (((UINT8 *)dc_texture_ram)[BYTE_XOR_LE(addrp)] >> ((off & 1) << 2)) & 0xf;
return cv_4444(pvrta_regs[t->palbase + c]); return cv_4444(pvrta_regs[t->palbase + c]);
} }
@ -303,8 +302,8 @@ static UINT32 tex_r_p4_4444_vq(texinfo *t, float x, float y)
{ {
int xt = ((int)x) & (t->sizex-1); int xt = ((int)x) & (t->sizex-1);
int yt = ((int)y) & (t->sizey-1); int yt = ((int)y) & (t->sizey-1);
int idx = ((UINT8 *)dc_texture_ram)[BYTE_XOR_LE(t->address + 0x800 + t->mipoffset + dilated1[t->cd][xt >> 1] + dilated0[t->cd][yt >> 1])]; int idx = ((UINT8 *)dc_texture_ram)[BYTE_XOR_LE(t->address + dilated1[t->cd][xt >> 1] + dilated0[t->cd][yt >> 1])];
int addrp = t->address + 8*idx + dilated1[t->cd][xt & 1] + dilated0[t->cd][yt & 3]; int addrp = t->vqbase + 8*idx + dilated1[t->cd][xt & 1] + dilated0[t->cd][yt & 3];
int c = ((UINT8 *)dc_texture_ram)[BYTE_XOR_LE(addrp)] & 0xf; int c = ((UINT8 *)dc_texture_ram)[BYTE_XOR_LE(addrp)] & 0xf;
return cv_4444(pvrta_regs[t->palbase + c]); return cv_4444(pvrta_regs[t->palbase + c]);
} }
@ -315,7 +314,7 @@ static UINT32 tex_r_p4_8888_tw(texinfo *t, float x, float y)
int yt = ((int)y) & (t->sizey-1); int yt = ((int)y) & (t->sizey-1);
int off = dilated1[t->cd][xt] + dilated0[t->cd][yt]; int off = dilated1[t->cd][xt] + dilated0[t->cd][yt];
int addrp = t->address + (off >> 1); int addrp = t->address + (off >> 1);
int c = (((UINT8 *)dc_texture_ram)[BYTE_XOR_LE(addrp)] >> ((off & 1) << 2))& 0xf; int c = (((UINT8 *)dc_texture_ram)[BYTE_XOR_LE(addrp)] >> ((off & 1) << 2)) & 0xf;
return pvrta_regs[t->palbase + c]; return pvrta_regs[t->palbase + c];
} }
@ -323,8 +322,8 @@ static UINT32 tex_r_p4_8888_vq(texinfo *t, float x, float y)
{ {
int xt = ((int)x) & (t->sizex-1); int xt = ((int)x) & (t->sizex-1);
int yt = ((int)y) & (t->sizey-1); int yt = ((int)y) & (t->sizey-1);
int idx = ((UINT8 *)dc_texture_ram)[BYTE_XOR_LE(t->address + 0x800 + t->mipoffset + dilated1[t->cd][xt >> 1] + dilated0[t->cd][yt >> 1])]; int idx = ((UINT8 *)dc_texture_ram)[BYTE_XOR_LE(t->address + dilated1[t->cd][xt >> 1] + dilated0[t->cd][yt >> 1])];
int addrp = t->address + 8*idx + dilated1[t->cd][xt & 1] + dilated0[t->cd][yt & 3]; int addrp = t->vqbase + 8*idx + dilated1[t->cd][xt & 1] + dilated0[t->cd][yt & 3];
int c = ((UINT8 *)dc_texture_ram)[BYTE_XOR_LE(addrp)] & 0xf; int c = ((UINT8 *)dc_texture_ram)[BYTE_XOR_LE(addrp)] & 0xf;
return pvrta_regs[t->palbase + c]; return pvrta_regs[t->palbase + c];
} }
@ -342,8 +341,8 @@ static UINT32 tex_r_p8_1555_vq(texinfo *t, float x, float y)
{ {
int xt = ((int)x) & (t->sizex-1); int xt = ((int)x) & (t->sizex-1);
int yt = ((int)y) & (t->sizey-1); int yt = ((int)y) & (t->sizey-1);
int idx = ((UINT8 *)dc_texture_ram)[BYTE_XOR_LE(t->address + 0x800 + t->mipoffset + dilated1[t->cd][xt >> 1] + dilated0[t->cd][yt >> 1])]; int idx = ((UINT8 *)dc_texture_ram)[BYTE_XOR_LE(t->address + dilated1[t->cd][xt >> 1] + dilated0[t->cd][yt >> 1])];
int addrp = t->address + 8*idx + dilated1[t->cd][xt & 1] + dilated0[t->cd][yt & 3]; int addrp = t->vqbase + 8*idx + dilated1[t->cd][xt & 1] + dilated0[t->cd][yt & 3];
int c = ((UINT8 *)dc_texture_ram)[BYTE_XOR_LE(addrp)]; int c = ((UINT8 *)dc_texture_ram)[BYTE_XOR_LE(addrp)];
return cv_1555(pvrta_regs[t->palbase + c]); return cv_1555(pvrta_regs[t->palbase + c]);
} }
@ -361,8 +360,8 @@ static UINT32 tex_r_p8_565_vq(texinfo *t, float x, float y)
{ {
int xt = ((int)x) & (t->sizex-1); int xt = ((int)x) & (t->sizex-1);
int yt = ((int)y) & (t->sizey-1); int yt = ((int)y) & (t->sizey-1);
int idx = ((UINT8 *)dc_texture_ram)[BYTE_XOR_LE(t->address + t->mipoffset+ 0x800 + dilated1[t->cd][xt >> 1] + dilated0[t->cd][yt >> 1])]; int idx = ((UINT8 *)dc_texture_ram)[BYTE_XOR_LE(t->address + dilated1[t->cd][xt >> 1] + dilated0[t->cd][yt >> 1])];
int addrp = t->address + 8*idx + dilated1[t->cd][xt & 1] + dilated0[t->cd][yt & 3]; int addrp = t->vqbase + 8*idx + dilated1[t->cd][xt & 1] + dilated0[t->cd][yt & 3];
int c = ((UINT8 *)dc_texture_ram)[BYTE_XOR_LE(addrp)]; int c = ((UINT8 *)dc_texture_ram)[BYTE_XOR_LE(addrp)];
return cv_565(pvrta_regs[t->palbase + c]); return cv_565(pvrta_regs[t->palbase + c]);
} }
@ -380,8 +379,8 @@ static UINT32 tex_r_p8_4444_vq(texinfo *t, float x, float y)
{ {
int xt = ((int)x) & (t->sizex-1); int xt = ((int)x) & (t->sizex-1);
int yt = ((int)y) & (t->sizey-1); int yt = ((int)y) & (t->sizey-1);
int idx = ((UINT8 *)dc_texture_ram)[BYTE_XOR_LE(t->address + t->mipoffset+ 0x800 + dilated1[t->cd][xt >> 1] + dilated0[t->cd][yt >> 1])]; int idx = ((UINT8 *)dc_texture_ram)[BYTE_XOR_LE(t->address + dilated1[t->cd][xt >> 1] + dilated0[t->cd][yt >> 1])];
int addrp = t->address + 8*idx + dilated1[t->cd][xt & 1] + dilated0[t->cd][yt & 3]; int addrp = t->vqbase + 8*idx + dilated1[t->cd][xt & 1] + dilated0[t->cd][yt & 3];
int c = ((UINT8 *)dc_texture_ram)[BYTE_XOR_LE(addrp)]; int c = ((UINT8 *)dc_texture_ram)[BYTE_XOR_LE(addrp)];
return cv_4444(pvrta_regs[t->palbase + c]); return cv_4444(pvrta_regs[t->palbase + c]);
} }
@ -399,8 +398,8 @@ static UINT32 tex_r_p8_8888_vq(texinfo *t, float x, float y)
{ {
int xt = ((int)x) & (t->sizex-1); int xt = ((int)x) & (t->sizex-1);
int yt = ((int)y) & (t->sizey-1); int yt = ((int)y) & (t->sizey-1);
int idx = ((UINT8 *)dc_texture_ram)[BYTE_XOR_LE(t->address + t->mipoffset + 0x800 + dilated1[t->cd][xt >> 1] + dilated0[t->cd][yt >> 1])]; int idx = ((UINT8 *)dc_texture_ram)[BYTE_XOR_LE(t->address + dilated1[t->cd][xt >> 1] + dilated0[t->cd][yt >> 1])];
int addrp = t->address + 8*idx + dilated1[t->cd][xt & 1] + dilated0[t->cd][yt & 3]; int addrp = t->vqbase + 8*idx + dilated1[t->cd][xt & 1] + dilated0[t->cd][yt & 3];
int c = ((UINT8 *)dc_texture_ram)[BYTE_XOR_LE(addrp)]; int c = ((UINT8 *)dc_texture_ram)[BYTE_XOR_LE(addrp)];
return pvrta_regs[t->palbase + c]; return pvrta_regs[t->palbase + c];
} }
@ -414,22 +413,20 @@ static UINT32 tex_r_default(texinfo *t, float x, float y)
static void tex_prepare(texinfo *t) static void tex_prepare(texinfo *t)
{ {
int miptype = 0; int miptype = 0;
static int xxxx = 0;
xxxx++;
t->r = tex_r_default; t->r = tex_r_default;
t->palbase = 0x400 | ((t->palette & 0x3f) << 4);
t->cd = dilatechose[t->sizes]; t->cd = dilatechose[t->sizes];
t->mipoffset = 0; t->palbase = 0;
t->vqbase = t->address;
// fprintf(stderr, "tex %d %d %d %d\n", t->pf, t->mode, pvrta_regs[PAL_RAM_CTRL], t->mipmapped);
switch(t->pf) { switch(t->pf) {
case 0: // 1555 case 0: // 1555
switch(t->mode) { switch(t->mode) {
case 0: t->r = tex_r_1555_tw; miptype = 2; break; case 0: t->r = tex_r_1555_tw; miptype = 2; break;
case 1: t->r = tex_r_1555_n; miptype = 2; break; case 1: t->r = tex_r_1555_n; miptype = 2; break;
default: t->r = tex_r_1555_vq; miptype = 3; break; default: t->r = tex_r_1555_vq; miptype = 3; t->address += 0x800; break;
} }
break; break;
@ -437,7 +434,7 @@ static void tex_prepare(texinfo *t)
switch(t->mode) { switch(t->mode) {
case 0: t->r = tex_r_565_tw; miptype = 2; break; case 0: t->r = tex_r_565_tw; miptype = 2; break;
case 1: t->r = tex_r_565_n; miptype = 2; break; case 1: t->r = tex_r_565_n; miptype = 2; break;
default: t->r = tex_r_565_vq; miptype = 3; break; default: t->r = tex_r_565_vq; miptype = 3; t->address += 0x800; break;
} }
break; break;
@ -445,7 +442,7 @@ static void tex_prepare(texinfo *t)
switch(t->mode) { switch(t->mode) {
case 0: t->r = tex_r_4444_tw; miptype = 2; break; case 0: t->r = tex_r_4444_tw; miptype = 2; break;
case 1: t->r = tex_r_4444_n; miptype = 2; break; case 1: t->r = tex_r_4444_n; miptype = 2; break;
default: t->r = tex_r_4444_vq; miptype = 3; break; default: t->r = tex_r_4444_vq; miptype = 3; t->address += 0x800; break;
} }
break; break;
@ -461,6 +458,7 @@ static void tex_prepare(texinfo *t)
break; break;
case 5: // 4bpp palette case 5: // 4bpp palette
t->palbase = 0x400 | ((t->palette & 0x3f) << 4);
switch(t->mode) { switch(t->mode) {
case 0: case 1: case 0: case 1:
miptype = 0; miptype = 0;
@ -476,16 +474,17 @@ static void tex_prepare(texinfo *t)
miptype = 3; // ? miptype = 3; // ?
switch(pvrta_regs[PAL_RAM_CTRL]) { switch(pvrta_regs[PAL_RAM_CTRL]) {
case 0: t->r = tex_r_p4_1555_vq; break; case 0: t->r = tex_r_p4_1555_vq; t->address += 0x800; break;
case 1: t->r = tex_r_p4_565_vq; break; case 1: t->r = tex_r_p4_565_vq; t->address += 0x800; break;
case 2: t->r = tex_r_p4_4444_vq; break; case 2: t->r = tex_r_p4_4444_vq; t->address += 0x800; break;
case 3: t->r = tex_r_p4_8888_vq; break; case 3: t->r = tex_r_p4_8888_vq; t->address += 0x800; break;
} }
break; break;
} }
break; break;
case 6: // 8bpp palette case 6: // 8bpp palette
t->palbase = 0x400 | ((t->palette & 0x30) << 4);
switch(t->mode) { switch(t->mode) {
case 0: case 1: case 0: case 1:
miptype = 1; miptype = 1;
@ -501,10 +500,10 @@ static void tex_prepare(texinfo *t)
miptype = 3; // ? miptype = 3; // ?
switch(pvrta_regs[PAL_RAM_CTRL]) { switch(pvrta_regs[PAL_RAM_CTRL]) {
case 0: t->r = tex_r_p8_1555_vq; break; case 0: t->r = tex_r_p8_1555_vq; t->address += 0x800; break;
case 1: t->r = tex_r_p8_565_vq; break; case 1: t->r = tex_r_p8_565_vq; t->address += 0x800; break;
case 2: t->r = tex_r_p8_4444_vq; break; case 2: t->r = tex_r_p8_4444_vq; t->address += 0x800; break;
case 3: t->r = tex_r_p8_8888_vq; break; case 3: t->r = tex_r_p8_8888_vq; t->address += 0x800; break;
} }
break; break;
} }
@ -585,22 +584,22 @@ static void tex_prepare(texinfo *t)
case 0: // 4bpp case 0: // 4bpp
//printf("4bpp\n"); //printf("4bpp\n");
t->address+= mipmap_4_8_offset[t->sizes&7]>>1; t->address += mipmap_4_8_offset[t->sizes&7]>>1;
break; break;
case 1: // 8bpp case 1: // 8bpp
//printf("8bpp\n"); //printf("8bpp\n");
t->address+= mipmap_4_8_offset[t->sizes&7]; t->address += mipmap_4_8_offset[t->sizes&7];
break; break;
case 2: // nonpalette case 2: // nonpalette
//printf("np\n"); //printf("np\n");
t->address+= mipmap_np_offset[t->sizes&7]; t->address += mipmap_np_offset[t->sizes&7];
break; break;
case 3: // vq case 3: // vq
//printf("vq\n"); //printf("vq\n");
t->mipoffset = mipmap_vq_offset[t->sizes&7]; t->address += mipmap_vq_offset[t->sizes&7];
break; break;
} }
} }
@ -939,9 +938,8 @@ WRITE64_HANDLER( pvr_ta_w )
state_ta.grab[state_ta.grabsel].ispbase=pvrta_regs[TA_ISP_BASE]; state_ta.grab[state_ta.grabsel].ispbase=pvrta_regs[TA_ISP_BASE];
state_ta.grab[state_ta.grabsel].busy=0; state_ta.grab[state_ta.grabsel].busy=0;
state_ta.grab[state_ta.grabsel].valid=1; state_ta.grab[state_ta.grabsel].valid=1;
state_ta.grab[state_ta.grabsel].testsprites_size=0; state_ta.grab[state_ta.grabsel].verts_size=0;
state_ta.grab[state_ta.grabsel].testvertices_size=0; state_ta.grab[state_ta.grabsel].strips_size=0;
state_ta.grab[state_ta.grabsel].teststrips_size=0;
break; break;
case TA_LIST_CONT: case TA_LIST_CONT:
#if DEBUG_PVRTA #if DEBUG_PVRTA
@ -971,6 +969,8 @@ void process_ta_fifo(running_machine* machine)
*/ */
receiveddata *rd = &state_ta.grab[state_ta.grabsel];
// Para Control // Para Control
state_ta.paracontrol=(tafifo_buff[0] >> 24) & 0xff; state_ta.paracontrol=(tafifo_buff[0] >> 24) & 0xff;
// 0 end of list // 0 end of list
@ -1189,104 +1189,10 @@ void process_ta_fifo(running_machine* machine)
#endif #endif
if (state_ta.texture == 1) if (state_ta.texture == 1)
{ {
#if 0 if (rd->verts_size <= 65530)
testsprites* testsprite;
#if DEBUG_PVRDLIST
mame_printf_verbose(" A(%f,%f) B(%f,%f) C(%f,%f)\n",u2f(tafifo_buff[13] & 0xffff0000),u2f((tafifo_buff[13] & 0xffff) << 16),u2f(tafifo_buff[14] & 0xffff0000),u2f((tafifo_buff[14] & 0xffff) << 16),u2f(tafifo_buff[15] & 0xffff0000),u2f((tafifo_buff[15] & 0xffff) << 16));
#endif
/* add a sprite to our 'test sprites' list */
/* sprites are used for the Naomi Bios logo + text for example */
/* -- this is wildly inaccurate! */
testsprite = &state_ta.grab[state_ta.grabsel].showsprites[state_ta.grab[state_ta.grabsel].testsprites_size];
/* Sprite Type 1 (for Sprite)
0x00 Parameter Control Word (see above)
0x04 A.X
0x08 A.Y
0x0C A.Z
0x10 B.X
0x14 B.Y
0x18 B.Z
0x1C C.X
0x20 C.Y
0x24 C.Z
0x28 D.X
0x2C D.Y
0x30 (ignored) D.Z is calculated from the Plane Equation
0x34 AU/AV (16-bits each)
0x38 BU/BV (16-bits each)
0x3C CU/CV (16-bits each)
note: DU/DV is calculated, not specified
*/
testsprite->a.x = u2f(tafifo_buff[0x04/4]);
testsprite->a.y = u2f(tafifo_buff[0x08/4]);
testsprite->a.z = u2f(tafifo_buff[0x0c/4]);
testsprite->b.x = u2f(tafifo_buff[0x10/4]);
testsprite->b.y = u2f(tafifo_buff[0x14/4]);
testsprite->b.z = u2f(tafifo_buff[0x18/4]);
testsprite->c.x = u2f(tafifo_buff[0x1c/4]);
testsprite->c.y = u2f(tafifo_buff[0x20/4]);
testsprite->c.z = u2f(tafifo_buff[0x24/4]);
testsprite->d.x = u2f(tafifo_buff[0x28/4]);
testsprite->d.y = u2f(tafifo_buff[0x2c/4]);
testsprite->d.z = 0.0f;// calculated
testsprite->a.u = u2f( (tafifo_buff[0x34/4]&0xffff0000) );
testsprite->a.v = u2f( (tafifo_buff[0x34/4]&0x0000ffff)<<16);
testsprite->b.u = u2f( (tafifo_buff[0x38/4]&0xffff0000) );
testsprite->b.v = u2f( (tafifo_buff[0x38/4]&0x0000ffff)<<16);
testsprite->c.u = u2f( (tafifo_buff[0x3c/4]&0xffff0000) );
testsprite->c.v = u2f( (tafifo_buff[0x3c/4]&0x0000ffff)<<16);
testsprite->d.u = 0.0f;// calculated
testsprite->d.v = 0.0f;// calculated
/*
printf("Sending a sprite with\n%f %f %f - %f %f\n %f %f %f - %f %f\n%f %f %f - %f %f\n%f %f %f - %f %f\n",
testsprite->a.x, testsprite->a.y, testsprite->a.z, testsprite->a.u, testsprite->a.v,
testsprite->b.x, testsprite->b.y, testsprite->b.z, testsprite->b.u, testsprite->b.v,
testsprite->c.x, testsprite->c.y, testsprite->c.z, testsprite->c.u, testsprite->c.v,
testsprite->d.x, testsprite->d.y, testsprite->d.z, testsprite->d.u, testsprite->d.v);
*/
/*
horizontal test mode
224.000000 224.000000 999.999939 - 0.000000 0.609375
232.000000 224.000000 999.999939 - 1.000000 0.609375
232.000000 232.000000 999.999939 - 1.000000 0.617188
224.000000 232.000000
should calculate 999.999939 - 0.000000 0.617188
vertical test mode
8.000000 184.000000 999.999939 - 0.000000 0.617188
16.000000 184.000000 999.999939 - 0.000000 0.609375
16.000000 192.000000 999.999939 - 1.000000 0.609375
8.000000 192.000000
should calculate 999.999939 - 1.000000 0.617188
*/
// old code, used for the test drawing
testsprite->positionx=testsprite->a.x;
testsprite->positiony=testsprite->a.y;
testsprite->sizex=u2f(tafifo_buff[4])-u2f(tafifo_buff[1]);
testsprite->sizey=u2f(tafifo_buff[8])-u2f(tafifo_buff[2]);
testsprite->u=u2f(tafifo_buff[13] & 0xffff0000);
testsprite->v=u2f((tafifo_buff[13] & 0xffff) << 16);
testsprite->du=u2f(tafifo_buff[14] & 0xffff0000)-testsprite->u;
testsprite->dv=u2f((tafifo_buff[15] & 0xffff) << 16)-testsprite->v;
tex_get_info(&testsprite->ti, &state_ta);
state_ta.grab[state_ta.grabsel].testsprites_size++;
#else
if (state_ta.grab[state_ta.grabsel].testvertices_size <= 65530)
{ {
teststrips *ts; strip *ts;
testvertices *tv = &state_ta.grab[state_ta.grabsel].showvertices[state_ta.grab[state_ta.grabsel].testvertices_size]; vert *tv = &rd->verts[rd->verts_size];
tv[0].x = u2f(tafifo_buff[0x1]); tv[0].x = u2f(tafifo_buff[0x1]);
tv[0].y = u2f(tafifo_buff[0x2]); tv[0].y = u2f(tafifo_buff[0x2]);
tv[0].w = u2f(tafifo_buff[0x3]); tv[0].w = u2f(tafifo_buff[0x3]);
@ -1308,28 +1214,13 @@ void process_ta_fifo(running_machine* machine)
tv[2].u = tv[0].u+tv[3].u-tv[1].u; tv[2].u = tv[0].u+tv[3].u-tv[1].u;
tv[2].v = tv[0].v+tv[3].v-tv[1].v; tv[2].v = tv[0].v+tv[3].v-tv[1].v;
#if 0 ts = &rd->strips[rd->strips_size++];
fprintf(stderr, "(%f, %f)-(%f, %f)-(%f, %f)-(%f, %f) [%f %f %f]\n",
tv[0].x, tv[0].y,
tv[1].x, tv[1].y,
tv[2].x, tv[2].y,
tv[3].x, tv[3].y,
tv[0].w, tv[1].w, tv[2].w);
fprintf(stderr, "[%f, %f]-[%f, %f]-[%f, %f]-[%f, %f]\n",
tv[0].u, tv[0].v,
tv[1].u, tv[1].v,
tv[2].u, tv[2].v,
tv[3].u, tv[3].v);
#endif
ts = &state_ta.grab[state_ta.grabsel].showstrips[state_ta.grab[state_ta.grabsel].teststrips_size++];
tex_get_info(&ts->ti, &state_ta); tex_get_info(&ts->ti, &state_ta);
ts->svert = state_ta.grab[state_ta.grabsel].testvertices_size; ts->svert = rd->verts_size;
ts->evert = ts->svert + 3; ts->evert = rd->verts_size + 3;
state_ta.grab[state_ta.grabsel].testvertices_size += 4; rd->verts_size += 4;
} }
#endif
} }
} }
else if (state_ta.global_paratype == 4) else if (state_ta.global_paratype == 4)
@ -1339,38 +1230,31 @@ void process_ta_fifo(running_machine* machine)
mame_printf_verbose(" V(%f,%f,%f) T(%f,%f)", u2f(tafifo_buff[1]), u2f(tafifo_buff[2]), u2f(tafifo_buff[3]), u2f(tafifo_buff[4]), u2f(tafifo_buff[5])); mame_printf_verbose(" V(%f,%f,%f) T(%f,%f)", u2f(tafifo_buff[1]), u2f(tafifo_buff[2]), u2f(tafifo_buff[3]), u2f(tafifo_buff[4]), u2f(tafifo_buff[5]));
mame_printf_verbose("\n"); mame_printf_verbose("\n");
#endif #endif
#if DEBUG_VERTICES if (rd->verts_size <= 65530)
if (state_ta.grab[state_ta.grabsel].testvertices_size <= 65530)
{ {
/* add a vertex to our 'testverticies' list */ /* add a vertex to our list */
/* this is used for 3d stuff, ie most of the graphics (see guilty gear, confidential mission, maze of the kings etc.) */ /* this is used for 3d stuff, ie most of the graphics (see guilty gear, confidential mission, maze of the kings etc.) */
/* -- this is also wildly inaccurate! */ /* -- this is also wildly inaccurate! */
testvertices* testvertex = &state_ta.grab[state_ta.grabsel].showvertices[state_ta.grab[state_ta.grabsel].testvertices_size]; vert *tv = &rd->verts[rd->verts_size];
testvertex->x=u2f(tafifo_buff[1]); tv->x=u2f(tafifo_buff[1]);
testvertex->y=u2f(tafifo_buff[2]); tv->y=u2f(tafifo_buff[2]);
testvertex->w=u2f(tafifo_buff[3]); tv->w=u2f(tafifo_buff[3]);
testvertex->u=u2f(tafifo_buff[4]); tv->u=u2f(tafifo_buff[4]);
testvertex->v=u2f(tafifo_buff[5]); tv->v=u2f(tafifo_buff[5]);
if((!rd->strips_size) ||
testvertex->endofstrip=state_ta.endofstrip; rd->strips[rd->strips_size-1].evert != -1)
if((!state_ta.grab[state_ta.grabsel].teststrips_size) ||
state_ta.grab[state_ta.grabsel].showstrips[state_ta.grab[state_ta.grabsel].teststrips_size-1].evert != -1)
{ {
teststrips *ts = &state_ta.grab[state_ta.grabsel].showstrips[state_ta.grab[state_ta.grabsel].teststrips_size++]; strip *ts = &rd->strips[rd->strips_size++];
tex_get_info(&ts->ti, &state_ta); tex_get_info(&ts->ti, &state_ta);
ts->svert = state_ta.grab[state_ta.grabsel].testvertices_size; ts->svert = rd->verts_size;
ts->evert = -1; ts->evert = -1;
} }
if(state_ta.endofstrip) if(state_ta.endofstrip)
state_ta.grab[state_ta.grabsel].showstrips[state_ta.grab[state_ta.grabsel].teststrips_size-1].evert = state_ta.grab[state_ta.grabsel].testvertices_size; rd->strips[rd->strips_size-1].evert = rd->verts_size;
rd->verts_size++;
} }
state_ta.grab[state_ta.grabsel].testvertices_size++;
#endif
} }
} }
} }
@ -1460,60 +1344,6 @@ static void computedilated(void)
dilatechose[(b << 3) + a]=3+(a < b ? a : b); dilatechose[(b << 3) + a]=3+(a < b ? a : b);
} }
#if DEBUG_VERTICES
INLINE void testdrawline(bitmap_t *bitmap, testvertices* from, testvertices* to)
{
UINT32 *bmpaddr;
int ix, iy, i, inc, x, y, dx, dy, plotx, ploty;
int dxix, dyiy;
render_bounds line, clip;
clip.x0=0;
clip.y0=0;
clip.x1=639;
clip.y1=479;
line.x0=from->x;
line.y0=from->y;
line.x1=to->x;
line.y1=to->y;
if (render_clip_line(&line, &clip))
return;
dx=line.x1-line.x0;
dy=line.y1-line.y0;
plotx=line.x0;
ploty=line.y0;
ix = abs(dx);
iy = abs(dy);
inc = MAX(ix,iy);
x = y = 0;
dxix = (dx ? dx/ix : 0);
dyiy = (dy ? dy/iy : 0);
for (i=0; i <= inc; ++i)
{
x += ix; y += iy;
if (x > inc)
{
x -= inc;
plotx += dxix;
bmpaddr = BITMAP_ADDR32(bitmap,ploty,plotx);
*bmpaddr = MAKE_RGB(0, 0, 255);
}
if (y > inc)
{
y -= inc;
ploty += dyiy;
bmpaddr = BITMAP_ADDR32(bitmap,ploty,plotx);
*bmpaddr = MAKE_RGB(0, 0, 255);
}
}
}
void render_hline(bitmap_t *bitmap, texinfo *ti, int y, float xl, float xr, float ul, float ur, float vl, float vr, float wl, float wr) void render_hline(bitmap_t *bitmap, texinfo *ti, int y, float xl, float xr, float ul, float ur, float vl, float vr, float wl, float wr)
{ {
int xxl, xxr; int xxl, xxr;
@ -1632,7 +1462,7 @@ void render_span(bitmap_t *bitmap, texinfo *ti,
} }
} }
static void sort_vertices(testvertices *v, int *i0, int *i1, int *i2) static void sort_vertices(const vert *v, int *i0, int *i1, int *i2)
{ {
float miny, maxy; float miny, maxy;
int imin, imax, imid; int imin, imax, imid;
@ -1663,7 +1493,7 @@ static void sort_vertices(testvertices *v, int *i0, int *i1, int *i2)
} }
static void render_tri_sorted(bitmap_t *bitmap, texinfo *ti, testvertices *v0, testvertices *v1, testvertices *v2) static void render_tri_sorted(bitmap_t *bitmap, texinfo *ti, const vert *v0, const vert *v1, const vert *v2)
{ {
int y0, y1, y2; int y0, y1, y2;
float dy01, dy02, dy12; float dy01, dy02, dy12;
@ -1740,7 +1570,7 @@ static void render_tri_sorted(bitmap_t *bitmap, texinfo *ti, testvertices *v0, t
} }
} }
static void render_tri(bitmap_t *bitmap, texinfo *ti, testvertices *v) static void render_tri(bitmap_t *bitmap, texinfo *ti, const vert *v)
{ {
int i0, i1, i2; int i0, i1, i2;
@ -1748,29 +1578,10 @@ static void render_tri(bitmap_t *bitmap, texinfo *ti, testvertices *v)
render_tri_sorted(bitmap, ti, v+i0, v+i1, v+i2); render_tri_sorted(bitmap, ti, v+i0, v+i1, v+i2);
} }
#endif
#if 0
INLINE UINT32 alpha_blend_r16_565(UINT32 d, UINT32 s, UINT8 level)
{
int alphad = 256 - level;
return ((((s & 0x001f) * level + (d & 0x001f) * alphad) >> 8)) |
((((s & 0x07e0) * level + (d & 0x07e0) * alphad) >> 8) & 0x07e0) |
((((s & 0xf800) * level + (d & 0xf800) * alphad) >> 8) & 0xf800);
}
#endif
/// !!
static void testdrawscreen(const running_machine *machine,bitmap_t *bitmap,const rectangle *cliprect) static void testdrawscreen(const running_machine *machine,bitmap_t *bitmap,const rectangle *cliprect)
{ {
const address_space *space = cputag_get_address_space(machine, "maincpu", ADDRESS_SPACE_PROGRAM); const address_space *space = cputag_get_address_space(machine, "maincpu", ADDRESS_SPACE_PROGRAM);
int cs,x,y,dx,dy,xi,yi,rs,ns; int cs,rs,ns;
float iu,iv,u,v;
UINT32 *bmpaddr;
float xt, yt;
UINT32 c; UINT32 c;
#if 0 #if 0
int stride; int stride;
@ -1809,13 +1620,13 @@ static void testdrawscreen(const running_machine *machine,bitmap_t *bitmap,const
} }
#endif #endif
ns=state_ta.grab[rs].teststrips_size; ns=state_ta.grab[rs].strips_size;
if(ns) if(ns)
memset(wbuffer, 0x00, sizeof(wbuffer)); memset(wbuffer, 0x00, sizeof(wbuffer));
for (cs=0;cs < ns;cs++) for (cs=0;cs < ns;cs++)
{ {
teststrips *ts = &state_ta.grab[rs].showstrips[cs]; strip *ts = &state_ta.grab[rs].strips[cs];
int sv = ts->svert; int sv = ts->svert;
int ev = ts->evert; int ev = ts->evert;
int i; int i;
@ -1824,109 +1635,13 @@ static void testdrawscreen(const running_machine *machine,bitmap_t *bitmap,const
for(i=sv; i <= ev; i++) for(i=sv; i <= ev; i++)
{ {
testvertices *tv = state_ta.grab[rs].showvertices + i; vert *tv = state_ta.grab[rs].verts + i;
tv->u = tv->u * ts->ti.sizex * tv->w; tv->u = tv->u * ts->ti.sizex * tv->w;
tv->v = tv->v * ts->ti.sizey * tv->w; tv->v = tv->v * ts->ti.sizey * tv->w;
} }
for(i=sv; i <= ev-2; i++) for(i=sv; i <= ev-2; i++)
render_tri(bitmap, &ts->ti, state_ta.grab[rs].showvertices + i); render_tri(bitmap, &ts->ti, state_ta.grab[rs].verts + i);
}
ns=state_ta.grab[rs].testsprites_size;
for (cs=0;cs < ns;cs++)
{
texinfo *ti;
dx=state_ta.grab[rs].showsprites[cs].sizex;
dy=state_ta.grab[rs].showsprites[cs].sizey;
iu=state_ta.grab[rs].showsprites[cs].du/dx;
iv=state_ta.grab[rs].showsprites[cs].dv/dy;
ti=&state_ta.grab[rs].showsprites[cs].ti;
if ((state_ta.grab[rs].showsprites[cs].positionx+dx) > 640)
dx=640-state_ta.grab[rs].showsprites[cs].positionx;
if ((state_ta.grab[rs].showsprites[cs].positiony+dy) > 480)
dy=480-state_ta.grab[rs].showsprites[cs].positiony;
xi=0;
yi=0;
if (state_ta.grab[rs].showsprites[cs].positionx < 0)
xi=-state_ta.grab[rs].showsprites[cs].positionx;
if (state_ta.grab[rs].showsprites[cs].positiony < 0)
yi=-state_ta.grab[rs].showsprites[cs].positiony;
for (y = yi;y < dy;y++)
{
for (x = xi;x < dx;x++)
{
// find the coordinates
u=state_ta.grab[rs].showsprites[cs].u+iu*x;
v=state_ta.grab[rs].showsprites[cs].v+iv*y;
xt=u*(ti->sizex-1);
yt=v*(ti->sizey-1);
c = ti->r(ti, xt, yt);
bmpaddr=BITMAP_ADDR32(bitmap,state_ta.grab[rs].showsprites[cs].positiony+y,state_ta.grab[rs].showsprites[cs].positionx+x);
*bmpaddr = alpha_blend_r32(*bmpaddr, c & 0xffffff, c >> 24);
#if 0
// write into framebuffer
switch (pvrta_regs[FB_W_CTRL] & 7)
{
case 0: // 0555 KRGB 16 bit
k=pvrta_regs[FB_W_CTRL] & 0x8000;
addrp=state_ta.grab[s].fbwsof1+(state_ta.grab[s].showsprites[cs].positiony+y)*stride+(state_ta.grab[s].showsprites[cs].positionx+x)*2;
bmpaddr16=((UINT16 *)dc_texture_ram) + (WORD2_XOR_LE(addrp) >> 1);
*bmpaddr16=k | alpha_blend_r16(*bmpaddr16,((c & 0xf80000) >> 9) | ((c & 0xf800) >> 6) | ((c & 0xf8) >> 3),a);
break;
case 1: // 565 RGB 16 bit
addrp=state_ta.grab[rs].fbwsof1+(state_ta.grab[rs].showsprites[cs].positiony+y)*stride+(state_ta.grab[rs].showsprites[cs].positionx+x)*2;
bmpaddr16=((UINT16 *)dc_texture_ram) + (WORD2_XOR_LE(addrp) >> 1);
//*bmpaddr16=alpha_blend_r16_565(*bmpaddr16,((c & 0xf80000) >> 8) | ((c & 0xfc00) >> 5) | ((c & 0xf8) >> 3),a);
*bmpaddr16=((c & 0xf80000) >> 8) | ((c & 0xfc00) >> 5) | ((c & 0xf8) >> 3);
break;
case 2: // 4444 ARGB 16 bit
break;
case 3: // 1555 ARGB 16 bit
break;
case 4: // 888 RGB 24 bit packed
break;
case 5: // 0888 KRGB 32 bit
break;
case 6: // 8888 ARGB 32 bit
break;
case 7: // reserved
break;
} // switch
#endif
}
}
#if 0
// test--draw the verts fore each quad as polys too
{
testvertices vv[4];
testvertices* v[3];
vv[0].x = state_ta.grab[rs].showsprites[cs].a.x;
vv[0].y = state_ta.grab[rs].showsprites[cs].a.y;
vv[1].x = state_ta.grab[rs].showsprites[cs].b.x;
vv[1].y = state_ta.grab[rs].showsprites[cs].b.y;
vv[2].x = state_ta.grab[rs].showsprites[cs].c.x;
vv[2].y = state_ta.grab[rs].showsprites[cs].c.y;
vv[3].x = state_ta.grab[rs].showsprites[cs].d.x;
vv[3].y = state_ta.grab[rs].showsprites[cs].d.y;
v[0] = &vv[0];
v[1] = &vv[1];
v[2] = &vv[2];
testdrawpoly(bitmap,v);
v[0] = &vv[0];
v[1] = &vv[2];
v[2] = &vv[3];
testdrawpoly(bitmap,v);
}
#endif
} }
state_ta.grab[rs].busy=0; state_ta.grab[rs].busy=0;
} }