Use linux-dmabuf feedback builder

References: https://gitlab.freedesktop.org/wlroots/wlroots/-/merge_requests/3716
This commit is contained in:
Simon Ser 2022-09-14 13:09:48 +02:00
parent 1c368fbb5f
commit 692e03f155

View file

@ -5,13 +5,9 @@
#include <stdlib.h> #include <stdlib.h>
#include <string.h> #include <string.h>
#include <strings.h> #include <strings.h>
#include <sys/stat.h>
#include <wayland-server-core.h>
#include <wlr/types/wlr_linux_dmabuf_v1.h> #include <wlr/types/wlr_linux_dmabuf_v1.h>
#include <wlr/types/wlr_output_layout.h> #include <wlr/types/wlr_output_layout.h>
#include <wlr/types/wlr_subcompositor.h> #include <wlr/types/wlr_subcompositor.h>
#include <wlr/render/drm_format_set.h>
#include "linux-dmabuf-unstable-v1-protocol.h"
#include "cairo_util.h" #include "cairo_util.h"
#include "pango.h" #include "pango.h"
#include "sway/config.h" #include "sway/config.h"
@ -1062,16 +1058,6 @@ void container_end_mouse_operation(struct sway_container *container) {
} }
} }
static bool devid_from_fd(int fd, dev_t *devid) {
struct stat stat;
if (fstat(fd, &stat) != 0) {
sway_log_errno(SWAY_ERROR, "fstat failed");
return false;
}
*devid = stat.st_rdev;
return true;
}
static void set_fullscreen(struct sway_container *con, bool enable) { static void set_fullscreen(struct sway_container *con, bool enable) {
if (!con->view) { if (!con->view) {
return; return;
@ -1098,60 +1084,23 @@ static void set_fullscreen(struct sway_container *con, bool enable) {
} }
struct sway_output *output = con->pending.workspace->output; struct sway_output *output = con->pending.workspace->output;
struct wlr_output *wlr_output = output->wlr_output;
// TODO: add wlroots helpers for all of this stuff struct wlr_linux_dmabuf_feedback_v1_builder *builder =
wlr_linux_dmabuf_feedback_v1_builder_create();
const struct wlr_drm_format_set *renderer_formats = wlr_linux_dmabuf_feedback_v1_builder_set_main_renderer(builder,
wlr_renderer_get_dmabuf_texture_formats(server.renderer); server.renderer);
assert(renderer_formats); wlr_linux_dmabuf_feedback_v1_builder_set_scanout_primary_output(builder,
output->wlr_output);
int renderer_drm_fd = wlr_renderer_get_drm_fd(server.renderer); const struct wlr_linux_dmabuf_feedback_v1 *feedback =
int backend_drm_fd = wlr_backend_get_drm_fd(wlr_output->backend); wlr_linux_dmabuf_feedback_v1_builder_get_feedback(builder);
if (renderer_drm_fd < 0 || backend_drm_fd < 0) { if (feedback != NULL) {
return; wlr_linux_dmabuf_v1_set_surface_feedback(server.linux_dmabuf_v1,
con->view->surface, feedback);
} }
dev_t render_dev, scanout_dev; wlr_linux_dmabuf_feedback_v1_builder_destroy(builder);
if (!devid_from_fd(renderer_drm_fd, &render_dev) ||
!devid_from_fd(backend_drm_fd, &scanout_dev)) {
return;
}
const struct wlr_drm_format_set *output_formats =
wlr_output_get_primary_formats(output->wlr_output,
WLR_BUFFER_CAP_DMABUF);
if (!output_formats) {
return;
}
struct wlr_drm_format_set scanout_formats = {0};
if (!wlr_drm_format_set_intersect(&scanout_formats,
output_formats, renderer_formats)) {
return;
}
struct wlr_linux_dmabuf_feedback_v1_tranche tranches[] = {
{
.target_device = scanout_dev,
.flags = ZWP_LINUX_DMABUF_FEEDBACK_V1_TRANCHE_FLAGS_SCANOUT,
.formats = &scanout_formats,
},
{
.target_device = render_dev,
.formats = renderer_formats,
},
};
const struct wlr_linux_dmabuf_feedback_v1 feedback = {
.main_device = render_dev,
.tranches = tranches,
.tranches_len = sizeof(tranches) / sizeof(tranches[0]),
};
wlr_linux_dmabuf_v1_set_surface_feedback(server.linux_dmabuf_v1,
con->view->surface, &feedback);
wlr_drm_format_set_finish(&scanout_formats);
} }
static void container_fullscreen_workspace(struct sway_container *con) { static void container_fullscreen_workspace(struct sway_container *con) {