From: <ze...@us...> - 2009-10-06 20:50:40
|
Revision: 2934 http://desmume.svn.sourceforge.net/desmume/?rev=2934&view=rev Author: zeromus Date: 2009-10-06 20:49:53 +0000 (Tue, 06 Oct 2009) Log Message: ----------- i probably should not have checked in rand() test data in vectest Modified Paths: -------------- trunk/desmume/src/gfx3d.cpp Modified: trunk/desmume/src/gfx3d.cpp =================================================================== --- trunk/desmume/src/gfx3d.cpp 2009-10-06 20:33:39 UTC (rev 2933) +++ trunk/desmume/src/gfx3d.cpp 2009-10-06 20:49:53 UTC (rev 2934) @@ -1543,10 +1543,6 @@ s16 y = (s16)(normal[1]); s16 z = (s16)(normal[2]); - x = rand(); - y = rand(); - z = rand(); - MMU_new.gxstat.tb = 0; // clear busy T1WriteWord(MMU.MMU_MEM[0][0x40], 0x630, x); T1WriteWord(MMU.MMU_MEM[0][0x40], 0x632, y); This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <ni...@us...> - 2009-10-11 04:11:48
|
Revision: 2949 http://desmume.svn.sourceforge.net/desmume/?rev=2949&view=rev Author: nitsuja Date: 2009-10-11 04:11:41 +0000 (Sun, 11 Oct 2009) Log Message: ----------- optimized the clipper Modified Paths: -------------- trunk/desmume/src/gfx3d.cpp Modified: trunk/desmume/src/gfx3d.cpp =================================================================== --- trunk/desmume/src/gfx3d.cpp 2009-10-10 20:32:25 UTC (rev 2948) +++ trunk/desmume/src/gfx3d.cpp 2009-10-11 04:11:41 UTC (rev 2949) @@ -45,7 +45,7 @@ #include "readwrite.h" #include "FIFO.h" #include <queue> -#include "movie.h" +//#include "movie.h" /* thoughts on flush timing: @@ -2272,6 +2272,10 @@ //clipping //------------------- +// this is optional for now in case someone has trouble with the new method +// or wants to toggle it to compare +#define OPTIMIZED_CLIPPING_METHOD + //#define CLIPLOG(X) printf(X); //#define CLIPLOG2(X,Y,Z) printf(X,Y,Z); #define CLIPLOG(X) @@ -2284,7 +2288,11 @@ //http://www.cs.berkeley.edu/~ug/slide/pipeline/assignments/as6/discussion.shtml +#ifdef OPTIMIZED_CLIPPING_METHOD +template<int coord, int which> static FORCEINLINE VERT clipPoint(VERT* inside, VERT* outside) +#else static FORCEINLINE VERT clipPoint(VERT* inside, VERT* outside, int coord, int which) +#endif { VERT ret; @@ -2328,6 +2336,172 @@ return ret; } +#ifdef OPTIMIZED_CLIPPING_METHOD + +#define MAX_SCRATCH_CLIP_VERTS (4*6 + 40) +static VERT scratchClipVerts [MAX_SCRATCH_CLIP_VERTS]; +static int numScratchClipVerts = 0; + +template <int coord, int which, class Next> +class ClipperPlane +{ +public: + ClipperPlane(Next& next) : m_next(next) {} + + void init(VERT* verts) + { + m_prevVert = NULL; + m_firstVert = NULL; + m_next.init(verts); + } + + void clipVert(VERT* vert) + { + if(m_prevVert) + this->clipSegmentVsPlane(m_prevVert, vert); + else + m_firstVert = vert; + m_prevVert = vert; + } + + // closes the loop and returns the number of clipped output verts + int finish() + { + this->clipVert(m_firstVert); + return m_next.finish(); + } + +private: + + VERT* m_prevVert; + VERT* m_firstVert; + Next& m_next; + + FORCEINLINE void clipSegmentVsPlane(VERT* vert0, VERT* vert1) + { + float* vert0coord = vert0->coord; + float* vert1coord = vert1->coord; + bool out0, out1; + if(which==-1) + out0 = vert0coord[coord] < -vert0coord[3]; + else + out0 = vert0coord[coord] > vert0coord[3]; + if(which==-1) + out1 = vert1coord[coord] < -vert1coord[3]; + else + out1 = vert1coord[coord] > vert1coord[3]; + + //CONSIDER: should we try and clip things behind the eye? does this code even successfully do it? not sure. + //if(coord==2 && which==1) { + // out0 = vert0coord[2] < 0; + // out1 = vert1coord[2] < 0; + //} + + //both outside: insert no points + if(out0 && out1) { + CLIPLOG(" both outside\n"); + } + + //both inside: insert the next point + if(!out0 && !out1) + { + CLIPLOG(" both inside\n"); + m_next.clipVert(vert1); + } + + //exiting volume: insert the clipped point + if(!out0 && out1) + { + CLIPLOG(" exiting\n"); + assert((u32)numScratchClipVerts < MAX_SCRATCH_CLIP_VERTS); + scratchClipVerts[numScratchClipVerts] = clipPoint<coord, which>(vert0,vert1); + m_next.clipVert(&scratchClipVerts[numScratchClipVerts++]); + } + + //entering volume: insert clipped point and the next (interior) point + if(out0 && !out1) { + CLIPLOG(" entering\n"); + assert((u32)numScratchClipVerts < MAX_SCRATCH_CLIP_VERTS); + scratchClipVerts[numScratchClipVerts] = clipPoint<coord, which>(vert1,vert0); + m_next.clipVert(&scratchClipVerts[numScratchClipVerts++]); + m_next.clipVert(vert1); + } + } +}; + +class ClipperOutput +{ +public: + void init(VERT* verts) + { + m_nextDestVert = verts; + m_numVerts = 0; + } + void clipVert(VERT* vert) + { + assert((u32)m_numVerts < MAX_CLIPPED_VERTS); + *m_nextDestVert++ = *vert; + m_numVerts++; + } + int finish() + { + return m_numVerts; + } +private: + VERT* m_nextDestVert; + int m_numVerts; +}; + +// see "Template juggling with Sutherland-Hodgman" http://www.codeguru.com/cpp/misc/misc/graphics/article.php/c8965__2/ +// for the idea behind setting things up like this. +static ClipperOutput clipperOut; +typedef ClipperPlane<2, 1,ClipperOutput> Stage6; static Stage6 clipper6 (clipperOut); // back plane //TODO - we need to parameterize back plane clipping +typedef ClipperPlane<2,-1,Stage6> Stage5; static Stage5 clipper5 (clipper6); // front plane +typedef ClipperPlane<1, 1,Stage5> Stage4; static Stage4 clipper4 (clipper5); // top plane +typedef ClipperPlane<1,-1,Stage4> Stage3; static Stage3 clipper3 (clipper4); // bottom plane +typedef ClipperPlane<0, 1,Stage3> Stage2; static Stage2 clipper2 (clipper3); // right plane +typedef ClipperPlane<0,-1,Stage2> Stage1; static Stage1 clipper (clipper2); // left plane + +void GFX3D_Clipper::clipPoly(POLY* poly, VERT** verts) +{ + CLIPLOG("==Begin poly==\n"); + + int type = poly->type; + numScratchClipVerts = 0; + + clipper.init(clippedPolys[clippedPolyCounter].clipVerts); + for(int i=0;i<type;i++) + clipper.clipVert(verts[i]); + int outType = clipper.finish(); + + assert((u32)outType < MAX_CLIPPED_VERTS); + if(outType < 3) + { + //a totally clipped poly. discard it. + //or, a degenerate poly. we're not handling these right now + } + else + { + clippedPolys[clippedPolyCounter].type = outType; + clippedPolys[clippedPolyCounter].poly = poly; + clippedPolyCounter++; + } +} + +void GFX3D_Clipper::clipSegmentVsPlane(VERT** verts, const int coord, int which) +{ + // not used (it's probably ok to delete this function) + assert(0); +} + +void GFX3D_Clipper::clipPolyVsPlane(const int coord, int which) +{ + // not used (it's probably ok to delete this function) + assert(0); +} + +#else // if not OPTIMIZED_CLIPPING_METHOD: + FORCEINLINE void GFX3D_Clipper::clipSegmentVsPlane(VERT** verts, const int coord, int which) { bool out0, out1; @@ -2433,4 +2607,6 @@ clippedPolyCounter++; } -} \ No newline at end of file +} +#endif + This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <ze...@us...> - 2009-10-15 08:07:37
|
Revision: 2962 http://desmume.svn.sourceforge.net/desmume/?rev=2962&view=rev Author: zeromus Date: 2009-10-15 08:07:01 +0000 (Thu, 15 Oct 2009) Log Message: ----------- fix boxtest once and for all by correctly emulating the addition overflow, which strawberry shortcake and garfields nightmare were actually relying on. also tighten the 3d timing a bit since strawberry shortcake was expecting the gxfifo to be emptied earlier than it was. Modified Paths: -------------- trunk/desmume/src/gfx3d.cpp Modified: trunk/desmume/src/gfx3d.cpp =================================================================== --- trunk/desmume/src/gfx3d.cpp 2009-10-15 06:34:41 UTC (rev 2961) +++ trunk/desmume/src/gfx3d.cpp 2009-10-15 08:07:01 UTC (rev 2962) @@ -249,12 +249,14 @@ } gxf_hardware; -//#define GFX_DELAY(x) MMU.gfx3dCycles = nds_timer + (1*x); -//#define GFX_DELAY_M2(x) MMU.gfx3dCycles += (1*x); +//these were 4 for the longest time (this is MUCH, MUCH less than their theoretical values) +//but it was changed to 1 for strawberry shortcake, which was issuing direct commands +//while the fifo was full, apparently expecting the fifo not to be full by that time. +//in general we are finding that 3d takes less time than we think.... +//although maybe the true culprit was charging the cpu less time for the dma. +#define GFX_DELAY(x) NDS_RescheduleGXFIFO(1); +#define GFX_DELAY_M2(x) NDS_RescheduleGXFIFO(1); -#define GFX_DELAY(x) NDS_RescheduleGXFIFO(4); -#define GFX_DELAY_M2(x) NDS_RescheduleGXFIFO(4); - using std::max; using std::min; @@ -363,7 +365,7 @@ static u32 BTind = 0; static u32 PTind = 0; -static CACHE_ALIGN float BTcoords[6] = {0.0, 0.0, 0.0, 0.0, 0.0, 0.0}; +static u16 BTcoords[6] = {0, 0, 0, 0, 0, 0}; static CACHE_ALIGN float PTcoords[4] = {0.0, 0.0, 0.0, 1.0}; //raw ds format poly attributes @@ -1358,16 +1360,13 @@ GFX_DELAY(1); } -int boxcounter = 0; -int passcounter=0; -int failcounter=0; BOOL gfx3d_glBoxTest(u32 v) { MMU_new.gxstat.tr = 0; // clear boxtest bit MMU_new.gxstat.tb = 1; // busy - BTcoords[BTind++] = float16table[v & 0xFFFF]; - BTcoords[BTind++] = float16table[v >> 16]; + BTcoords[BTind++] = v & 0xFFFF; + BTcoords[BTind++] = v >> 16; if (BTind < 5) return FALSE; BTind = 0; @@ -1388,48 +1387,35 @@ //(crafted to be clear, not fast.) - //there is a still a problem in here. - //nanostray title, ff4, ice age 3 work - //garfields nightmare, strawberry shortcake do not. - //but i think it is a timing issue, since - //1. shortcake can be made to flicker by tweaking btcoords - //2. the flicker can be made to go away by making dma cost todo instead of todo/4 - //the game is probably doing a box test and then dmaing an object to gxfifo, - //and then being sloppy about how long to wait before the next box test. - //(maybe bus lock would fix it) - //this doesnt seem to help garfield. garfield does seem to work better when its - //rendering is being constrained by the box test, but the box test is still failing in that game + //nanostray title, ff4, ice age 3 depend on this and work + //garfields nightmare and strawberry shortcake DO DEPEND on the overflow behavior. - float x = BTcoords[0]; - float y = BTcoords[1]; - float z = BTcoords[2]; - float w = BTcoords[3]; - float h = BTcoords[4]; - float d = BTcoords[5]; + u16 ux = BTcoords[0]; + u16 uy = BTcoords[1]; + u16 uz = BTcoords[2]; + u16 uw = BTcoords[3]; + u16 uh = BTcoords[4]; + u16 ud = BTcoords[5]; //craft the coords by adding extents to startpoint + float x = float16table[ux]; + float y = float16table[uy]; + float z = float16table[uz]; + float xw = float16table[(ux+uw)&0xFFFF]; //&0xFFFF not necessary for u16+u16 addition but added for emphasis + float yh = float16table[(uy+uh)&0xFFFF]; + float zd = float16table[(uz+ud)&0xFFFF]; + + //eight corners of cube VERT verts[8]; verts[0].set_coord(x,y,z,1); - verts[1].set_coord(x+w,y,z,1); - verts[2].set_coord(x+w,y+h,z,1); - verts[3].set_coord(x,y+h,z,1); - verts[4].set_coord(x,y,z+d,1); - verts[5].set_coord(x+w,y,z+d,1); - verts[6].set_coord(x+w,y+h,z+d,1); - verts[7].set_coord(x,y+h,z+d,1); + verts[1].set_coord(xw,y,z,1); + verts[2].set_coord(xw,yh,z,1); + verts[3].set_coord(x,yh,z,1); + verts[4].set_coord(x,y,zd,1); + verts[5].set_coord(xw,y,zd,1); + verts[6].set_coord(xw,yh,zd,1); + verts[7].set_coord(x,yh,zd,1); - //transform all coords - for(int i=0;i<8;i++) { - //MatrixMultVec4x4_M2(mtxCurrent[0], verts[i].coord); - - //yuck.. cant use the sse2 accelerated ones because vert.coords is not cache aligned or something - //i dunno - - //void _NOSSE_MatrixMultVec4x4 (const float *matrix, float *vecPtr); - //_NOSSE_MatrixMultVec4x4(mtxCurrent[1],verts[i].coord); - //_NOSSE_MatrixMultVec4x4(mtxCurrent[0],verts[i].coord); - } - //craft the faces of the box (clockwise) POLY polys[6]; polys[0].setVertIndexes(7,6,5,4); //near @@ -1497,7 +1483,6 @@ if(boxtestClipper.clippedPolyCounter>0) { //printf("%06d PASS %d\n",boxcounter,gxFIFO.size); MMU_new.gxstat.tr = 1; - passcounter++; break; } } @@ -1505,15 +1490,8 @@ if(MMU_new.gxstat.tr == 0) { //printf("%06d FAIL %d\n",boxcounter,gxFIFO.size); - failcounter++; } - //if(boxcounter==0) - //MMU_new.gxstat.tr = 1; - //MMU_new.gxstat.tr = 0; - - boxcounter++; - return TRUE; } @@ -1847,10 +1825,6 @@ void gfx3d_glFlush(u32 v) { - //printf("flush: fail: %d pass:%d\n",failcounter,passcounter); - boxcounter = 0; - failcounter=0; - passcounter=0; //printf("-------------FLUSH------------- (vcount=%d\n",nds.VCount); gfx3d.sortmode = BIT0(v); gfx3d.wbuffer = BIT1(v); @@ -2162,6 +2136,7 @@ { "GLBT", 4, 1, &BTind}, { "GLPT", 4, 1, &PTind}, { "GLPC", 4, 4, PTcoords}, + { "GBTC", 2, 6, &BTcoords[0]}, { "GFHE", 4, 1, &gxFIFO.head}, { "GFTA", 4, 1, &gxFIFO.tail}, { "GFSZ", 4, 1, &gxFIFO.size}, This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <ni...@us...> - 2009-10-15 10:59:25
|
Revision: 2963 http://desmume.svn.sourceforge.net/desmume/?rev=2963&view=rev Author: nitsuja Date: 2009-10-15 10:59:09 +0000 (Thu, 15 Oct 2009) Log Message: ----------- disabling a printf Modified Paths: -------------- trunk/desmume/src/gfx3d.cpp Modified: trunk/desmume/src/gfx3d.cpp =================================================================== --- trunk/desmume/src/gfx3d.cpp 2009-10-15 08:07:01 UTC (rev 2962) +++ trunk/desmume/src/gfx3d.cpp 2009-10-15 10:59:09 UTC (rev 2963) @@ -1526,7 +1526,7 @@ { GFX_DELAY(5); - printf("VECTEST\n"); + //printf("VECTEST\n"); CACHE_ALIGN float normal[4] = { normalTable[v&1023], normalTable[(v>>10)&1023], This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <ze...@us...> - 2009-10-15 18:10:51
|
Revision: 2965 http://desmume.svn.sourceforge.net/desmume/?rev=2965&view=rev Author: zeromus Date: 2009-10-15 18:10:18 +0000 (Thu, 15 Oct 2009) Log Message: ----------- tighten the 3d timing even more to fix marvel nemesis. this is now clearly at epic compatibility hack level as 3d takes virtually no time to execute, but lets gather data on whether there are any negative consequences. Modified Paths: -------------- trunk/desmume/src/gfx3d.cpp Modified: trunk/desmume/src/gfx3d.cpp =================================================================== --- trunk/desmume/src/gfx3d.cpp 2009-10-15 12:51:29 UTC (rev 2964) +++ trunk/desmume/src/gfx3d.cpp 2009-10-15 18:10:18 UTC (rev 2965) @@ -1785,7 +1785,7 @@ //this is a SPEED HACK //fifo is currently emulated more accurately than it probably needs to be. //without this batch size the emuloop will escape way too often to run fast. - const int HACK_FIFO_BATCH_SIZE = 32; + const int HACK_FIFO_BATCH_SIZE = 64; for(int i=0;i<HACK_FIFO_BATCH_SIZE;i++) { if(GFX_PIPErecv(&cmd, ¶m)) @@ -1801,6 +1801,15 @@ //for the earlier params. //printf("%05d:%03d:%12lld: executed 3d: %02X %08X\n",currFrameCounter, nds.VCount, nds_timer , cmd, param); gfx3d_execute(cmd, param); + + //this is a COMPATIBILITY HACK. + //this causes 3d to take virtually no time whatsoever to execute. + //this was done for marvel nemesis, but a similar family of + //hacks for ridiculously fast 3d execution has proven necessary for a number of games. + //the true answer is probably dma bus blocking.. but lets go ahead and try this and + //check the compatibility, at the very least it will be nice to know if any games suffer from + //3d running too fast + MMU.gfx3dCycles = nds_timer+1; } else break; } This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <ze...@us...> - 2009-11-01 18:05:23
|
Revision: 3004 http://desmume.svn.sourceforge.net/desmume/?rev=3004&view=rev Author: zeromus Date: 2009-11-01 18:04:57 +0000 (Sun, 01 Nov 2009) Log Message: ----------- fix a little bug in the 3d frameskipping Modified Paths: -------------- trunk/desmume/src/gfx3d.cpp Modified: trunk/desmume/src/gfx3d.cpp =================================================================== --- trunk/desmume/src/gfx3d.cpp 2009-11-01 11:04:14 UTC (rev 3003) +++ trunk/desmume/src/gfx3d.cpp 2009-11-01 18:04:57 UTC (rev 3004) @@ -1996,9 +1996,10 @@ void gfx3d_VBlankEndSignal(bool skipFrame) { if (!drawPending) return; + if(skipFrame) return; + drawPending = FALSE; - if(skipFrame) return; //if the null 3d core is chosen, then we need to clear out the 3d buffers to keep old data from being rendered if(gpu3D == &gpu3DNull || !CommonSettings.showGpu.main) { This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <ni...@us...> - 2009-11-08 19:46:18
|
Revision: 3037 http://desmume.svn.sourceforge.net/desmume/?rev=3037&view=rev Author: nitsuja Date: 2009-11-08 19:46:09 +0000 (Sun, 08 Nov 2009) Log Message: ----------- fix for 3d lighting sometimes being screwed up on the frame after loading a savestate Modified Paths: -------------- trunk/desmume/src/gfx3d.cpp Modified: trunk/desmume/src/gfx3d.cpp =================================================================== --- trunk/desmume/src/gfx3d.cpp 2009-11-08 19:09:15 UTC (rev 3036) +++ trunk/desmume/src/gfx3d.cpp 2009-11-08 19:46:09 UTC (rev 3037) @@ -2223,7 +2223,7 @@ void gfx3d_savestate(EMUFILE* os) { //version - write32le(3,os); + write32le(4,os); //dump the render lists OSWRITE(vertlist->count); @@ -2241,6 +2241,10 @@ } gxf_hardware.savestate(os); + + // evidently these need to be saved because we don't cache the matrix that would need to be used to properly regenerate them + OSWRITE(cacheLightDirection); + OSWRITE(cacheHalfVector); } bool gfx3d_loadstate(EMUFILE* is, int size) @@ -2291,6 +2295,12 @@ gfx3d.polylist->count=0; gfx3d.vertlist->count=0; + if(version >= 4) + { + OSREAD(cacheLightDirection); + OSREAD(cacheHalfVector); + } + return true; } This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <ze...@us...> - 2009-12-05 06:41:35
|
Revision: 3114 http://desmume.svn.sourceforge.net/desmume/?rev=3114&view=rev Author: zeromus Date: 2009-12-05 06:41:06 +0000 (Sat, 05 Dec 2009) Log Message: ----------- fix vectest Modified Paths: -------------- trunk/desmume/src/gfx3d.cpp Modified: trunk/desmume/src/gfx3d.cpp =================================================================== --- trunk/desmume/src/gfx3d.cpp 2009-12-04 11:46:32 UTC (rev 3113) +++ trunk/desmume/src/gfx3d.cpp 2009-12-05 06:41:06 UTC (rev 3114) @@ -1549,7 +1549,9 @@ { GFX_DELAY(5); - printf("VECTEST\n"); + //this is tested by phoenix wright in its evidence inspector modelviewer + //i am not sure exactly what it is doing, maybe it is testing to ensure + //that the normal vector for the point of interest is camera-facing. CACHE_ALIGN float normal[4] = { normalTable[v&1023], normalTable[(v>>10)&1023], @@ -1558,9 +1560,9 @@ MatrixMultVec4x4(mtxCurrent[2], normal); - s16 x = (s16)(normal[0]); - s16 y = (s16)(normal[1]); - s16 z = (s16)(normal[2]); + s16 x = (s16)(normal[0]*4096); + s16 y = (s16)(normal[1]*4096); + s16 z = (s16)(normal[2]*4096); MMU_new.gxstat.tb = 0; // clear busy T1WriteWord(MMU.MMU_MEM[0][0x40], 0x630, x); This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <ric...@us...> - 2009-12-28 13:24:47
|
Revision: 3256 http://desmume.svn.sourceforge.net/desmume/?rev=3256&view=rev Author: riccardom Date: 2009-12-28 13:24:40 +0000 (Mon, 28 Dec 2009) Log Message: ----------- Remove unused vars. Modified Paths: -------------- trunk/desmume/src/gfx3d.cpp Modified: trunk/desmume/src/gfx3d.cpp =================================================================== --- trunk/desmume/src/gfx3d.cpp 2009-12-28 13:22:49 UTC (rev 3255) +++ trunk/desmume/src/gfx3d.cpp 2009-12-28 13:24:40 UTC (rev 3256) @@ -152,8 +152,6 @@ decode: //printf("[%05d] gxf: decoding %08X\n",currFrameCounter,val); - bool valid = true; - bool gimpyCommand = false; const u8 commands[] = { val&0xFF, (val>>8)&0xFF, (val>>16)&0xFF, (val>>24)&0xFF }; const u8 commandTypes[] = { gfx3d_commandTypes[commands[0]], gfx3d_commandTypes[commands[1]],gfx3d_commandTypes[commands[2]], gfx3d_commandTypes[commands[3]] }; This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <ric...@us...> - 2010-03-12 14:48:26
|
Revision: 3403 http://desmume.svn.sourceforge.net/desmume/?rev=3403&view=rev Author: riccardom Date: 2010-03-12 14:48:18 +0000 (Fri, 12 Mar 2010) Log Message: ----------- colorAlpha is not used anymore. Modified Paths: -------------- trunk/desmume/src/gfx3d.cpp Modified: trunk/desmume/src/gfx3d.cpp =================================================================== --- trunk/desmume/src/gfx3d.cpp 2010-03-12 14:47:15 UTC (rev 3402) +++ trunk/desmume/src/gfx3d.cpp 2010-03-12 14:48:18 UTC (rev 3403) @@ -384,7 +384,6 @@ //these dont need to go into the savestate. they can be regenerated from HW registers //from polygonattr: static unsigned int cullingMask=0; -static u8 colorAlpha=0; static u32 envMode=0; static u32 lightMask=0; //other things: This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <yos...@us...> - 2010-03-26 15:33:52
|
Revision: 3441 http://desmume.svn.sourceforge.net/desmume/?rev=3441&view=rev Author: yoshihiropsp Date: 2010-03-26 15:33:46 +0000 (Fri, 26 Mar 2010) Log Message: ----------- Fixed GFX3D reset on xbox hardware #define _XBOX Modified Paths: -------------- trunk/desmume/src/gfx3d.cpp Modified: trunk/desmume/src/gfx3d.cpp =================================================================== --- trunk/desmume/src/gfx3d.cpp 2010-03-26 15:32:15 UTC (rev 3440) +++ trunk/desmume/src/gfx3d.cpp 2010-03-26 15:33:46 UTC (rev 3441) @@ -495,8 +495,11 @@ void gfx3d_reset() { +#ifndef _XBOX gfx3d = GFX3D(); - +#else + GFX3D(); +#endif gxf_hardware.reset(); control = 0; This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <ze...@us...> - 2010-03-31 19:19:49
|
Revision: 3456 http://desmume.svn.sourceforge.net/desmume/?rev=3456&view=rev Author: zeromus Date: 2010-03-31 19:19:39 +0000 (Wed, 31 Mar 2010) Log Message: ----------- gfx3d: fiddle with poly sorting. break some things, fix more things. broken things I think are due to floating point gfx3d math Modified Paths: -------------- trunk/desmume/src/gfx3d.cpp Modified: trunk/desmume/src/gfx3d.cpp =================================================================== --- trunk/desmume/src/gfx3d.cpp 2010-03-31 06:58:14 UTC (rev 3455) +++ trunk/desmume/src/gfx3d.cpp 2010-03-31 19:19:39 UTC (rev 3456) @@ -1978,8 +1978,8 @@ //also the buttons in the knights in the nightmare frontend depend on this and the perspective division if (poly1.maxy < poly2.maxy) return true; if (poly1.maxy > poly2.maxy) return false; - if (poly1.miny > poly2.miny) return true; - if (poly1.miny < poly2.miny) return false; + if (poly1.miny < poly2.miny) return true; + if (poly1.miny > poly2.miny) return false; //notably, the main shop interface in harvest moon will not have a correct RTN button //i think this is due to a math error rounding its position to one pixel too high and it popping behind //the bar that it sits on. @@ -2031,17 +2031,18 @@ POLY &poly = polylist->list[i]; float verty = vertlist->list[poly.vertIndexes[0]].y; float vertw = vertlist->list[poly.vertIndexes[0]].w; - verty = (verty+vertw)/(2*vertw); + verty = 1.0f-(verty+vertw)/(2*vertw); poly.miny = poly.maxy = verty; for(int j=1; j<poly.type; j++) { verty = vertlist->list[poly.vertIndexes[j]].y; vertw = vertlist->list[poly.vertIndexes[j]].w; - verty = (verty+vertw)/(2*vertw); + verty = 1.0f-(verty+vertw)/(2*vertw); poly.miny = min(poly.miny, verty); poly.maxy = max(poly.maxy, verty); } + } //we need to sort the poly list with alpha polys last This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <ric...@us...> - 2010-04-21 20:19:03
|
Revision: 3574 http://desmume.svn.sourceforge.net/desmume/?rev=3574&view=rev Author: riccardom Date: 2010-04-21 20:18:56 +0000 (Wed, 21 Apr 2010) Log Message: ----------- Make log3D static and put it under the same ifdef which surround its usage. Modified Paths: -------------- trunk/desmume/src/gfx3d.cpp Modified: trunk/desmume/src/gfx3d.cpp =================================================================== --- trunk/desmume/src/gfx3d.cpp 2010-04-21 14:41:43 UTC (rev 3573) +++ trunk/desmume/src/gfx3d.cpp 2010-04-21 20:18:56 UTC (rev 3574) @@ -1638,7 +1638,9 @@ return (unsigned int)(PTcoords[index] * 4096.0f); } -void log3D(u8 cmd, u32 param) +//#define _3D_LOG_EXEC +#ifdef _3D_LOG_EXEC +static void log3D(u8 cmd, u32 param) { INFO("3D command 0x%02X: ", cmd); switch (cmd) @@ -1760,8 +1762,8 @@ } printf("\t\t(FIFO size %i)\n", gxFIFO.size); } +#endif -//#define _3D_LOG_EXEC static void gfx3d_execute(u8 cmd, u32 param) { #ifdef _3D_LOG_EXEC This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <mta...@us...> - 2010-04-25 17:53:53
|
Revision: 3598 http://desmume.svn.sourceforge.net/desmume/?rev=3598&view=rev Author: mtabachenko Date: 2010-04-25 17:53:47 +0000 (Sun, 25 Apr 2010) Log Message: ----------- core: - fix bug in Geometry Engine when in packed commands latest command is undefined (bug #2973143); Modified Paths: -------------- trunk/desmume/src/gfx3d.cpp Modified: trunk/desmume/src/gfx3d.cpp =================================================================== --- trunk/desmume/src/gfx3d.cpp 2010-04-25 16:02:18 UTC (rev 3597) +++ trunk/desmume/src/gfx3d.cpp 2010-04-25 17:53:47 UTC (rev 3598) @@ -157,13 +157,15 @@ //decode a packed command decode: //printf("[%05d] gxf: decoding %08X\n",currFrameCounter,val); - + if (val == 0) return; // nop + const u8 commands[] = { val&0xFF, (val>>8)&0xFF, (val>>16)&0xFF, (val>>24)&0xFF }; const u8 commandTypes[] = { gfx3d_commandTypes[commands[0]], gfx3d_commandTypes[commands[1]],gfx3d_commandTypes[commands[2]], gfx3d_commandTypes[commands[3]] }; for(int i=0;i<4;i++) { u8 cmd = commands[i]; u8 type = commandTypes[i]; + if(type == INVALID_COMMAND) { commandsPending[i].command = INVALID_COMMAND; } else { @@ -179,8 +181,12 @@ //these are valid commands with no parameters. they might need special handling //as long as there is a subsequent defined command with parameters, we're safe bool safe = false; - for(int j=i+1;j<4;j++) { - if(commandTypes[j] != INVALID_COMMAND) { + if (i == 3) + safe = true; + else + // start loop from (i+1) always skip last command + for(u8 j=i+1;j<4;j++) { + if((commandTypes[j] != INVALID_COMMAND)) { safe = true; break; } This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <ze...@us...> - 2010-06-13 23:11:39
|
Revision: 3662 http://desmume.svn.sourceforge.net/desmume/?rev=3662&view=rev Author: zeromus Date: 2010-06-13 23:11:33 +0000 (Sun, 13 Jun 2010) Log Message: ----------- what dont you guys like debug prints? Modified Paths: -------------- trunk/desmume/src/gfx3d.cpp Modified: trunk/desmume/src/gfx3d.cpp =================================================================== --- trunk/desmume/src/gfx3d.cpp 2010-06-13 15:08:57 UTC (rev 3661) +++ trunk/desmume/src/gfx3d.cpp 2010-06-13 23:11:33 UTC (rev 3662) @@ -1376,7 +1376,7 @@ static BOOL gfx3d_glBoxTest(u32 v) { - printf("boxtest\n"); + //printf("boxtest\n"); MMU_new.gxstat.tr = 0; // clear boxtest bit MMU_new.gxstat.tb = 1; // busy @@ -1510,7 +1510,7 @@ static BOOL gfx3d_glPosTest(u32 v) { - printf("postest\n"); + //printf("postest\n"); //this is apparently tested by transformers decepticons and ultimate spiderman //printf("POSTEST\n"); @@ -1539,7 +1539,7 @@ static void gfx3d_glVecTest(u32 v) { - printf("vectest\n"); + //printf("vectest\n"); GFX_DELAY(5); //this is tested by phoenix wright in its evidence inspector modelviewer This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <ze...@us...> - 2010-08-08 22:46:19
|
Revision: 3735 http://desmume.svn.sourceforge.net/desmume/?rev=3735&view=rev Author: zeromus Date: 2010-08-08 22:46:13 +0000 (Sun, 08 Aug 2010) Log Message: ----------- would you believe there are still bugs in our @#&*@#ing matrix stack? fixes a bug that causes overwrite of matrix stack when offset==31; and apply fixed point logic for texCoordinateTransform==3 Modified Paths: -------------- trunk/desmume/src/gfx3d.cpp Modified: trunk/desmume/src/gfx3d.cpp =================================================================== --- trunk/desmume/src/gfx3d.cpp 2010-08-06 16:53:23 UTC (rev 3734) +++ trunk/desmume/src/gfx3d.cpp 2010-08-08 22:46:13 UTC (rev 3735) @@ -619,18 +619,17 @@ if (texCoordinateTransform == 3) { - //UNTESTED since fixed point conversion, and almost certainly wrong. - last_s =((coord[0]*mtxCurrent[3][0] + - coord[1]*mtxCurrent[3][4] + - coord[2]*mtxCurrent[3][8]) + _s * 16.0f) / 16.0f; - last_t =((coord[0]*mtxCurrent[3][1] + - coord[1]*mtxCurrent[3][5] + - coord[2]*mtxCurrent[3][9]) + _t * 16.0f) / 16.0f; - last_s /= 4096.0f; - last_t /= 4096.0f; + //Tested by: Eledees The Adventures of Kai and Zero (E) [title screen and frontend menus] + last_s = (s32)(((s64)s16coord[0] * mtxCurrent[3][0] + + (s64)s16coord[1] * mtxCurrent[3][4] + + (s64)s16coord[2] * mtxCurrent[3][8] + + (((s64)(_s))<<24))>>24); + last_t = (s32)(((s64)s16coord[0] * mtxCurrent[3][1] + + (s64)s16coord[1] * mtxCurrent[3][5] + + (s64)s16coord[2] * mtxCurrent[3][9] + + (((s64)(_t))<<24))>>24); } - //refuse to do anything if we have too many verts or polys polygonListCompleted = 0; if(vertlist->count >= VERTLIST_SIZE) @@ -889,7 +888,7 @@ if(mymode==0 || mymode==3) v = 0; - if (v > 31) return; + if (v >= 31) return; MatrixStackLoadMatrix (&mtxStack[mymode], v, mtxCurrent[mymode]); @@ -909,7 +908,7 @@ if(mymode==0 || mymode==3) v = 0; - if (v > 31) return; + if (v >= 31) return; MatrixCopy (mtxCurrent[mymode], MatrixStackGetPos(&mtxStack[mymode], v)); This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <ze...@us...> - 2011-01-16 19:01:28
|
Revision: 3909 http://desmume.svn.sourceforge.net/desmume/?rev=3909&view=rev Author: zeromus Date: 2011-01-16 19:01:21 +0000 (Sun, 16 Jan 2011) Log Message: ----------- ogl renderer: fix line loop detection so that it is aware of the existence of 3d games Modified Paths: -------------- trunk/desmume/src/gfx3d.cpp Modified: trunk/desmume/src/gfx3d.cpp =================================================================== --- trunk/desmume/src/gfx3d.cpp 2011-01-14 03:19:05 UTC (rev 3908) +++ trunk/desmume/src/gfx3d.cpp 2011-01-16 19:01:21 UTC (rev 3909) @@ -2823,7 +2823,7 @@ for(int j = i + 1; j < type; j++) { vert2 = &gfx3d.vertlist->list[poly->vertIndexes[j]]; - if (vert1->x == vert2->x && vert1->y == vert2->y) + if (vert1->x == vert2->x && vert1->y == vert2->y && vert1->z == vert2->z) { duplicatedVert[j] = true; } @@ -2854,6 +2854,11 @@ { horizontalLine = false; } + + //the Z is different, and this method isn't even meant to catch that + if (vert1->coord[2] != vert2->coord[2]) + return false; + } if (horizontalLine || verticalLine) return true; This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <go...@us...> - 2011-02-06 05:17:07
|
Revision: 3924 http://desmume.svn.sourceforge.net/desmume/?rev=3924&view=rev Author: gocha Date: 2011-02-06 05:17:01 +0000 (Sun, 06 Feb 2011) Log Message: ----------- Commented out r3909 changes, because of Portrait of Ruin warp stone regression. I guess, not much sure though, gfx3d_IsLinePoly doesn't need to take Z position. Z will be handled well by each renderer, whether it's polygon or line. Modified Paths: -------------- trunk/desmume/src/gfx3d.cpp Modified: trunk/desmume/src/gfx3d.cpp =================================================================== --- trunk/desmume/src/gfx3d.cpp 2011-02-06 03:07:20 UTC (rev 3923) +++ trunk/desmume/src/gfx3d.cpp 2011-02-06 05:17:01 UTC (rev 3924) @@ -2823,7 +2823,9 @@ for(int j = i + 1; j < type; j++) { vert2 = &gfx3d.vertlist->list[poly->vertIndexes[j]]; - if (vert1->x == vert2->x && vert1->y == vert2->y && vert1->z == vert2->z) + if (vert1->x == vert2->x && vert1->y == vert2->y + //&& vert1->z == vert2->z + ) { duplicatedVert[j] = true; } @@ -2856,9 +2858,8 @@ } //the Z is different, and this method isn't even meant to catch that - if (vert1->coord[2] != vert2->coord[2]) - return false; - + //if (vert1->coord[2] != vert2->coord[2]) + // return false; } if (horizontalLine || verticalLine) return true; This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <mta...@us...> - 2011-02-25 14:57:07
|
Revision: 3937 http://desmume.svn.sourceforge.net/desmume/?rev=3937&view=rev Author: mtabachenko Date: 2011-02-25 14:57:01 +0000 (Fri, 25 Feb 2011) Log Message: ----------- - fix line segment detection; Modified Paths: -------------- trunk/desmume/src/gfx3d.cpp Modified: trunk/desmume/src/gfx3d.cpp =================================================================== --- trunk/desmume/src/gfx3d.cpp 2011-02-25 07:21:52 UTC (rev 3936) +++ trunk/desmume/src/gfx3d.cpp 2011-02-25 14:57:01 UTC (rev 3937) @@ -766,27 +766,26 @@ POLY &poly = polylist->list[polylist->count]; poly.vtxFormat = vtxFormat; - if (poly.type == 4) - { // Line stream polygon detect - // Tested" Castlevania POR - warp stone, trajectory of ricochet, "Eye of Decay" - u8 duplicatedVerts = 0; - for (int i = 0; i < (poly.type-1); i++) - { - VERT &vert1 = vertlist->list[poly.vertIndexes[i]]; - for (int t = (i+1); t < poly.type; t++) - { - VERT &vert2 = vertlist->list[poly.vertIndexes[t]]; - if ((vert1.x == vert2.x) && (vert1.y == vert2.y)) - duplicatedVerts++; - } - } - if (duplicatedVerts == 2) - { - //printf("Line stream polygon detected\n"); - poly.vtxFormat = vtxFormat + 4; - } + + // Line segment detect + // Tested" Castlevania POR - warp stone, trajectory of ricochet, "Eye of Decay" + bool duplicated = false; + VERT &vert0 = vertlist->list[poly.vertIndexes[0]]; + VERT &vert1 = vertlist->list[poly.vertIndexes[1]]; + VERT &vert2 = vertlist->list[poly.vertIndexes[2]]; + if ( (vert0.x == vert1.x) && (vert0.y == vert1.y) ) duplicated = true; + else + if ( (vert1.x == vert2.x) && (vert1.y == vert2.y) ) duplicated = true; + else + if ( (vert0.y == vert1.y) && (vert1.y == vert2.y) ) duplicated = true; + else + if ( (vert0.x == vert1.x) && (vert1.x == vert2.x) ) duplicated = true; + if (duplicated) + { + //printf("Line Segmet detected (poly type %i, mode %i)\n", poly.type, poly.vtxFormat); + poly.vtxFormat = vtxFormat + 4; } - + poly.polyAttr = polyAttr; poly.texParam = textureFormat; poly.texPalette = texturePalette; This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <mta...@us...> - 2011-03-26 17:06:38
|
Revision: 3958 http://desmume.svn.sourceforge.net/desmume/?rev=3958&view=rev Author: mtabachenko Date: 2011-03-26 17:06:32 +0000 (Sat, 26 Mar 2011) Log Message: ----------- GE: - removed hacks from Geometry FIFO; Modified Paths: -------------- trunk/desmume/src/gfx3d.cpp Modified: trunk/desmume/src/gfx3d.cpp =================================================================== --- trunk/desmume/src/gfx3d.cpp 2011-03-25 20:48:27 UTC (rev 3957) +++ trunk/desmume/src/gfx3d.cpp 2011-03-26 17:06:32 UTC (rev 3958) @@ -71,31 +71,29 @@ in this function: */ static void gfx3d_doFlush(); -#define INVALID_COMMAND 0xFF -#define UNDEFINED_COMMAND 0xCC +#define GFX_NOARG_COMMAND 0x00 +#define GFX_INVALID_COMMAND 0xFF +#define GFX_UNDEFINED_COMMAND 0xCC static const u8 gfx3d_commandTypes[] = { - 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, //invalid commands; no parameters - 0x01,0x00,0x01,0x01,0x01,0x00,0x10,0x0C, 0x10,0x0C,0x09,0x03,0x03,0xCC,0xCC,0xCC, //matrix commands - 0x01,0x01,0x01,0x02,0x01,0x01,0x01,0x01, 0x01,0x01,0x01,0x01,0xCC,0xCC,0xCC,0xCC, //vertex and per-vertex material commands - 0x01,0x01,0x01,0x01,0x20,0xCC,0xCC,0xCC, 0xCC,0xCC,0xCC,0xCC,0xCC,0xCC,0xCC,0xCC, //lighting engine material commands - 0x01,0x00,0xCC,0xCC,0xCC,0xCC,0xCC,0xCC, 0xCC,0xCC,0xCC,0xCC,0xCC,0xCC,0xCC,0xCC, //begin and end - 0x01,0xCC,0xCC,0xCC,0xCC,0xCC,0xCC,0xCC, 0xCC,0xCC,0xCC,0xCC,0xCC,0xCC,0xCC,0xCC, //swapbuffers - 0x01,0xCC,0xCC,0xCC,0xCC,0xCC,0xCC,0xCC, 0xCC,0xCC,0xCC,0xCC,0xCC,0xCC,0xCC,0xCC, //viewport - 0x03,0x02,0x01,0xCC,0xCC,0xCC,0xCC,0xCC, 0xCC,0xCC,0xCC,0xCC,0xCC,0xCC,0xCC,0xCC, //tests + /* 00 */ 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, //invalid commands; no parameters + /* 10 */ 0x01,0x00,0x01,0x01,0x01,0x00,0x10,0x0C, 0x10,0x0C,0x09,0x03,0x03,0xCC,0xCC,0xCC, //matrix commands + /* 20 */ 0x01,0x01,0x01,0x02,0x01,0x01,0x01,0x01, 0x01,0x01,0x01,0x01,0xCC,0xCC,0xCC,0xCC, //vertex and per-vertex material commands + /* 30 */ 0x01,0x01,0x01,0x01,0x20,0xCC,0xCC,0xCC, 0xCC,0xCC,0xCC,0xCC,0xCC,0xCC,0xCC,0xCC, //lighting engine material commands + /* 40 */ 0x01,0x00,0xCC,0xCC,0xCC,0xCC,0xCC,0xCC, 0xCC,0xCC,0xCC,0xCC,0xCC,0xCC,0xCC,0xCC, //begin and end + /* 50 */ 0x01,0xCC,0xCC,0xCC,0xCC,0xCC,0xCC,0xCC, 0xCC,0xCC,0xCC,0xCC,0xCC,0xCC,0xCC,0xCC, //swapbuffers + /* 60 */ 0x01,0xCC,0xCC,0xCC,0xCC,0xCC,0xCC,0xCC, 0xCC,0xCC,0xCC,0xCC,0xCC,0xCC,0xCC,0xCC, //viewport + /* 70 */ 0x03,0x02,0x01,0xCC,0xCC,0xCC,0xCC,0xCC, 0xCC,0xCC,0xCC,0xCC,0xCC,0xCC,0xCC,0xCC, //tests //0x80: - 0xCC,0xCC,0xCC,0xCC,0xCC,0xCC,0xCC,0xCC, 0xCC,0xCC,0xCC,0xCC,0xCC,0xCC,0xCC,0xCC, - 0xCC,0xCC,0xCC,0xCC,0xCC,0xCC,0xCC,0xCC, 0xCC,0xCC,0xCC,0xCC,0xCC,0xCC,0xCC,0xCC, - 0xCC,0xCC,0xCC,0xCC,0xCC,0xCC,0xCC,0xCC, 0xCC,0xCC,0xCC,0xCC,0xCC,0xCC,0xCC,0xCC, - 0xCC,0xCC,0xCC,0xCC,0xCC,0xCC,0xCC,0xCC, 0xCC,0xCC,0xCC,0xCC,0xCC,0xCC,0xCC,0xCC, - 0xCC,0xCC,0xCC,0xCC,0xCC,0xCC,0xCC,0xCC, 0xCC,0xCC,0xCC,0xCC,0xCC,0xCC,0xCC,0xCC, - 0xCC,0xCC,0xCC,0xCC,0xCC,0xCC,0xCC,0xCC, 0xCC,0xCC,0xCC,0xCC,0xCC,0xCC,0xCC,0xCC, - 0xCC,0xCC,0xCC,0xCC,0xCC,0xCC,0xCC,0xCC, 0xCC,0xCC,0xCC,0xCC,0xCC,0xCC,0xCC,0xCC, - 0xCC,0xCC,0xCC,0xCC,0xCC,0xCC,0xCC,0xCC, 0xCC,0xCC,0xCC,0xCC,0xCC,0xCC,0xCC,0xCC + /* 80 */ 0xCC,0xCC,0xCC,0xCC,0xCC,0xCC,0xCC,0xCC, 0xCC,0xCC,0xCC,0xCC,0xCC,0xCC,0xCC,0xCC, + /* 90 */ 0xCC,0xCC,0xCC,0xCC,0xCC,0xCC,0xCC,0xCC, 0xCC,0xCC,0xCC,0xCC,0xCC,0xCC,0xCC,0xCC, + /* A0 */ 0xCC,0xCC,0xCC,0xCC,0xCC,0xCC,0xCC,0xCC, 0xCC,0xCC,0xCC,0xCC,0xCC,0xCC,0xCC,0xCC, + /* B0 */ 0xCC,0xCC,0xCC,0xCC,0xCC,0xCC,0xCC,0xCC, 0xCC,0xCC,0xCC,0xCC,0xCC,0xCC,0xCC,0xCC, + /* C0 */ 0xCC,0xCC,0xCC,0xCC,0xCC,0xCC,0xCC,0xCC, 0xCC,0xCC,0xCC,0xCC,0xCC,0xCC,0xCC,0xCC, + /* D0 */ 0xCC,0xCC,0xCC,0xCC,0xCC,0xCC,0xCC,0xCC, 0xCC,0xCC,0xCC,0xCC,0xCC,0xCC,0xCC,0xCC, + /* E0 */ 0xCC,0xCC,0xCC,0xCC,0xCC,0xCC,0xCC,0xCC, 0xCC,0xCC,0xCC,0xCC,0xCC,0xCC,0xCC,0xCC, + /* F0 */ 0xCC,0xCC,0xCC,0xCC,0xCC,0xCC,0xCC,0xCC, 0xCC,0xCC,0xCC,0xCC,0xCC,0xCC,0xCC,0xCC }; - -//todo: it would be nice to make some kind of state machine that more closely models the hardware -//but this is servicable for now class GXF_Hardware { public: @@ -109,106 +107,72 @@ for(int i=0;i<4;i++) { commandsPending[i].command = 0; commandsPending[i].countdown = 0; + size = 0; } } - //todo - things in here other than the very first thing involving GFX3D_NOP_NOARG_HACK I am not too sure about. - void receive(u32 val) { - bool hack = false; - if(size()>0 && val != 0 && - (front().command == 0x15 || front().command == 0x11 || front().command == 0x41 - || front().command == GFX3D_NOP_NOARG_HACK //nintendogs dalmatian sends these I think. - )) + + void receive(u32 val) + { + if (size > 0) { - //apparently a zero is swallowed in this case but if another value is sent - //processing will continue - if(front().command == GFX3D_NOP_NOARG_HACK) { } - else + GFX_FIFOsend(front().command, val); + front().countdown--; + if (front().countdown == 0) { - //printf("gxf: sending hack %02X: (dummy=0)\n", front().command); - GFX_FIFOsend(front().command,0); - } - hack = true; - goto hackTrigger; - } - if(countdown>0) { - //received a parameter - //printf("gxf: sending %02X: %08X\n", front().command,val); - //if(commandsPending.front() == GFX3D_NOP_NOARG_HACK) - //{} - //else - GFX_FIFOsend(front().command,val); - hackTrigger: - countdown--; - while(countdown==0) { + size--; + if (size == 0) return; dequeue(); - trigger: - //dont set hack to false if you jumped from below! it needs to be true for when you jump down from above. - //oh my what a mess. - if(size()==0) break; - countdown = front().countdown; - if(!countdown) { - if(front().command != INVALID_COMMAND - && front().command != GFX3D_NOP_NOARG_HACK //g.i. joe sends these in the form of 0xFF commands - ){ - //printf("[%06d]gxf: sending %02X: (dummy=0)\n", currFrameCounter,front().command); - GFX_FIFOsend(front().command,0); - } + + while (gfx3d_commandTypes[front().command] == GFX_NOARG_COMMAND) + { + GFX_FIFOsend(front().command, 0); + if (size == 0) break; + size--; dequeue(); } } - if(hack) goto decode; - } else { - //decode a packed command -decode: - //printf("[%05d] gxf: decoding %08X\n",currFrameCounter,val); + } + else + { if (val == 0) return; // nop const u8 commands[] = { val&0xFF, (val>>8)&0xFF, (val>>16)&0xFF, (val>>24)&0xFF }; - const u8 commandTypes[] = { gfx3d_commandTypes[commands[0]], gfx3d_commandTypes[commands[1]],gfx3d_commandTypes[commands[2]], gfx3d_commandTypes[commands[3]] }; + const u8 commandTypes[] = { gfx3d_commandTypes[commands[0]], gfx3d_commandTypes[commands[1]], gfx3d_commandTypes[commands[2]], gfx3d_commandTypes[commands[3]] }; - for(int i=0;i<4;i++) { - u8 cmd = commands[i]; - u8 type = commandTypes[i]; + commandCursor = 0; + size = 0; - if(type == INVALID_COMMAND) { - commandsPending[i].command = INVALID_COMMAND; - } else { - if(type == UNDEFINED_COMMAND) - { - commandsPending[i].command = GFX3D_NOP_NOARG_HACK; //enqueue a single undefined command we know how to handle - } - else commandsPending[i].command = cmd; + // A \x93command without parameters\x94 is one of the four following commands: + // - PushMatrix + // - LoadIdentity + // - End + // - Commands undefined within the region between 0x10 and 0xFF + + for (u8 i = 0; i < 4; i++) + { + if (commandTypes[i] == GFX_INVALID_COMMAND) + { + //printf("gfx3D: invalid command (%02X)\n", commands[i]); + continue; } - if(type == UNDEFINED_COMMAND - //|| type == 0x00 //DON'T DO THIS: galactik football will break if you do (ingame character portraits etc.) as well as nintendogs dalmatian - ) { - //these are valid commands with no parameters. they might need special handling - //as long as there is a subsequent defined command with parameters, we're safe - bool safe = false; - if (i == 3) - safe = true; - else - // start loop from (i+1) always skip last command - for(u8 j=i+1;j<4;j++) { - if((commandTypes[j] != INVALID_COMMAND)) { - safe = true; - break; - } - } - if(safe) { - commandsPending[i].countdown = 0; - } else { - //we need to receive a dummy parameter in this case - commandsPending[i].countdown = 1; - } - } else if(type != INVALID_COMMAND) { - commandsPending[i].countdown = type; - } else commandsPending[i].countdown = 0; - } - commandCursor = 0; - countdown = front().countdown; - if(countdown==0) - goto trigger; + if (commandTypes[i] == GFX_UNDEFINED_COMMAND) + { + //printf("gfx3D: undefined command (%02X)\n", commands[i]); + continue; + } + commandsPending[size].command = commands[i]; + commandsPending[size].countdown = commandTypes[i]; + //printf("%i: CMD %02X size %i\n", i, commands[i], commandsPending[size].countdown); + if ((commandsPending[size].countdown == 0) && (size == 0)) // cmd 0x11, 0x15, 0x41 - no params + { + GFX_FIFOsend(commands[i], 0); + + while ((i < 4) && commands[i+1] != 0 && gfx3d_commandTypes[commands[i+1]] == GFX_NOARG_COMMAND) + GFX_FIFOsend(commands[++i], 0); + } + else + size++; + } } } @@ -222,17 +186,17 @@ private: void dequeue() { commandCursor++; } CommandItem& front() { return commandsPending[commandCursor]; } - u32 size() { return 4-commandCursor; } + u32 size; public: void savestate(EMUFILE *f) { //TODO - next time we invalidate savestates, simplify this format. - write32le(0,f); //version - write32le(size(),f); - for(u32 i=commandCursor;i<4;i++) write8le(commandsPending[i].command,f); - write32le(0,f); - for(u32 i=commandCursor;i<4;i++) write8le(commandsPending[i].countdown,f); + write32le(1,f); //version + write32le(size,f); + write32le(commandCursor,f); + for(u32 i=0;i<4;i++) write8le(commandsPending[i].command,f); + for(u32 i=0;i<4;i++) write8le(commandsPending[i].countdown,f); write8le(countdown,f); } @@ -240,16 +204,25 @@ { u32 version; if(read32le(&version,f) != 1) return false; - if(version != 0) return false; + if(version > 1) return false; - u32 tempsize; - read32le(&tempsize,f); - commandCursor = 4-tempsize; - for(u32 i=0;i<commandCursor;i++) commandsPending[i].command = 0; - for(u32 i=commandCursor;i<4;i++) read8le(&commandsPending[i].command,f); - read32le(&tempsize,f); - for(u32 i=0;i<commandCursor;i++) commandsPending[i].countdown = 0; - for(u32 i=commandCursor;i<4;i++) read8le(&commandsPending[i].countdown,f); + if (version == 0) + { + read32le(&size,f); + commandCursor = 4-size; + for(u32 i=commandCursor;i<4;i++) read8le(&commandsPending[i-commandCursor].command,f); + read32le(&size,f); + size = 4-commandCursor; + for(u32 i=commandCursor;i<4;i++) read8le(&commandsPending[i-commandCursor].countdown,f); + } + else + if (version == 1) + { + read32le(&size,f); + read32le(&commandCursor,f); + for(u32 i=0;i<4;i++) read8le(&commandsPending[i].command,f); + for(u32 i=0;i<4;i++) read8le(&commandsPending[i].countdown,f); + } read8le(&countdown,f); This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <mta...@us...> - 2011-03-27 14:39:04
|
Revision: 3960 http://desmume.svn.sourceforge.net/desmume/?rev=3960&view=rev Author: mtabachenko Date: 2011-03-27 14:38:58 +0000 (Sun, 27 Mar 2011) Log Message: ----------- fix typo on last rev, sorry Modified Paths: -------------- trunk/desmume/src/gfx3d.cpp Modified: trunk/desmume/src/gfx3d.cpp =================================================================== --- trunk/desmume/src/gfx3d.cpp 2011-03-27 14:21:11 UTC (rev 3959) +++ trunk/desmume/src/gfx3d.cpp 2011-03-27 14:38:58 UTC (rev 3960) @@ -743,7 +743,7 @@ // Line segment detect // Tested" Castlevania POR - warp stone, trajectory of ricochet, "Eye of Decay" - if (textureFormat & (7 << 26) == 0) // no texture + if (!(textureFormat & (7 << 26))) // no texture { bool duplicated = false; VERT &vert0 = vertlist->list[poly.vertIndexes[0]]; This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <mta...@us...> - 2011-08-13 14:12:00
|
Revision: 4077 http://desmume.svn.sourceforge.net/desmume/?rev=4077&view=rev Author: mtabachenko Date: 2011-08-13 14:11:53 +0000 (Sat, 13 Aug 2011) Log Message: ----------- gxFIFO: - fix typo (fix GTA); Modified Paths: -------------- trunk/desmume/src/gfx3d.cpp Modified: trunk/desmume/src/gfx3d.cpp =================================================================== --- trunk/desmume/src/gfx3d.cpp 2011-08-12 13:49:03 UTC (rev 4076) +++ trunk/desmume/src/gfx3d.cpp 2011-08-13 14:11:53 UTC (rev 4077) @@ -107,8 +107,8 @@ for(int i=0;i<4;i++) { commandsPending[i].command = 0; commandsPending[i].countdown = 0; + } size = 0; - } } void receive(u32 val) @@ -126,8 +126,9 @@ while (gfx3d_commandTypes[front().command] == GFX_NOARG_COMMAND) { GFX_FIFOsend(front().command, 0); + size--; if (size == 0) break; - size--; dequeue(); + dequeue(); } } } This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <ze...@us...> - 2011-10-01 22:24:02
|
Revision: 4102 http://desmume.svn.sourceforge.net/desmume/?rev=4102&view=rev Author: zeromus Date: 2011-10-01 22:23:56 +0000 (Sat, 01 Oct 2011) Log Message: ----------- fix bug in texcoordtransform 2 (normal source) created from r3660 fixed point changes (broke smackdown 2010 textures) Revision Links: -------------- http://desmume.svn.sourceforge.net/desmume/?rev=3660&view=rev Modified Paths: -------------- trunk/desmume/src/gfx3d.cpp Modified: trunk/desmume/src/gfx3d.cpp =================================================================== --- trunk/desmume/src/gfx3d.cpp 2011-10-01 17:04:48 UTC (rev 4101) +++ trunk/desmume/src/gfx3d.cpp 2011-10-01 22:23:56 UTC (rev 4102) @@ -1128,15 +1128,16 @@ s16 ny = ((v<<12)>>22)<<3; s16 nz = ((v<<2)>>22)<<3; + CACHE_ALIGN s32 normal[4] = { nx,ny,nz,(1<<12) }; + if (texCoordinateTransform == 2) { //SM64 highlight rendered star in main menu tests this - last_s = (s32)(((s64)nx * mtxCurrent[3][0] + (s64)ny * mtxCurrent[3][4] + (s64)nz * mtxCurrent[3][8] + (_s<<24))>>24); - last_t = (s32)(((s64)nx * mtxCurrent[3][1] + (s64)ny * mtxCurrent[3][5] + (s64)nz * mtxCurrent[3][9] + (_t<<24))>>24); + //also smackdown 2010 player textures tested this (needed cast on _s and _t) + last_s = (s32)(((s64)normal[0] * mtxCurrent[3][0] + (s64)normal[1] * mtxCurrent[3][4] + (s64)normal[2] * mtxCurrent[3][8] + (((s64)_s)<<24))>>24); + last_t = (s32)(((s64)normal[0] * mtxCurrent[3][1] + (s64)normal[1] * mtxCurrent[3][5] + (s64)normal[2] * mtxCurrent[3][9] + (((s64)_t)<<24))>>24); } - CACHE_ALIGN s32 normal[4] = { nx,ny,nz,(1<<12) }; - MatrixMultVec3x3_fixed(mtxCurrent[2],normal); //apply lighting model This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <ric...@us...> - 2012-03-18 16:39:53
|
Revision: 4217 http://desmume.svn.sourceforge.net/desmume/?rev=4217&view=rev Author: riccardom Date: 2012-03-18 16:39:47 +0000 (Sun, 18 Mar 2012) Log Message: ----------- gfx3d.cpp: correct memset size for vertlists and polylists Modified Paths: -------------- trunk/desmume/src/gfx3d.cpp Modified: trunk/desmume/src/gfx3d.cpp =================================================================== --- trunk/desmume/src/gfx3d.cpp 2012-03-18 16:25:37 UTC (rev 4216) +++ trunk/desmume/src/gfx3d.cpp 2012-03-18 16:39:47 UTC (rev 4217) @@ -498,8 +498,8 @@ control = 0; drawPending = FALSE; flushPending = FALSE; - memset(polylists, 0, sizeof(polylists)); - memset(vertlists, 0, sizeof(vertlists)); + memset(polylists, 0, sizeof(POLYLIST)*2); + memset(vertlists, 0, sizeof(VERTLIST)*2); gfx3d.state.invalidateToon = true; listTwiddle = 1; twiddleLists(); This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <go...@us...> - 2012-08-27 12:25:56
|
Revision: 4384 http://desmume.svn.sourceforge.net/desmume/?rev=4384&view=rev Author: gocha Date: 2012-08-27 12:25:45 +0000 (Mon, 27 Aug 2012) Log Message: ----------- Replace non-ASCII quotes. Modified Paths: -------------- trunk/desmume/src/gfx3d.cpp Modified: trunk/desmume/src/gfx3d.cpp =================================================================== --- trunk/desmume/src/gfx3d.cpp 2012-08-26 05:08:33 UTC (rev 4383) +++ trunk/desmume/src/gfx3d.cpp 2012-08-27 12:25:45 UTC (rev 4384) @@ -143,7 +143,7 @@ commandCursor = 0; size = 0; - // A \x93command without parameters\x94 is one of the four following commands: + // A "command without parameters" is one of the four following commands: // - PushMatrix // - LoadIdentity // - End This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |