diff options
author | Simon Zeni <simon@bl4ckb0ne.ca> | 2021-04-20 14:48:52 -0400 |
---|---|---|
committer | Simon Ser <contact@emersion.fr> | 2021-04-20 21:14:27 +0200 |
commit | cdacf4f632577a2d9c0f10f7b0aa9f8336e8a1d1 (patch) | |
tree | 6adf1f8bdf441fd7a52badc9eeb793ffd91602e4 | |
parent | 10c5199d85f54079a759f5de37574ccf8ae30825 (diff) |
render: introduce WLR_RENDERER in wlr_renderer_autocreate_with_drm_fd
This env var forces the creation of a specific renderer. If no renderer
is specified, the function will try to create all of the renderers one
by one until one is created successfuly.
-rw-r--r-- | docs/env_vars.md | 2 | ||||
-rw-r--r-- | render/wlr_renderer.c | 41 |
2 files changed, 23 insertions, 20 deletions
diff --git a/docs/env_vars.md b/docs/env_vars.md index 8461d132..1d39a624 100644 --- a/docs/env_vars.md +++ b/docs/env_vars.md @@ -9,6 +9,8 @@ wlroots reads these environment variables * *WLR_DIRECT_TTY*: specifies the tty to be used (instead of using /dev/tty) * *WLR_XWAYLAND*: specifies the path to an Xwayland binary to be used (instead of following shell search semantics for "Xwayland") +* *WLR_RENDERER*: forces the creation of a specified renderer (available + renderers: gles2, pixman) ## DRM backend diff --git a/render/wlr_renderer.c b/render/wlr_renderer.c index 77be3018..d9397c40 100644 --- a/render/wlr_renderer.c +++ b/render/wlr_renderer.c @@ -1,7 +1,6 @@ #include <assert.h> #include <stdbool.h> #include <stdlib.h> -#include <gbm.h> #include <wlr/render/interface.h> #include <wlr/render/pixman.h> #include <wlr/render/wlr_renderer.h> @@ -228,33 +227,35 @@ bool wlr_renderer_init_wl_display(struct wlr_renderer *r, } struct wlr_renderer *wlr_renderer_autocreate_with_drm_fd(int drm_fd) { + const char *name = getenv("WLR_RENDERER"); + if (name) { #if WLR_HAS_GLES2_RENDERER - struct gbm_device *gbm_device = gbm_create_device(drm_fd); - if (!gbm_device) { - wlr_log(WLR_ERROR, "Failed to create GBM device"); - return NULL; - } + if (strcmp(name, "gles2") == 0) { + return wlr_gles2_renderer_create_with_drm_fd(drm_fd); + } +#endif + if (strcmp(name, "pixman") == 0) { + return wlr_pixman_renderer_create(); + } - struct wlr_egl *egl = wlr_egl_create(EGL_PLATFORM_GBM_KHR, gbm_device); - if (egl == NULL) { - wlr_log(WLR_ERROR, "Could not initialize EGL"); - gbm_device_destroy(gbm_device); + wlr_log(WLR_ERROR, "Invalid WLR_RENDERER value: '%s'", name); return NULL; } - egl->gbm_device = gbm_device; - - struct wlr_renderer *renderer = wlr_gles2_renderer_create(egl); - if (!renderer) { - wlr_log(WLR_ERROR, "Failed to create GLES2 renderer"); - wlr_egl_destroy(egl); - return NULL; + struct wlr_renderer *renderer = NULL; +#if WLR_HAS_GLES2_RENDERER + if ((renderer = wlr_gles2_renderer_create_with_drm_fd(drm_fd)) != NULL) { + return renderer; } - - return renderer; + wlr_log(WLR_DEBUG, "Failed to create gles2 renderer"); #endif - wlr_log(WLR_ERROR, "Failed to initialize any renderer"); + if ((renderer = wlr_pixman_renderer_create()) != NULL) { + return renderer; + } + wlr_log(WLR_DEBUG, "Failed to create pixman renderer"); + + wlr_log(WLR_ERROR, "Could not initialize renderer"); return NULL; } |