diff --git a/desmume/ChangeLog b/desmume/ChangeLog index 0b09e88b7..cd984fd92 100644 --- a/desmume/ChangeLog +++ b/desmume/ChangeLog @@ -43,10 +43,9 @@ - Added texture caching (speedup 3D core) [CrazyMax] - Render shadow volumes [zeromus, luigi__] - Toon shading system [luigi__] - - carry w=1 from vertex() through pipeline (this will be necessary for software 3d rendering) [zeromus] + - Carry w=1 from vertex() through pipeline (this will be necessary for software 3d rendering) [zeromus] - Fix clear depth (ex. Castlevania now doesnt flip) [lugi__] - Make GE matrix mult and load commands clear out unused rows and cols to identity correctly [zeromus] - - Setup to track polycount better, but still worthless, not accounting for clipping and culling [zeromus] - Fix errors in matrix operations regarding projection mode and pos-vector mode [zeromus] - Fix error in command unpacking which caused some display lists to totally blow up [zeromus] - Convert alpha and material values from [0,31], [0,7] etc ranges to opengl [0,maxint] ranges in a more precise way [zeromus] @@ -55,6 +54,7 @@ - Move lighting model to software instead of using opengl for more precision [zeromus] - Fix a bug in texture transformation mode 1 [zeromus] - Add 3d layer h-scrolling [zeromus] + - Removed some serious inefficiencies from sprite window code [zeromus] Mac OS X port: - Fixed: Filenames and paths with unicode characters now work. [Jeff] - Fixed: Load state from file button works again. [Jeff] diff --git a/desmume/src/GPU.cpp b/desmume/src/GPU.cpp index a7325258a..3d168ce3b 100644 --- a/desmume/src/GPU.cpp +++ b/desmume/src/GPU.cpp @@ -77,7 +77,9 @@ NDS_Screen SubScreen; //#define DEBUG_TRI -u8 GPU_screen[4*256*192]; +CACHE_ALIGN u8 GPU_screen[4*256*192]; + +CACHE_ALIGN u8 sprWin[256]; OSDCLASS *osd = NULL; OSDCLASS *osdA = NULL; @@ -235,7 +237,11 @@ static void GPU_resortBGs(GPU *gpu) struct _DISPCNT * cnt = &gpu->dispx_st->dispx_DISPCNT.bits; itemsForPriority_t * item; - memset(gpu->sprWin,0, 256*192); + //zero 29-dec-2008 - this really doesnt make sense to me. + //i changed the sprwin to be line by line, + //and resetting it here is pointless since line rendering is instantaneous + //and completely produces and consumes sprwin after which the contents of this buffer are useless + //memset(gpu->sprWin,0, 256*192); // we don't need to check for windows here... // if we tick boxes, invisible layers become invisible & vice versa @@ -481,11 +487,12 @@ static INLINE void renderline_checkWindows(const GPU *gpu, u8 bgnum, u16 x, u16 } } + //if(true) //sprwin test hack if (gpu->WINOBJ_ENABLED) { // it is in winOBJ, do we display ? // low priority - if (gpu->sprWin[y][x]) + if (sprWin[x]) { *draw = (gpu->WINOBJ >> bgnum)&1; *effect = (gpu->WINOBJ_SPECIAL); @@ -506,8 +513,13 @@ static INLINE void renderline_checkWindows(const GPU *gpu, u8 bgnum, u16 x, u16 static BOOL setFinalColorSpecialNone (const GPU *gpu, u32 passing, u8 bgnum, u8 *dst, u16 color, u16 x, u16 y) { - T2WriteWord(dst, passing, color); + //sprwin test hack - use this code + //BOOL windowDraw = TRUE, windowEffect = TRUE; + //renderline_checkWindows(gpu,bgnum,x,y, &windowDraw, &windowEffect); + //if(windowDraw) T2WriteWord(dst, passing, color); + //return 1; + T2WriteWord(dst, passing, color); return 1; } @@ -1260,7 +1272,7 @@ INLINE void render_sprite_Win (GPU * gpu, u16 l, u8 * src, u16 x1; if (col256) { for(i = 0; i < lg; i++, sprX++,x+=xdir) - gpu->sprWin[l][sprX] = (src[x])?1:0; + sprWin[sprX] = (src[x])?1:0; } else { for(i = 0; i < lg; i++, ++sprX, x+=xdir) { @@ -1268,7 +1280,7 @@ INLINE void render_sprite_Win (GPU * gpu, u16 l, u8 * src, palette = src[(x1&0x3) + ((x1&0xFFFC)<<3)]; if (x & 1) palette_entry = palette >> 4; else palette_entry = palette & 0xF; - gpu->sprWin[l][sprX] = (palette_entry)?1:0; + sprWin[sprX] = (palette_entry)?1:0; } } } @@ -1588,7 +1600,9 @@ void sprite1D(GPU * gpu, u16 l, u8 * dst, u8 * prioTab) else pal = (u16*)(ARM9Mem.ARM9_VMEM + 0x200 + gpu->core *0x400); + //sprwin test hack - to enable, only draw win and not sprite render_sprite_256 (gpu, l, dst, src, pal, prioTab, prio, lg, sprX, x, xdir, spriteInfo->Mode == 1); + //render_sprite_Win (gpu, l, src, spriteInfo->Depth, lg, sprX, x, xdir); continue; } @@ -1598,7 +1612,10 @@ void sprite1D(GPU * gpu, u16 l, u8 * dst, u8 * prioTab) pal = (u16*)(ARM9Mem.ARM9_VMEM + 0x200 + gpu->core * 0x400); pal += (spriteInfo->PaletteIndex<<4); + + //sprwin test hack - to enable, only draw win and not sprite render_sprite_16 (gpu, l, dst, src, pal, prioTab, prio, lg, sprX, x, xdir, spriteInfo->Mode == 1); + //render_sprite_Win (gpu, l, src, spriteInfo->Depth, lg, sprX, x, xdir); } } @@ -2120,7 +2137,7 @@ static INLINE void GPU_ligne_layer(NDS_Screen * screen, u16 l) // init background color & priorities memset(sprPrio,0xFF,256); - memset(&gpu->sprWin[l],0,256); + memset(sprWin,0,256); // init pixels priorities for (int i=0; i //mem funcs -#include //va_start, etc -#include "debug.h" - -#include "softrender.h" - -#include "softrender_v3sysfont.h" -#include "softrender_desmumefont.h" - -using namespace softrender; - -extern u8 GPU_screen[4*256*192]; -image screenshell; - -OSDCLASS::OSDCLASS(u8 core) -{ - memset(screen, 0, sizeof(screen)); - memset(name,0,7); - //memset(line, 0, sizeof(line)); - memset(timer, 0, sizeof(timer)); - memset(color, 0, sizeof(color)); - - old_msg = new char[512]; - memset(old_msg, 0, 512); - - current_color = 0x8F; - mode=core; - offset=0; +/* Copyright (C) 2006 yopyop + yopyop156@ifrance.com + yopyop156.ifrance.com + + Copyright (C) 2006-2008 DeSmuME team + + This file is part of DeSmuME + + DeSmuME is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + DeSmuME is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with DeSmuME; if not, write to the Free Software + Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +*/ + +#include "GPU_osd.h" +#include "GPU.h" +#include "mem.h" +#include //mem funcs +#include //va_start, etc +#include "debug.h" + +#include "softrender.h" + +#include "softrender_v3sysfont.h" +#include "softrender_desmumefont.h" + +using namespace softrender; + +image screenshell; + +OSDCLASS::OSDCLASS(u8 core) +{ + memset(screen, 0, sizeof(screen)); + memset(name,0,7); + //memset(line, 0, sizeof(line)); + memset(timer, 0, sizeof(timer)); + memset(color, 0, sizeof(color)); + + old_msg = new char[512]; + memset(old_msg, 0, 512); + + current_color = 0x8F; + mode=core; + offset=0; startline=0; - lastline=0; - - needUpdate = false; - - if (core==0) - memcpy(name,"Core A",6); - else - if (core==1) - memcpy(name,"Core B",6); - else - { - memcpy(name,"Main",6); - mode=255; - } - - screenshell.shell = true; - screenshell.data = screen; - screenshell.bpp = 15; - screenshell.width = 256; - screenshell.height = 384; - screenshell.pitch = 256; - screenshell.cx1 = 0; - screenshell.cx2 = 256-1; - screenshell.cy1 = 0; - screenshell.cy2 = 384-1; - - LOG("OSD_Init (%s)\n",name); -} - -OSDCLASS::~OSDCLASS() -{ - LOG("OSD_Deinit (%s)\n",name); - - delete[] old_msg; -} - -void OSDCLASS::setOffset(u16 ofs) -{ - offset=ofs; -} - -void OSDCLASS::clear() -{ - memset(screen, 0, sizeof(screen)); - memset(line, 0, sizeof(line)); - memset(timer, 0, sizeof(timer)); - needUpdate=false; -} - -void OSDCLASS::setColor(u16 col) -{ - current_color = col; -} - -void OSDCLASS::update() // don't optimized -{ - if (!needUpdate) return; // don't update if buffer empty (speed up) - u16 *dst=(u16*)GPU_screen; - if (mode!=255) - dst+=offset*512; - - for (int i=0; i<256*192; i++) - { - if(screen[i]&0x8000) - T2WriteWord((u8*)dst,(i << 1), screen[i] ); - } -} - -void OSDCLASS::addLine(const char *fmt, ...) -{ - -} - -void OSDCLASS::addFixed(u16 x, u16 y, const char *fmt, ...) -{ - va_list list; - char msg[1024]; - -// memset(msg,0,1024); - - va_start(list,fmt); -#if defined(_MSC_VER) || defined(__INTEL_COMPILER) - _vsnprintf(msg,1023,fmt,list); -#else - vsnprintf(msg,1023,fmt,list); -#endif - - va_end(list); - - if (strcmp(msg, old_msg) == 0) return; - - render51.PrintString(1,x,y,render51.MakeColor(128,0,0),msg,&screenshell); - - needUpdate = true; -} + lastline=0; + + needUpdate = false; + + if (core==0) + memcpy(name,"Core A",6); + else + if (core==1) + memcpy(name,"Core B",6); + else + { + memcpy(name,"Main",6); + mode=255; + } + + screenshell.shell = true; + screenshell.data = screen; + screenshell.bpp = 15; + screenshell.width = 256; + screenshell.height = 384; + screenshell.pitch = 256; + screenshell.cx1 = 0; + screenshell.cx2 = 256-1; + screenshell.cy1 = 0; + screenshell.cy2 = 384-1; + + LOG("OSD_Init (%s)\n",name); +} + +OSDCLASS::~OSDCLASS() +{ + LOG("OSD_Deinit (%s)\n",name); + + delete[] old_msg; +} + +void OSDCLASS::setOffset(u16 ofs) +{ + offset=ofs; +} + +void OSDCLASS::clear() +{ + memset(screen, 0, sizeof(screen)); + memset(line, 0, sizeof(line)); + memset(timer, 0, sizeof(timer)); + needUpdate=false; +} + +void OSDCLASS::setColor(u16 col) +{ + current_color = col; +} + +void OSDCLASS::update() // don't optimized +{ + if (!needUpdate) return; // don't update if buffer empty (speed up) + u16 *dst=(u16*)GPU_screen; + if (mode!=255) + dst+=offset*512; + + for (int i=0; i<256*192; i++) + { + if(screen[i]&0x8000) + T2WriteWord((u8*)dst,(i << 1), screen[i] ); + } +} + +void OSDCLASS::addLine(const char *fmt, ...) +{ + +} + +void OSDCLASS::addFixed(u16 x, u16 y, const char *fmt, ...) +{ + va_list list; + char msg[1024]; + +// memset(msg,0,1024); + + va_start(list,fmt); +#if defined(_MSC_VER) || defined(__INTEL_COMPILER) + _vsnprintf(msg,1023,fmt,list); +#else + vsnprintf(msg,1023,fmt,list); +#endif + + va_end(list); + + if (strcmp(msg, old_msg) == 0) return; + + render51.PrintString(1,x,y,render51.MakeColor(128,0,0),msg,&screenshell); + + needUpdate = true; +}