From 319f68ac6886e210a1afd8d10dceca0d55f001dc Mon Sep 17 00:00:00 2001 From: zeromus Date: Mon, 13 Jul 2009 05:15:25 +0000 Subject: [PATCH] gpu: correctly(?) handle case where backdrop is requested as a top blend layer. fixes ff3 fading text --- desmume/src/GPU.cpp | 74 ++++++++++++++++++++++++--------------------- desmume/src/GPU.h | 20 ++++++------ 2 files changed, 50 insertions(+), 44 deletions(-) diff --git a/desmume/src/GPU.cpp b/desmume/src/GPU.cpp index c113ae4f4..952db1e0d 100644 --- a/desmume/src/GPU.cpp +++ b/desmume/src/GPU.cpp @@ -915,7 +915,6 @@ FORCEINLINE void GPU::renderline_checkWindows(u16 x, bool &draw, bool &effect) c { //INFO("bg%i passed win0 : (%i %i) was within (%i %i)(%i %i)\n", bgnum, x, gpu->currLine, gpu->WIN0H0, gpu->WIN0V0, gpu->WIN0H1, gpu->WIN0V1); draw = (WININ0 >> currBgNum)&1; - if(currBgNum==5) draw = true; //backdrop must always be drawn. windows only control color effects. effect = (WININ0_SPECIAL); return; } @@ -931,7 +930,6 @@ FORCEINLINE void GPU::renderline_checkWindows(u16 x, bool &draw, bool &effect) c { //INFO("bg%i passed win1 : (%i %i) was within (%i %i)(%i %i)\n", bgnum, x, gpu->currLine, gpu->WIN1H0, gpu->WIN1V0, gpu->WIN1H1, gpu->WIN1V1); draw = (WININ1 >> currBgNum)&1; - if(currBgNum==5) draw = true; //backdrop must always be drawn. windows only control color effects. effect = (WININ1_SPECIAL); return; } @@ -945,7 +943,6 @@ FORCEINLINE void GPU::renderline_checkWindows(u16 x, bool &draw, bool &effect) c if (sprWin[x]) { draw = (WINOBJ >> currBgNum)&1; - if(currBgNum==5) draw = true; //backdrop must always be drawn. windows only control color effects. effect = (WINOBJ_SPECIAL); return; } @@ -954,7 +951,6 @@ FORCEINLINE void GPU::renderline_checkWindows(u16 x, bool &draw, bool &effect) c if (WINOBJ_ENABLED | WIN1_ENABLED | WIN0_ENABLED) { draw = (WINOUT >> currBgNum) & 1; - if(currBgNum==5) draw = true; //backdrop must always be drawn. windows only control color effects. effect = (WINOUT_SPECIAL); } } @@ -963,12 +959,14 @@ FORCEINLINE void GPU::renderline_checkWindows(u16 x, bool &draw, bool &effect) c // PIXEL RENDERING - BGS /*****************************************************************************/ -FORCEINLINE void GPU::setFinalBGColorSpecialNone(u16 &color, const u8 x) +template FORCEINLINE void GPU::setFinalBGColorSpecialNone(u16 &color, const u8 x) { } -FORCEINLINE void GPU::setFinalBGColorSpecialBlend(u16 &color, const u8 x) +template FORCEINLINE void GPU::setFinalBGColorSpecialBlend(u16 &color, const u8 x) { + //blend backdrop with what?? this doesn't make sense + if(BACKDROP) return; if(blend1) { //If the layer we are drawing on is selected as 2nd source, we can blend @@ -978,7 +976,7 @@ FORCEINLINE void GPU::setFinalBGColorSpecialBlend(u16 &color, const u8 x) } } -FORCEINLINE void GPU::setFinalBGColorSpecialIncrease (u16 &color, const u8 x) +template FORCEINLINE void GPU::setFinalBGColorSpecialIncrease (u16 &color, const u8 x) { if(blend1) // the bg to draw has a special color effect { @@ -986,7 +984,7 @@ FORCEINLINE void GPU::setFinalBGColorSpecialIncrease (u16 &color, const u8 x) } } -FORCEINLINE void GPU::setFinalBGColorSpecialDecrease(u16 &color, const u8 x) +template FORCEINLINE void GPU::setFinalBGColorSpecialDecrease(u16 &color, const u8 x) { if(blend1) // the bg to draw has a special color effect { @@ -994,11 +992,13 @@ FORCEINLINE void GPU::setFinalBGColorSpecialDecrease(u16 &color, const u8 x) } } -FORCEINLINE bool GPU::setFinalBGColorSpecialNoneWnd(u16 &color, const u8 x) +template FORCEINLINE bool GPU::setFinalBGColorSpecialNoneWnd(u16 &color, const u8 x) { bool windowDraw = true, windowEffect = true; renderline_checkWindows(x, windowDraw, windowEffect); + + if(BACKDROP) windowDraw = true; //backdrop must always be drawn if (blend1 && windowEffect) // the bg to draw has a special color effect { @@ -1014,12 +1014,14 @@ FORCEINLINE bool GPU::setFinalBGColorSpecialNoneWnd(u16 &color, const u8 x) return false; } -FORCEINLINE bool GPU::setFinalBGColorSpecialBlendWnd(u16 &color, const u8 x) +template FORCEINLINE bool GPU::setFinalBGColorSpecialBlendWnd(u16 &color, const u8 x) { bool windowDraw = true, windowEffect = true; renderline_checkWindows(x, windowDraw, windowEffect); + if(BACKDROP) windowDraw = true; //backdrop must always be drawn + if(windowDraw) { if(blend1 && windowEffect) @@ -1035,12 +1037,14 @@ FORCEINLINE bool GPU::setFinalBGColorSpecialBlendWnd(u16 &color, const u8 x) return false; } -FORCEINLINE bool GPU::setFinalBGColorSpecialIncreaseWnd(u16 &color, const u8 x) +template FORCEINLINE bool GPU::setFinalBGColorSpecialIncreaseWnd(u16 &color, const u8 x) { bool windowDraw = true, windowEffect = true; renderline_checkWindows(x, windowDraw, windowEffect); + if(BACKDROP) windowDraw = true; //backdrop must always be drawn + if(windowDraw) { if(blend1 && windowEffect) @@ -1052,12 +1056,14 @@ FORCEINLINE bool GPU::setFinalBGColorSpecialIncreaseWnd(u16 &color, const u8 x) return false; } -FORCEINLINE bool GPU::setFinalBGColorSpecialDecreaseWnd(u16 &color, const u8 x) +template FORCEINLINE bool GPU::setFinalBGColorSpecialDecreaseWnd(u16 &color, const u8 x) { bool windowDraw = true, windowEffect = true; renderline_checkWindows(x, windowDraw, windowEffect); + if(BACKDROP) windowDraw = true; //backdrop must always be drawn + if(windowDraw) { if(blend1 && windowEffect) @@ -1120,7 +1126,7 @@ static void _master_setFinalOBJColor(GPU *gpu, u32 passing, u8 *dst, u16 color, gpu->bgPixels[x] = 4; } -FORCEINLINE void GPU::setFinalColorBG(u16 color, u8 x) +template FORCEINLINE void GPU::setFinalColorBG(u16 color, u8 x) { //It is not safe to assert this here. //This is probably the best place to enforce it, since almost every single color that comes in here @@ -1132,14 +1138,14 @@ FORCEINLINE void GPU::setFinalColorBG(u16 color, u8 x) bool draw=true; switch(setFinalColorBck_funcNum) { - case 0x0: setFinalBGColorSpecialNone(color,x); break; - case 0x1: setFinalBGColorSpecialBlend(color,x); break; - case 0x2: setFinalBGColorSpecialIncrease(color,x); break; - case 0x3: setFinalBGColorSpecialDecrease(color,x); break; - case 0x4: draw=setFinalBGColorSpecialNoneWnd(color,x); break; - case 0x5: draw=setFinalBGColorSpecialBlendWnd(color,x); break; - case 0x6: draw=setFinalBGColorSpecialIncreaseWnd(color,x); break; - case 0x7: draw=setFinalBGColorSpecialDecreaseWnd(color,x); break; + case 0x0: setFinalBGColorSpecialNone(color,x); break; + case 0x1: setFinalBGColorSpecialBlend(color,x); break; + case 0x2: setFinalBGColorSpecialIncrease(color,x); break; + case 0x3: setFinalBGColorSpecialDecrease(color,x); break; + case 0x4: draw=setFinalBGColorSpecialNoneWnd(color,x); break; + case 0x5: draw=setFinalBGColorSpecialBlendWnd(color,x); break; + case 0x6: draw=setFinalBGColorSpecialIncreaseWnd(color,x); break; + case 0x7: draw=setFinalBGColorSpecialDecreaseWnd(color,x); break; }; if(draw) @@ -1168,7 +1174,7 @@ FORCEINLINE void GPU::setFinalColor3d(int dstX, int srcX) //this was forced inline because most of the time it just falls through to setFinalColorBck() and the function call //overhead was ridiculous and terrible -template FORCEINLINE void GPU::__setFinalColorBck(u16 color, const u8 x, const bool opaque) +template FORCEINLINE void GPU::__setFinalColorBck(u16 color, const u8 x, const bool opaque) { //I commented out this line to make a point. //indeed, since x is a u8 we cannot pass in anything >=256 @@ -1200,7 +1206,7 @@ template FORCEINLINE void GPU::__setFinalColorBck(u16 color, const if(color != 0xFFFF) { finish: - setFinalColorBG(color,x); + setFinalColorBG(color,x); } } @@ -1275,7 +1281,7 @@ template void lineLarge8bpp(GPU * gpu) XBG &= wmask; u8 pixel = map[XBG]; u16 color = T1ReadWord(pal, pixel<<1); - gpu->__setFinalColorBck(color,x,color!=0); + gpu->__setFinalColorBck(color,x,color!=0); } } @@ -1347,12 +1353,12 @@ template INLINE void renderline_textBG(GPU * gpu, u16 XBG, u16 YBG, if(!(xoff&1)) { color = T1ReadWord(pal, ((currLine>>4) + tilePalette) << 1); - gpu->__setFinalColorBck(color,x,currLine>>4); + gpu->__setFinalColorBck(color,x,currLine>>4); x++; xoff++; } color = T1ReadWord(pal, ((currLine&0xF) + tilePalette) << 1); - gpu->__setFinalColorBck(color,x,currLine&0xF); + gpu->__setFinalColorBck(color,x,currLine&0xF); x++; xoff++; } } else { @@ -1364,12 +1370,12 @@ template INLINE void renderline_textBG(GPU * gpu, u16 XBG, u16 YBG, if(!(xoff&1)) { color = T1ReadWord(pal, ((currLine&0xF) + tilePalette) << 1); - gpu->__setFinalColorBck(color,x,currLine&0xF); + gpu->__setFinalColorBck(color,x,currLine&0xF); x++; xoff++; } color = T1ReadWord(pal, ((currLine>>4) + tilePalette) << 1); - gpu->__setFinalColorBck(color,x,currLine>>4); + gpu->__setFinalColorBck(color,x,currLine>>4); x++; xoff++; } } @@ -1412,7 +1418,7 @@ template INLINE void renderline_textBG(GPU * gpu, u16 XBG, u16 YBG, else color = T1ReadWord(pal, (*line) << 1); - gpu->__setFinalColorBck(color,x,*line); + gpu->__setFinalColorBck(color,x,*line); x++; xoff++; @@ -1436,7 +1442,7 @@ template FORCEINLINE void rot_tiled_8bit_entry(GPU * gpu, s32 auxX, palette_entry = *(u8*)MMU_gpu_map(tile + ((tileindex<<6)+(y<<3)+x)); color = T1ReadWord(pal, palette_entry << 1); - gpu->__setFinalColorBck(color,i,palette_entry); + gpu->__setFinalColorBck(color,i,palette_entry); } template FORCEINLINE void rot_tiled_16bit_entry(GPU * gpu, s32 auxX, s32 auxY, int lg, u32 map, u32 tile, u8 * pal, int i, u8 extPal) { @@ -1453,7 +1459,7 @@ template FORCEINLINE void rot_tiled_16bit_entry(GPU * gpu, s32 auxX palette_entry = *(u8*)MMU_gpu_map(tile + ((tileentry.bits.TileNum<<6)+(y<<3)+x)); color = T1ReadWord(pal, (palette_entry + (extPal ? (tileentry.bits.Palette<<8) : 0)) << 1); - gpu->__setFinalColorBck(color, i, palette_entry); + gpu->__setFinalColorBck(color, i, palette_entry); } template FORCEINLINE void rot_256_map(GPU * gpu, s32 auxX, s32 auxY, int lg, u32 map, u32 tile, u8 * pal, int i, u8 extPal) { @@ -1464,14 +1470,14 @@ template FORCEINLINE void rot_256_map(GPU * gpu, s32 auxX, s32 auxY palette_entry = *adr; color = T1ReadWord(pal, palette_entry << 1); - gpu->__setFinalColorBck(color, i, palette_entry); + gpu->__setFinalColorBck(color, i, palette_entry); } template FORCEINLINE void rot_BMP_map(GPU * gpu, s32 auxX, s32 auxY, int lg, u32 map, u32 tile, u8 * pal, int i, u8 extPal) { u16 color; void* adr = MMU_gpu_map((map) + ((auxX + auxY * lg) << 1)); color = T1ReadWord(adr, 0); - gpu->__setFinalColorBck(color, i, color&0x8000); + gpu->__setFinalColorBck(color, i, color&0x8000); } typedef void (*rot_fun)(GPU * gpu, s32 auxX, s32 auxY, int lg, u32 map, u32 tile, u8 * pal , int i, u8 extPal); @@ -2386,7 +2392,7 @@ static void GPU_ligne_layer(NDS_Screen * screen, u16 l) //this is currently eating up 2fps or so. it is a reasonable candidate for optimization. gpu->currBgNum = 5; for(int x=0;x<256;x++) { - gpu->__setFinalColorBck(backdrop_color,x,1); + gpu->__setFinalColorBck(backdrop_color,x,1); } //this check isnt really helpful. it just slows us down in the cases where we need the most speed diff --git a/desmume/src/GPU.h b/desmume/src/GPU.h index e8733d67f..479fa5dad 100644 --- a/desmume/src/GPU.h +++ b/desmume/src/GPU.h @@ -779,17 +779,17 @@ struct GPU void _spriteRender(u8 * dst, u8 * dst_alpha, u8 * typeTab, u8 * prioTab); void spriteRender(u8 * dst, u8 * dst_alpha, u8 * typeTab, u8 * prioTab); - void setFinalColorBG(u16 color, u8 x); + template void setFinalColorBG(u16 color, u8 x); void setFinalColor3d(int dstX, int srcX); - FORCEINLINE void setFinalBGColorSpecialNone(u16 &color, u8 x); - FORCEINLINE void setFinalBGColorSpecialBlend(u16 &color, u8 x); - FORCEINLINE void setFinalBGColorSpecialIncrease(u16 &color, u8 x); - FORCEINLINE void setFinalBGColorSpecialDecrease(u16 &color, u8 x); - FORCEINLINE bool setFinalBGColorSpecialNoneWnd(u16 &color, u8 x); - FORCEINLINE bool setFinalBGColorSpecialBlendWnd(u16 &color, u8 x); - FORCEINLINE bool setFinalBGColorSpecialIncreaseWnd(u16 &color, u8 x); - FORCEINLINE bool setFinalBGColorSpecialDecreaseWnd(u16 &color, u8 x); + template FORCEINLINE void setFinalBGColorSpecialNone(u16 &color, u8 x); + template FORCEINLINE void setFinalBGColorSpecialBlend(u16 &color, u8 x); + template FORCEINLINE void setFinalBGColorSpecialIncrease(u16 &color, u8 x); + template FORCEINLINE void setFinalBGColorSpecialDecrease(u16 &color, u8 x); + template FORCEINLINE bool setFinalBGColorSpecialNoneWnd(u16 &color, u8 x); + template FORCEINLINE bool setFinalBGColorSpecialBlendWnd(u16 &color, u8 x); + template FORCEINLINE bool setFinalBGColorSpecialIncreaseWnd(u16 &color, u8 x); + template FORCEINLINE bool setFinalBGColorSpecialDecreaseWnd(u16 &color, u8 x); FORCEINLINE void setFinal3DColorSpecialNone(int dstX, int srcX); FORCEINLINE void setFinal3DColorSpecialBlend(int dstX, int srcX); @@ -801,7 +801,7 @@ struct GPU FORCEINLINE void setFinal3DColorSpecialDecreaseWnd(int dstX, int srcX); - template void __setFinalColorBck(u16 color, const u8 x, const bool opaque); + template void __setFinalColorBck(u16 color, const u8 x, const bool opaque); void setAffineStart(int layer, int xy, u32 val); void setAffineStartWord(int layer, int xy, u16 val, int word); u32 getAffineStart(int layer, int xy);