diff --git a/src/common/settings.h b/src/common/settings.h index 59e96e74fd..e53cd02b4b 100644 --- a/src/common/settings.h +++ b/src/common/settings.h @@ -584,6 +584,7 @@ struct Values { // Miscellaneous Setting log_filter{"*:Info", "log_filter"}; Setting use_dev_keys{false, "use_dev_keys"}; + Setting use_gamemode{false, "use_gamemode"}; // Network Setting network_interface{std::string(), "network_interface"}; diff --git a/src/yuzu_cmd/CMakeLists.txt b/src/yuzu_cmd/CMakeLists.txt index 46eddf423f..3e5bd31455 100644 --- a/src/yuzu_cmd/CMakeLists.txt +++ b/src/yuzu_cmd/CMakeLists.txt @@ -45,6 +45,7 @@ target_link_libraries(yuzu-cmd PRIVATE SDL2::SDL2 Vulkan::Headers) if(UNIX AND NOT APPLE) install(TARGETS yuzu-cmd) + target_link_libraries(yuzu-cmd PRIVATE gamemode) endif() if(WIN32) diff --git a/src/yuzu_cmd/config.cpp b/src/yuzu_cmd/config.cpp index c5bc472ca2..498b19ad15 100644 --- a/src/yuzu_cmd/config.cpp +++ b/src/yuzu_cmd/config.cpp @@ -336,6 +336,7 @@ void Config::ReadValues() { Settings::values.log_filter = sdl2_config->Get("Miscellaneous", Settings::values.log_filter.GetLabel(), "*:Trace"); ReadSetting("Miscellaneous", Settings::values.use_dev_keys); + ReadSetting("Miscellaneous", Settings::values.use_gamemode); // Debugging Settings::values.record_frame_times = diff --git a/src/yuzu_cmd/default_ini.h b/src/yuzu_cmd/default_ini.h index 119e22183e..72e666d20c 100644 --- a/src/yuzu_cmd/default_ini.h +++ b/src/yuzu_cmd/default_ini.h @@ -498,6 +498,10 @@ log_filter = *:Trace # 0 (default): Disabled, 1: Enabled use_dev_keys = +# Use gamemode +# 0 (default): Disabled, 1: Enabled +use_gamemode = + [Debugging] # Record frame time data, can be found in the log directory. Boolean value record_frame_times = diff --git a/src/yuzu_cmd/yuzu.cpp b/src/yuzu_cmd/yuzu.cpp index d0433ffc65..f5f5799337 100644 --- a/src/yuzu_cmd/yuzu.cpp +++ b/src/yuzu_cmd/yuzu.cpp @@ -62,6 +62,10 @@ __declspec(dllexport) int AmdPowerXpressRequestHighPerformance = 1; } #endif +#ifdef __linux__ +#include +#endif + static void PrintHelp(const char* argv0) { std::cout << "Usage: " << argv0 << " [options] \n" @@ -422,6 +426,16 @@ int main(int argc, char** argv) { exit(0); }); +#ifdef __linux__ + if (Settings::values.use_gamemode) { + if (gamemode_request_start() < 0) { + LOG_WARNING(Frontend, "Failed to start gamemode: {}", gamemode_error_string()); + } else { + LOG_INFO(Frontend, "Started gamemode"); + } + } +#endif + void(system.Run()); if (system.DebuggerEnabled()) { system.InitializeDebugger(); @@ -433,6 +447,16 @@ int main(int argc, char** argv) { void(system.Pause()); system.ShutdownMainProcess(); +#ifdef __linux__ + if (Settings::values.use_gamemode) { + if (gamemode_request_end() < 0) { + LOG_WARNING(Frontend, "Failed to stop gamemode: {}", gamemode_error_string()); + } else { + LOG_INFO(Frontend, "Stopped gamemode"); + } + } +#endif + detached_tasks.WaitForAllTasks(); return 0; }