mirror of https://github.com/PCSX2/pcsx2.git
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:
parent
1a5ec046a6
commit
1ca7d5ac95
|
@ -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 (®s)[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();
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue