aboutsummaryrefslogtreecommitdiff
path: root/sway/server.c
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/server.c
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/server.c')
-rw-r--r--sway/server.c32
1 files changed, 32 insertions, 0 deletions
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");