gpu - clean up sprite window rendering so it isn't a separate codepath but rather is identical to regular character OBJ until the very end. may fix subtle bugs, may do nothing, but it's cleaner now anyway

This commit is contained in:
zeromus 2017-08-18 22:44:56 -05:00
parent bf120f3c3e
commit 222f5d8507
2 changed files with 8419 additions and 8447 deletions

View File

@ -3743,7 +3743,7 @@ void GPUEngineBase::_RenderSpriteBMP(GPUEngineCompositorInfo &compInfo, const u8
}
}
template<bool ISDEBUGRENDER>
template<bool ISDEBUGRENDER, bool ISWINDOW>
void GPUEngineBase::_RenderSprite256(GPUEngineCompositorInfo &compInfo, const u8 spriteNum, u16 *__restrict dst, const u32 srcadr, const u16 *__restrict pal, u8 *__restrict dst_alpha, u8 *__restrict typeTab, u8 *__restrict prioTab, const u8 prio, const size_t lg, size_t sprX, size_t x, const s32 xdir, const u8 alpha)
{
for (size_t i = 0; i < lg; i++, ++sprX, x += xdir)
@ -3762,7 +3762,12 @@ void GPUEngineBase::_RenderSprite256(GPUEngineCompositorInfo &compInfo, const u8
}
else
{
if ((palette_entry > 0) && (prio < prioTab[sprX]))
if(ISWINDOW)
{
if(palette_entry > 0)
this->_sprWin[sprX] = 1;
}
else if ((palette_entry > 0) && (prio < prioTab[sprX]))
{
dst[sprX] = LE_TO_LOCAL_16(pal[palette_entry]);
dst_alpha[sprX] = 0xFF;
@ -3774,7 +3779,7 @@ void GPUEngineBase::_RenderSprite256(GPUEngineCompositorInfo &compInfo, const u8
}
}
template<bool ISDEBUGRENDER>
template<bool ISDEBUGRENDER, bool ISWINDOW>
void GPUEngineBase::_RenderSprite16(GPUEngineCompositorInfo &compInfo, const u8 spriteNum, u16 *__restrict dst, const u32 srcadr, const u16 *__restrict pal, u8 *__restrict dst_alpha, u8 *__restrict typeTab, u8 *__restrict prioTab, const u8 prio, const size_t lg, size_t sprX, size_t x, const s32 xdir, const u8 alpha)
{
for (size_t i = 0; i < lg; i++, ++sprX, x += xdir)
@ -3795,7 +3800,12 @@ void GPUEngineBase::_RenderSprite16(GPUEngineCompositorInfo &compInfo, const u8
}
else
{
if ((palette_entry > 0) && (prio < prioTab[sprX]))
if(ISWINDOW)
{
if(palette_entry > 0)
this->_sprWin[sprX] = 1;
}
else if ((palette_entry > 0) && (prio < prioTab[sprX]))
{
dst[sprX] = LE_TO_LOCAL_16(pal[palette_entry]);
dst_alpha[sprX] = 0xFF;
@ -3807,34 +3817,6 @@ void GPUEngineBase::_RenderSprite16(GPUEngineCompositorInfo &compInfo, const u8
}
}
void GPUEngineBase::_RenderSpriteWin(const u8 *src, const bool col256, const size_t lg, size_t sprX, size_t x, const s32 xdir)
{
if (col256)
{
for (size_t i = 0; i < lg; i++, sprX++, x += xdir)
{
if (src[(x & 7) + ((x & 0xFFF8) << 3)])
{
this->_sprWin[sprX] = 1;
}
}
}
else
{
for (size_t i = 0; i < lg; i++, sprX++, x += xdir)
{
const size_t x1 = x >> 1;
const u8 palette = src[(x1 & 0x3) + ((x1 & 0xFFFC) << 3)];
const u8 palette_entry = (x & 1) ? palette >> 4 : palette & 0xF;
if (palette_entry)
{
this->_sprWin[sprX] = 1;
}
}
}
}
// return val means if the sprite is to be drawn or not
bool GPUEngineBase::_ComputeSpriteVars(GPUEngineCompositorInfo &compInfo, const OAMAttributes &spriteInfo, SpriteSize &sprSize, s32 &sprX, s32 &sprY, s32 &x, s32 &y, s32 &lg, s32 &xdir)
{
@ -4253,32 +4235,14 @@ void GPUEngineBase::_SpriteRenderPerform(GPUEngineCompositorInfo &compInfo, u16
cost += sprSize.width;
if (objMode == OBJMode_Window)
{
if (MODE == SpriteRenderMode_Sprite2D)
{
if (spriteInfo.PaletteMode == PaletteMode_1x256)
src = (u8 *)MMU_gpu_map(this->_sprMem + ((spriteInfo.TileIndex)<<5) + ((y>>3)<<10) + ((y&0x7)*8));
else
src = (u8 *)MMU_gpu_map(this->_sprMem + ((spriteInfo.TileIndex)<<5) + ((y>>3)<<10) + ((y&0x7)*4));
}
else
{
if (spriteInfo.PaletteMode == PaletteMode_1x256)
src = (u8 *)MMU_gpu_map(this->_sprMem + (spriteInfo.TileIndex<<compInfo.renderState.spriteBoundary) + ((y>>3)*sprSize.width*8) + ((y&0x7)*8));
else
src = (u8 *)MMU_gpu_map(this->_sprMem + (spriteInfo.TileIndex<<compInfo.renderState.spriteBoundary) + ((y>>3)*sprSize.width*4) + ((y&0x7)*4));
}
this->_RenderSpriteWin(src, (spriteInfo.PaletteMode == PaletteMode_1x256), lg, sprX, x, xdir);
}
else if (objMode == OBJMode_Bitmap) //sprite is in BMP format
if (objMode == OBJMode_Bitmap) //sprite is in BMP format
{
//transparent (i think, dont bother to render?) if alpha is 0
if (spriteInfo.PaletteIndex == 0)
continue;
srcadr = this->_SpriteAddressBMP(compInfo, spriteInfo, sprSize, y);
this->_RenderSpriteBMP<ISDEBUGRENDER>(compInfo, i, dst, srcadr, dst_alpha, typeTab, prioTab, prio, lg, sprX, x, xdir, spriteInfo.PaletteIndex);
const size_t vramPixel = (size_t)((u8 *)MMU_gpu_map(srcadr) - MMU.ARM9_LCD) / sizeof(u16);
@ -4295,7 +4259,7 @@ void GPUEngineBase::_SpriteRenderPerform(GPUEngineCompositorInfo &compInfo, u16
}
}
}
else if (spriteInfo.PaletteMode == PaletteMode_1x256) //256 colors
else if (spriteInfo.PaletteMode == PaletteMode_1x256) //256 colors; handles OBJ windows too
{
if (MODE == SpriteRenderMode_Sprite2D)
srcadr = this->_sprMem + ((spriteInfo.TileIndex)<<5) + ((y>>3)<<10) + ((y&0x7)*8);
@ -4303,9 +4267,13 @@ void GPUEngineBase::_SpriteRenderPerform(GPUEngineCompositorInfo &compInfo, u16
srcadr = this->_sprMem + (spriteInfo.TileIndex<<compInfo.renderState.spriteBoundary) + ((y>>3)*sprSize.width*8) + ((y&0x7)*8);
pal = (DISPCNT.ExOBJPalette_Enable) ? (u16 *)(MMU.ObjExtPal[this->_engineID][0]+(spriteInfo.PaletteIndex*ADDRESS_STEP_512B)) : this->_paletteOBJ;
this->_RenderSprite256<ISDEBUGRENDER>(compInfo, i, dst, srcadr, pal, dst_alpha, typeTab, prioTab, prio, lg, sprX, x, xdir, (objMode == OBJMode_Transparent));
if (objMode == OBJMode_Window)
this->_RenderSprite256<ISDEBUGRENDER,true>(compInfo, i, dst, srcadr, pal, dst_alpha, typeTab, prioTab, prio, lg, sprX, x, xdir, (objMode == OBJMode_Transparent));
else
this->_RenderSprite256<ISDEBUGRENDER,false>(compInfo, i, dst, srcadr, pal, dst_alpha, typeTab, prioTab, prio, lg, sprX, x, xdir, (objMode == OBJMode_Transparent));
}
else // 16 colors
else // 16 colors; handles OBJ windows too
{
if (MODE == SpriteRenderMode_Sprite2D)
{
@ -4317,7 +4285,11 @@ void GPUEngineBase::_SpriteRenderPerform(GPUEngineCompositorInfo &compInfo, u16
}
pal = this->_paletteOBJ + (spriteInfo.PaletteIndex << 4);
this->_RenderSprite16<ISDEBUGRENDER>(compInfo, i, dst, srcadr, pal, dst_alpha, typeTab, prioTab, prio, lg, sprX, x, xdir, (objMode == OBJMode_Transparent));
if (objMode == OBJMode_Window)
this->_RenderSprite16<ISDEBUGRENDER, true>(compInfo, i, dst, srcadr, pal, dst_alpha, typeTab, prioTab, prio, lg, sprX, x, xdir, (objMode == OBJMode_Transparent));
else
this->_RenderSprite16<ISDEBUGRENDER, false>(compInfo, i, dst, srcadr, pal, dst_alpha, typeTab, prioTab, prio, lg, sprX, x, xdir, (objMode == OBJMode_Transparent));
}
}
}

View File

@ -1437,8 +1437,8 @@ protected:
#endif
template<bool ISDEBUGRENDER> void _RenderSpriteBMP(GPUEngineCompositorInfo &compInfo, const u8 spriteNum, u16 *__restrict dst, const u32 srcadr, u8 *__restrict dst_alpha, u8 *__restrict typeTab, u8 *__restrict prioTab, const u8 prio, const size_t lg, size_t sprX, size_t x, const s32 xdir, const u8 alpha);
template<bool ISDEBUGRENDER> void _RenderSprite256(GPUEngineCompositorInfo &compInfo, const u8 spriteNum, u16 *__restrict dst, const u32 srcadr, const u16 *__restrict pal, u8 *__restrict dst_alpha, u8 *__restrict typeTab, u8 *__restrict prioTab, const u8 prio, const size_t lg, size_t sprX, size_t x, const s32 xdir, const u8 alpha);
template<bool ISDEBUGRENDER> void _RenderSprite16(GPUEngineCompositorInfo &compInfo, const u8 spriteNum, u16 *__restrict dst, const u32 srcadr, const u16 *__restrict pal, u8 *__restrict dst_alpha, u8 *__restrict typeTab, u8 *__restrict prioTab, const u8 prio, const size_t lg, size_t sprX, size_t x, const s32 xdir, const u8 alpha);
template<bool ISDEBUGRENDER, bool ISWINDOW> void _RenderSprite256(GPUEngineCompositorInfo &compInfo, const u8 spriteNum, u16 *__restrict dst, const u32 srcadr, const u16 *__restrict pal, u8 *__restrict dst_alpha, u8 *__restrict typeTab, u8 *__restrict prioTab, const u8 prio, const size_t lg, size_t sprX, size_t x, const s32 xdir, const u8 alpha);
template<bool ISDEBUGRENDER, bool ISWINDOW> void _RenderSprite16(GPUEngineCompositorInfo &compInfo, const u8 spriteNum, u16 *__restrict dst, const u32 srcadr, const u16 *__restrict pal, u8 *__restrict dst_alpha, u8 *__restrict typeTab, u8 *__restrict prioTab, const u8 prio, const size_t lg, size_t sprX, size_t x, const s32 xdir, const u8 alpha);
void _RenderSpriteWin(const u8 *src, const bool col256, const size_t lg, size_t sprX, size_t x, const s32 xdir);
bool _ComputeSpriteVars(GPUEngineCompositorInfo &compInfo, const OAMAttributes &spriteInfo, SpriteSize &sprSize, s32 &sprX, s32 &sprY, s32 &x, s32 &y, s32 &lg, s32 &xdir);