aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorFurkan Sahin <furkan-dev@proton.me>2023-12-12 15:25:10 +0100
committerFurkan Sahin <furkan-dev@proton.me>2023-12-12 15:25:10 +0100
commitfb5c13bbf3dd34978673be6b0b66cbef48ab7e96 (patch)
treefc4aa760eafe3a14c37fd11d8743c3b54e31de9c
parent654320aa6bf622d2a87e8b22b5daa32b6279d148 (diff)
Detect Nvidia proprietary driver via drmGetVersion()
This is less punishing for users with the Nvidia driver loaded but not used by Sway (e.g. for CUDA).
-rw-r--r--include/sway/server.h2
-rw-r--r--meson.build3
-rw-r--r--sway/main.c29
-rw-r--r--sway/server.c32
4 files changed, 36 insertions, 30 deletions
diff --git a/include/sway/server.h b/include/sway/server.h
index 1b3166ce..bf195706 100644
--- a/include/sway/server.h
+++ b/include/sway/server.h
@@ -163,6 +163,8 @@ struct sway_debug {
extern struct sway_debug debug;
+extern bool allow_unsupported_gpu;
+
bool server_init(struct sway_server *server);
void server_fini(struct sway_server *server);
bool server_start(struct sway_server *server);
diff --git a/meson.build b/meson.build
index adf49c19..e65723b6 100644
--- a/meson.build
+++ b/meson.build
@@ -77,8 +77,7 @@ pixman = dependency('pixman-1')
libevdev = dependency('libevdev')
libinput = wlroots_features['libinput_backend'] ? dependency('libinput', version: '>=1.21.0') : null_dep
xcb = dependency('xcb', required: get_option('xwayland'))
-drm_full = dependency('libdrm') # only needed for drm_fourcc.h
-drm = drm_full.partial_dependency(compile_args: true, includes: true)
+drm = dependency('libdrm')
libudev = wlroots_features['libinput_backend'] ? dependency('libudev') : null_dep
math = cc.find_library('m')
rt = cc.find_library('rt')
diff --git a/sway/main.c b/sway/main.c
index 0db116d3..98aba7f2 100644
--- a/sway/main.c
+++ b/sway/main.c
@@ -49,32 +49,6 @@ void sig_handler(int signal) {
sway_terminate(EXIT_SUCCESS);
}
-void detect_proprietary(int allow_unsupported_gpu) {
- FILE *f = fopen("/proc/modules", "r");
- if (!f) {
- return;
- }
- char *line = NULL;
- size_t line_size = 0;
- while (getline(&line, &line_size, f) != -1) {
- if (strncmp(line, "nvidia ", 7) == 0) {
- if (allow_unsupported_gpu) {
- sway_log(SWAY_ERROR,
- "!!! Proprietary Nvidia drivers are in use !!!");
- } else {
- sway_log(SWAY_ERROR,
- "Proprietary Nvidia drivers are NOT supported. "
- "Use Nouveau. To launch sway anyway, launch with "
- "--unsupported-gpu and DO NOT report issues.");
- exit(EXIT_FAILURE);
- }
- break;
- }
- }
- free(line);
- fclose(f);
-}
-
void run_as_ipc_client(char *command, char *socket_path) {
int socketfd = ipc_open_socket(socket_path);
uint32_t len = strlen(command);
@@ -243,7 +217,7 @@ static const char usage[] =
"\n";
int main(int argc, char **argv) {
- static bool verbose = false, debug = false, validate = false, allow_unsupported_gpu = false;
+ static bool verbose = false, debug = false, validate = false;
char *config_path = NULL;
@@ -351,7 +325,6 @@ int main(int argc, char **argv) {
return 0;
}
- detect_proprietary(allow_unsupported_gpu);
increase_nofile_limit();
// handle SIGTERM signals
diff --git a/sway/server.c b/sway/server.c
index be521621..267e46c0 100644
--- a/sway/server.c
+++ b/sway/server.c
@@ -37,6 +37,7 @@
#include <wlr/types/wlr_xdg_foreign_v1.h>
#include <wlr/types/wlr_xdg_foreign_v2.h>
#include <wlr/types/wlr_xdg_output_v1.h>
+#include <xf86drm.h>
#include "config.h"
#include "list.h"
#include "log.h"
@@ -60,6 +61,8 @@
#define SWAY_XDG_SHELL_VERSION 2
#define SWAY_LAYER_SHELL_VERSION 4
+bool allow_unsupported_gpu = false;
+
#if WLR_HAS_DRM_BACKEND
static void handle_drm_lease_request(struct wl_listener *listener, void *data) {
/* We only offer non-desktop outputs, but in the future we might want to do
@@ -113,6 +116,33 @@ static bool filter_global(const struct wl_client *client,
return true;
}
+static void detect_proprietary(struct wlr_backend *backend, void *data) {
+ int drm_fd = wlr_backend_get_drm_fd(backend);
+ if (drm_fd < 0) {
+ return;
+ }
+
+ drmVersion *version = drmGetVersion(drm_fd);
+ if (version == NULL) {
+ sway_log(SWAY_ERROR, "drmGetVersion() failed");
+ return;
+ }
+
+ if (strcmp(version->name, "nvidia-drm") == 0) {
+ if (allow_unsupported_gpu) {
+ sway_log(SWAY_ERROR, "!!! Proprietary Nvidia drivers are in use !!!");
+ } else {
+ sway_log(SWAY_ERROR,
+ "Proprietary Nvidia drivers are NOT supported. "
+ "Use Nouveau. To launch sway anyway, launch with "
+ "--unsupported-gpu and DO NOT report issues.");
+ exit(EXIT_FAILURE);
+ }
+ }
+
+ drmFreeVersion(version);
+}
+
bool server_init(struct sway_server *server) {
sway_log(SWAY_DEBUG, "Initializing Wayland server");
server->wl_display = wl_display_create();
@@ -128,6 +158,8 @@ bool server_init(struct sway_server *server) {
return false;
}
+ wlr_multi_for_each_backend(server->backend, detect_proprietary, NULL);
+
server->renderer = wlr_renderer_autocreate(server->backend);
if (!server->renderer) {
sway_log(SWAY_ERROR, "Failed to create renderer");