mirror of
				https://gitlab.freedesktop.org/wlroots/wlroots.git
				synced 2025-11-03 09:01:40 -05:00 
			
		
		
		
	backend: support creating DRM and libinput via WLR_BACKENDS
This commit is contained in:
		
							parent
							
								
									007d83c6ee
								
							
						
					
					
						commit
						75b10cd621
					
				
					 1 changed files with 57 additions and 27 deletions
				
			
		| 
						 | 
					@ -118,7 +118,33 @@ static struct wlr_backend *attempt_headless_backend(
 | 
				
			||||||
	return backend;
 | 
						return backend;
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					static struct wlr_backend *attempt_drm_backend(struct wl_display *display,
 | 
				
			||||||
 | 
							struct wlr_backend *backend, struct wlr_session *session) {
 | 
				
			||||||
 | 
						int gpus[8];
 | 
				
			||||||
 | 
						size_t num_gpus = wlr_session_find_gpus(session, 8, gpus);
 | 
				
			||||||
 | 
						struct wlr_backend *primary_drm = NULL;
 | 
				
			||||||
 | 
						wlr_log(L_INFO, "Found %zu GPUs", num_gpus);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						for (size_t i = 0; i < num_gpus; ++i) {
 | 
				
			||||||
 | 
							struct wlr_backend *drm = wlr_drm_backend_create(display, session,
 | 
				
			||||||
 | 
								gpus[i], primary_drm);
 | 
				
			||||||
 | 
							if (!drm) {
 | 
				
			||||||
 | 
								wlr_log(L_ERROR, "Failed to open DRM device %d", gpus[i]);
 | 
				
			||||||
 | 
								continue;
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							if (!primary_drm) {
 | 
				
			||||||
 | 
								primary_drm = drm;
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							wlr_multi_backend_add(backend, drm);
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						return primary_drm;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
static struct wlr_backend *attempt_backend_by_name(struct wl_display *display,
 | 
					static struct wlr_backend *attempt_backend_by_name(struct wl_display *display,
 | 
				
			||||||
 | 
							struct wlr_backend *backend, struct wlr_session **session,
 | 
				
			||||||
		const char *name) {
 | 
							const char *name) {
 | 
				
			||||||
	if (strcmp(name, "wayland") == 0) {
 | 
						if (strcmp(name, "wayland") == 0) {
 | 
				
			||||||
		return attempt_wl_backend(display);
 | 
							return attempt_wl_backend(display);
 | 
				
			||||||
| 
						 | 
					@ -128,7 +154,22 @@ static struct wlr_backend *attempt_backend_by_name(struct wl_display *display,
 | 
				
			||||||
#endif
 | 
					#endif
 | 
				
			||||||
	} else if (strcmp(name, "headless") == 0) {
 | 
						} else if (strcmp(name, "headless") == 0) {
 | 
				
			||||||
		return attempt_headless_backend(display);
 | 
							return attempt_headless_backend(display);
 | 
				
			||||||
 | 
						} else if (strcmp(name, "drm") == 0 || strcmp(name, "libinput") == 0) {
 | 
				
			||||||
 | 
							// DRM and libinput need a session
 | 
				
			||||||
 | 
							*session = wlr_session_create(display);
 | 
				
			||||||
 | 
							if (!*session) {
 | 
				
			||||||
 | 
								wlr_log(L_ERROR, "failed to start a session");
 | 
				
			||||||
 | 
								return NULL;
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							if (strcmp(name, "libinput") == 0) {
 | 
				
			||||||
 | 
								return wlr_libinput_backend_create(display, *session);
 | 
				
			||||||
 | 
							} else {
 | 
				
			||||||
 | 
								return attempt_drm_backend(display, backend, *session);
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						wlr_log(L_ERROR, "unrecognized backend '%s'", name);
 | 
				
			||||||
	return NULL;
 | 
						return NULL;
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					@ -139,11 +180,14 @@ struct wlr_backend *wlr_backend_autocreate(struct wl_display *display) {
 | 
				
			||||||
		return NULL;
 | 
							return NULL;
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						struct wlr_session *session = NULL;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	char *names = getenv("WLR_BACKENDS");
 | 
						char *names = getenv("WLR_BACKENDS");
 | 
				
			||||||
	if (names) {
 | 
						if (names) {
 | 
				
			||||||
		names = strdup(names);
 | 
							names = strdup(names);
 | 
				
			||||||
		if (names == NULL) {
 | 
							if (names == NULL) {
 | 
				
			||||||
			wlr_log(L_ERROR, "allocation failed");
 | 
								wlr_log(L_ERROR, "allocation failed");
 | 
				
			||||||
 | 
								wlr_backend_destroy(backend);
 | 
				
			||||||
			return NULL;
 | 
								return NULL;
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					@ -151,13 +195,18 @@ struct wlr_backend *wlr_backend_autocreate(struct wl_display *display) {
 | 
				
			||||||
		char *name = strtok_r(names, ",", &saveptr);
 | 
							char *name = strtok_r(names, ",", &saveptr);
 | 
				
			||||||
		while (name != NULL) {
 | 
							while (name != NULL) {
 | 
				
			||||||
			struct wlr_backend *subbackend =
 | 
								struct wlr_backend *subbackend =
 | 
				
			||||||
				attempt_backend_by_name(display, name);
 | 
									attempt_backend_by_name(display, backend, &session, name);
 | 
				
			||||||
			if (subbackend == NULL) {
 | 
								if (subbackend == NULL) {
 | 
				
			||||||
				wlr_log(L_ERROR, "unrecognized backend '%s'", name);
 | 
									wlr_log(L_ERROR, "failed to start backend '%s'", name);
 | 
				
			||||||
 | 
									wlr_backend_destroy(backend);
 | 
				
			||||||
 | 
									wlr_session_destroy(session);
 | 
				
			||||||
				return NULL;
 | 
									return NULL;
 | 
				
			||||||
			}
 | 
								}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
			if (!wlr_multi_backend_add(backend, subbackend)) {
 | 
								if (!wlr_multi_backend_add(backend, subbackend)) {
 | 
				
			||||||
 | 
									wlr_log(L_ERROR, "failed to add backend '%s'", name);
 | 
				
			||||||
 | 
									wlr_backend_destroy(backend);
 | 
				
			||||||
 | 
									wlr_session_destroy(session);
 | 
				
			||||||
				return NULL;
 | 
									return NULL;
 | 
				
			||||||
			}
 | 
								}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					@ -189,7 +238,7 @@ struct wlr_backend *wlr_backend_autocreate(struct wl_display *display) {
 | 
				
			||||||
#endif
 | 
					#endif
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	// Attempt DRM+libinput
 | 
						// Attempt DRM+libinput
 | 
				
			||||||
	struct wlr_session *session = wlr_session_create(display);
 | 
						session = wlr_session_create(display);
 | 
				
			||||||
	if (!session) {
 | 
						if (!session) {
 | 
				
			||||||
		wlr_log(L_ERROR, "Failed to start a DRM session");
 | 
							wlr_log(L_ERROR, "Failed to start a DRM session");
 | 
				
			||||||
		wlr_backend_destroy(backend);
 | 
							wlr_backend_destroy(backend);
 | 
				
			||||||
| 
						 | 
					@ -197,40 +246,21 @@ struct wlr_backend *wlr_backend_autocreate(struct wl_display *display) {
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	struct wlr_backend *libinput = wlr_libinput_backend_create(display, session);
 | 
						struct wlr_backend *libinput = wlr_libinput_backend_create(display, session);
 | 
				
			||||||
	if (libinput) {
 | 
						if (!libinput) {
 | 
				
			||||||
		wlr_multi_backend_add(backend, libinput);
 | 
					 | 
				
			||||||
	} else {
 | 
					 | 
				
			||||||
		wlr_log(L_ERROR, "Failed to start libinput backend");
 | 
							wlr_log(L_ERROR, "Failed to start libinput backend");
 | 
				
			||||||
		wlr_backend_destroy(backend);
 | 
							wlr_backend_destroy(backend);
 | 
				
			||||||
		wlr_session_destroy(session);
 | 
							wlr_session_destroy(session);
 | 
				
			||||||
		return NULL;
 | 
							return NULL;
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
						wlr_multi_backend_add(backend, libinput);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	int gpus[8];
 | 
						struct wlr_backend *primary_drm =
 | 
				
			||||||
	size_t num_gpus = wlr_session_find_gpus(session, 8, gpus);
 | 
							attempt_drm_backend(display, backend, session);
 | 
				
			||||||
	struct wlr_backend *primary_drm = NULL;
 | 
					 | 
				
			||||||
	wlr_log(L_INFO, "Found %zu GPUs", num_gpus);
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	for (size_t i = 0; i < num_gpus; ++i) {
 | 
					 | 
				
			||||||
		struct wlr_backend *drm = wlr_drm_backend_create(display, session,
 | 
					 | 
				
			||||||
			gpus[i], primary_drm);
 | 
					 | 
				
			||||||
		if (!drm) {
 | 
					 | 
				
			||||||
			wlr_log(L_ERROR, "Failed to open DRM device");
 | 
					 | 
				
			||||||
			continue;
 | 
					 | 
				
			||||||
		}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
		if (!primary_drm) {
 | 
					 | 
				
			||||||
			primary_drm = drm;
 | 
					 | 
				
			||||||
		}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
		wlr_multi_backend_add(backend, drm);
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	if (!primary_drm) {
 | 
						if (!primary_drm) {
 | 
				
			||||||
		wlr_log(L_ERROR, "Failed to open any DRM device");
 | 
							wlr_log(L_ERROR, "Failed to open any DRM device");
 | 
				
			||||||
		wlr_backend_destroy(libinput);
 | 
							wlr_backend_destroy(libinput);
 | 
				
			||||||
		wlr_session_destroy(session);
 | 
					 | 
				
			||||||
		wlr_backend_destroy(backend);
 | 
							wlr_backend_destroy(backend);
 | 
				
			||||||
 | 
							wlr_session_destroy(session);
 | 
				
			||||||
		return NULL;
 | 
							return NULL;
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue