aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--backend/drm/drm.c28
-rw-r--r--docs/env_vars.md2
2 files changed, 26 insertions, 4 deletions
diff --git a/backend/drm/drm.c b/backend/drm/drm.c
index db6f0207..f8812b4e 100644
--- a/backend/drm/drm.c
+++ b/backend/drm/drm.c
@@ -603,21 +603,41 @@ static bool drm_connector_init_renderer(struct wlr_drm_connector *conn,
int height = mode->wlr_mode.height;
uint32_t format = drm->renderer.gbm_format;
- if (!init_drm_plane_surfaces(plane, drm, width, height, format, true) ||
+ bool modifiers = true;
+ const char *no_modifiers = getenv("WLR_DRM_NO_MODIFIERS");
+ if (no_modifiers != NULL && strcmp(no_modifiers, "1") == 0) {
+ wlr_log(WLR_DEBUG,
+ "WLR_DRM_NO_MODIFIERS set, initializing planes without modifiers");
+ modifiers = false;
+ }
+
+ if (!init_drm_plane_surfaces(plane, drm, width, height, format, modifiers) ||
!drm_connector_pageflip_renderer(conn, mode)) {
// If page-flipping with modifiers enabled doesn't work, retry without
// modifiers
- wlr_log(WLR_INFO, "Page-flip failed with primary FB modifiers enabled, "
- "retrying without modifiers");
finish_drm_surface(&plane->surf);
finish_drm_surface(&plane->mgpu_surf);
- if (!init_drm_plane_surfaces(plane, drm, width, height, format, false)) {
+
+ if (!modifiers) {
+ wlr_log(WLR_ERROR, "Failed to initialize renderer "
+ "on connector '%s': initial page-flip failed",
+ conn->output.name);
+ return false;
+ }
+ wlr_log(WLR_INFO, "Page-flip failed with primary FB modifiers enabled, "
+ "retrying without modifiers");
+ modifiers = false;
+
+ if (!init_drm_plane_surfaces(plane, drm, width, height, format,
+ modifiers)) {
return false;
}
if (!drm_connector_pageflip_renderer(conn, mode)) {
wlr_log(WLR_ERROR, "Failed to initialize renderer "
"on connector '%s': initial page-flip failed",
conn->output.name);
+ finish_drm_surface(&plane->surf);
+ finish_drm_surface(&plane->mgpu_surf);
return false;
}
}
diff --git a/docs/env_vars.md b/docs/env_vars.md
index 6e6f846a..48f96f7f 100644
--- a/docs/env_vars.md
+++ b/docs/env_vars.md
@@ -17,6 +17,8 @@ wlroots reads these environment variables
considered the primary DRM device.
* *WLR_DRM_NO_ATOMIC*: set to 1 to use legacy DRM interface instead of atomic
mode setting
+* *WLR_DRM_NO_MODIFIERS*: set to 1 to always allocate planes without modifiers,
+ this can fix certain modeset failures because of bandwidth restrictions.
## Headless backend