mirror of
https://github.com/dolphin-emu/dolphin.git
synced 2024-11-14 21:37:52 -07:00
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:
parent
90a2096a24
commit
37332216ef
@ -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--;
|
||||||
|
Loading…
Reference in New Issue
Block a user