aboutsummaryrefslogtreecommitdiff
path: root/backend
diff options
context:
space:
mode:
authorSimon Ser <contact@emersion.fr>2021-12-17 15:42:57 +0100
committerSimon Ser <contact@emersion.fr>2022-05-24 20:45:55 +0000
commite59f4d4ffa9ac2c7add84278b716b7e1c7ac74f3 (patch)
tree7533526cb51148a5d1d8a47db3bf29ff034ad44f /backend
parentad06c12c89791dad0c3858a75102277127158063 (diff)
backend/drm: allow non-linear modifiers for multi-GPU
Prior to [1], if an entry in a DRM format set was different than a single LINEAR modifier, implicit modifiers were always allowed. This has changed and now implicit modifiers are only allowed if INVALID is in the list of modifiers. So now we can safely enable explicit modifiers for cross-GPU imports, without risking receiving buffers with an implicit modifier. This should improve perf a bit on setups where two GPUs from the same vendor are used. This fixes the first bullet point from [2]. [1]: https://gitlab.freedesktop.org/wlroots/wlroots/-/merge_requests/3231 [2]: https://gitlab.freedesktop.org/wlroots/wlroots/-/issues/3331
Diffstat (limited to 'backend')
-rw-r--r--backend/drm/backend.c16
1 files changed, 9 insertions, 7 deletions
diff --git a/backend/drm/backend.c b/backend/drm/backend.c
index b9e7274b..267bbfb2 100644
--- a/backend/drm/backend.c
+++ b/backend/drm/backend.c
@@ -275,15 +275,17 @@ struct wlr_backend *wlr_drm_backend_create(struct wl_display *display,
goto error_mgpu_renderer;
}
- // Force a linear layout. In case explicit modifiers aren't supported,
- // the meaning of implicit modifiers changes from one GPU to the other.
- // In case explicit modifiers are supported, we still have no guarantee
- // that the buffer producer will support these, so they might fallback
- // to implicit modifiers.
+ // Forbid implicit modifiers, because their meaning changes from one
+ // GPU to another.
for (size_t i = 0; i < texture_formats->len; i++) {
const struct wlr_drm_format *fmt = texture_formats->formats[i];
- wlr_drm_format_set_add(&drm->mgpu_formats, fmt->format,
- DRM_FORMAT_MOD_LINEAR);
+ for (size_t j = 0; j < fmt->len; j++) {
+ uint64_t mod = fmt->modifiers[j];
+ if (mod == DRM_FORMAT_MOD_INVALID) {
+ continue;
+ }
+ wlr_drm_format_set_add(&drm->mgpu_formats, fmt->format, mod);
+ }
}
}