[gnome-shell/wip/hadess/always-launch-discrete-gpu: 2/4] shell-app: Respect X-KDE-RunOnDiscreteGpu when launching apps
- From: Bastien Nocera <hadess src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [gnome-shell/wip/hadess/always-launch-discrete-gpu: 2/4] shell-app: Respect X-KDE-RunOnDiscreteGpu when launching apps
- Date: Thu, 24 Oct 2019 12:47:36 +0000 (UTC)
commit 4d47b16d330ca9ab01bcccb8de7a4a60c34f5b14
Author: Bastien Nocera <hadess hadess net>
Date: Wed Oct 23 11:48:19 2019 +0200
shell-app: Respect X-KDE-RunOnDiscreteGpu when launching apps
If whether to launch on the discrete GPU or the integrated one isn't
passed down to us, check whether the application prefers to be launched
on the discrete GPU.
See: https://gitlab.gnome.org/GNOME/gnome-shell/issues/1804
src/shell-app.c | 37 ++++++++++++++++++++++++++++---------
src/shell-app.h | 16 +++++++++++-----
2 files changed, 39 insertions(+), 14 deletions(-)
---
diff --git a/src/shell-app.c b/src/shell-app.c
index 33d5ec3a7a..b9ceac34b0 100644
--- a/src/shell-app.c
+++ b/src/shell-app.c
@@ -509,7 +509,7 @@ shell_app_activate_full (ShellApp *app,
case SHELL_APP_STATE_STOPPED:
{
GError *error = NULL;
- if (!shell_app_launch (app, timestamp, workspace, FALSE, &error))
+ if (!shell_app_launch (app, timestamp, workspace, SHELL_APP_GPU_SELECTION_AUTO, &error))
{
char *msg;
msg = g_strdup_printf (_("Failed to launch ā%sā"), shell_app_get_name (app));
@@ -584,7 +584,7 @@ shell_app_open_new_window (ShellApp *app,
* instance (Firefox). There are a few less-sensical cases such
* as say Pidgin.
*/
- shell_app_launch (app, 0, workspace, FALSE, NULL);
+ shell_app_launch (app, 0, workspace, SHELL_APP_GPU_SELECTION_AUTO, NULL);
}
/**
@@ -1255,19 +1255,37 @@ wait_pid (GDesktopAppInfo *appinfo,
g_child_watch_add (pid, (GChildWatchFunc) g_spawn_close_pid, NULL);
}
+static gboolean
+get_with_discrete_gpu (ShellApp *app,
+ ShellAppGpuSelection discrete_gpu)
+{
+ switch (discrete_gpu)
+ {
+ case SHELL_APP_GPU_SELECTION_INTEGRATED:
+ return FALSE;
+ case SHELL_APP_GPU_SELECTION_DISCRETE:
+ return TRUE;
+ case SHELL_APP_GPU_SELECTION_AUTO:
+ return g_desktop_app_info_get_boolean (app->info, "PreferRunOnDiscreteGPU") ||
+ g_desktop_app_info_get_boolean (app->info, "X-KDE-RunOnDiscreteGpu");
+ default:
+ g_assert_not_reached();
+ }
+}
+
/**
* shell_app_launch:
* @timestamp: Event timestamp, or 0 for current event timestamp
* @workspace: Start on this workspace, or -1 for default
- * @discrete_gpu: Whether to start on the discrete GPU
+ * @discrete_gpu: the preferred GPU to launch the application on.
* @error: A #GError
*/
gboolean
-shell_app_launch (ShellApp *app,
- guint timestamp,
- int workspace,
- gboolean discrete_gpu,
- GError **error)
+shell_app_launch (ShellApp *app,
+ guint timestamp,
+ int workspace,
+ ShellAppGpuSelection discrete_gpu,
+ GError **error)
{
ShellGlobal *global;
GAppLaunchContext *context;
@@ -1289,7 +1307,8 @@ shell_app_launch (ShellApp *app,
global = shell_global_get ();
context = shell_global_create_app_launch_context (global, timestamp, workspace);
- if (discrete_gpu)
+ /* FIXME: this should probably check whether we're on a dual-GPU system */
+ if (get_with_discrete_gpu (app, discrete_gpu))
g_app_launch_context_setenv (context, "DRI_PRIME", "1");
/* Set LEAVE_DESCRIPTORS_OPEN in order to use an optimized gspawn
diff --git a/src/shell-app.h b/src/shell-app.h
index 8a09b642dc..1557578bda 100644
--- a/src/shell-app.h
+++ b/src/shell-app.h
@@ -18,6 +18,12 @@ typedef enum {
SHELL_APP_STATE_RUNNING
} ShellAppState;
+typedef enum {
+ SHELL_APP_GPU_SELECTION_AUTO = -1,
+ SHELL_APP_GPU_SELECTION_INTEGRATED = 0,
+ SHELL_APP_GPU_SELECTION_DISCRETE = 1
+} ShellAppGpuSelection;
+
const char *shell_app_get_id (ShellApp *app);
GDesktopAppInfo *shell_app_get_app_info (ShellApp *app);
@@ -51,11 +57,11 @@ GSList *shell_app_get_pids (ShellApp *app);
gboolean shell_app_is_on_workspace (ShellApp *app, MetaWorkspace *workspace);
-gboolean shell_app_launch (ShellApp *app,
- guint timestamp,
- int workspace,
- gboolean discrete_gpu,
- GError **error);
+gboolean shell_app_launch (ShellApp *app,
+ guint timestamp,
+ int workspace,
+ ShellAppGpuSelection discrete_gpu,
+ GError **error);
void shell_app_launch_action (ShellApp *app,
const char *action_name,
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]