diff options
Diffstat (limited to 'meta-agl-profile-graphical/recipes-graphics/wayland/weston/0019-compositor-drm-introduce-drm_get_dmafd_from_view.patch')
-rw-r--r-- | meta-agl-profile-graphical/recipes-graphics/wayland/weston/0019-compositor-drm-introduce-drm_get_dmafd_from_view.patch | 132 |
1 files changed, 132 insertions, 0 deletions
diff --git a/meta-agl-profile-graphical/recipes-graphics/wayland/weston/0019-compositor-drm-introduce-drm_get_dmafd_from_view.patch b/meta-agl-profile-graphical/recipes-graphics/wayland/weston/0019-compositor-drm-introduce-drm_get_dmafd_from_view.patch new file mode 100644 index 000000000..bec90c75d --- /dev/null +++ b/meta-agl-profile-graphical/recipes-graphics/wayland/weston/0019-compositor-drm-introduce-drm_get_dmafd_from_view.patch @@ -0,0 +1,132 @@ +From 3dbffb783f44752ec221a2ee7a94a21934d681a2 Mon Sep 17 00:00:00 2001 +From: Wataru Mizuno <wmizuno@jp.adit-jv.com> +Date: Tue, 10 Apr 2018 12:22:07 +0900 +Subject: [PATCH 5/5] compositor-drm: introduce drm_get_dmafd_from_view + +This API enables to get dmafd from weston_view + +Signed-off-by: Wataru Mizuno <wmizuno@jp.adit-jv.com> +--- + libweston/compositor-drm.c | 80 ++++++++++++++++++++++++++++++++++++++++++++++ + libweston/compositor-drm.h | 7 ++++ + 2 files changed, 87 insertions(+) + +diff --git a/libweston/compositor-drm.c b/libweston/compositor-drm.c +index 0b5b4c4..77f2ece 100644 +--- a/libweston/compositor-drm.c ++++ b/libweston/compositor-drm.c +@@ -2430,6 +2430,85 @@ drm_output_set_seat(struct weston_output *base, + } + + static int ++drm_get_dma_fd_from_view(struct weston_output *base, ++ struct weston_view *ev) ++{ ++ struct drm_backend *b = to_drm_backend(base->compositor); ++ struct weston_buffer *buffer = ev->surface->buffer_ref.buffer; ++ struct gbm_bo *bo; ++ struct drm_fb *current; ++ struct linux_dmabuf_buffer *dmabuf; ++ uint32_t format; ++ int fd, ret; ++ ++ if(!buffer) { ++ weston_log("buffer is NULL\n"); ++ return -1; ++ } ++ ++ if(dmabuf = linux_dmabuf_buffer_get(buffer->resource)) { ++ struct gbm_import_fd_data gbm_dmabuf = { ++ .fd = dmabuf->attributes.fd[0], ++ .width = dmabuf->attributes.width, ++ .height = dmabuf->attributes.height, ++ .stride = dmabuf->attributes.stride[0], ++ .format = dmabuf->attributes.format ++ }; ++ ++ bo = gbm_bo_import(b->gbm, GBM_BO_IMPORT_FD, ++ &gbm_dmabuf, GBM_BO_USE_SCANOUT); ++ if (!bo) { ++ weston_log("failed to get gbm_bo\n"); ++ return -1; ++ } ++ ++ current = zalloc(sizeof *current); ++ current->handle = gbm_bo_get_handle(bo).s32; ++ if (!current->handle) { ++ fprintf(stderr, "failed to get drm_handle\n"); ++ return -1; ++ } ++ } ++ else if(ev->surface->buffer_ref.buffer->legacy_buffer) { ++ bo = gbm_bo_import(b->gbm, GBM_BO_IMPORT_WL_BUFFER, ++ buffer->resource, GBM_BO_USE_SCANOUT); ++ ++ if (!bo) { ++ weston_log("failed to get gbm_bo\n"); ++ return -1; ++ } ++ ++ format = gbm_bo_get_format(bo); ++ if (!format) { ++ weston_log("failed to get format\n"); ++ gbm_bo_destroy(bo); ++ return -1; ++ } ++ ++ current = drm_fb_get_from_bo(bo, b, format); ++ if (!current) { ++ weston_log("failed to get drm_fb\n"); ++ gbm_bo_destroy(bo); ++ return -1; ++ } ++ } ++ else { ++ weston_log("Buffer is not supported\n"); ++ return -1; ++ } ++ ++ ret = drmPrimeHandleToFD(b->drm.fd, current->handle, ++ DRM_CLOEXEC, &fd); ++ free(current); ++ if (ret) { ++ weston_log("failed to create prime fd for front buffer\n"); ++ return -1; ++ } ++ ++ return fd; ++} ++ ++static int + drm_output_enable(struct weston_output *base) + { + struct drm_output *output = to_drm_output(base); +@@ -3199,6 +3278,7 @@ static const struct weston_drm_output_api api = { + drm_output_set_mode, + drm_output_set_gbm_format, + drm_output_set_seat, ++ drm_get_dma_fd_from_view, + }; + + static struct drm_backend * +diff --git a/libweston/compositor-drm.h b/libweston/compositor-drm.h +index 2e2995a..fe00bd5 100644 +--- a/libweston/compositor-drm.h ++++ b/libweston/compositor-drm.h +@@ -78,6 +78,13 @@ struct weston_drm_output_api { + */ + void (*set_seat)(struct weston_output *output, + const char *seat); ++ ++ /** Get the dma fd from drm view. ++ * ++ * The dma fd is got from weston_view. ++ * Returns fd on success, -1 on failure. ++ */ ++ int (*get_dma_fd_from_view)(struct weston_output *output, struct weston_view *view); + }; + + static inline const struct weston_drm_output_api * +-- +2.7.4 + |