aboutsummaryrefslogtreecommitdiff
path: root/sway
diff options
context:
space:
mode:
authorSimon Ser <contact@emersion.fr>2023-12-12 15:25:10 +0100
committerSimon Zeni <simon@bl4ckb0ne.ca>2023-12-12 10:04:14 -0500
commitff07eab85b5c6b728ad3cc99d02e9f2ae8b9854f (patch)
treefc4aa760eafe3a14c37fd11d8743c3b54e31de9c /sway
parentb81c4da494ed8fac861fb11dab56a9c68d7b91aa (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).
Diffstat (limited to 'sway')
-rw-r--r--sway/main.c29
-rw-r--r--sway/server.c32
2 files changed, 33 insertions, 28 deletions
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");