Cache pointer to dsp plugin. turns out the lookup is pretty expensive, looking at TD's oprofile run... this'll maybe give you a frame or two.

git-svn-id: https://dolphin-emu.googlecode.com/svn/trunk@3664 8ced0084-cf51-0410-be5f-012b33b47a6e
This commit is contained in:
hrydgard 2009-07-03 18:47:55 +00:00
parent 90a2096a24
commit 37332216ef

View File

@ -170,6 +170,9 @@ u16 g_AR_MODE = 0x43; // 0x23 -> Zelda standard mode (standard ARAM access ??)
// 0x43 -> written by OSAudioInit at the UCode upload (upload UCode) // 0x43 -> written by OSAudioInit at the UCode upload (upload UCode)
// 0x63 -> ARCheckSize Mode (access AR-registers ??) or no exception ?? // 0x63 -> ARCheckSize Mode (access AR-registers ??) or no exception ??
Common::PluginDSP *dsp_plugin;
void DoState(PointerWrap &p) void DoState(PointerWrap &p)
{ {
if (!SConfig::GetInstance().m_LocalCoreStartupParameter.bWii) if (!SConfig::GetInstance().m_LocalCoreStartupParameter.bWii)
@ -197,6 +200,8 @@ void GenerateDSPInterrupt_Wrapper(u64 userdata, int cyclesLate)
void Init() void Init()
{ {
dsp_plugin = CPluginManager::GetInstance().GetDSP();
if (SConfig::GetInstance().m_LocalCoreStartupParameter.bWii) if (SConfig::GetInstance().m_LocalCoreStartupParameter.bWii)
{ {
// On the Wii, ARAM is simply mapped to EXRAM. // On the Wii, ARAM is simply mapped to EXRAM.
@ -217,6 +222,7 @@ void Shutdown()
if (!SConfig::GetInstance().m_LocalCoreStartupParameter.bWii) if (!SConfig::GetInstance().m_LocalCoreStartupParameter.bWii)
FreeMemoryPages(g_ARAM, ARAM_SIZE); FreeMemoryPages(g_ARAM, ARAM_SIZE);
g_ARAM = NULL; g_ARAM = NULL;
dsp_plugin = NULL;
} }
void Read16(u16& _uReturnValue, const u32 _iAddress) void Read16(u16& _uReturnValue, const u32 _iAddress)
@ -224,34 +230,34 @@ void Read16(u16& _uReturnValue, const u32 _iAddress)
// WTF is this check about? DSP is at 5000 TODO remove // WTF is this check about? DSP is at 5000 TODO remove
if ((_iAddress & 0x6C00) != 0x6c00) if ((_iAddress & 0x6C00) != 0x6c00)
{ {
if (_iAddress != 0xCC005004) { if (_iAddress != 0xCC005004)
{
DEBUG_LOG(DSPINTERFACE, "DSPInterface(r16) 0x%08x", _iAddress); DEBUG_LOG(DSPINTERFACE, "DSPInterface(r16) 0x%08x", _iAddress);
} }
Common::PluginDSP *dsp = CPluginManager::GetInstance().GetDSP();
switch (_iAddress & 0xFFFF) switch (_iAddress & 0xFFFF)
{ {
// ================================================================================== // ==================================================================================
// AI_REGS 0x5000+ // AI_REGS 0x5000+
// ================================================================================== // ==================================================================================
case DSP_MAIL_TO_DSP_HI: case DSP_MAIL_TO_DSP_HI:
_uReturnValue = dsp->DSP_ReadMailboxHigh(true); _uReturnValue = dsp_plugin->DSP_ReadMailboxHigh(true);
return; return;
case DSP_MAIL_TO_DSP_LO: case DSP_MAIL_TO_DSP_LO:
_uReturnValue = dsp->DSP_ReadMailboxLow(true); _uReturnValue = dsp_plugin->DSP_ReadMailboxLow(true);
return; return;
case DSP_MAIL_FROM_DSP_HI: case DSP_MAIL_FROM_DSP_HI:
_uReturnValue = dsp->DSP_ReadMailboxHigh(false); _uReturnValue = dsp_plugin->DSP_ReadMailboxHigh(false);
return; return;
case DSP_MAIL_FROM_DSP_LO: case DSP_MAIL_FROM_DSP_LO:
_uReturnValue = dsp->DSP_ReadMailboxLow(false); _uReturnValue = dsp_plugin->DSP_ReadMailboxLow(false);
return; return;
case DSP_CONTROL: case DSP_CONTROL:
_uReturnValue = (g_dspState.DSPControl.Hex & ~DSP_CONTROL_MASK) | _uReturnValue = (g_dspState.DSPControl.Hex & ~DSP_CONTROL_MASK) |
(dsp->DSP_ReadControlRegister() & DSP_CONTROL_MASK); (dsp_plugin->DSP_ReadControlRegister() & DSP_CONTROL_MASK);
return; return;
// ================================================================================== // ==================================================================================
@ -311,7 +317,7 @@ void Read16(u16& _uReturnValue, const u32 _iAddress)
void Write16(const u16 _Value, const u32 _Address) void Write16(const u16 _Value, const u32 _Address)
{ {
DEBUG_LOG(DSPINTERFACE, "DSPInterface(w16) 0x%04x 0x%08x", _Value, _Address); DEBUG_LOG(DSPINTERFACE, "DSPInterface(w16) 0x%04x 0x%08x", _Value, _Address);
Common::PluginDSP *dsp = CPluginManager::GetInstance().GetDSP();
switch(_Address & 0xFFFF) switch(_Address & 0xFFFF)
{ {
// ================================================================================== // ==================================================================================
@ -319,11 +325,11 @@ void Write16(const u16 _Value, const u32 _Address)
// ================================================================================== // ==================================================================================
case DSP_MAIL_TO_DSP_HI: case DSP_MAIL_TO_DSP_HI:
dsp->DSP_WriteMailboxHigh(true, _Value); dsp_plugin->DSP_WriteMailboxHigh(true, _Value);
break; break;
case DSP_MAIL_TO_DSP_LO: case DSP_MAIL_TO_DSP_LO:
dsp->DSP_WriteMailboxLow(true, _Value); dsp_plugin->DSP_WriteMailboxLow(true, _Value);
break; break;
case DSP_MAIL_FROM_DSP_HI: case DSP_MAIL_FROM_DSP_HI:
@ -341,7 +347,7 @@ void Write16(const u16 _Value, const u32 _Address)
{ {
UDSPControl tmpControl; UDSPControl tmpControl;
tmpControl.Hex = (_Value & ~DSP_CONTROL_MASK) | tmpControl.Hex = (_Value & ~DSP_CONTROL_MASK) |
(dsp->DSP_WriteControlRegister(_Value) & DSP_CONTROL_MASK); (dsp_plugin->DSP_WriteControlRegister(_Value) & DSP_CONTROL_MASK);
// Update DSP related flags // Update DSP related flags
g_dspState.DSPControl.DSPReset = tmpControl.DSPReset; g_dspState.DSPControl.DSPReset = tmpControl.DSPReset;
@ -452,12 +458,11 @@ void Write16(const u16 _Value, const u32 _Address)
// This happens at 4 khz, since 32 bytes at 4khz = 4 bytes at 32 khz (16bit stereo pcm) // This happens at 4 khz, since 32 bytes at 4khz = 4 bytes at 32 khz (16bit stereo pcm)
void UpdateAudioDMA() void UpdateAudioDMA()
{ {
Common::PluginDSP *dsp = CPluginManager::GetInstance().GetDSP();
if (g_audioDMA.AudioDMAControl.Enabled && g_audioDMA.BlocksLeft) { if (g_audioDMA.AudioDMAControl.Enabled && g_audioDMA.BlocksLeft) {
// Read audio at g_audioDMA.ReadAddress in RAM and push onto an external audio fifo in the emulator, // Read audio at g_audioDMA.ReadAddress in RAM and push onto an external audio fifo in the emulator,
// to be mixed with the disc streaming output. If that audio queue fills up, we delay the emulator. // to be mixed with the disc streaming output. If that audio queue fills up, we delay the emulator.
// TO RESTORE OLD BEHAVIOUR, COMMENT OUT THIS LINE // TO RESTORE OLD BEHAVIOUR, COMMENT OUT THIS LINE
dsp->DSP_SendAIBuffer(g_audioDMA.ReadAddress, AudioInterface::GetDSPSampleRate()); dsp_plugin->DSP_SendAIBuffer(g_audioDMA.ReadAddress, AudioInterface::GetDSPSampleRate());
g_audioDMA.ReadAddress += 32; g_audioDMA.ReadAddress += 32;
g_audioDMA.BlocksLeft--; g_audioDMA.BlocksLeft--;