linux-dmabuf-v1: skip import check on split render/display SoCs

Unfortunately we have no way to get back the proper render node in
that case. This will be fixed with [1]: with that Mesa patch, the
wlr_renderer will return the proper render node and the existing
logic will work fine.

[1]: https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/24825

Closes: https://gitlab.freedesktop.org/wlroots/wlroots/-/issues/3757
This commit is contained in:
Simon Ser 2023-11-20 19:31:29 +01:00
parent 515681503e
commit fe6a432299
2 changed files with 21 additions and 14 deletions

View File

@ -61,7 +61,7 @@ struct wlr_linux_dmabuf_v1 {
struct wlr_drm_format_set default_formats; // for legacy clients
struct wl_list surfaces; // wlr_linux_dmabuf_v1_surface.link
int main_device_fd; // to sanity check FDs sent by clients
int main_device_fd; // to sanity check FDs sent by clients, -1 if unavailable
struct wl_listener display_destroy;
};

View File

@ -202,6 +202,10 @@ static void buffer_handle_resource_destroy(struct wl_resource *buffer_resource)
static bool check_import_dmabuf(struct wlr_linux_dmabuf_v1 *linux_dmabuf,
struct wlr_dmabuf_attributes *attribs) {
if (linux_dmabuf->main_device_fd < 0) {
return true;
}
// TODO: check number of planes
for (int i = 0; i < attribs->n_planes; i++) {
uint32_t handle = 0;
@ -857,7 +861,9 @@ static void linux_dmabuf_v1_destroy(struct wlr_linux_dmabuf_v1 *linux_dmabuf) {
compiled_feedback_destroy(linux_dmabuf->default_feedback);
wlr_drm_format_set_finish(&linux_dmabuf->default_formats);
close(linux_dmabuf->main_device_fd);
if (linux_dmabuf->main_device_fd >= 0) {
close(linux_dmabuf->main_device_fd);
}
wl_list_remove(&linux_dmabuf->display_destroy.link);
@ -884,22 +890,23 @@ static bool set_default_feedback(struct wlr_linux_dmabuf_v1 *linux_dmabuf,
goto error_compiled;
}
const char *name = NULL;
int main_device_fd = -1;
if (device->available_nodes & (1 << DRM_NODE_RENDER)) {
name = device->nodes[DRM_NODE_RENDER];
const char *name = device->nodes[DRM_NODE_RENDER];
main_device_fd = open(name, O_RDWR | O_CLOEXEC);
drmFreeDevice(&device);
if (main_device_fd < 0) {
wlr_log_errno(WLR_ERROR, "Failed to open DRM device %s", name);
goto error_compiled;
}
} else {
// Likely a split display/render setup
// Likely a split display/render setup. Unfortunately we have no way to
// get back the proper render node used by the renderer under-the-hood.
// TODO: drop once mesa!24825 is widespread
assert(device->available_nodes & (1 << DRM_NODE_PRIMARY));
name = device->nodes[DRM_NODE_PRIMARY];
wlr_log(WLR_DEBUG, "DRM device %s has no render node, "
"falling back to primary node", name);
}
int main_device_fd = open(name, O_RDWR | O_CLOEXEC);
drmFreeDevice(&device);
if (main_device_fd < 0) {
wlr_log_errno(WLR_ERROR, "Failed to open DRM device %s", name);
goto error_compiled;
"skipping DMA-BUF import checks", device->nodes[DRM_NODE_PRIMARY]);
drmFreeDevice(&device);
}
size_t tranches_len =