Sin descripción

Marc Di Luzio ee1c51d0b0 Add clang format file hace 7 años
daemon 1170746a37 Default initialise arrays to 0 instead of using memset hace 7 años
data c459c05076 Initial 0.1 commit hace 7 años
example c459c05076 Initial 0.1 commit hace 7 años
lib c459c05076 Initial 0.1 commit hace 7 años
.clang-format ee1c51d0b0 Add clang format file hace 7 años
.gitignore c459c05076 Initial 0.1 commit hace 7 años
LICENSE.txt c459c05076 Initial 0.1 commit hace 7 años
README.md ee1c51d0b0 Add clang format file hace 7 años
bootstrap.sh c459c05076 Initial 0.1 commit hace 7 años
meson.build 47b76f1496 Set meson C language to C11 hace 7 años

README.md

GameMode

A preliminary implementation of a daemon/lib combo to allow games to request a performance mode from the host OS on Linux. It was designed primarily as a stop-gap solution to problems with the Intel and AMD CPU powersave or ondemand governors, but is intended to be expanded beyond just CPU power states as needed.

Currently using sd-bus on the user bus internally for messaging


Components

Host

gamemoded

Runs in the background, waits for requests, refcounts and also checks caller PID lifetime.

Accepts -d (daemonize) and -l (log to syslog)

libgamemode

Dynamic library to dispatch requests to the daemon

Note: Behaviour of gamemoded may change, so libgamemode should never be linked with directly.

cpugovctl

Small program used to to control the cpu governor.

Accepts get (gets current governor) and set <GOVERNOR> (sets the current governor).

Clients

libgamemodeauto

Simple dynamic library that automatically requests game mode when loaded. Minimal dependencies.

Useful to LD_PRELOAD into any game as needed.

gamemode_client.h

Very small header only lib that lets a game request game mode and handle errors. Minimal dependencies.

Can also be included with GAMEMODE_AUTO defined to behave automatically.


Build and install

Daemon and host library

Dependencies

  • meson
  • systemd

    # Ubuntu
    apt install meson libsystemd-dev
    # Arch
    pacman -S meson systemd
    
    git clone <git repo>
    cd gamemode
    meson --prefix=/usr build
    cd build
    ninja
    sudo ninja install
    

Using with any game or program

After installing libgamemodeauto.so simple preload it into the program. Examples:

LD_PRELOAD=/usr/lib/libgamemodeauto.so ./game

Or steam launch options

LD_PRELOAD=/usr/lib/libgamemodeauto.so %command%

Building into a game or program

You may want to build in functionality directly into an app, this stops the need for users to have to manually set anything up.

gamemode_client.h and libgamemodeauto are safe to use regardless of whether libgamemode and gamemoded are installed on the system. They also do not require systemd.

Using directly

#include "gamemode_client.h"

	if( gamemode_request_start() < 0 )
		fprintf( stderr, "gamemode request failed: %s\n", gamemode_error_string() );

	/* run game... */

	gamemode_request_end(); // Not required, gamemoded will clean up after game exists anyway

Using automatically

Option 1: Include in code

#define GAMEMODE_AUTO
#include "gamemode_client.h"

Option 2: Link and distribute

Add -lgamemodeauto to linker arguments and distribute libgamemodeauto.so with the game

Option 3: Distribute and script

Distribute libgamemodeauto.so with the game and add to LD_PRELOAD in a launch script


Pull Requests

Pull requests must match with the coding style found in the .clang-format file

clang-format -i $(find . -name '*.[ch]')

TODO

  • Use polkit for cpugovctl (currently simply using chmod +4555)
  • Implement some kind of user confuguration to allow for whitelists, extra behaviour, etc.