applied endian fixes in GPU thanks to Phazz

This commit is contained in:
gecko_reverse 2008-04-06 15:47:35 +00:00
parent abd5e1bcb3
commit e2936e40b2
3 changed files with 78 additions and 13 deletions

View File

@ -19,6 +19,7 @@
- Fixed possible segfault in ROMReader on ia64 and amd64. [evilynux]
- Fixed a crash bug with 2D background corrupting memory [shash]
- Flag check optimization [carlo_bramini]
- Applied some endian fixes in GPU (thanks to Phazz) [Jeff B]
gtk-glade:
- Added DeSmuME version in about dialog. [evilynux]
- Updated website url in about dialog. [evilynux]

View File

@ -1272,7 +1272,7 @@ INLINE void render_sprite_BMP (GPU * gpu, u16 l, u8 * dst, u16 * src, u8 * prioT
int i; u16 color;
for(i = 0; i < lg; i++, ++sprX, x+=xdir)
{
color = src[x];
color = LE_TO_LOCAL_16(src[x]);
// alpha bit = invisible
if ((color&0x8000)&&(prio<=prioTab[sprX]))
@ -1301,7 +1301,7 @@ INLINE void render_sprite_256 ( GPU * gpu, u16 l, u8 * dst, u8 * src, u16 * pal,
for(i = 0; i < lg; i++, ++sprX, x+=xdir)
{
palette_entry = src[(x&0x7) + ((x&0xFFF8)<<3)];
color = pal[palette_entry];
color = LE_TO_LOCAL_16(pal[palette_entry]);
// palette entry = 0 means backdrop
if ((palette_entry>0)&&(prio<=prioTab[sprX]))
@ -1337,7 +1337,7 @@ INLINE void render_sprite_16 ( GPU * gpu, u16 l, u8 * dst, u8 * src, u16 * pal,
palette = src[(x1&0x3) + ((x1&0xFFFC)<<3)];
if (x & 1) palette_entry = palette >> 4;
else palette_entry = palette & 0xF;
color = pal[palette_entry];
color = LE_TO_LOCAL_16(pal[palette_entry]);
// palette entry = 0 means backdrop
if ((palette_entry>0)&&(prio<=prioTab[sprX]))
@ -1436,13 +1436,26 @@ void sprite1D(GPU * gpu, u16 l, u8 * dst, u8 * prioTab)
u8 block = gpu->sprBoundary;
u16 i;
for(i = 0; i<nbShow; ++i, --spriteInfo) /* check all sprites */
//for(i = 0; i<nbShow; ++i, --spriteInfo) /* check all sprites */
#ifdef WORDS_BIGENDIAN
*(((u16*)spriteInfo)+1) = (*(((u16*)spriteInfo)+1) >> 1) | *(((u16*)spriteInfo)+1) << 15;
*(((u16*)spriteInfo)+2) = (*(((u16*)spriteInfo)+2) >> 2) | *(((u16*)spriteInfo)+2) << 14;
#endif
for(i = 0; i<nbShow; ++i, --spriteInfo
#ifdef WORDS_BIGENDIAN
,*(((u16*)(spriteInfo+1))+1) = (*(((u16*)(spriteInfo+1))+1) << 1) | *(((u16*)(spriteInfo+1))+1) >> 15
,*(((u16*)(spriteInfo+1))+2) = (*(((u16*)(spriteInfo+1))+2) << 2) | *(((u16*)(spriteInfo+1))+2) >> 14
,*(((u16*)spriteInfo)+1) = (*(((u16*)spriteInfo)+1) >> 1) | *(((u16*)spriteInfo)+1) << 15
,*(((u16*)spriteInfo)+2) = (*(((u16*)spriteInfo)+2) >> 2) | *(((u16*)spriteInfo)+2) << 14
#endif
) /* check all sprites */
{
size sprSize;
s32 sprX, sprY, x, y, lg;
int xdir;
u8 prio, * src;
u16 i,j;
u16 i;
// Check if sprite is disabled before everything
if (spriteInfo->RotScale == 2)
@ -1671,6 +1684,11 @@ void sprite1D(GPU * gpu, u16 l, u8 * dst, u8 * prioTab)
render_sprite_16 (gpu, l, dst, src, pal, prioTab, prio, lg, sprX, x, xdir, spriteInfo->Mode == 1);
}
}
#ifdef WORDS_BIGENDIAN
*(((u16*)spriteInfo)+1) = (*(((u16*)spriteInfo)+1) << 1) | *(((u16*)spriteInfo)+1) >> 15;
*(((u16*)spriteInfo)+2) = (*(((u16*)spriteInfo)+2) << 2) | *(((u16*)spriteInfo)+2) >> 14;
#endif
}
void sprite2D(GPU * gpu, u16 l, u8 * dst, u8 * prioTab)
@ -1679,7 +1697,19 @@ void sprite2D(GPU * gpu, u16 l, u8 * dst, u8 * prioTab)
_OAM_ * spriteInfo = (_OAM_*)(gpu->oam + (nbShow-1));// + 127;
u16 i;
for(i = 0; i<nbShow; ++i, --spriteInfo)
#ifdef WORDS_BIGENDIAN
*(((u16*)spriteInfo)+1) = (*(((u16*)spriteInfo)+1) >> 1) | *(((u16*)spriteInfo)+1) << 15;
*(((u16*)spriteInfo)+2) = (*(((u16*)spriteInfo)+2) >> 2) | *(((u16*)spriteInfo)+2) << 14;
#endif
for(i = 0; i<nbShow; ++i, --spriteInfo
#ifdef WORDS_BIGENDIAN
,*(((u16*)(spriteInfo+1))+1) = (*(((u16*)(spriteInfo+1))+1) << 1) | *(((u16*)(spriteInfo+1))+1) >> 15
,*(((u16*)(spriteInfo+1))+2) = (*(((u16*)(spriteInfo+1))+2) << 2) | *(((u16*)(spriteInfo+1))+2) >> 14
,*(((u16*)spriteInfo)+1) = (*(((u16*)spriteInfo)+1) >> 1) | *(((u16*)spriteInfo)+1) << 15
,*(((u16*)spriteInfo)+2) = (*(((u16*)spriteInfo)+2) >> 2) | *(((u16*)spriteInfo)+2) << 14
#endif
) /* check all sprites */
{
size sprSize;
s32 sprX, sprY, x, y, lg;
@ -1915,6 +1945,11 @@ void sprite2D(GPU * gpu, u16 l, u8 * dst, u8 * prioTab)
prioTab, prio, lg, sprX, x, xdir, spriteInfo->Mode == 1);
}
}
#ifdef WORDS_BIGENDIAN
*(((u16*)spriteInfo)+1) = (*(((u16*)spriteInfo)+1) << 1) | *(((u16*)spriteInfo)+1) >> 15;
*(((u16*)spriteInfo)+2) = (*(((u16*)spriteInfo)+2) << 2) | *(((u16*)spriteInfo)+2) >> 14;
#endif
}
/*****************************************************************************/
@ -2415,7 +2450,7 @@ void GPU_ligne(NDS_Screen * screen, u16 l)
#ifndef BRIGHT_TABLES
u8 base ;
u8 r,g,b; // get components, 5bit each
dstColor.val = T1ReadWord(dst, i16 << 1);
dstColor.val = *((u16 *) (dst + (i16 << 1)));
r = dstColor.bits.red;
g = dstColor.bits.green;
b = dstColor.bits.blue;
@ -2428,7 +2463,7 @@ void GPU_ligne(NDS_Screen * screen, u16 l)
dstColor.val = T1ReadWord(dst, i16 << 1);
dstColor.bitx.bgr = colors[dstColor.bitx.bgr];
#endif
T2WriteWord (dst, i16 << 1, dstColor.val);
*((u16 *) (dst + (i16 << 1))) = dstColor.val;
}
break;
}
@ -2464,7 +2499,7 @@ void GPU_ligne(NDS_Screen * screen, u16 l)
{
#ifndef BRIGHT_TABLES
u8 r,g,b;
dstColor.val = T1ReadWord(dst, i16 << 1);
dstColor.val = *((u16 *) (dst + (i16 << 1)));
r = dstColor.bits.red;
g = dstColor.bits.green;
b = dstColor.bits.blue;
@ -2476,7 +2511,7 @@ void GPU_ligne(NDS_Screen * screen, u16 l)
dstColor.val = T1ReadWord(dst, i16 << 1);
dstColor.bitx.bgr = colors[dstColor.bitx.bgr];
#endif
T2WriteWord (dst, i16 << 1, dstColor.val);
*((u16 *) (dst + (i16 << 1))) = dstColor.val;
}
break;
}

View File

@ -466,10 +466,17 @@ typedef union
*/
struct _COLOR { // abgr x555
unsigned red:5;
unsigned green:5;
#ifdef WORDS_BIGENDIAN
unsigned alpha:1; // sometimes it is unused (pad)
unsigned blue:5;
unsigned alpha:1; // sometimes it is unused (pad)
unsigned green:5;
unsigned red:5;
#else
unsigned red:5;
unsigned green:5;
unsigned blue:5;
unsigned alpha:1; // sometimes it is unused (pad)
#endif
};
struct _COLORx { // abgr x555
unsigned bgr:15;
@ -521,6 +528,27 @@ ref: http://www.bottledlight.com/ds/index.php/Video/Sprites
typedef struct
{
#ifdef WORDS_BIGENDIAN
// attr0
/* 0*/ unsigned Y:8;
/*14*/ unsigned Shape:2; // (00: Square, 01: Wide, 10: Tall, 11: Illegal)
/*13*/ unsigned Depth:1; // (0: 16, 1: 256)
/*12*/ unsigned Mosaic:1; // (1: Enabled)
/*10*/ unsigned Mode:2; // (00: Normal, 01: Transparent, 10: Object window, 11: Bitmap)
/* 8*/ unsigned RotScale:2; // (00: Normal, 01: Rot/scale, 10: Disabled, 11: Double-size rot/scale)
// attr1
/* 0*/ signed X:9;
/*14*/ unsigned Size:2;
/*13*/ unsigned VFlip:1;
/*12*/ unsigned HFlip:1;
/* 9*/ unsigned RotScalIndex:3; // Rot/scale matrix index
// attr2
/* 0*/ unsigned TileIndex:10;
/*12*/ unsigned PaletteIndex:4;
/*10*/ unsigned Priority:2;
// attr3
unsigned attr3:16;
#else
// attr0
/* 0*/ unsigned Y:8;
/* 8*/ unsigned RotScale:2; // (00: Normal, 01: Rot/scale, 10: Disabled, 11: Double-size rot/scale)
@ -540,6 +568,7 @@ typedef struct
/*12*/ unsigned PaletteIndex:4;
// attr3
unsigned attr3:16;
#endif
} _OAM_;
typedef struct