SimpleString HexStringFrom(long value) { return StringFromFormat("%lx", value); }
SimpleString StringFrom(int value) { return StringFromFormat("%d", value); }
SimpleString StringFrom(long value) { return StringFromFormat("%ld", value); }
SimpleString StringFrom(uint8_t i) { return StringFromFormat("%3u (0x%02x)", i, i); }
SimpleString StringFrom(bool value) { return SimpleString(StringFromFormat("%s", value ? "true" : "false")); }
SimpleString StringFrom(uint32_t i) { return StringFromFormat("%10u (0x%08x)", i, i); }
SimpleString StringFrom(uint16_t i) { return StringFromFormat("%5u (0x%04x)", i, i); }
SimpleString StringFrom(char value) { return StringFromFormat("%c", value); }
SimpleString StringFrom(double value, int precision) { SimpleString format = StringFromFormat("%%.%dg", precision); return StringFromFormat(format.asCharString(), value); }
void VertexShaderCache::PrepareShader(u32 components, const XFMemory &xfr, const BPMemory &bpm, bool ongputhread) { VertexShaderUid uid; GetVertexShaderUID(uid, components, xfr, bpm); if (ongputhread) { Compiler->ProcCompilationResults(); #if defined(_DEBUG) || defined(DEBUGFAST) if (g_ActiveConfig.bEnableShaderDebugging) { ShaderCode code; GenerateVertexShaderCodeD3D9(code, uid.GetUidData()); } #endif if (last_entry) { if (uid == last_uid) { return; } } last_uid = uid; GFX_DEBUGGER_PAUSE_AT(NEXT_VERTEX_SHADER_CHANGE, true); } else { if (external_last_uid == uid) { return; } external_last_uid = uid; } vshaderslock.lock(); VSCacheEntry *entry = &vshaders[uid]; vshaderslock.unlock(); if (ongputhread) { last_entry = entry; } // Compile only when we have a new instance if (entry->initialized.test_and_set()) { return; } ShaderCompilerWorkUnit *wunit = Compiler->NewUnit(VERTEXSHADERGEN_BUFFERSIZE); wunit->GenerateCodeHandler = [uid](ShaderCompilerWorkUnit* wunit) { ShaderCode code; code.SetBuffer(wunit->code.data()); GenerateVertexShaderCodeD3D9(code, uid.GetUidData()); wunit->codesize = (u32)code.BufferSize(); }; wunit->entrypoint = "main"; wunit->flags = D3DCOMPILE_SKIP_VALIDATION | D3DCOMPILE_OPTIMIZATION_LEVEL3; wunit->target = D3D::VertexShaderVersionString(); wunit->ResultHandler = [uid, entry](ShaderCompilerWorkUnit* wunit) { if (SUCCEEDED(wunit->cresult)) { ID3DBlob* shaderBuffer = wunit->shaderbytecode; const u8* bytecode = (const u8*)shaderBuffer->GetBufferPointer(); u32 bytecodelen = (u32)shaderBuffer->GetBufferSize(); g_vs_disk_cache.Append(uid, bytecode, bytecodelen); PushByteCode(uid, bytecode, bytecodelen, entry); #if defined(_DEBUG) || defined(DEBUGFAST) if (g_ActiveConfig.bEnableShaderDebugging) { entry->code = wunit->code.data(); } #endif } else { static int num_failures = 0; std::string filename = StringFromFormat("%sbad_vs_%04i.txt", File::GetUserPath(D_DUMP_IDX).c_str(), num_failures++); std::ofstream file; OpenFStream(file, filename, std::ios_base::out); file << ((const char*)wunit->code.data()); file << ((const char*)wunit->error->GetBufferPointer()); file.close(); PanicAlert("Failed to compile vertex shader!\nThis usually happens when trying to use Dolphin with an outdated GPU or integrated GPU like the Intel GMA series.\n\nIf you're sure this is Dolphin's error anyway, post the contents of %s along with this error message at the forums.\n\nDebug info (%s):\n%s", filename, D3D::VertexShaderVersionString(), (char*)wunit->error->GetBufferPointer()); } }; Compiler->CompileShaderAsync(wunit); }
// Boot the ISO or file bool BootCore(const std::string& _rFilename) { SConfig& StartUp = SConfig::GetInstance(); // Use custom settings for debugging mode Host_SetStartupDebuggingParameters(); StartUp.m_BootType = SConfig::BOOT_ISO; StartUp.m_strFilename = _rFilename; SConfig::GetInstance().m_LastFilename = _rFilename; SConfig::GetInstance().SaveSettings(); StartUp.bRunCompareClient = false; StartUp.bRunCompareServer = false; // This is saved separately from everything because it can be changed in SConfig::AutoSetup() config_cache.bHLE_BS2 = StartUp.bHLE_BS2; // If for example the ISO file is bad we return here if (!StartUp.AutoSetup(SConfig::BOOT_DEFAULT)) return false; // Load game specific settings if (StartUp.GetUniqueID().size() == 6) { IniFile game_ini = StartUp.LoadGameIni(); config_cache.valid = true; config_cache.bCPUThread = StartUp.bCPUThread; config_cache.bSkipIdle = StartUp.bSkipIdle; config_cache.bSyncGPUOnSkipIdleHack = StartUp.bSyncGPUOnSkipIdleHack; config_cache.iCPUCore = StartUp.iCPUCore; config_cache.bFPRF = StartUp.bFPRF; config_cache.bAccurateNaNs = StartUp.bAccurateNaNs; config_cache.bMMU = StartUp.bMMU; config_cache.bDCBZOFF = StartUp.bDCBZOFF; config_cache.bSyncGPU = StartUp.bSyncGPU; config_cache.bFastDiscSpeed = StartUp.bFastDiscSpeed; config_cache.bDSPHLE = StartUp.bDSPHLE; config_cache.strBackend = StartUp.m_strVideoBackend; config_cache.m_strGPUDeterminismMode = StartUp.m_strGPUDeterminismMode; config_cache.m_EnableJIT = SConfig::GetInstance().m_DSPEnableJIT; config_cache.Volume = SConfig::GetInstance().m_Volume; config_cache.sBackend = SConfig::GetInstance().sBackend; config_cache.framelimit = SConfig::GetInstance().m_Framelimit; config_cache.frameSkip = SConfig::GetInstance().m_FrameSkip; config_cache.bProgressive = StartUp.bProgressive; config_cache.bPAL60 = StartUp.bPAL60; config_cache.iSelectedLanguage = StartUp.SelectedLanguage; for (unsigned int i = 0; i < MAX_BBMOTES; ++i) { config_cache.iWiimoteSource[i] = g_wiimote_sources[i]; } for (unsigned int i = 0; i < MAX_SI_CHANNELS; ++i) { config_cache.Pads[i] = SConfig::GetInstance().m_SIDevice[i]; } for (unsigned int i = 0; i < MAX_EXI_CHANNELS; ++i) { config_cache.m_EXIDevice[i] = SConfig::GetInstance().m_EXIDevice[i]; } std::fill_n(config_cache.bSetWiimoteSource, (int)MAX_BBMOTES, false); std::fill_n(config_cache.bSetPads, (int)MAX_SI_CHANNELS, false); std::fill_n(config_cache.bSetEXIDevice, (int)MAX_EXI_CHANNELS, false); config_cache.bSetFramelimit = false; config_cache.bSetFrameSkip = false; // General settings IniFile::Section* core_section = game_ini.GetOrCreateSection("Core"); IniFile::Section* dsp_section = game_ini.GetOrCreateSection("DSP"); IniFile::Section* controls_section = game_ini.GetOrCreateSection("Controls"); core_section->Get("CPUThread", &StartUp.bCPUThread, StartUp.bCPUThread); core_section->Get("SkipIdle", &StartUp.bSkipIdle, StartUp.bSkipIdle); core_section->Get("SyncOnSkipIdle", &StartUp.bSyncGPUOnSkipIdleHack, StartUp.bSyncGPUOnSkipIdleHack); core_section->Get("FPRF", &StartUp.bFPRF, StartUp.bFPRF); core_section->Get("AccurateNaNs", &StartUp.bAccurateNaNs, StartUp.bAccurateNaNs); core_section->Get("MMU", &StartUp.bMMU, StartUp.bMMU); core_section->Get("DCBZ", &StartUp.bDCBZOFF, StartUp.bDCBZOFF); core_section->Get("SyncGPU", &StartUp.bSyncGPU, StartUp.bSyncGPU); core_section->Get("FastDiscSpeed", &StartUp.bFastDiscSpeed, StartUp.bFastDiscSpeed); core_section->Get("DSPHLE", &StartUp.bDSPHLE, StartUp.bDSPHLE); core_section->Get("GFXBackend", &StartUp.m_strVideoBackend, StartUp.m_strVideoBackend); core_section->Get("CPUCore", &StartUp.iCPUCore, StartUp.iCPUCore); core_section->Get("HLE_BS2", &StartUp.bHLE_BS2, StartUp.bHLE_BS2); core_section->Get("ProgressiveScan", &StartUp.bProgressive, StartUp.bProgressive); core_section->Get("PAL60", &StartUp.bPAL60, StartUp.bPAL60); if (core_section->Get("FrameLimit", &SConfig::GetInstance().m_Framelimit, SConfig::GetInstance().m_Framelimit)) config_cache.bSetFramelimit = true; if (core_section->Get("FrameSkip", &SConfig::GetInstance().m_FrameSkip)) { config_cache.bSetFrameSkip = true; Movie::SetFrameSkipping(SConfig::GetInstance().m_FrameSkip); } if (dsp_section->Get("Volume", &SConfig::GetInstance().m_Volume, SConfig::GetInstance().m_Volume)) config_cache.bSetVolume = true; dsp_section->Get("EnableJIT", &SConfig::GetInstance().m_DSPEnableJIT, SConfig::GetInstance().m_DSPEnableJIT); dsp_section->Get("Backend", &SConfig::GetInstance().sBackend, SConfig::GetInstance().sBackend); VideoBackend::ActivateBackend(StartUp.m_strVideoBackend); core_section->Get("GPUDeterminismMode", &StartUp.m_strGPUDeterminismMode, StartUp.m_strGPUDeterminismMode); for (unsigned int i = 0; i < MAX_SI_CHANNELS; ++i) { int source; controls_section->Get(StringFromFormat("PadType%u", i), &source, -1); if (source >= (int) SIDEVICE_NONE && source <= (int) SIDEVICE_AM_BASEBOARD) { SConfig::GetInstance().m_SIDevice[i] = (SIDevices) source; config_cache.bSetPads[i] = true; } } // Wii settings if (StartUp.bWii) { // Flush possible changes to SYSCONF to file SConfig::GetInstance().m_SYSCONF->Save(); int source; for (unsigned int i = 0; i < MAX_WIIMOTES; ++i) { controls_section->Get(StringFromFormat("WiimoteSource%u", i), &source, -1); if (source != -1 && g_wiimote_sources[i] != (unsigned) source && source >= WIIMOTE_SRC_NONE && source <= WIIMOTE_SRC_HYBRID) { config_cache.bSetWiimoteSource[i] = true; g_wiimote_sources[i] = source; WiimoteReal::ChangeWiimoteSource(i, source); } } controls_section->Get("WiimoteSourceBB", &source, -1); if (source != -1 && g_wiimote_sources[WIIMOTE_BALANCE_BOARD] != (unsigned) source && (source == WIIMOTE_SRC_NONE || source == WIIMOTE_SRC_REAL)) { config_cache.bSetWiimoteSource[WIIMOTE_BALANCE_BOARD] = true; g_wiimote_sources[WIIMOTE_BALANCE_BOARD] = source; WiimoteReal::ChangeWiimoteSource(WIIMOTE_BALANCE_BOARD, source); } } } StartUp.m_GPUDeterminismMode = ParseGPUDeterminismMode(StartUp.m_strGPUDeterminismMode); // Movie settings if (Movie::IsPlayingInput() && Movie::IsConfigSaved()) { StartUp.bCPUThread = Movie::IsDualCore(); StartUp.bSkipIdle = Movie::IsSkipIdle(); StartUp.bDSPHLE = Movie::IsDSPHLE(); StartUp.bProgressive = Movie::IsProgressive(); StartUp.bPAL60 = Movie::IsPAL60(); StartUp.bFastDiscSpeed = Movie::IsFastDiscSpeed(); StartUp.iCPUCore = Movie::GetCPUMode(); StartUp.bSyncGPU = Movie::IsSyncGPU(); for (int i = 0; i < 2; ++i) { if (Movie::IsUsingMemcard(i) && Movie::IsStartingFromClearSave() && !StartUp.bWii) { if (File::Exists(File::GetUserPath(D_GCUSER_IDX) + StringFromFormat("Movie%s.raw", (i == 0) ? "A" : "B"))) File::Delete(File::GetUserPath(D_GCUSER_IDX) + StringFromFormat("Movie%s.raw", (i == 0) ? "A" : "B")); } } } if (NetPlay::IsNetPlayRunning()) { StartUp.bCPUThread = g_NetPlaySettings.m_CPUthread; StartUp.bDSPHLE = g_NetPlaySettings.m_DSPHLE; StartUp.bEnableMemcardSdWriting = g_NetPlaySettings.m_WriteToMemcard; StartUp.iCPUCore = g_NetPlaySettings.m_CPUcore; StartUp.SelectedLanguage = g_NetPlaySettings.m_SelectedLanguage; StartUp.bOverrideGCLanguage = g_NetPlaySettings.m_OverrideGCLanguage; StartUp.bProgressive = g_NetPlaySettings.m_ProgressiveScan; StartUp.bPAL60 = g_NetPlaySettings.m_PAL60; SConfig::GetInstance().m_DSPEnableJIT = g_NetPlaySettings.m_DSPEnableJIT; SConfig::GetInstance().m_OCEnable = g_NetPlaySettings.m_OCEnable; SConfig::GetInstance().m_OCFactor = g_NetPlaySettings.m_OCFactor; SConfig::GetInstance().m_EXIDevice[0] = g_NetPlaySettings.m_EXIDevice[0]; SConfig::GetInstance().m_EXIDevice[1] = g_NetPlaySettings.m_EXIDevice[1]; config_cache.bSetEXIDevice[0] = true; config_cache.bSetEXIDevice[1] = true; } else { g_SRAM_netplay_initialized = false; } // Apply overrides // Some NTSC GameCube games such as Baten Kaitos react strangely to language settings that would be invalid on an NTSC system if (!StartUp.bOverrideGCLanguage && StartUp.bNTSC) { StartUp.SelectedLanguage = 0; } // Some NTSC Wii games such as Doc Louis's Punch-Out!! and 1942 (Virtual Console) crash if the PAL60 option is enabled if (StartUp.bWii && StartUp.bNTSC) { StartUp.bPAL60 = false; } SConfig::GetInstance().m_SYSCONF->SetData("IPL.PGS", StartUp.bProgressive); SConfig::GetInstance().m_SYSCONF->SetData("IPL.E60", StartUp.bPAL60); // Run the game // Init the core if (!Core::Init()) { PanicAlertT("Couldn't init the core.\nCheck your configuration."); return false; } return true; }
void HotkeyManager::LoadDefaults(const ControllerInterface& ciface) { ControllerEmu::LoadDefaults(ciface); #ifdef _WIN32 const std::string NON = "(!(LMENU | RMENU) & !(LSHIFT | RSHIFT) & !(LCONTROL | RCONTROL))"; const std::string ALT = "((LMENU | RMENU) & !(LSHIFT | RSHIFT) & !(LCONTROL | RCONTROL))"; const std::string SHIFT = "(!(LMENU | RMENU) & (LSHIFT | RSHIFT) & !(LCONTROL | RCONTROL))"; const std::string CTRL = "(!(LMENU | RMENU) & !(LSHIFT | RSHIFT) & (LCONTROL | RCONTROL))"; #else const std::string NON = "(!`Alt_L` & !(`Shift_L` | `Shift_R`) & !(`Control_L` | `Control_R` ))"; const std::string ALT = "(`Alt_L` & !(`Shift_L` | `Shift_R`) & !(`Control_L` | `Control_R` ))"; const std::string SHIFT = "(!`Alt_L` & (`Shift_L` | `Shift_R`) & !(`Control_L` | `Control_R` ))"; const std::string CTRL = "(!`Alt_L` & !(`Shift_L` | `Shift_R`) & (`Control_L` | `Control_R` ))"; #endif auto set_key_expression = [this](int index, const std::string& expression) { m_keys[index / 32]->controls[index % 32]->control_ref->expression = expression; }; // General hotkeys set_key_expression(HK_OPEN, CTRL + " & O"); set_key_expression(HK_PLAY_PAUSE, "`F10`"); #ifdef _WIN32 set_key_expression(HK_STOP, "ESCAPE"); set_key_expression(HK_FULLSCREEN, ALT + " & RETURN"); #else set_key_expression(HK_STOP, "Escape"); set_key_expression(HK_FULLSCREEN, ALT + " & Return"); #endif set_key_expression(HK_SCREENSHOT, NON + " & `F9`"); set_key_expression(HK_WIIMOTE1_CONNECT, ALT + " & `F5`"); set_key_expression(HK_WIIMOTE2_CONNECT, ALT + " & `F6`"); set_key_expression(HK_WIIMOTE3_CONNECT, ALT + " & `F7`"); set_key_expression(HK_WIIMOTE4_CONNECT, ALT + " & `F8`"); set_key_expression(HK_BALANCEBOARD_CONNECT, ALT + " & `F9`"); #ifdef _WIN32 set_key_expression(HK_TOGGLE_THROTTLE, "TAB"); #else set_key_expression(HK_TOGGLE_THROTTLE, "Tab"); #endif // Freelook set_key_expression(HK_FREELOOK_DECREASE_SPEED, SHIFT + " & `1`"); set_key_expression(HK_FREELOOK_INCREASE_SPEED, SHIFT + " & `2`"); set_key_expression(HK_FREELOOK_RESET_SPEED, SHIFT + " & F"); set_key_expression(HK_FREELOOK_UP, SHIFT + " & E"); set_key_expression(HK_FREELOOK_DOWN, SHIFT + " & Q"); set_key_expression(HK_FREELOOK_LEFT, SHIFT + " & A"); set_key_expression(HK_FREELOOK_RIGHT, SHIFT + " & D"); set_key_expression(HK_FREELOOK_ZOOM_IN, SHIFT + " & W"); set_key_expression(HK_FREELOOK_ZOOM_OUT, SHIFT + " & S"); set_key_expression(HK_FREELOOK_RESET, SHIFT + " & R"); // Savestates for (int i = 0; i < 8; i++) { set_key_expression(HK_LOAD_STATE_SLOT_1 + i, StringFromFormat((NON + " & `F%d`").c_str(), i + 1)); set_key_expression(HK_SAVE_STATE_SLOT_1 + i, StringFromFormat((SHIFT + " & `F%d`").c_str(), i + 1)); } set_key_expression(HK_UNDO_LOAD_STATE, NON + " & `F12`"); set_key_expression(HK_UNDO_SAVE_STATE, SHIFT + " & `F12`"); }