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).
master
Simon Ser 12 months ago committed by Simon Zeni
parent b81c4da494
commit ff07eab85b

@ -163,6 +163,8 @@ struct sway_debug {
extern struct sway_debug debug; extern struct sway_debug debug;
extern bool allow_unsupported_gpu;
bool server_init(struct sway_server *server); bool server_init(struct sway_server *server);
void server_fini(struct sway_server *server); void server_fini(struct sway_server *server);
bool server_start(struct sway_server *server); bool server_start(struct sway_server *server);

@ -77,8 +77,7 @@ pixman = dependency('pixman-1')
libevdev = dependency('libevdev') libevdev = dependency('libevdev')
libinput = wlroots_features['libinput_backend'] ? dependency('libinput', version: '>=1.21.0') : null_dep libinput = wlroots_features['libinput_backend'] ? dependency('libinput', version: '>=1.21.0') : null_dep
xcb = dependency('xcb', required: get_option('xwayland')) xcb = dependency('xcb', required: get_option('xwayland'))
drm_full = dependency('libdrm') # only needed for drm_fourcc.h drm = dependency('libdrm')
drm = drm_full.partial_dependency(compile_args: true, includes: true)
libudev = wlroots_features['libinput_backend'] ? dependency('libudev') : null_dep libudev = wlroots_features['libinput_backend'] ? dependency('libudev') : null_dep
math = cc.find_library('m') math = cc.find_library('m')
rt = cc.find_library('rt') rt = cc.find_library('rt')

@ -49,32 +49,6 @@ void sig_handler(int signal) {
sway_terminate(EXIT_SUCCESS); 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) { void run_as_ipc_client(char *command, char *socket_path) {
int socketfd = ipc_open_socket(socket_path); int socketfd = ipc_open_socket(socket_path);
uint32_t len = strlen(command); uint32_t len = strlen(command);
@ -243,7 +217,7 @@ static const char usage[] =
"\n"; "\n";
int main(int argc, char **argv) { 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; char *config_path = NULL;
@ -351,7 +325,6 @@ int main(int argc, char **argv) {
return 0; return 0;
} }
detect_proprietary(allow_unsupported_gpu);
increase_nofile_limit(); increase_nofile_limit();
// handle SIGTERM signals // handle SIGTERM signals

@ -37,6 +37,7 @@
#include <wlr/types/wlr_xdg_foreign_v1.h> #include <wlr/types/wlr_xdg_foreign_v1.h>
#include <wlr/types/wlr_xdg_foreign_v2.h> #include <wlr/types/wlr_xdg_foreign_v2.h>
#include <wlr/types/wlr_xdg_output_v1.h> #include <wlr/types/wlr_xdg_output_v1.h>
#include <xf86drm.h>
#include "config.h" #include "config.h"
#include "list.h" #include "list.h"
#include "log.h" #include "log.h"
@ -60,6 +61,8 @@
#define SWAY_XDG_SHELL_VERSION 2 #define SWAY_XDG_SHELL_VERSION 2
#define SWAY_LAYER_SHELL_VERSION 4 #define SWAY_LAYER_SHELL_VERSION 4
bool allow_unsupported_gpu = false;
#if WLR_HAS_DRM_BACKEND #if WLR_HAS_DRM_BACKEND
static void handle_drm_lease_request(struct wl_listener *listener, void *data) { 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 /* 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; 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) { bool server_init(struct sway_server *server) {
sway_log(SWAY_DEBUG, "Initializing Wayland server"); sway_log(SWAY_DEBUG, "Initializing Wayland server");
server->wl_display = wl_display_create(); server->wl_display = wl_display_create();
@ -128,6 +158,8 @@ bool server_init(struct sway_server *server) {
return false; return false;
} }
wlr_multi_for_each_backend(server->backend, detect_proprietary, NULL);
server->renderer = wlr_renderer_autocreate(server->backend); server->renderer = wlr_renderer_autocreate(server->backend);
if (!server->renderer) { if (!server->renderer) {
sway_log(SWAY_ERROR, "Failed to create renderer"); sway_log(SWAY_ERROR, "Failed to create renderer");

Loading…
Cancel
Save