diff options
author | Simon Ser <contact@emersion.fr> | 2021-12-17 15:42:57 +0100 |
---|---|---|
committer | Simon Ser <contact@emersion.fr> | 2022-05-24 20:45:55 +0000 |
commit | e59f4d4ffa9ac2c7add84278b716b7e1c7ac74f3 (patch) | |
tree | 7533526cb51148a5d1d8a47db3bf29ff034ad44f | |
parent | ad06c12c89791dad0c3858a75102277127158063 (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
-rw-r--r-- | backend/drm/backend.c | 16 |
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); + } } } |