shell-app: Add discrete GPU support for NVidia drivers
Use data from switcheroo-control to know which environment variables to use to launch an application on the discrete GPU. switcheroo-control version 2.0 or newer should be installed on Linux platforms. Closes: https://gitlab.gnome.org/GNOME/gnome-shell/issues/1810
This commit is contained in:
parent
33c10e9180
commit
0223d38602
@ -19,6 +19,7 @@
|
|||||||
#include "st.h"
|
#include "st.h"
|
||||||
#include "gtkactionmuxer.h"
|
#include "gtkactionmuxer.h"
|
||||||
#include "org-gtk-application.h"
|
#include "org-gtk-application.h"
|
||||||
|
#include "switcheroo-control.h"
|
||||||
|
|
||||||
#ifdef HAVE_SYSTEMD
|
#ifdef HAVE_SYSTEMD
|
||||||
#include <systemd/sd-journal.h>
|
#include <systemd/sd-journal.h>
|
||||||
@ -1255,6 +1256,60 @@ wait_pid (GDesktopAppInfo *appinfo,
|
|||||||
g_child_watch_add (pid, (GChildWatchFunc) g_spawn_close_pid, NULL);
|
g_child_watch_add (pid, (GChildWatchFunc) g_spawn_close_pid, NULL);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static void
|
||||||
|
apply_discrete_gpu_env (GAppLaunchContext *context,
|
||||||
|
ShellGlobal *global)
|
||||||
|
{
|
||||||
|
GDBusProxy *proxy;
|
||||||
|
GVariant* variant;
|
||||||
|
guint num_children, i;
|
||||||
|
|
||||||
|
proxy = _shell_global_get_switcheroo_control (global);
|
||||||
|
if (!proxy)
|
||||||
|
{
|
||||||
|
g_warning ("Could not apply discrete GPU environment, switcheroo-control not available");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
variant = shell_net_hadess_switcheroo_control_get_gpus (SHELL_NET_HADESS_SWITCHEROO_CONTROL (proxy));
|
||||||
|
if (!variant)
|
||||||
|
{
|
||||||
|
g_warning ("Could not apply discrete GPU environment, no GPUs in list");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
num_children = g_variant_n_children (variant);
|
||||||
|
for (i = 0; i < num_children; i++)
|
||||||
|
{
|
||||||
|
g_autoptr(GVariant) gpu;
|
||||||
|
g_autoptr(GVariant) env = NULL;
|
||||||
|
g_autoptr(GVariant) default_variant = NULL;
|
||||||
|
g_autofree const char **env_s = NULL;
|
||||||
|
guint j;
|
||||||
|
|
||||||
|
gpu = g_variant_get_child_value (variant, i);
|
||||||
|
if (!gpu ||
|
||||||
|
!g_variant_is_of_type (gpu, G_VARIANT_TYPE ("a{s*}")))
|
||||||
|
continue;
|
||||||
|
|
||||||
|
/* Skip over the default GPU */
|
||||||
|
default_variant = g_variant_lookup_value (gpu, "Default", NULL);
|
||||||
|
if (!default_variant || g_variant_get_boolean (default_variant))
|
||||||
|
continue;
|
||||||
|
|
||||||
|
env = g_variant_lookup_value (gpu, "Environment", NULL);
|
||||||
|
if (!env)
|
||||||
|
continue;
|
||||||
|
|
||||||
|
env_s = g_variant_get_strv (env, NULL);
|
||||||
|
for (j = 0; env_s[j] != NULL; j = j + 2)
|
||||||
|
g_app_launch_context_setenv (context, env_s[j], env_s[j+1]);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
g_warning ("Could not find discrete GPU data in switcheroo-control");
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* shell_app_launch:
|
* shell_app_launch:
|
||||||
* @timestamp: Event timestamp, or 0 for current event timestamp
|
* @timestamp: Event timestamp, or 0 for current event timestamp
|
||||||
@ -1290,7 +1345,7 @@ shell_app_launch (ShellApp *app,
|
|||||||
global = shell_global_get ();
|
global = shell_global_get ();
|
||||||
context = shell_global_create_app_launch_context (global, timestamp, workspace);
|
context = shell_global_create_app_launch_context (global, timestamp, workspace);
|
||||||
if (discrete_gpu)
|
if (discrete_gpu)
|
||||||
g_app_launch_context_setenv (context, "DRI_PRIME", "1");
|
apply_discrete_gpu_env (context, global);
|
||||||
|
|
||||||
/* Set LEAVE_DESCRIPTORS_OPEN in order to use an optimized gspawn
|
/* Set LEAVE_DESCRIPTORS_OPEN in order to use an optimized gspawn
|
||||||
* codepath. The shell's open file descriptors should be marked CLOEXEC
|
* codepath. The shell's open file descriptors should be marked CLOEXEC
|
||||||
|
Loading…
Reference in New Issue
Block a user