diff options
| -rw-r--r-- | src/citra/config.cpp | 17 | ||||
| -rw-r--r-- | src/citra/config.h | 5 | ||||
| -rw-r--r-- | src/citra/emu_window/emu_window_glfw.cpp | 8 | ||||
| -rw-r--r-- | src/citra_qt/config.cpp | 52 | ||||
| -rw-r--r-- | src/citra_qt/config.h | 11 | ||||
| -rw-r--r-- | src/core/arm/dyncom/arm_dyncom_interpreter.cpp | 54 | ||||
| -rw-r--r-- | src/core/hle/kernel/mutex.cpp | 15 | ||||
| -rw-r--r-- | src/core/hle/kernel/thread.cpp | 2 | ||||
| -rw-r--r-- | src/core/hle/svc.cpp | 5 | 
9 files changed, 62 insertions, 107 deletions
| diff --git a/src/citra/config.cpp b/src/citra/config.cpp index f45d09fc2..1f8f5922b 100644 --- a/src/citra/config.cpp +++ b/src/citra/config.cpp @@ -36,7 +36,8 @@ bool Config::LoadINI(INIReader* config, const char* location, const std::string&      return true;  } -void Config::ReadControls() { +void Config::ReadValues() { +    // Controls      Settings::values.pad_a_key = glfw_config->GetInteger("Controls", "pad_a", GLFW_KEY_A);      Settings::values.pad_b_key = glfw_config->GetInteger("Controls", "pad_b", GLFW_KEY_S);      Settings::values.pad_x_key = glfw_config->GetInteger("Controls", "pad_x", GLFW_KEY_Z); @@ -54,27 +55,21 @@ void Config::ReadControls() {      Settings::values.pad_sdown_key  = glfw_config->GetInteger("Controls", "pad_sdown",  GLFW_KEY_DOWN);      Settings::values.pad_sleft_key  = glfw_config->GetInteger("Controls", "pad_sleft",  GLFW_KEY_LEFT);      Settings::values.pad_sright_key = glfw_config->GetInteger("Controls", "pad_sright", GLFW_KEY_RIGHT); -} -void Config::ReadCore() { +    // Core      Settings::values.cpu_core = glfw_config->GetInteger("Core", "cpu_core", Core::CPU_Interpreter);      Settings::values.gpu_refresh_rate = glfw_config->GetInteger("Core", "gpu_refresh_rate", 60); -} -void Config::ReadData() { +    // Data Storage      Settings::values.use_virtual_sd = glfw_config->GetBoolean("Data Storage", "use_virtual_sd", true); -} -void Config::ReadMiscellaneous() { +    // Miscellaneous      Settings::values.enable_log = glfw_config->GetBoolean("Miscellaneous", "enable_log", true);  }  void Config::Reload() {      LoadINI(glfw_config, glfw_config_loc.c_str(), DefaultINI::glfw_config_file); -    ReadControls(); -    ReadCore(); -    ReadData(); -    ReadMiscellaneous(); +    ReadValues();  }  Config::~Config() { diff --git a/src/citra/config.h b/src/citra/config.h index 19bb83700..2b46fa8aa 100644 --- a/src/citra/config.h +++ b/src/citra/config.h @@ -15,10 +15,7 @@ class Config {      std::string glfw_config_loc;      bool LoadINI(INIReader* config, const char* location, const std::string& default_contents="", bool retry=true); -    void ReadControls(); -    void ReadCore(); -    void ReadData(); -    void ReadMiscellaneous(); +    void ReadValues();  public:      Config();      ~Config(); diff --git a/src/citra/emu_window/emu_window_glfw.cpp b/src/citra/emu_window/emu_window_glfw.cpp index 8efb39e2e..697bf4693 100644 --- a/src/citra/emu_window/emu_window_glfw.cpp +++ b/src/citra/emu_window/emu_window_glfw.cpp @@ -58,9 +58,13 @@ EmuWindow_GLFW::EmuWindow_GLFW() {      ReloadSetKeymaps(); +    glfwSetErrorCallback([](int error, const char *desc){ +        ERROR_LOG(GUI, "GLFW 0x%08x: %s", error, desc); +    }); +      // Initialize the window      if(glfwInit() != GL_TRUE) { -        printf("Failed to initialize GLFW! Exiting..."); +        ERROR_LOG(GUI, "Failed to initialize GLFW! Exiting...");          exit(1);      }      glfwWindowHint(GLFW_CONTEXT_VERSION_MAJOR, 3); @@ -75,7 +79,7 @@ EmuWindow_GLFW::EmuWindow_GLFW() {          window_title.c_str(), NULL, NULL);      if (m_render_window == NULL) { -        printf("Failed to create GLFW window! Exiting..."); +        ERROR_LOG(GUI, "Failed to create GLFW window! Exiting...");          exit(1);      } diff --git a/src/citra_qt/config.cpp b/src/citra_qt/config.cpp index 09fce4d6f..3209e5900 100644 --- a/src/citra_qt/config.cpp +++ b/src/citra_qt/config.cpp @@ -21,7 +21,7 @@ Config::Config() {      Reload();  } -void Config::ReadControls() { +void Config::ReadValues() {      qt_config->beginGroup("Controls");      Settings::values.pad_a_key = qt_config->value("pad_a", Qt::Key_A).toInt();      Settings::values.pad_b_key = qt_config->value("pad_b", Qt::Key_S).toInt(); @@ -41,9 +41,22 @@ void Config::ReadControls() {      Settings::values.pad_sleft_key  = qt_config->value("pad_sleft",  Qt::Key_Left).toInt();      Settings::values.pad_sright_key = qt_config->value("pad_sright", Qt::Key_Right).toInt();      qt_config->endGroup(); + +    qt_config->beginGroup("Core"); +    Settings::values.cpu_core = qt_config->value("cpu_core", Core::CPU_Interpreter).toInt(); +    Settings::values.gpu_refresh_rate = qt_config->value("gpu_refresh_rate", 60).toInt(); +    qt_config->endGroup(); + +    qt_config->beginGroup("Data Storage"); +    Settings::values.use_virtual_sd = qt_config->value("use_virtual_sd", true).toBool(); +    qt_config->endGroup(); + +    qt_config->beginGroup("Miscellaneous"); +    Settings::values.enable_log = qt_config->value("enable_log", true).toBool(); +    qt_config->endGroup();  } -void Config::SaveControls() { +void Config::SaveValues() {      qt_config->beginGroup("Controls");      qt_config->setValue("pad_a", Settings::values.pad_a_key);      qt_config->setValue("pad_b", Settings::values.pad_b_key); @@ -63,58 +76,27 @@ void Config::SaveControls() {      qt_config->setValue("pad_sleft",  Settings::values.pad_sleft_key);      qt_config->setValue("pad_sright", Settings::values.pad_sright_key);      qt_config->endGroup(); -} - -void Config::ReadCore() { -    qt_config->beginGroup("Core"); -    Settings::values.cpu_core = qt_config->value("cpu_core", Core::CPU_Interpreter).toInt(); -    Settings::values.gpu_refresh_rate = qt_config->value("gpu_refresh_rate", 60).toInt(); -    qt_config->endGroup(); -} -void Config::SaveCore() {      qt_config->beginGroup("Core");      qt_config->setValue("cpu_core", Settings::values.cpu_core);      qt_config->setValue("gpu_refresh_rate", Settings::values.gpu_refresh_rate);      qt_config->endGroup(); -} - -void Config::ReadData() { -    qt_config->beginGroup("Data Storage"); -    Settings::values.use_virtual_sd = qt_config->value("use_virtual_sd", true).toBool(); -    qt_config->endGroup(); -} -void Config::SaveData() {      qt_config->beginGroup("Data Storage");      qt_config->setValue("use_virtual_sd", Settings::values.use_virtual_sd);      qt_config->endGroup(); -} - -void Config::ReadMiscellaneous() { -    qt_config->beginGroup("Miscellaneous"); -    Settings::values.enable_log = qt_config->value("enable_log", true).toBool(); -    qt_config->endGroup(); -} -void Config::SaveMiscellaneous() {      qt_config->beginGroup("Miscellaneous");      qt_config->setValue("enable_log", Settings::values.enable_log);      qt_config->endGroup();  }  void Config::Reload() { -    ReadControls(); -    ReadCore(); -    ReadData(); -    ReadMiscellaneous(); +    ReadValues();  }  void Config::Save() { -    SaveControls(); -    SaveCore(); -    SaveData(); -    SaveMiscellaneous(); +    SaveValues();  }  Config::~Config() { diff --git a/src/citra_qt/config.h b/src/citra_qt/config.h index 8c6568cb2..4c95d0cb9 100644 --- a/src/citra_qt/config.h +++ b/src/citra_qt/config.h @@ -12,15 +12,8 @@ class Config {      QSettings* qt_config;      std::string qt_config_loc; -    void ReadControls(); -    void SaveControls(); -    void ReadCore(); -    void SaveCore(); -    void ReadData(); -    void SaveData(); - -    void ReadMiscellaneous(); -    void SaveMiscellaneous(); +    void ReadValues(); +    void SaveValues();  public:      Config();      ~Config(); diff --git a/src/core/arm/dyncom/arm_dyncom_interpreter.cpp b/src/core/arm/dyncom/arm_dyncom_interpreter.cpp index f899e2e8a..233cd3e3a 100644 --- a/src/core/arm/dyncom/arm_dyncom_interpreter.cpp +++ b/src/core/arm/dyncom/arm_dyncom_interpreter.cpp @@ -26,7 +26,7 @@  #define CITRA_IGNORE_EXIT(x)  #include <algorithm> -#include <map> +#include <unordered_map>  #include <stdio.h>  #include <assert.h>  #include <cstdio> @@ -94,9 +94,8 @@ typedef unsigned int (*shtop_fp_t)(arm_processor *cpu, unsigned int sht_oper);  /* exclusive memory access */  static int exclusive_detect(ARMul_State* state, ARMword addr){ -	int i;  	#if 0 -	for(i = 0; i < 128; i++){ +	for(int i = 0; i < 128; i++){  		if(state->exclusive_tag_array[i] == addr)  			return 0;  	} @@ -108,9 +107,8 @@ static int exclusive_detect(ARMul_State* state, ARMword addr){  }  static void add_exclusive_addr(ARMul_State* state, ARMword addr){ -	int i;  	#if 0 -	for(i = 0; i < 128; i++){ +	for(int i = 0; i < 128; i++){  		if(state->exclusive_tag_array[i] == 0xffffffff){  			state->exclusive_tag_array[i] = addr;  			//DEBUG_LOG(ARM11, "In %s, add  addr 0x%x\n", __func__, addr); @@ -3309,9 +3307,8 @@ const transop_fp_t arm_instruction_trans[] = {  	INTERPRETER_TRANSLATE(blx_1_thumb)  }; -typedef map<unsigned int, int> bb_map; -bb_map CreamCache[65536]; -bb_map ProfileCache[65536]; +typedef std::unordered_map<u32, int> bb_map; +bb_map CreamCache;  //#define USE_DUMMY_CACHE @@ -3319,14 +3316,12 @@ bb_map ProfileCache[65536];  unsigned int DummyCache[0x100000];  #endif -#define HASH(x) ((x + (x << 3) + (x >> 6)) % 65536)  void insert_bb(unsigned int addr, int start)  {  #ifdef USE_DUMMY_CACHE  	DummyCache[addr] = start;  #else -//	CreamCache[addr] = start; -	CreamCache[HASH(addr)][addr] = start; +	CreamCache[addr] = start;  #endif  } @@ -3341,8 +3336,8 @@ int find_bb(unsigned int addr, int &start)  	} else  		ret = -1;  #else -	bb_map::const_iterator it = CreamCache[HASH(addr)].find(addr); -	if (it != CreamCache[HASH(addr)].end()) { +	bb_map::const_iterator it = CreamCache.find(addr); +	if (it != CreamCache.end()) {  		start = static_cast<int>(it->second);  		ret = 0;  #if HYBRID_MODE @@ -3473,30 +3468,15 @@ void flush_bb(uint32_t addr)  	uint32_t start;  	addr  &= 0xfffff000; -	for (int i = 0; i < 65536; i ++) { -		for (it = CreamCache[i].begin(); it != CreamCache[i].end(); ) { -			start = static_cast<uint32_t>(it->first); -			//start = (start >> 12) << 12; -			start &= 0xfffff000; -			if (start == addr) { -				//DEBUG_LOG(ARM11, "[ERASE][0x%08x]\n", static_cast<int>(it->first)); -				CreamCache[i].erase(it ++); -			} else -				++it; -		} -	} - -	for (int i = 0; i < 65536; i ++) { -		for (it = ProfileCache[i].begin(); it != ProfileCache[i].end(); ) { -			start = static_cast<uint32_t>(it->first); -			//start = (start >> 12) << 12; -			start &= 0xfffff000; -			if (start == addr) { -				//DEBUG_LOG(ARM11, "[ERASE][0x%08x]\n", static_cast<int>(it->first)); -				ProfileCache[i].erase(it ++); -			} else -				++it; -		} +	for (it = CreamCache.begin(); it != CreamCache.end(); ) { +		start = static_cast<uint32_t>(it->first); +		//start = (start >> 12) << 12; +		start &= 0xfffff000; +		if (start == addr) { +			//DEBUG_LOG(ARM11, "[ERASE][0x%08x]\n", static_cast<int>(it->first)); +			CreamCache.erase(it++); +		} else +			++it;  	}  	//DEBUG_LOG(ARM11, "flush bb @ %x\n", addr); diff --git a/src/core/hle/kernel/mutex.cpp b/src/core/hle/kernel/mutex.cpp index b303ba128..d07e9761b 100644 --- a/src/core/hle/kernel/mutex.cpp +++ b/src/core/hle/kernel/mutex.cpp @@ -88,20 +88,19 @@ bool ReleaseMutexForThread(Mutex* mutex, Handle thread) {  bool ReleaseMutex(Mutex* mutex) {      MutexEraseLock(mutex); -    bool woke_threads = false;      // Find the next waiting thread for the mutex... -    while (!woke_threads && !mutex->waiting_threads.empty()) { +    while (!mutex->waiting_threads.empty()) {          std::vector<Handle>::iterator iter = mutex->waiting_threads.begin(); -        woke_threads |= ReleaseMutexForThread(mutex, *iter); +        ReleaseMutexForThread(mutex, *iter);          mutex->waiting_threads.erase(iter);      } +      // Reset mutex lock thread handle, nothing is waiting -    if (!woke_threads) { -        mutex->locked = false; -        mutex->lock_thread = -1; -    } -    return woke_threads; +    mutex->locked = false; +    mutex->lock_thread = -1; + +    return true;  }  /** diff --git a/src/core/hle/kernel/thread.cpp b/src/core/hle/kernel/thread.cpp index f3f54a4e9..f59795901 100644 --- a/src/core/hle/kernel/thread.cpp +++ b/src/core/hle/kernel/thread.cpp @@ -143,7 +143,7 @@ void ChangeReadyState(Thread* t, bool ready) {  /// Verify that a thread has not been released from waiting  inline bool VerifyWait(const Thread* thread, WaitType type, Handle wait_handle) {      _dbg_assert_(KERNEL, thread != nullptr); -    return type == thread->wait_type && wait_handle == thread->wait_handle; +    return (type == thread->wait_type) && (wait_handle == thread->wait_handle) && (thread->IsWaiting());  }  /// Stops the current thread diff --git a/src/core/hle/svc.cpp b/src/core/hle/svc.cpp index 87d768856..43a3cbe03 100644 --- a/src/core/hle/svc.cpp +++ b/src/core/hle/svc.cpp @@ -189,6 +189,8 @@ static Result CreateAddressArbiter(u32* arbiter) {  /// Arbitrate address  static Result ArbitrateAddress(Handle arbiter, u32 address, u32 type, u32 value, s64 nanoseconds) { +    DEBUG_LOG(SVC, "called handle=0x%08X, address=0x%08X, type=0x%08X, value=0x%08X", arbiter, +        address, type, value);      return Kernel::ArbitrateAddress(arbiter, static_cast<Kernel::ArbitrationType>(type),              address, value).raw;  } @@ -331,6 +333,9 @@ static Result ClearEvent(Handle evt) {  /// Sleep the current thread  static void SleepThread(s64 nanoseconds) {      DEBUG_LOG(SVC, "called nanoseconds=%lld", nanoseconds); + +    // Check for next thread to schedule +    HLE::Reschedule(__func__);  }  /// This returns the total CPU ticks elapsed since the CPU was powered-on | 
