Try to get dynamic plugin change working

This commit is contained in:
zilmar 2015-02-12 21:58:28 +11:00
parent 3e24a54130
commit c973db8e35
16 changed files with 194 additions and 96 deletions

View File

@ -115,9 +115,9 @@ void CSystemEvents::ExecuteEvents ( void )
bLoadedSave = true;
}
break;
/*case SysEvent_ChangePlugins:
case SysEvent_ChangePlugins:
ChangePluginFunc();
break;*/
break;
case SysEvent_ChangingFullScreen:
g_Notify->ChangeFullScreen();
break;
@ -182,6 +182,14 @@ void CSystemEvents::ExecuteEvents ( void )
bPause = true;
}
break;
case SysEvent_PauseCPU_Settings:
if (!g_Settings->LoadBool(GameRunning_CPU_Paused))
{
g_Settings->SaveBool(GameRunning_CPU_Paused,true);
g_Settings->SaveDword(GameRunning_CPU_PausedType, PauseType_Settings);
bPause = true;
}
break;
default:
g_Notify->BreakPoint(__FILE__,__LINE__);
break;
@ -194,36 +202,8 @@ void CSystemEvents::ExecuteEvents ( void )
}
}
/*void CSystemEvents::ChangePluginFunc ( void )
void CSystemEvents::ChangePluginFunc ( void )
{
g_Notify->DisplayMessage(0,MSG_PLUGIN_INIT);
if (g_Settings->LoadBool(Plugin_GFX_Changed))
{
g_Plugins->Reset(PLUGIN_TYPE_GFX);
}
if (g_Settings->LoadBool(Plugin_AUDIO_Changed))
{
g_Plugins->Reset(PLUGIN_TYPE_AUDIO);
}
if (g_Settings->LoadBool(Plugin_CONT_Changed))
{
g_Plugins->Reset(PLUGIN_TYPE_CONTROLLER);
}
if (g_Settings->LoadBool(Plugin_RSP_Changed) ||
g_Settings->LoadBool(Plugin_AUDIO_Changed) ||
g_Settings->LoadBool(Plugin_GFX_Changed))
{
g_Plugins->Reset(PLUGIN_TYPE_RSP);
}
g_Settings->SaveBool(Plugin_RSP_Changed, false);
g_Settings->SaveBool(Plugin_AUDIO_Changed,false);
g_Settings->SaveBool(Plugin_GFX_Changed, false);
g_Settings->SaveBool(Plugin_CONT_Changed, false);
g_Notify->RefreshMenu();
if (!g_Plugins->Initiate())
{
g_Notify->DisplayMessage(5,MSG_PLUGIN_NOT_INIT);
g_BaseSystem->m_EndEmulation = true;
}
g_Recompiler->ResetRecompCode();
}*/
m_System->PluginReset();
}

View File

@ -25,6 +25,7 @@ enum SystemEvent {
SysEvent_PauseCPU_LoadGame,
SysEvent_PauseCPU_DumpMemory,
SysEvent_PauseCPU_SearchMemory,
SysEvent_PauseCPU_Settings,
SysEvent_ResumeCPU_FromMenu,
SysEvent_ResumeCPU_AppGainedActive,
SysEvent_ResumeCPU_AppGainedFocus,
@ -32,8 +33,9 @@ enum SystemEvent {
SysEvent_ResumeCPU_LoadGame,
SysEvent_ResumeCPU_DumpMemory,
SysEvent_ResumeCPU_SearchMemory,
SysEvent_ResumeCPU_Settings,
SysEvent_ChangingFullScreen,
// SysEvent_ChangePlugins,
SysEvent_ChangePlugins,
SysEvent_SaveMachineState,
SysEvent_LoadMachineState,
SysEvent_Interrupt_SP,
@ -66,7 +68,7 @@ private:
CSystemEvents(const CSystemEvents&); // Disable copy constructor
CSystemEvents& operator=(const CSystemEvents&); // Disable assignment
//void ChangePluginFunc( void );
void ChangePluginFunc( void );
CN64System * m_System;
EventList m_Events;

View File

@ -100,7 +100,8 @@ void CN64System::ExternalEvent ( SystemEvent action )
case SysEvent_Interrupt_DP:
case SysEvent_ResetCPU_Hard:
case SysEvent_ResetCPU_Soft:
case SysEvent_CloseCPU:
case SysEvent_CloseCPU:
case SysEvent_ChangePlugins:
QueueEvent(action);
break;
case SysEvent_PauseCPU_FromMenu:
@ -110,6 +111,7 @@ void CN64System::ExternalEvent ( SystemEvent action )
case SysEvent_PauseCPU_LoadGame:
case SysEvent_PauseCPU_DumpMemory:
case SysEvent_PauseCPU_SearchMemory:
case SysEvent_PauseCPU_Settings:
if (!g_Settings->LoadBool(GameRunning_CPU_Paused))
{
QueueEvent(action);
@ -155,6 +157,12 @@ void CN64System::ExternalEvent ( SystemEvent action )
SetEvent(m_hPauseEvent);
}
break;
case SysEvent_ResumeCPU_Settings:
if (g_Settings->LoadDword(GameRunning_CPU_PausedType) == PauseType_Settings )
{
SetEvent(m_hPauseEvent);
}
break;
default:
WriteTraceF(TraceError,__FUNCTION__ ": Unknown event %d",action);
g_Notify->BreakPoint(__FILE__,__LINE__);
@ -506,6 +514,39 @@ void CN64System::GameReset (void)
}
}
void CN64System::PluginReset ( void )
{
if (!m_Plugins->ResetInUiThread(this))
{
g_Notify->DisplayMessage(5,MSG_PLUGIN_NOT_INIT);
if (g_BaseSystem)
{
g_BaseSystem->m_EndEmulation = true;
}
}
if (m_SyncCPU)
{
if (!m_SyncCPU->m_Plugins->ResetInUiThread(m_SyncCPU))
{
g_Notify->DisplayMessage(5,MSG_PLUGIN_NOT_INIT);
if (g_BaseSystem)
{
g_BaseSystem->m_EndEmulation = true;
}
}
}
g_Notify->RefreshMenu();
if (m_Recomp)
{
m_Recomp->Reset();
}
m_Plugins->RomOpened();
if (m_SyncCPU)
{
m_SyncCPU->m_Plugins->RomOpened();
}
}
void CN64System::Reset (bool bInitReg, bool ClearMenory)
{
RefreshGameSettings();
@ -631,7 +672,7 @@ bool CN64System::SetActiveSystem( bool bActive )
{
WriteTrace(TraceDebug,__FUNCTION__ ": Reseting Plugins");
g_Notify->DisplayMessage(5,MSG_PLUGIN_INIT);
m_Plugins->Reset();
m_Plugins->CreatePlugins();
bRes = m_Plugins->Initiate(this);
if (!bRes)
{

View File

@ -58,6 +58,7 @@ public:
void DecreaeSpeed ( void ) { m_Limitor.DecreaeSpeed(); }
void Reset ( bool bInitReg, bool ClearMenory );
void GameReset ( void );
void PluginReset ( void );
void Pause ( void );
void RunRSP ( void );

View File

@ -25,6 +25,7 @@ enum PauseType
PauseType_LoadGame,
PauseType_DumpMemory,
PauseType_SearchMemory,
PauseType_Settings,
};
enum CPU_TYPE {

View File

@ -111,10 +111,13 @@ bool CPlugin::Load (const char * FileName)
{
return false;
}
WriteTraceF(PluginTraceType(),__FUNCTION__ "(%s): Functions loaded",PluginType());
if (PluginOpened)
{
WriteTraceF(PluginTraceType(),__FUNCTION__ "(%s): Before Plugin Opened",PluginType());
PluginOpened();
WriteTraceF(PluginTraceType(),__FUNCTION__ "(%s): After Plugin Opened",PluginType());
}
return true;
}
@ -124,8 +127,10 @@ void CPlugin::RomOpened()
if (m_RomOpen || RomOpen == NULL)
return;
WriteTraceF(PluginTraceType(),__FUNCTION__ "(%s): Before Rom Open",PluginType());
RomOpen();
m_RomOpen = true;
WriteTraceF(PluginTraceType(),__FUNCTION__ "(%s): After Rom Open",PluginType());
}
void CPlugin::RomClose()
@ -133,8 +138,10 @@ void CPlugin::RomClose()
if (!m_RomOpen)
return;
WriteTraceF(PluginTraceType(),__FUNCTION__ "(%s): Before Rom Close",PluginType());
RomClosed();
m_RomOpen = false;
WriteTraceF(PluginTraceType(),__FUNCTION__ "(%s): After Rom Close",PluginType());
}
void CPlugin::GameReset()
@ -151,19 +158,19 @@ void CPlugin::GameReset()
void CPlugin::Close()
{
if (m_RomOpen) {
RomClosed();
m_RomOpen = false;
}
WriteTraceF(PluginTraceType(),__FUNCTION__ "(%s): Start",PluginType());
RomClose();
if (m_Initilized)
{
CloseDLL();
m_Initilized = false;
}
WriteTraceF(PluginTraceType(),__FUNCTION__ "(%s): Done",PluginType());
}
void CPlugin::UnloadPlugin()
{
WriteTraceF(PluginTraceType(),__FUNCTION__ "(%s): unloading",PluginType());
memset(&m_PluginInfo, 0, sizeof(m_PluginInfo));
if (m_hDll != NULL)
{
@ -182,3 +189,27 @@ void CPlugin::UnloadPlugin()
SetSettingInfo2 = NULL;
SetSettingInfo3 = NULL;
}
const char * CPlugin::PluginType () const
{
switch (m_PluginInfo.Type)
{
case PLUGIN_TYPE_RSP: return "RSP";
case PLUGIN_TYPE_GFX: return "GFX";
case PLUGIN_TYPE_AUDIO: return "Audio";
case PLUGIN_TYPE_CONTROLLER: return "Control";
}
return "Unknown";
}
TraceType CPlugin::PluginTraceType () const
{
switch (m_PluginInfo.Type)
{
case PLUGIN_TYPE_RSP: return TraceRSP;
case PLUGIN_TYPE_GFX: return TraceGfxPlugin;
case PLUGIN_TYPE_AUDIO: return TraceDebug;
case PLUGIN_TYPE_CONTROLLER: return TraceDebug;
}
return TraceDebug;
}

View File

@ -34,6 +34,8 @@ public:
protected:
void UnloadPlugin();
const char * PluginType () const;
TraceType PluginTraceType () const;
virtual void UnloadPluginDetails() = 0;
virtual PLUGIN_TYPE type() = 0;
virtual bool LoadFunctions ( void ) = 0;

View File

@ -50,11 +50,6 @@ CPlugins::~CPlugins (void)
void CPlugins::PluginChanged ( CPlugins * _this )
{
if (g_Settings->LoadBool(GameRunning_CPU_Running))
{
return;
}
bool bGfxChange = _stricmp(_this->m_GfxFile.c_str(),g_Settings->LoadString(Game_Plugin_Gfx).c_str()) != 0;
bool bAudioChange = _stricmp(_this->m_AudioFile.c_str(),g_Settings->LoadString(Game_Plugin_Audio).c_str()) != 0;
bool bRspChange = _stricmp(_this->m_RSPFile.c_str(),g_Settings->LoadString(Game_Plugin_RSP).c_str()) != 0;
@ -62,8 +57,19 @@ void CPlugins::PluginChanged ( CPlugins * _this )
if ( bGfxChange || bAudioChange || bRspChange || bContChange )
{
_this->Reset();
g_Notify->RefreshMenu();
if (g_Settings->LoadBool(GameRunning_CPU_Running))
{
//Ensure that base system actually exists before we go triggering the event
if (g_BaseSystem)
{
g_BaseSystem->ExternalEvent(SysEvent_ChangePlugins);
}
}
else
{
_this->Reset(NULL);
g_Notify->RefreshMenu();
}
}
}
@ -82,7 +88,7 @@ static void LoadPlugin (SettingID PluginSettingID, SettingID PluginVerSettingID,
WriteTraceF(TraceLevel,__FUNCTION__ ": %s Loading (%s): Starting",type,(LPCTSTR)PluginFileName);
if (plugin->Load(PluginFileName))
{
WriteTraceF(TraceLevel,__FUNCTION__ ": %a Current Ver: %s",type,plugin->PluginName().c_str());
WriteTraceF(TraceLevel,__FUNCTION__ ": %s Current Ver: %s",type,plugin->PluginName().c_str());
g_Settings->SaveString(PluginVerSettingID,plugin->PluginName().c_str());
}
else
@ -250,19 +256,57 @@ bool CPlugins::Initiate ( CN64System * System )
return true;
}
void CPlugins::Reset ( void )
bool CPlugins::ResetInUiThread ( CN64System * System )
{
return m_RenderWindow->ResetPlugins(this, System);
}
bool CPlugins::Reset ( CN64System * System )
{
WriteTrace(TraceDebug,__FUNCTION__ ": Start");
bool bGfxChange = _stricmp(m_GfxFile.c_str(),g_Settings->LoadString(Game_Plugin_Gfx).c_str()) != 0;
bool bAudioChange = _stricmp(m_AudioFile.c_str(),g_Settings->LoadString(Game_Plugin_Audio).c_str()) != 0;
bool bRspChange = _stricmp(m_RSPFile.c_str(),g_Settings->LoadString(Game_Plugin_RSP).c_str()) != 0;
bool bContChange = _stricmp(m_ControlFile.c_str(),g_Settings->LoadString(Game_Plugin_Controller).c_str()) != 0;
//if GFX and Audio has changed we also need to force reset of RSP
if (bGfxChange || bAudioChange)
bRspChange = true;
if (bGfxChange) { DestroyGfxPlugin(); }
if (bAudioChange) { DestroyAudioPlugin(); }
if (bRspChange) { DestroyRspPlugin(); }
if (bContChange) { DestroyControlPlugin(); }
CreatePlugins();
if (bGfxChange)
{
WriteTrace(TraceGfxPlugin,__FUNCTION__ ": Gfx Initiate Starting");
if (!m_Gfx->Initiate(System,m_RenderWindow)) { return false; }
WriteTrace(TraceGfxPlugin,__FUNCTION__ ": Gfx Initiate Done");
}
if (bAudioChange)
{
WriteTrace(TraceDebug,__FUNCTION__ ": Audio Initiate Starting");
if (!m_Audio->Initiate(System,m_RenderWindow)) { return false; }
WriteTrace(TraceDebug,__FUNCTION__ ": Audio Initiate Done");
}
if (bContChange)
{
WriteTrace(TraceDebug, __FUNCTION__ ": Control Initiate Starting");
if (!m_Control->Initiate(System,m_RenderWindow)) { return false; }
WriteTrace(TraceDebug, __FUNCTION__ ": Control Initiate Done");
}
if (bRspChange)
{
WriteTrace(TraceRSP,__FUNCTION__ ": RSP Initiate Starting");
if (!m_RSP->Initiate(this,System)) { return false; }
WriteTrace(TraceRSP,__FUNCTION__ ": RSP Initiate Done");
}
WriteTrace(TraceDebug,__FUNCTION__ ": Done");
return true;
}
void CPlugins::ConfigPlugin ( DWORD hParent, PLUGIN_TYPE Type ) {

View File

@ -97,7 +97,9 @@ public:
void SetRenderWindows ( CMainGui * RenderWindow, CMainGui * DummyWindow );
void ConfigPlugin ( DWORD hParent, PLUGIN_TYPE Type );
bool CopyPlugins ( const stdstr & DstDir ) const;
void Reset ( void );
void CreatePlugins ( void );
bool Reset ( CN64System * System );
bool ResetInUiThread ( CN64System * System );
void GameReset ( void );
inline CGfxPlugin * Gfx ( void) const { return m_Gfx; };
@ -112,7 +114,6 @@ private:
// void Reset ( PLUGIN_TYPE Type );
void CreatePlugins ( void );
void CreatePluginDir ( const stdstr & DstDir ) const;
void DestroyGfxPlugin ( void );

View File

@ -232,20 +232,15 @@ enum SettingID {
//Plugins
Plugin_RSP_Current,
Plugin_RSP_CurVer,
Plugin_RSP_Changed,
Plugin_GFX_Current,
Plugin_GFX_CurVer,
Plugin_GFX_Changed,
Plugin_AUDIO_Current,
Plugin_AUDIO_CurVer,
Plugin_AUDIO_Changed,
Plugin_CONT_Current,
Plugin_CONT_CurVer,
Plugin_CONT_Changed,
Plugin_UseHleGfx,
Plugin_UseHleAudio,
//Cheats
Cheat_Entry,
Cheat_Active,

View File

@ -310,11 +310,6 @@ void CSettings::AddHowToHandleSetting ()
AddHandler(Plugin_AUDIO_CurVer, new CSettingTypeApplication("Plugin","Audio Dll Ver", ""));
AddHandler(Plugin_CONT_CurVer, new CSettingTypeApplication("Plugin","Controller Dll Ver", ""));
AddHandler(Plugin_RSP_Changed, new CSettingTypeTempBool(true));
AddHandler(Plugin_GFX_Changed, new CSettingTypeTempBool(true));
AddHandler(Plugin_AUDIO_Changed, new CSettingTypeTempBool(true));
AddHandler(Plugin_CONT_Changed, new CSettingTypeTempBool(true));
AddHandler(Plugin_UseHleGfx, new CSettingTypeApplication("RSP","HLE GFX",true));
AddHandler(Plugin_UseHleAudio, new CSettingTypeApplication("RSP","HLE Audio",false));

View File

@ -273,21 +273,28 @@ DWORD CALLBACK AboutIniBoxProc (HWND WndHandle, DWORD uMsg, DWORD wParam, DWORD
return TRUE;
}
bool CMainGui::InitiatePlugins (void)
bool CMainGui::ResetPlugins (CPlugins * plugins, CN64System * System)
{
/*HANDLE hEvent = CreateEvent(NULL,TRUE,FALSE,NULL);
RESET_PLUGIN info;
info.system = System;
info.plugins = plugins;
info.hEvent = CreateEvent(NULL,TRUE,FALSE,NULL);
bool bRes = true;
if (hEvent)
if (info.hEvent)
{
PostMessage((HWND)m_hMainWindow,WM_INIATE_PLUGIN,(WPARAM)&bRes,(LPARAM)hEvent);
DWORD dwRes = WaitForSingleObject(hEvent,5000);
CloseHandle(hEvent);
PostMessage((HWND)m_hMainWindow,WM_RESET_PLUGIN,(WPARAM)&bRes,(LPARAM)&info);
#ifdef _DEBUG
DWORD dwRes = WaitForSingleObject(info.hEvent,INFINITE);
#else
DWORD dwRes = WaitForSingleObject(info.hEvent,5000);
#endif
dwRes = dwRes;
CloseHandle(info.hEvent);
} else {
WriteTrace(TraceError,__FUNCTION__ ": Failed to create event");
bRes = false;
}
return bRes;*/
return false;
return bRes;
}
void CMainGui::BringToTop (void) {
@ -757,15 +764,14 @@ DWORD CALLBACK CMainGui::MainGui_Proc (HWND hWnd, DWORD uMsg, DWORD wParam, DWOR
_this->RomBrowserToTop();
}
break;
/*case WM_INIATE_PLUGIN:
case WM_RESET_PLUGIN:
{
bool * bRes = (bool *)wParam;
HANDLE hEvent = (HANDLE)lParam;
RESET_PLUGIN * info = (RESET_PLUGIN *)lParam;
*bRes = g_Plugins->InitiateMainThread();
SetEvent(hEvent);
info->res = info->plugins->Reset(info->system);
SetEvent(info->hEvent);
}
break;*/
break;
case WM_COMMAND:
{
CMainGui * _this = (CMainGui *)GetProp((HWND)hWnd,"Class");

View File

@ -21,7 +21,7 @@ class CriticalSection;
enum {
WM_HIDE_CUROSR = WM_USER + 10,
WM_MAKE_FOCUS = WM_USER + 17,
//WM_INIATE_PLUGIN = WM_USER + 18,
WM_RESET_PLUGIN = WM_USER + 18,
WM_BORWSER_TOP = WM_USER + 40,
};
@ -31,6 +31,13 @@ class CMainGui :
{
enum { StatusBarID = 400 };
typedef struct
{
CN64System * system;
CPlugins * plugins;
HANDLE hEvent;
bool res;
} RESET_PLUGIN;
public:
CMainGui ( bool bMainWindow, const char * WindowTitle = "" );
~CMainGui ( void );
@ -68,7 +75,7 @@ public:
void AboutBox ( void );
//Plugins
bool InitiatePlugins ( void );
bool ResetPlugins ( CPlugins * plugins, CN64System * System );
//Get Window Handle
inline HWND GetHandle ( void ) const { return m_hMainWindow; }

View File

@ -22,7 +22,17 @@ CSettingConfig::~CSettingConfig ()
void CSettingConfig::Display(void * ParentWindow)
{
if (g_BaseSystem)
{
g_BaseSystem->ExternalEvent(SysEvent_PauseCPU_Settings);
}
DoModal((HWND)ParentWindow);
if (g_BaseSystem)
{
g_BaseSystem->ExternalEvent(SysEvent_ResumeCPU_Settings);
}
}
void CSettingConfig::UpdateAdvanced ( bool AdvancedMode )

View File

@ -264,15 +264,6 @@ void CGamePluginPage::ApplyComboBoxes ( void )
} else {
g_Settings->DeleteSetting(cb_iter->first);
}
switch (cb_iter->first)
{
case Game_EditPlugin_RSP: g_Settings->SaveBool(Plugin_RSP_Changed,true); break;
case Game_EditPlugin_Gfx: g_Settings->SaveBool(Plugin_GFX_Changed,true); break;
case Game_EditPlugin_Audio: g_Settings->SaveBool(Plugin_AUDIO_Changed,true); break;
case Game_EditPlugin_Contr: g_Settings->SaveBool(Plugin_CONT_Changed,true); break;
default:
Notify().BreakPoint(__FILE__,__LINE__);
}
}
if (ComboBox->IsReset())
{

View File

@ -247,15 +247,6 @@ void COptionPluginPage::ApplyComboBoxes ( void )
const CPluginList::PLUGIN * Plugin = *PluginPtr;
g_Settings->SaveString(cb_iter->first,Plugin->FileName.c_str());
switch (Plugin->Info.Type)
{
case PLUGIN_TYPE_RSP: g_Settings->SaveBool(Plugin_RSP_Changed,true); break;
case PLUGIN_TYPE_GFX: g_Settings->SaveBool(Plugin_GFX_Changed,true); break;
case PLUGIN_TYPE_AUDIO: g_Settings->SaveBool(Plugin_AUDIO_Changed,true); break;
case PLUGIN_TYPE_CONTROLLER: g_Settings->SaveBool(Plugin_CONT_Changed,true); break;
default:
g_Notify->BreakPoint(__FILE__,__LINE__);
}
}
if (ComboBox->IsReset())
{