|
|
|
@ -636,34 +636,6 @@ static void compiled_feedback_destroy(
|
|
|
|
|
free(feedback);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
static bool feedback_tranche_init_with_renderer(
|
|
|
|
|
struct wlr_linux_dmabuf_feedback_v1_tranche *tranche,
|
|
|
|
|
struct wlr_renderer *renderer) {
|
|
|
|
|
memset(tranche, 0, sizeof(*tranche));
|
|
|
|
|
|
|
|
|
|
int drm_fd = wlr_renderer_get_drm_fd(renderer);
|
|
|
|
|
if (drm_fd < 0) {
|
|
|
|
|
wlr_log(WLR_ERROR, "Failed to get DRM FD from renderer");
|
|
|
|
|
return false;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
struct stat stat;
|
|
|
|
|
if (fstat(drm_fd, &stat) != 0) {
|
|
|
|
|
wlr_log_errno(WLR_ERROR, "fstat failed");
|
|
|
|
|
return false;
|
|
|
|
|
}
|
|
|
|
|
tranche->target_device = stat.st_rdev;
|
|
|
|
|
|
|
|
|
|
const struct wlr_drm_format_set *formats = wlr_renderer_get_dmabuf_texture_formats(renderer);
|
|
|
|
|
if (formats == NULL) {
|
|
|
|
|
wlr_log(WLR_ERROR, "Failed to get renderer DMA-BUF texture formats");
|
|
|
|
|
return false;
|
|
|
|
|
}
|
|
|
|
|
tranche->formats = *formats;
|
|
|
|
|
|
|
|
|
|
return true;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
static void feedback_tranche_send(
|
|
|
|
|
const struct wlr_linux_dmabuf_feedback_v1_compiled_tranche *tranche,
|
|
|
|
|
struct wl_resource *resource) {
|
|
|
|
@ -1015,18 +987,17 @@ error_linux_dmabuf:
|
|
|
|
|
|
|
|
|
|
struct wlr_linux_dmabuf_v1 *wlr_linux_dmabuf_v1_create_with_renderer(struct wl_display *display,
|
|
|
|
|
uint32_t version, struct wlr_renderer *renderer) {
|
|
|
|
|
struct wlr_linux_dmabuf_feedback_v1_tranche tranche = {0};
|
|
|
|
|
if (!feedback_tranche_init_with_renderer(&tranche, renderer)) {
|
|
|
|
|
const struct wlr_linux_dmabuf_feedback_v1_init_options options = {
|
|
|
|
|
.main_renderer = renderer,
|
|
|
|
|
};
|
|
|
|
|
struct wlr_linux_dmabuf_feedback_v1 feedback = {0};
|
|
|
|
|
if (!wlr_linux_dmabuf_feedback_v1_init_with_options(&feedback, &options)) {
|
|
|
|
|
return NULL;
|
|
|
|
|
}
|
|
|
|
|
const struct wlr_linux_dmabuf_feedback_v1 feedback = {
|
|
|
|
|
.main_device = tranche.target_device,
|
|
|
|
|
.tranches = {
|
|
|
|
|
.data = &tranche,
|
|
|
|
|
.size = sizeof(tranche),
|
|
|
|
|
},
|
|
|
|
|
};
|
|
|
|
|
return wlr_linux_dmabuf_v1_create(display, version, &feedback);
|
|
|
|
|
struct wlr_linux_dmabuf_v1 *linux_dmabuf =
|
|
|
|
|
wlr_linux_dmabuf_v1_create(display, version, &feedback);
|
|
|
|
|
wlr_linux_dmabuf_feedback_v1_finish(&feedback);
|
|
|
|
|
return linux_dmabuf;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
bool wlr_linux_dmabuf_v1_set_surface_feedback(
|
|
|
|
|