GSdx: reworked the gs transfer function a bit, and removed the nloop hack, which does not seem to be necessary anymore.

git-svn-id: http://pcsx2.googlecode.com/svn/trunk@997 96395faa-99c1-11dd-bbfe-3dabce05a288
This commit is contained in:
gabest11 2009-04-17 01:06:27 +00:00
parent 0bf914833f
commit 8865ee398b
17 changed files with 173 additions and 208 deletions

View File

@ -106,10 +106,6 @@ static INT32 GSopen(void* dsp, char* title, int mt, int renderer)
GSclose(); GSclose();
// TODO
int nloophack = AfxGetApp()->GetProfileInt(_T("Settings"), _T("nloophack"), 2);
GSRendererSettings rs; GSRendererSettings rs;
rs.m_interlace = AfxGetApp()->GetProfileInt(_T("Settings"), _T("interlace"), 0); rs.m_interlace = AfxGetApp()->GetProfileInt(_T("Settings"), _T("interlace"), 0);
@ -125,14 +121,14 @@ static INT32 GSopen(void* dsp, char* title, int mt, int renderer)
switch(renderer) switch(renderer)
{ {
default: default:
case 0: s_gs = new GSRendererHW9(s_basemem, !!mt, s_irq, nloophack, rs); break; case 0: s_gs = new GSRendererHW9(s_basemem, !!mt, s_irq, rs); break;
case 1: s_gs = new GSRendererSW<GSDevice9>(s_basemem, !!mt, s_irq, nloophack, rs, threads); break; case 1: s_gs = new GSRendererSW<GSDevice9>(s_basemem, !!mt, s_irq, rs, threads); break;
case 2: s_gs = new GSRendererNull<GSDevice9>(s_basemem, !!mt, s_irq, nloophack, rs); break; case 2: s_gs = new GSRendererNull<GSDevice9>(s_basemem, !!mt, s_irq, rs); break;
case 3: s_gs = new GSRendererHW10(s_basemem, !!mt, s_irq, nloophack, rs); break; case 3: s_gs = new GSRendererHW10(s_basemem, !!mt, s_irq, rs); break;
case 4: s_gs = new GSRendererSW<GSDevice10>(s_basemem, !!mt, s_irq, nloophack, rs, threads); break; case 4: s_gs = new GSRendererSW<GSDevice10>(s_basemem, !!mt, s_irq, rs, threads); break;
case 5: s_gs = new GSRendererNull<GSDevice10>(s_basemem, !!mt, s_irq, nloophack, rs); break; case 5: s_gs = new GSRendererNull<GSDevice10>(s_basemem, !!mt, s_irq, rs); break;
case 6: s_gs = new GSRendererSW<GSDeviceNull>(s_basemem, !!mt, s_irq, nloophack, rs, threads); break; case 6: s_gs = new GSRendererSW<GSDeviceNull>(s_basemem, !!mt, s_irq, rs, threads); break;
case 7: s_gs = new GSRendererNull<GSDeviceNull>(s_basemem, !!mt, s_irq, nloophack, rs); break; case 7: s_gs = new GSRendererNull<GSDeviceNull>(s_basemem, !!mt, s_irq, rs); break;
} }
s_hr = ::CoInitializeEx(NULL, COINIT_MULTITHREADED); s_hr = ::CoInitializeEx(NULL, COINIT_MULTITHREADED);

View File

@ -24,107 +24,107 @@
CRC::Game CRC::m_games[] = CRC::Game CRC::m_games[] =
{ {
{0x00000000, None, Unknown, false}, {0x00000000, None, Unknown},
{0x2113EA2E, MetalSlug6, Unknown, false}, {0x2113EA2E, MetalSlug6, Unknown},
{0x42E05BAF, TomoyoAfter, JP, false}, {0x42E05BAF, TomoyoAfter, JP},
{0x7800DC84, Clannad, JP, false}, {0x7800DC84, Clannad, JP},
{0xa39517ab, FFX, EU, true}, {0xa39517ab, FFX, EU},
{0xa39517ae, FFX, FR, true}, {0xa39517ae, FFX, FR},
{0x941bb7d9, FFX, DE, true}, {0x941bb7d9, FFX, DE},
{0xa39517a9, FFX, IT, true}, {0xa39517a9, FFX, IT},
{0x941bb7de, FFX, ES, true}, {0x941bb7de, FFX, ES},
{0xb4414ea1, FFX, RU, true}, {0xb4414ea1, FFX, RU},
{0xee97db5b, FFX, RU, true}, {0xee97db5b, FFX, RU},
{0xaec495cc, FFX, RU, true}, {0xaec495cc, FFX, RU},
{0xbb3d833a, FFX, US, true}, {0xbb3d833a, FFX, US},
{0x6a4efe60, FFX, JP, true}, {0x6a4efe60, FFX, JP},
{0x3866ca7e, FFX, ASIA, true}, // int. {0x3866ca7e, FFX, ASIA}, // int.
{0x658597e2, FFX, JP, true}, // int. {0x658597e2, FFX, JP}, // int.
{0x9aac5309, FFX2, EU, true}, {0x9aac5309, FFX2, EU},
{0x9aac530c, FFX2, FR, true}, {0x9aac530c, FFX2, FR},
{0x9aac530a, FFX2, FR, true}, // ? {0x9aac530a, FFX2, FR}, // ?
{0x9aac530d, FFX2, DE, true}, {0x9aac530d, FFX2, DE},
{0x9aac530b, FFX2, IT, true}, {0x9aac530b, FFX2, IT},
{0x48fe0c71, FFX2, US, true}, {0x48fe0c71, FFX2, US},
{0xe1fd9a2d, FFX2, JP, true}, // int. {0xe1fd9a2d, FFX2, JP}, // int.
{0x78da0252, FFXII, EU, false}, {0x78da0252, FFXII, EU},
{0xc1274668, FFXII, EU, false}, {0xc1274668, FFXII, EU},
{0xdc2a467e, FFXII, EU, false}, {0xdc2a467e, FFXII, EU},
{0xca284668, FFXII, EU, false}, {0xca284668, FFXII, EU},
{0x280AD120, FFXII, JP, false}, {0x280AD120, FFXII, JP},
{0x8BE3D7B2, ShadowHearts, Unknown, false}, {0x8BE3D7B2, ShadowHearts, Unknown},
{0xDEFA4763, ShadowHearts, US, false}, {0xDEFA4763, ShadowHearts, US},
{0x21068223, Okami, US, false}, {0x21068223, Okami, US},
{0x891f223f, Okami, FR, false}, {0x891f223f, Okami, FR},
{0xC5DEFEA0, Okami, JP, false}, {0xC5DEFEA0, Okami, JP},
{0x053D2239, MetalGearSolid3, US, false}, {0x053D2239, MetalGearSolid3, US},
{0x086273D2, MetalGearSolid3, FR, false}, {0x086273D2, MetalGearSolid3, FR},
{0x26A6E286, MetalGearSolid3, EU, false}, {0x26A6E286, MetalGearSolid3, EU},
{0xAA31B5BF, MetalGearSolid3, Unknown, false}, {0xAA31B5BF, MetalGearSolid3, Unknown},
{0x9F185CE1, MetalGearSolid3, Unknown, false}, {0x9F185CE1, MetalGearSolid3, Unknown},
{0x98D4BC93, MetalGearSolid3, EU, false}, {0x98D4BC93, MetalGearSolid3, EU},
{0x86BC3040, MetalGearSolid3, US, false}, //Subsistance disc 1 {0x86BC3040, MetalGearSolid3, US}, //Subsistance disc 1
{0x0481AD8A, MetalGearSolid3, JP, false}, {0x0481AD8A, MetalGearSolid3, JP},
{0x79ED26AD, MetalGearSolid3, EU, false}, {0x79ED26AD, MetalGearSolid3, EU},
{0x5E31EA42, MetalGearSolid3, EU, false}, {0x5E31EA42, MetalGearSolid3, EU},
{0x278722BF, DBZBT2, US, false}, {0x278722BF, DBZBT2, US},
{0xFE961D28, DBZBT2, US, false}, {0xFE961D28, DBZBT2, US},
{0x0393B6BE, DBZBT2, EU, false}, {0x0393B6BE, DBZBT2, EU},
{0xE2F289ED, DBZBT2, JP, false}, // Sparking Neo! {0xE2F289ED, DBZBT2, JP}, // Sparking Neo!
{0x35AA84D1, DBZBT2, Unknown, false}, {0x35AA84D1, DBZBT2, Unknown},
{0x428113C2, DBZBT3, US, false}, {0x428113C2, DBZBT3, US},
{0xA422BB13, DBZBT3, EU, false}, {0xA422BB13, DBZBT3, EU},
{0x983c53d2, DBZBT3, Unknown, false}, {0x983c53d2, DBZBT3, Unknown},
{0x72B3802A, SFEX3, US, false}, {0x72B3802A, SFEX3, US},
{0x71521863, SFEX3, US, false}, {0x71521863, SFEX3, US},
{0x28703748, Bully, US, false}, {0x28703748, Bully, US},
{0xC78A495D, BullyCC, US, false}, {0xC78A495D, BullyCC, US},
{0xC19A374E, SoTC, US, false}, {0xC19A374E, SoTC, US},
{0x7D8F539A, SoTC, EU, false}, {0x7D8F539A, SoTC, EU},
{0x3122B508, OnePieceGrandAdventure, US, false}, {0x3122B508, OnePieceGrandAdventure, US},
{0x6F8545DB, ICO, US, false}, {0x6F8545DB, ICO, US},
{0xB01A4C95, ICO, JP, false}, {0xB01A4C95, ICO, JP},
{0x5C991F4E, ICO, Unknown, false}, {0x5C991F4E, ICO, Unknown},
{0xAEAD1CA3, GT4, JP, false}, {0xAEAD1CA3, GT4, JP},
{0x44A61C8F, GT4, Unknown, false}, {0x44A61C8F, GT4, Unknown},
{0x0086E35B, GT4, Unknown, false}, {0x0086E35B, GT4, Unknown},
{0x77E61C8A, GT4, Unknown, false}, {0x77E61C8A, GT4, Unknown},
{0xC164550A, WildArms5, JPUNDUB, false}, {0xC164550A, WildArms5, JPUNDUB},
{0xC1640D2C, WildArms5, US, false}, {0xC1640D2C, WildArms5, US},
{0x0FCF8FE4, WildArms5, EU, false}, {0x0FCF8FE4, WildArms5, EU},
{0x2294D322, WildArms5, JP, false}, {0x2294D322, WildArms5, JP},
{0x565B6170, WildArms5, JP, false}, {0x565B6170, WildArms5, JP},
{0x8B029334, Manhunt2, Unknown, false}, {0x8B029334, Manhunt2, Unknown},
{0x09F49E37, CrashBandicootWoC, Unknown, false}, {0x09F49E37, CrashBandicootWoC, Unknown},
{0x013E349D, ResidentEvil4, US, false}, {0x013E349D, ResidentEvil4, US},
{0x6BA2F6B9, ResidentEvil4, Unknown, false}, {0x6BA2F6B9, ResidentEvil4, Unknown},
{0x60FA8C69, ResidentEvil4, JP, false}, {0x60FA8C69, ResidentEvil4, JP},
{0x72E1E60E, Spartan, Unknown, false}, {0x72E1E60E, Spartan, Unknown},
{0x5ED8FB53, AceCombat4, JP, false}, {0x5ED8FB53, AceCombat4, JP},
{0x1B9B7563, AceCombat4, Unknown, false}, {0x1B9B7563, AceCombat4, Unknown},
{0xEC432B24, Drakengard2, Unknown, false}, {0xEC432B24, Drakengard2, Unknown},
{0xFC46EA61, Tekken5, JP, false}, {0xFC46EA61, Tekken5, JP},
{0x1F88EE37, Tekken5, Unknown, false}, {0x1F88EE37, Tekken5, Unknown},
{0x652050D2, Tekken5, Unknown, false}, {0x652050D2, Tekken5, Unknown},
{0x9E98B8AE, IkkiTousen, JP, false}, {0x9E98B8AE, IkkiTousen, JP},
{0xD6385328, GodOfWar, US, false}, {0xD6385328, GodOfWar, US},
{0xFB0E6D72, GodOfWar, EU, false}, {0xFB0E6D72, GodOfWar, EU},
{0xEB001875, GodOfWar, EU, false}, {0xEB001875, GodOfWar, EU},
{0xA61A4C6D, GodOfWar, Unknown, false}, {0xA61A4C6D, GodOfWar, Unknown},
{0xE23D532B, GodOfWar, Unknown, false}, {0xE23D532B, GodOfWar, Unknown},
{0x2F123FD8, GodOfWar2, RU, false}, {0x2F123FD8, GodOfWar2, RU},
{0x2F123FD8, GodOfWar2, US, false}, {0x2F123FD8, GodOfWar2, US},
{0x44A8A22A, GodOfWar2, EU, false}, {0x44A8A22A, GodOfWar2, EU},
{0x5D482F18, JackieChanAdv, Unknown, false}, {0x5D482F18, JackieChanAdv, Unknown},
{0xf0a6d880, HarvestMoon, US, true}, {0xf0a6d880, HarvestMoon, US},
{0x75c01a04, NamcoXCapcom, US, false}, {0x75c01a04, NamcoXCapcom, US},
{0xBF6F101F, GiTS, US, false}, {0xBF6F101F, GiTS, US},
{0xA5768F53, GiTS, JP, false}, {0xA5768F53, GiTS, JP},
{0x6BF11378, Onimusha3, US, false}, {0x6BF11378, Onimusha3, US},
{0xF442260C, MajokkoALaMode2, JP, false}, {0xF442260C, MajokkoALaMode2, JP},
{0x14FE77F7, TalesOfAbyss, US, false}, {0x14FE77F7, TalesOfAbyss, US},
{0x045D77E9, TalesOfAbyss, US, false}, // undub {0x045D77E9, TalesOfAbyss, US}, // undub
{0xAA5EC3A3, TalesOfAbyss, JP, false}, {0xAA5EC3A3, TalesOfAbyss, JP},
}; };
CAtlMap<DWORD, CRC::Game*> CRC::m_map; CAtlMap<DWORD, CRC::Game*> CRC::m_map;

View File

@ -86,7 +86,6 @@ public:
DWORD crc; DWORD crc;
Title title; Title title;
Region region; Region region;
bool nloophack;
}; };
private: private:

View File

@ -266,10 +266,7 @@ bool GSDevice9::Reset(int w, int h, bool fs)
m_pp.PresentationInterval = D3DPRESENT_INTERVAL_DEFAULT; m_pp.PresentationInterval = D3DPRESENT_INTERVAL_DEFAULT;
} }
if(!!AfxGetApp()->GetProfileInt(_T("Settings"), _T("tvout"), FALSE)) m_pp.Flags |= D3DPRESENTFLAG_VIDEO; // enables tv-out (but I don't think anyone would still use a regular tv...)
{
m_pp.Flags |= D3DPRESENTFLAG_VIDEO;
}
int mw = AfxGetApp()->GetProfileInt(_T("Settings"), _T("ModeWidth"), 0); int mw = AfxGetApp()->GetProfileInt(_T("Settings"), _T("ModeWidth"), 0);
int mh = AfxGetApp()->GetProfileInt(_T("Settings"), _T("ModeHeight"), 0); int mh = AfxGetApp()->GetProfileInt(_T("Settings"), _T("ModeHeight"), 0);

View File

@ -95,8 +95,8 @@ public:
GSWnd m_wnd; GSWnd m_wnd;
public: public:
GSRendererBase(BYTE* base, bool mt, void (*irq)(), int nloophack, const GSRendererSettings& rs) GSRendererBase(BYTE* base, bool mt, void (*irq)(), const GSRendererSettings& rs)
: GSState(base, mt, irq, nloophack) : GSState(base, mt, irq)
, m_osd(true) , m_osd(true)
{ {
m_interlace = rs.m_interlace; m_interlace = rs.m_interlace;
@ -412,8 +412,8 @@ public:
GSCapture m_capture; GSCapture m_capture;
public: public:
GSRenderer(BYTE* base, bool mt, void (*irq)(), int nloophack, const GSRendererSettings& rs, bool psrr) GSRenderer(BYTE* base, bool mt, void (*irq)(), const GSRendererSettings& rs, bool psrr)
: GSRendererBase(base, mt, irq, nloophack, rs) : GSRendererBase(base, mt, irq, rs)
, m_psrr(psrr) , m_psrr(psrr)
{ {
s_n = 0; s_n = 0;
@ -687,8 +687,8 @@ protected:
virtual void Draw() = 0; virtual void Draw() = 0;
public: public:
GSRendererT(BYTE* base, bool mt, void (*irq)(), int nloophack, const GSRendererSettings& rs, bool psrr = true) GSRendererT(BYTE* base, bool mt, void (*irq)(), const GSRendererSettings& rs, bool psrr = true)
: GSRenderer<Device>(base, mt, irq, nloophack, rs, psrr) : GSRenderer<Device>(base, mt, irq, rs, psrr)
, m_count(0) , m_count(0)
, m_maxcount(0) , m_maxcount(0)
, m_vertices(NULL) , m_vertices(NULL)

View File

@ -631,8 +631,8 @@ protected:
} }
public: public:
GSRendererHW(BYTE* base, bool mt, void (*irq)(), int nloophack, const GSRendererSettings& rs, bool psrr) GSRendererHW(BYTE* base, bool mt, void (*irq)(), const GSRendererSettings& rs, bool psrr)
: GSRendererT<Device, Vertex>(base, mt, irq, nloophack, rs, psrr) : GSRendererT<Device, Vertex>(base, mt, irq, rs, psrr)
, m_width(1024) , m_width(1024)
, m_height(1024) , m_height(1024)
, m_skip(0) , m_skip(0)

View File

@ -24,8 +24,8 @@
#include "GSCrc.h" #include "GSCrc.h"
#include "resource.h" #include "resource.h"
GSRendererHW10::GSRendererHW10(BYTE* base, bool mt, void (*irq)(), int nloophack, const GSRendererSettings& rs) GSRendererHW10::GSRendererHW10(BYTE* base, bool mt, void (*irq)(), const GSRendererSettings& rs)
: GSRendererHW<Device, Vertex, TextureCache>(base, mt, irq, nloophack, rs, true) : GSRendererHW<Device, Vertex, TextureCache>(base, mt, irq, rs, true)
{ {
InitVertexKick<GSRendererHW10>(); InitVertexKick<GSRendererHW10>();
} }

View File

@ -48,7 +48,7 @@ protected:
void SetupDATE(Texture& rt, Texture& ds); void SetupDATE(Texture& rt, Texture& ds);
public: public:
GSRendererHW10(BYTE* base, bool mt, void (*irq)(), int nloophack, const GSRendererSettings& rs); GSRendererHW10(BYTE* base, bool mt, void (*irq)(), const GSRendererSettings& rs);
bool Create(LPCTSTR title); bool Create(LPCTSTR title);

View File

@ -24,8 +24,8 @@
#include "GSCrc.h" #include "GSCrc.h"
#include "resource.h" #include "resource.h"
GSRendererHW9::GSRendererHW9(BYTE* base, bool mt, void (*irq)(), int nloophack, const GSRendererSettings& rs) GSRendererHW9::GSRendererHW9(BYTE* base, bool mt, void (*irq)(), const GSRendererSettings& rs)
: GSRendererHW<Device, Vertex, TextureCache>(base, mt, irq, nloophack, rs, false) : GSRendererHW<Device, Vertex, TextureCache>(base, mt, irq, rs, false)
{ {
m_fba.enabled = !!AfxGetApp()->GetProfileInt(_T("Settings"), _T("fba"), TRUE); m_fba.enabled = !!AfxGetApp()->GetProfileInt(_T("Settings"), _T("fba"), TRUE);
m_logz = !!AfxGetApp()->GetProfileInt(_T("Settings"), _T("logz"), FALSE); m_logz = !!AfxGetApp()->GetProfileInt(_T("Settings"), _T("logz"), FALSE);

View File

@ -57,7 +57,7 @@ protected:
void UpdateFBA(Texture& rt); void UpdateFBA(Texture& rt);
public: public:
GSRendererHW9(BYTE* base, bool mt, void (*irq)(), int nloophack, const GSRendererSettings& rs); GSRendererHW9(BYTE* base, bool mt, void (*irq)(), const GSRendererSettings& rs);
bool Create(LPCTSTR title); bool Create(LPCTSTR title);

View File

@ -37,8 +37,8 @@ protected:
} }
public: public:
GSRendererNull(BYTE* base, bool mt, void (*irq)(), int nloophack, const GSRendererSettings& rs) GSRendererNull(BYTE* base, bool mt, void (*irq)(), const GSRendererSettings& rs)
: GSRendererT<Device, GSVertexNull>(base, mt, irq, nloophack, rs) : GSRendererT<Device, GSVertexNull>(base, mt, irq, rs)
{ {
InitVertexKick<GSRendererNull<Device> >(); InitVertexKick<GSRendererNull<Device> >();
} }

View File

@ -717,8 +717,8 @@ protected:
} }
public: public:
GSRendererSW(BYTE* base, bool mt, void (*irq)(), int nloophack, const GSRendererSettings& rs, int threads) GSRendererSW(BYTE* base, bool mt, void (*irq)(), const GSRendererSettings& rs, int threads)
: GSRendererT(base, mt, irq, nloophack, rs) : GSRendererT(base, mt, irq, rs)
{ {
m_rl.Create<GSDrawScanline>(this, threads); m_rl.Create<GSDrawScanline>(this, threads);

View File

@ -68,9 +68,7 @@ GSSetting GSSettingsDlg::g_aspectratio[] =
IMPLEMENT_DYNAMIC(GSSettingsDlg, CDialog) IMPLEMENT_DYNAMIC(GSSettingsDlg, CDialog)
GSSettingsDlg::GSSettingsDlg(CWnd* pParent /*=NULL*/) GSSettingsDlg::GSSettingsDlg(CWnd* pParent /*=NULL*/)
: CDialog(GSSettingsDlg::IDD, pParent) : CDialog(GSSettingsDlg::IDD, pParent)
, m_tvout(FALSE)
, m_filter(1) , m_filter(1)
, m_nloophack(2)
, m_nativeres(FALSE) , m_nativeres(FALSE)
, m_vsync(FALSE) , m_vsync(FALSE)
, m_logz(FALSE) , m_logz(FALSE)
@ -104,9 +102,7 @@ void GSSettingsDlg::DoDataExchange(CDataExchange* pDX)
DDX_Control(pDX, IDC_COMBO4, m_psversion); DDX_Control(pDX, IDC_COMBO4, m_psversion);
DDX_Control(pDX, IDC_COMBO2, m_interlace); DDX_Control(pDX, IDC_COMBO2, m_interlace);
DDX_Control(pDX, IDC_COMBO5, m_aspectratio); DDX_Control(pDX, IDC_COMBO5, m_aspectratio);
DDX_Check(pDX, IDC_CHECK3, m_tvout);
DDX_Check(pDX, IDC_CHECK4, m_filter); DDX_Check(pDX, IDC_CHECK4, m_filter);
DDX_Check(pDX, IDC_CHECK6, m_nloophack);
DDX_Control(pDX, IDC_SPIN1, m_resx); DDX_Control(pDX, IDC_SPIN1, m_resx);
DDX_Control(pDX, IDC_SPIN2, m_resy); DDX_Control(pDX, IDC_SPIN2, m_resy);
DDX_Control(pDX, IDC_SPIN3, m_swthreads); DDX_Control(pDX, IDC_SPIN3, m_swthreads);
@ -219,8 +215,6 @@ BOOL GSSettingsDlg::OnInitDialog()
// //
m_filter = pApp->GetProfileInt(_T("Settings"), _T("filter"), 1); m_filter = pApp->GetProfileInt(_T("Settings"), _T("filter"), 1);
m_tvout = pApp->GetProfileInt(_T("Settings"), _T("tvout"), FALSE);
m_nloophack = pApp->GetProfileInt(_T("Settings"), _T("nloophack"), 2);
m_vsync = !!pApp->GetProfileInt(_T("Settings"), _T("vsync"), FALSE); m_vsync = !!pApp->GetProfileInt(_T("Settings"), _T("vsync"), FALSE);
m_logz = !!pApp->GetProfileInt(_T("Settings"), _T("logz"), FALSE); m_logz = !!pApp->GetProfileInt(_T("Settings"), _T("logz"), FALSE);
m_fba = !!pApp->GetProfileInt(_T("Settings"), _T("fba"), TRUE); m_fba = !!pApp->GetProfileInt(_T("Settings"), _T("fba"), TRUE);
@ -284,8 +278,6 @@ void GSSettingsDlg::OnOK()
} }
pApp->WriteProfileInt(_T("Settings"), _T("filter"), m_filter); pApp->WriteProfileInt(_T("Settings"), _T("filter"), m_filter);
pApp->WriteProfileInt(_T("Settings"), _T("tvout"), m_tvout);
pApp->WriteProfileInt(_T("Settings"), _T("nloophack"), m_nloophack);
pApp->WriteProfileInt(_T("Settings"), _T("vsync"), m_vsync); pApp->WriteProfileInt(_T("Settings"), _T("vsync"), m_vsync);
pApp->WriteProfileInt(_T("Settings"), _T("logz"), m_logz); pApp->WriteProfileInt(_T("Settings"), _T("logz"), m_logz);
pApp->WriteProfileInt(_T("Settings"), _T("fba"), m_fba); pApp->WriteProfileInt(_T("Settings"), _T("fba"), m_fba);

View File

@ -47,9 +47,7 @@ public:
CComboBox m_psversion; CComboBox m_psversion;
CComboBox m_interlace; CComboBox m_interlace;
CComboBox m_aspectratio; CComboBox m_aspectratio;
BOOL m_tvout;
int m_filter; int m_filter;
int m_nloophack;
CSpinButtonCtrl m_resx; CSpinButtonCtrl m_resx;
CSpinButtonCtrl m_resy; CSpinButtonCtrl m_resy;
CSpinButtonCtrl m_swthreads; CSpinButtonCtrl m_swthreads;

View File

@ -22,11 +22,9 @@
#include "stdafx.h" #include "stdafx.h"
#include "GSState.h" #include "GSState.h"
GSState::GSState(BYTE* base, bool mt, void (*irq)(), int nloophack) GSState::GSState(BYTE* base, bool mt, void (*irq)())
: m_mt(mt) : m_mt(mt)
, m_irq(irq) , m_irq(irq)
, m_nloophack_org(nloophack)
, m_nloophack(nloophack == 1)
, m_crc(0) , m_crc(0)
, m_options(0) , m_options(0)
, m_path3hack(0) , m_path3hack(0)
@ -1241,8 +1239,6 @@ template<int index> void GSState::Transfer(BYTE* mem, UINT32 size)
while(size > 0) while(size > 0)
{ {
bool eop = false;
if(path.tag.NLOOP == 0) if(path.tag.NLOOP == 0)
{ {
path.SetTag(mem); path.SetTag(mem);
@ -1250,41 +1246,29 @@ template<int index> void GSState::Transfer(BYTE* mem, UINT32 size)
mem += sizeof(GIFTag); mem += sizeof(GIFTag);
size--; size--;
m_q = 1.0f;
if(index == 2 && path.tag.EOP) if(index == 2 && path.tag.EOP)
{ {
m_path3hack = 1; m_path3hack = 1;
} }
if(path.tag.PRE) if(path.tag.NLOOP > 0) // eeuser 7.2.2. GIFtag: "... when NLOOP is 0, the GIF does not output anything, and values other than the EOP field are disregarded."
{ {
ASSERT(path.tag.FLG != GIF_FLG_IMAGE); // kingdom hearts, ffxii, tales of abyss, berserk m_q = 1.0f;
if((path.tag.FLG & 2) == 0) if(path.tag.PRE)
{ {
GIFReg r; ASSERT(path.tag.FLG != GIF_FLG_IMAGE); // kingdom hearts, ffxii, tales of abyss, berserk
r.i64 = path.tag.PRIM;
(this->*m_fpGIFRegHandlers[GIF_A_D_REG_PRIM])(&r);
}
}
if(path.tag.EOP) if((path.tag.FLG & 2) == 0)
{ {
eop = true; GIFReg r;
} r.i64 = path.tag.PRIM;
else if(path.tag.NLOOP == 0) (this->*m_fpGIFRegHandlers[GIF_A_D_REG_PRIM])(&r);
{ }
if(index == 0 && m_nloophack)
{
continue;
} }
eop = true;
} }
} }
else
if(path.tag.NLOOP > 0)
{ {
switch(path.tag.FLG) switch(path.tag.FLG)
{ {
@ -1400,21 +1384,12 @@ template<int index> void GSState::Transfer(BYTE* mem, UINT32 size)
} }
} }
if(eop && ((int)size <= 0 || index == 0)) if(index == 0)
{ {
break; if(path.tag.EOP && path.tag.NLOOP == 0)
} {
} break;
}
// FIXME: dq8, pcsx2 error probably
if(index == 0)
{
if(!path.tag.EOP && path.tag.NLOOP > 0)
{
path.tag.NLOOP = 0;
TRACE(_T("path1 hack\n"));
} }
} }
@ -1422,6 +1397,23 @@ template<int index> void GSState::Transfer(BYTE* mem, UINT32 size)
{ {
m_dump.Transfer(index, start, mem - start); m_dump.Transfer(index, start, mem - start);
} }
if(index == 0)
{
if(size == 0 && path.tag.NLOOP > 0)
{
if(m_mt)
{
// TODO
path.tag.NLOOP = 0;
}
else
{
Transfer<0>(mem - 0x4000, 0x4000 / 16);
}
}
}
} }
template<class T> static void WriteState(BYTE*& dst, T* src, size_t len = sizeof(T)) template<class T> static void WriteState(BYTE*& dst, T* src, size_t len = sizeof(T))
@ -1617,11 +1609,6 @@ void GSState::SetGameCRC(DWORD crc, int options)
m_crc = crc; m_crc = crc;
m_options = options; m_options = options;
m_game = CRC::Lookup(crc); m_game = CRC::Lookup(crc);
if(m_nloophack_org == 2)
{
m_nloophack = m_game.nloophack;
}
} }
void GSState::SetFrameSkip(int frameskip) void GSState::SetFrameSkip(int frameskip)

View File

@ -112,7 +112,6 @@ class GSState : public GSAlignedClass<16>
bool m_mt; bool m_mt;
void (*m_irq)(); void (*m_irq)();
bool m_path3hack; bool m_path3hack;
int m_nloophack_org;
int m_x, m_y; int m_x, m_y;
int m_bytes; int m_bytes;
@ -200,7 +199,6 @@ public:
DWORD m_vprim; DWORD m_vprim;
GSPerfMon m_perfmon; GSPerfMon m_perfmon;
bool m_nloophack;
DWORD m_crc; DWORD m_crc;
int m_options; int m_options;
int m_frameskip; int m_frameskip;
@ -208,7 +206,7 @@ public:
GSDump m_dump; GSDump m_dump;
public: public:
GSState(BYTE* base, bool mt, void (*irq)(), int nloophack); GSState(BYTE* base, bool mt, void (*irq)());
virtual ~GSState(); virtual ~GSState();
void ResetHandlers(); void ResetHandlers();

View File

@ -82,7 +82,7 @@ IDB_LOGO10 BITMAP "res\\logo10.bmp"
// Dialog // Dialog
// //
IDD_CONFIG DIALOGEX 0, 0, 189, 256 IDD_CONFIG DIALOGEX 0, 0, 189, 248
STYLE DS_SETFONT | DS_MODALFRAME | DS_FIXEDSYS | WS_POPUP | WS_CAPTION | WS_SYSMENU STYLE DS_SETFONT | DS_MODALFRAME | DS_FIXEDSYS | WS_POPUP | WS_CAPTION | WS_SYSMENU
CAPTION "Settings..." CAPTION "Settings..."
FONT 8, "MS Shell Dlg", 400, 0, 0x1 FONT 8, "MS Shell Dlg", 400, 0, 0x1
@ -108,17 +108,15 @@ BEGIN
LTEXT "SW rend. threads:",IDC_STATIC,7,149,60,8 LTEXT "SW rend. threads:",IDC_STATIC,7,149,60,8
EDITTEXT IDC_EDIT3,71,147,35,13,ES_AUTOHSCROLL | ES_NUMBER EDITTEXT IDC_EDIT3,71,147,35,13,ES_AUTOHSCROLL | ES_NUMBER
CONTROL "",IDC_SPIN3,"msctls_updown32",UDS_SETBUDDYINT | UDS_ALIGNRIGHT | UDS_AUTOBUDDY | UDS_ARROWKEYS | UDS_NOTHOUSANDS,99,150,11,14 CONTROL "",IDC_SPIN3,"msctls_updown32",UDS_SETBUDDYINT | UDS_ALIGNRIGHT | UDS_AUTOBUDDY | UDS_ARROWKEYS | UDS_NOTHOUSANDS,99,150,11,14
CONTROL "NLOOP hack",IDC_CHECK6,"Button",BS_AUTO3STATE | WS_TABSTOP,7,167,55,10 CONTROL "Texture filtering",IDC_CHECK4,"Button",BS_AUTO3STATE | WS_TABSTOP,7,167,67,10
CONTROL "Enable tv-out",IDC_CHECK3,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,80,167,57,10 CONTROL "Logarithmic Z",IDC_CHECK5,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,80,168,58,10
CONTROL "Texture filtering",IDC_CHECK4,"Button",BS_AUTO3STATE | WS_TABSTOP,7,180,67,10 CONTROL "Wait vsync",IDC_CHECK2,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,7,180,51,10
CONTROL "Logarithmic Z",IDC_CHECK5,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,80,180,58,10 CONTROL "Alpha correction (FBA)",IDC_CHECK7,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,80,181,102,10
CONTROL "Wait vsync",IDC_CHECK2,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,7,193,51,10
CONTROL "Alpha correction (FBA)",IDC_CHECK7,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,80,193,102,10
CONTROL "Edge anti-aliasing (AA1, sw-mode only)",IDC_CHECK8, CONTROL "Edge anti-aliasing (AA1, sw-mode only)",IDC_CHECK8,
"Button",BS_AUTOCHECKBOX | WS_TABSTOP,7,206,141,10 "Button",BS_AUTOCHECKBOX | WS_TABSTOP,7,194,141,10
CONTROL "Enable output merger blur effect",IDC_CHECK9,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,7,219,121,10 CONTROL "Enable output merger blur effect",IDC_CHECK9,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,7,208,121,10
DEFPUSHBUTTON "OK",IDOK,43,235,50,14 DEFPUSHBUTTON "OK",IDOK,43,227,50,14
PUSHBUTTON "Cancel",IDCANCEL,96,235,50,14 PUSHBUTTON "Cancel",IDCANCEL,96,227,50,14
END END
IDD_CAPTURE DIALOGEX 0, 0, 279, 71 IDD_CAPTURE DIALOGEX 0, 0, 279, 71
@ -182,7 +180,7 @@ BEGIN
VERTGUIDE, 80 VERTGUIDE, 80
VERTGUIDE, 182 VERTGUIDE, 182
TOPMARGIN, 7 TOPMARGIN, 7
BOTTOMMARGIN, 249 BOTTOMMARGIN, 241
END END
IDD_CAPTURE, DIALOG IDD_CAPTURE, DIALOG