2015-03-18 18:00:27 -04:00
// Copyright 2015 Dolphin Emulator Project
2015-05-18 01:08:10 +02:00
// Licensed under GPLv2+
2015-03-18 18:00:27 -04:00
// Refer to the license.txt file included.
#include <wx/checkbox.h>
#include <wx/choice.h>
#include <wx/event.h>
#include <wx/menu.h>
#include <wx/radiobox.h>
#include <wx/sizer.h>
#include <wx/stattext.h>
#include "Core/ConfigManager.h"
#include "Core/Core.h"
#include "Core/PowerPC/PowerPC.h"
#include "DolphinWX/Frame.h"
#include "DolphinWX/Main.h"
#include "DolphinWX/Config/GeneralConfigPane.h"
#include "DolphinWX/Debugger/CodeWindow.h"
struct CPUCore
{
int CPUid ;
wxString name ;
};
static const CPUCore cpu_cores [] = {
{ 0 , _ ( "Interpreter (VERY slow)" ) },
#ifdef _M_X86_64
{ 1 , _ ( "JIT Recompiler (recommended)" ) },
{ 2 , _ ( "JITIL Recompiler (slower, experimental)" ) },
#elif defined(_M_ARM_32)
{ 3 , _ ( "Arm JIT (experimental)" ) },
#elif defined(_M_ARM_64)
{ 4 , _ ( "Arm64 JIT (experimental)" ) },
#endif
};
GeneralConfigPane :: GeneralConfigPane ( wxWindow * parent , wxWindowID id )
: wxPanel ( parent , id )
{
InitializeGUI ();
LoadGUIValues ();
RefreshGUI ();
}
void GeneralConfigPane :: InitializeGUI ()
{
m_frame_limit_array_string . Add ( _ ( "Off" ));
m_frame_limit_array_string . Add ( _ ( "Auto" ));
for ( int i = 5 ; i <= 120 ; i += 5 ) // from 5 to 120
m_frame_limit_array_string . Add ( wxString :: Format ( "%i" , i ));
for ( const CPUCore & cpu_core : cpu_cores )
m_cpu_engine_array_string . Add ( cpu_core . name );
m_dual_core_checkbox = new wxCheckBox ( this , wxID_ANY , _ ( "Enable Dual Core (speedup)" ));
m_idle_skip_checkbox = new wxCheckBox ( this , wxID_ANY , _ ( "Enable Idle Skipping (speedup)" ));
m_cheats_checkbox = new wxCheckBox ( this , wxID_ANY , _ ( "Enable Cheats" ));
m_force_ntscj_checkbox = new wxCheckBox ( this , wxID_ANY , _ ( "Force Console as NTSC-J" ));
m_frame_limit_choice = new wxChoice ( this , wxID_ANY , wxDefaultPosition , wxDefaultSize , m_frame_limit_array_string );
m_cpu_engine_radiobox = new wxRadioBox ( this , wxID_ANY , _ ( "CPU Emulator Engine" ), wxDefaultPosition , wxDefaultSize , m_cpu_engine_array_string , 0 , wxRA_SPECIFY_ROWS );
m_dual_core_checkbox -> SetToolTip ( _ ( "Splits the CPU and GPU threads so they can be run on separate cores. \n Provides major speed improvements on most modern PCs, but can cause occasional crashes/glitches." ));
m_idle_skip_checkbox -> SetToolTip ( _ ( "Attempt to detect and skip wait-loops. \n If unsure, leave this checked." ));
m_cheats_checkbox -> SetToolTip ( _ ( "Enables the use of Action Replay and Gecko cheats." ));
m_force_ntscj_checkbox -> SetToolTip ( _ ( "Forces NTSC-J mode for using the Japanese ROM font. \n If left unchecked, Dolphin defaults to NTSC-U and automatically enables this setting when playing Japanese games." ));
m_frame_limit_choice -> SetToolTip ( _ ( "Limits the game speed to the specified number of frames per second (full speed is 60 for NTSC and 50 for PAL)." ));
m_dual_core_checkbox -> Bind ( wxEVT_CHECKBOX , & GeneralConfigPane :: OnDualCoreCheckBoxChanged , this );
m_idle_skip_checkbox -> Bind ( wxEVT_CHECKBOX , & GeneralConfigPane :: OnIdleSkipCheckBoxChanged , this );
m_cheats_checkbox -> Bind ( wxEVT_CHECKBOX , & GeneralConfigPane :: OnCheatCheckBoxChanged , this );
m_force_ntscj_checkbox -> Bind ( wxEVT_CHECKBOX , & GeneralConfigPane :: OnForceNTSCJCheckBoxChanged , this );
m_frame_limit_choice -> Bind ( wxEVT_CHOICE , & GeneralConfigPane :: OnFrameLimitChoiceChanged , this );
m_cpu_engine_radiobox -> Bind ( wxEVT_RADIOBOX , & GeneralConfigPane :: OnCPUEngineRadioBoxChanged , this );
wxBoxSizer * const frame_limit_sizer = new wxBoxSizer ( wxHORIZONTAL );
frame_limit_sizer -> Add ( new wxStaticText ( this , wxID_ANY , _ ( "Framelimit:" )), 0 , wxALIGN_CENTER_VERTICAL | wxLEFT | wxRIGHT | wxBOTTOM , 5 );
frame_limit_sizer -> Add ( m_frame_limit_choice , 0 , wxLEFT | wxRIGHT | wxBOTTOM | wxEXPAND , 5 );
wxStaticBoxSizer * const basic_settings_sizer = new wxStaticBoxSizer ( wxVERTICAL , this , _ ( "Basic Settings" ));
basic_settings_sizer -> Add ( m_dual_core_checkbox , 0 , wxALL , 5 );
basic_settings_sizer -> Add ( m_idle_skip_checkbox , 0 , wxALL , 5 );
basic_settings_sizer -> Add ( m_cheats_checkbox , 0 , wxALL , 5 );
basic_settings_sizer -> Add ( frame_limit_sizer );
wxStaticBoxSizer * const advanced_settings_sizer = new wxStaticBoxSizer ( wxVERTICAL , this , _ ( "Advanced Settings" ));
advanced_settings_sizer -> Add ( m_cpu_engine_radiobox , 0 , wxALL , 5 );
advanced_settings_sizer -> Add ( m_force_ntscj_checkbox , 0 , wxALL , 5 );
wxBoxSizer * const main_sizer = new wxBoxSizer ( wxVERTICAL );
main_sizer -> Add ( basic_settings_sizer , 0 , wxEXPAND | wxALL , 5 );
main_sizer -> Add ( advanced_settings_sizer , 0 , wxEXPAND | wxALL , 5 );
SetSizer ( main_sizer );
}
void GeneralConfigPane :: LoadGUIValues ()
{
const SCoreStartupParameter & startup_params = SConfig :: GetInstance (). m_LocalCoreStartupParameter ;
m_dual_core_checkbox -> SetValue ( startup_params . bCPUThread );
m_idle_skip_checkbox -> SetValue ( startup_params . bSkipIdle );
m_cheats_checkbox -> SetValue ( startup_params . bEnableCheats );
m_force_ntscj_checkbox -> SetValue ( startup_params . bForceNTSCJ );
m_frame_limit_choice -> SetSelection ( SConfig :: GetInstance (). m_Framelimit );
for ( size_t i = 0 ; i < ( sizeof ( cpu_cores ) / sizeof ( CPUCore )); ++ i )
{
if ( cpu_cores [ i ]. CPUid == startup_params . iCPUCore )
m_cpu_engine_radiobox -> SetSelection ( i );
}
}
void GeneralConfigPane :: RefreshGUI ()
{
if ( Core :: IsRunning ())
{
m_dual_core_checkbox -> Disable ();
m_idle_skip_checkbox -> Disable ();
m_cheats_checkbox -> Disable ();
m_force_ntscj_checkbox -> Disable ();
m_cpu_engine_radiobox -> Disable ();
}
}
void GeneralConfigPane :: OnDualCoreCheckBoxChanged ( wxCommandEvent & event )
{
if ( Core :: IsRunning ())
return ;
SConfig :: GetInstance (). m_LocalCoreStartupParameter . bCPUThread = m_dual_core_checkbox -> IsChecked ();
}
void GeneralConfigPane :: OnIdleSkipCheckBoxChanged ( wxCommandEvent & event )
{
SConfig :: GetInstance (). m_LocalCoreStartupParameter . bSkipIdle = m_idle_skip_checkbox -> IsChecked ();
}
void GeneralConfigPane :: OnCheatCheckBoxChanged ( wxCommandEvent & event )
{
2015-03-29 20:43:51 -04:00
SConfig :: GetInstance (). m_LocalCoreStartupParameter . bEnableCheats = m_cheats_checkbox -> IsChecked ();
2015-03-18 18:00:27 -04:00
}
void GeneralConfigPane :: OnForceNTSCJCheckBoxChanged ( wxCommandEvent & event )
{
SConfig :: GetInstance (). m_LocalCoreStartupParameter . bForceNTSCJ = m_force_ntscj_checkbox -> IsChecked ();
}
void GeneralConfigPane :: OnFrameLimitChoiceChanged ( wxCommandEvent & event )
{
SConfig :: GetInstance (). m_Framelimit = m_frame_limit_choice -> GetSelection ();
}
void GeneralConfigPane :: OnCPUEngineRadioBoxChanged ( wxCommandEvent & event )
{
const int selection = m_cpu_engine_radiobox -> GetSelection ();
if ( main_frame -> g_pCodeWindow )
{
bool using_interp = ( SConfig :: GetInstance (). m_LocalCoreStartupParameter . iCPUCore == PowerPC :: CORE_INTERPRETER );
main_frame -> g_pCodeWindow -> GetMenuBar () -> Check ( IDM_INTERPRETER , using_interp );
}
SConfig :: GetInstance (). m_LocalCoreStartupParameter . iCPUCore = cpu_cores [ selection ]. CPUid ;
}