Browse Source

Allow setting the device value with a hex string

	Also stops erroring on 0 value longs
Marc Di Luzio 6 years ago
parent
commit
ad2c218ab3
3 changed files with 32 additions and 9 deletions
  1. 23 3
      daemon/daemon_config.c
  2. 8 6
      daemon/gamemode-gpu.c
  3. 1 0
      example/gamemode.ini

+ 23 - 3
daemon/daemon_config.c

@@ -119,7 +119,7 @@ static bool append_value_to_list(const char *list_name, const char *value,
 }
 
 /*
- * Get a positive long value from a string
+ * Get a long value from a string
  */
 static bool get_long_value(const char *value_name, const char *value, long *output)
 {
@@ -129,7 +129,27 @@ static bool get_long_value(const char *value_name, const char *value, long *outp
 	if (errno == ERANGE) {
 		LOG_ERROR("Config: %s overflowed, given [%s]\n", value_name, value);
 		return false;
-	} else if (config_value <= 0 || !(*value != '\0' && end && *end == '\0')) {
+	} else if (!(*value != '\0' && end && *end == '\0')) {
+		LOG_ERROR("Config: %s was invalid, given [%s]\n", value_name, value);
+		return false;
+	} else {
+		*output = config_value;
+	}
+
+	return true;
+}
+/*
+ * Get a long value from a hex string
+ */
+static bool get_long_value_hex(const char *value_name, const char *value, long *output)
+{
+	char *end = NULL;
+	long config_value = strtol(value, &end, 16);
+
+	if (errno == ERANGE) {
+		LOG_ERROR("Config: %s overflowed, given [%s]\n", value_name, value);
+		return false;
+	} else if (!(*value != '\0' && end && *end == '\0')) {
 		LOG_ERROR("Config: %s was invalid, given [%s]\n", value_name, value);
 		return false;
 	} else {
@@ -186,7 +206,7 @@ static int inih_handler(void *user, const char *section, const char *name, const
 		if (strcmp(name, "apply_gpu_optimisations") == 0) {
 			valid = get_long_value(name, value, &self->apply_gpu_optimisations);
 		} else if (strcmp(name, "gpu_vendor") == 0) {
-			valid = get_long_value(name, value, &self->gpu_device);
+			valid = get_long_value_hex(name, value, &self->gpu_vendor);
 		} else if (strcmp(name, "gpu_device") == 0) {
 			valid = get_long_value(name, value, &self->gpu_device);
 		} else if (strcmp(name, "nv_core_clock_mhz_offset") == 0) {

+ 8 - 6
daemon/gamemode-gpu.c

@@ -40,8 +40,7 @@ POSSIBILITY OF SUCH DAMAGE.
 #include "gpu-query.h"
 
 // TODO
-// Gather GPU type and information
-// Allow override of vendor and device
+// Gather GPU type and information automatically
 // Apply Nvidia GPU settings (CoolBits will be needed)
 // Apply AMD GPU settings (Will need user changing pwm1_enable)
 // Intel?
@@ -76,15 +75,18 @@ int game_mode_initialise_gpu(GameModeConfig *config, GameModeGPUInfo **info)
 
 	/* verify device ID */
 	if (new_info->device == -1) {
-		LOG_ERROR("Invalid gpu_device value set in configuration, will not appli optimisations!\n");
+		LOG_ERROR("Invalid gpu_device value set in configuration, will not apply optimisations!\n");
 		free(new_info);
 		return -1;
 	}
 
 	/* verify GPU vendor */
-	if (new_info->vendor != Vendor_NVIDIA && new_info->vendor != Vendor_AMD &&
-	    new_info->vendor != Vendor_Intel) {
-		LOG_ERROR("Invalid gpu_vendor value set in configuration, will not apply optimisations!\n");
+	if (!(new_info->vendor == Vendor_NVIDIA || new_info->vendor == Vendor_AMD ||
+	      new_info->vendor == Vendor_Intel)) {
+		LOG_ERROR(
+		    "Invalid gpu_vendor value (0x%04x) set in configuration, will not apply "
+		    "optimisations!\n",
+		    (unsigned int)new_info->vendor);
 		LOG_ERROR("Possible values are: 0x%04x (NVIDIA) 0x%04x (AMD) 0x%04x (Intel)\n",
 		          Vendor_NVIDIA,
 		          Vendor_AMD,

+ 1 - 0
example/gamemode.ini

@@ -43,6 +43,7 @@ inhibit_screensaver=1
 ;apply_gpu_optimisations=0
 
 ; Set these to specify which vendor and device ID you want apply optimisations to
+; Vendor must be one of 0x10de (NVIDIA), 0x1002 (AMD) or 0x8086 (Intel)
 ;gpu_vendor=0x0000
 ;gpu_device=0