GSdx: Fixes GSReplay renderer selection, and adds support for using -1 as a renderer (uses the GSdx configured renderer, but only works if the current working directory is set properly, otherwise the ini file won't be found).

git-svn-id: http://pcsx2.googlecode.com/svn/trunk@1873 96395faa-99c1-11dd-bbfe-3dabce05a288
This commit is contained in:
Jake.Stine 2009-09-19 11:20:31 +00:00
parent 1a5ec046a6
commit 1ca7d5ac95
1 changed files with 77 additions and 50 deletions

View File

@ -134,6 +134,11 @@ static INT32 _GSopen(void* dsp, char* title, int renderer)
GSDevice* dev = NULL; GSDevice* dev = NULL;
if( renderer == -1 )
{
renderer = theApp.GetConfig("renderer", 0);
}
try try
{ {
GSFreezeData tempsave = { 0, NULL }; GSFreezeData tempsave = { 0, NULL };
@ -199,6 +204,7 @@ static INT32 _GSopen(void* dsp, char* title, int renderer)
if(tempsave.data) if(tempsave.data)
{ {
s_gs->Defrost(&tempsave); s_gs->Defrost(&tempsave);
_aligned_free(tempsave.data);
} }
} }
catch( std::exception& ex ) catch( std::exception& ex )
@ -440,6 +446,75 @@ EXPORT_C GSsetFrameLimit(int limit)
#ifdef _WINDOWS #ifdef _WINDOWS
// Returns false if the window's been closed or an invalid packet was encountered.
static __forceinline bool LoopDatPacket_Thingamajig(HWND hWnd, uint8 (&regs)[0x2000], vector<uint8>& buff, FILE* fp, long start)
{
switch(fgetc(fp))
{
case EOF:
fseek(fp, start, 0);
return !!IsWindowVisible(hWnd);
case 0:
{
uint32 index = fgetc(fp);
uint32 size;
fread(&size, 4, 1, fp);
switch(index)
{
case 0:
{
if(buff.size() < 0x4000) buff.resize(0x4000);
uint32 addr = 0x4000 - size;
fread(&buff[0] + addr, size, 1, fp);
GSgifTransfer1(&buff[0], addr);
}
break;
case 1:
if(buff.size() < size) buff.resize(size);
fread(&buff[0], size, 1, fp);
GSgifTransfer2(&buff[0], size / 16);
break;
case 2:
if(buff.size() < size) buff.resize(size);
fread(&buff[0], size, 1, fp);
GSgifTransfer3(&buff[0], size / 16);
break;
}
}
break;
case 1:
GSvsync(fgetc(fp));
return !!IsWindowVisible(hWnd);
case 2:
{
uint32 size;
fread(&size, 4, 1, fp);
if(buff.size() < size) buff.resize(size);
GSreadFIFO2(&buff[0], size / 16);
}
break;
case 3:
fread(regs, 0x2000, 1, fp);
break;
default:
return false;
}
return true;
}
// lpszCmdLine:
// First parameter is the renderer.
// Second parameter is the gs file to load and run.
EXPORT_C GSReplay(HWND hwnd, HINSTANCE hinst, LPSTR lpszCmdLine, int nCmdShow) EXPORT_C GSReplay(HWND hwnd, HINSTANCE hinst, LPSTR lpszCmdLine, int nCmdShow)
{ {
int renderer = -1; int renderer = -1;
@ -465,7 +540,7 @@ EXPORT_C GSReplay(HWND hwnd, HINSTANCE hinst, LPSTR lpszCmdLine, int nCmdShow)
GSsetBaseMem(regs); GSsetBaseMem(regs);
HWND hWnd = NULL; HWND hWnd = NULL;
GSopen(&hWnd, "", renderer); _GSopen(&hWnd, "", renderer);
uint32 crc; uint32 crc;
fread(&crc, 4, 1, fp); fread(&crc, 4, 1, fp);
@ -482,57 +557,9 @@ EXPORT_C GSReplay(HWND hwnd, HINSTANCE hinst, LPSTR lpszCmdLine, int nCmdShow)
long start = ftell(fp); long start = ftell(fp);
unsigned int index, size, addr;
GSvsync(1); GSvsync(1);
while(1) while( LoopDatPacket_Thingamajig(hWnd, regs, buff, fp, start) ) ;
{
switch(fgetc(fp))
{
case EOF:
fseek(fp, start, 0);
if(!IsWindowVisible(hWnd)) return;
break;
case 0:
index = fgetc(fp);
fread(&size, 4, 1, fp);
switch(index)
{
case 0:
if(buff.size() < 0x4000) buff.resize(0x4000);
addr = 0x4000 - size;
fread(&buff[0] + addr, size, 1, fp);
GSgifTransfer1(&buff[0], addr);
break;
case 1:
if(buff.size() < size) buff.resize(size);
fread(&buff[0], size, 1, fp);
GSgifTransfer2(&buff[0], size / 16);
break;
case 2:
if(buff.size() < size) buff.resize(size);
fread(&buff[0], size, 1, fp);
GSgifTransfer3(&buff[0], size / 16);
break;
}
break;
case 1:
GSvsync(fgetc(fp));
if(!IsWindowVisible(hWnd)) return;
break;
case 2:
fread(&size, 4, 1, fp);
if(buff.size() < size) buff.resize(size);
GSreadFIFO2(&buff[0], size / 16);
break;
case 3:
fread(regs, 0x2000, 1, fp);
break;
default:
return;
}
}
GSclose(); GSclose();