mirror of
https://github.com/hyprwm/wlroots-hyprland.git
synced 2024-11-22 12:55:58 +01:00
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:
parent
515681503e
commit
fe6a432299
2 changed files with 21 additions and 14 deletions
|
@ -61,7 +61,7 @@ struct wlr_linux_dmabuf_v1 {
|
||||||
struct wlr_drm_format_set default_formats; // for legacy clients
|
struct wlr_drm_format_set default_formats; // for legacy clients
|
||||||
struct wl_list surfaces; // wlr_linux_dmabuf_v1_surface.link
|
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;
|
struct wl_listener display_destroy;
|
||||||
};
|
};
|
||||||
|
|
|
@ -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,
|
static bool check_import_dmabuf(struct wlr_linux_dmabuf_v1 *linux_dmabuf,
|
||||||
struct wlr_dmabuf_attributes *attribs) {
|
struct wlr_dmabuf_attributes *attribs) {
|
||||||
|
if (linux_dmabuf->main_device_fd < 0) {
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
// TODO: check number of planes
|
// TODO: check number of planes
|
||||||
for (int i = 0; i < attribs->n_planes; i++) {
|
for (int i = 0; i < attribs->n_planes; i++) {
|
||||||
uint32_t handle = 0;
|
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);
|
compiled_feedback_destroy(linux_dmabuf->default_feedback);
|
||||||
wlr_drm_format_set_finish(&linux_dmabuf->default_formats);
|
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);
|
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;
|
goto error_compiled;
|
||||||
}
|
}
|
||||||
|
|
||||||
const char *name = NULL;
|
int main_device_fd = -1;
|
||||||
if (device->available_nodes & (1 << DRM_NODE_RENDER)) {
|
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 {
|
} 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));
|
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, "
|
wlr_log(WLR_DEBUG, "DRM device %s has no render node, "
|
||||||
"falling back to primary node", name);
|
"skipping DMA-BUF import checks", device->nodes[DRM_NODE_PRIMARY]);
|
||||||
}
|
drmFreeDevice(&device);
|
||||||
|
|
||||||
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;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
size_t tranches_len =
|
size_t tranches_len =
|
||||||
|
|
Loading…
Reference in a new issue